From ece0ee3b1ebbbb67f690b882cac42ced97c5ae49 Mon Sep 17 00:00:00 2001 From: cicdguy <26552821+cicdguy@users.noreply.github.com> Date: Thu, 9 Nov 2023 10:08:32 -0600 Subject: [PATCH] Built site for admiralophtha: 0.3.0.9002@ --- main/404.html => 404.html | 52 +- main/LICENSE.html => LICENSE.html | 28 +- ...20x120.png => apple-touch-icon-120x120.png | Bin ...52x152.png => apple-touch-icon-152x152.png | Bin ...80x180.png => apple-touch-icon-180x180.png | Bin ...on-60x60.png => apple-touch-icon-60x60.png | Bin ...on-76x76.png => apple-touch-icon-76x76.png | Bin ...ple-touch-icon.png => apple-touch-icon.png | Bin articles/adbcva.html | 572 + .../crosstalk-1.2.0/css/crosstalk.min.css | 0 .../crosstalk-1.2.0/js/crosstalk.js | 0 .../crosstalk-1.2.0/js/crosstalk.js.map | 0 .../crosstalk-1.2.0/js/crosstalk.min.js | 0 .../crosstalk-1.2.0/js/crosstalk.min.js.map | 0 .../crosstalk-1.2.0/scss/crosstalk.scss | 0 .../datatables-binding-0.30}/datatables.js | 73 +- .../datatables-crosstalk.css | 32 + .../css/jquery.dataTables.extra.css | 0 .../css/jquery.dataTables.min.css | 1 + .../js/jquery.dataTables.min.js | 4 + .../css/buttons.dataTables.min.css | 1 + .../js/buttons.colVis.min.js | 5 + .../js/buttons.html5.min.js | 8 + .../js/buttons.print.min.js | 5 + .../js/dataTables.buttons.min.js | 4 + .../css/colReorder.dataTables.min.css | 0 .../js/dataTables.colReorder.min.js | 4 + .../css/scroller.dataTables.min.css | 2 +- .../js/dataTables.scroller.min.js | 4 + .../jquery.highlight.js | 0 .../source.css | 0 .../source.min.js | 2 + .../adbcva_files/dt-scroll-1.0.0/style.css | 0 .../htmlwidgets-1.6.2}/htmlwidgets.js | 56 +- .../jquery.nouislider.min.css | 0 .../jquery.nouislider.min.js | 0 .../selectize-0.12.0/selectize.bootstrap3.css | 0 .../selectize-0.12.0/selectize.min.js | 0 .../articles => articles}/admiralophtha.html | 18 +- {main/articles => articles}/adoe.html | 116 +- articles/advfq.html | 373 + {main/articles => articles}/index.html | 10 +- {main/articles => articles}/standards.html | 24 +- main/authors.html => authors.html | 10 +- deps/bootstrap-5.2.2/bootstrap.bundle.min.js | 7 + .../bootstrap.bundle.min.js.map | 1 + deps/bootstrap-5.2.2/bootstrap.min.css | 6 + .../bootstrap-5.2.2}/font.css | 0 ...txg8zYS_SKggPN4iEgvnHyvveLxVs9pbCIPrc.woff | Bin 0 -> 26240 bytes ...txg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrc.woff | Bin 0 -> 25916 bytes .../1adeadb2fe618c5ed46221f15e12b9c8.woff | Bin 0 -> 46088 bytes .../fonts/4iCs6KVjbNBYlgo6ew.woff | Bin 0 -> 134032 bytes .../fonts/4iCs6KVjbNBYlgoKfw7w.woff | Bin 0 -> 39832 bytes .../fonts/4iCv6KVjbNBYlgoCxCvTtA.woff | Bin 0 -> 117140 bytes .../fonts/4iCv6KVjbNBYlgoCxCvjsGyL.woff | Bin 0 -> 34452 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDQ.woff | Bin 0 -> 17760 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPa7j.woff | Bin 0 -> 49156 bytes .../fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3aPA.woff | Bin 0 -> 74684 bytes .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7j.woff | Bin 0 -> 18420 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3i54rAkw.woff | Bin 0 -> 74348 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vAkw.woff | Bin 0 -> 74332 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdo.woff | Bin 0 -> 18388 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zAkw.woff | Bin 0 -> 74148 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdo.woff | Bin 0 -> 18340 bytes .../fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNRevw.woff | Bin 0 -> 16724 bytes .../fonts/CSR54z1Qlv-GDxkbKVQ_dFsvaNA.woff | Bin 29712 -> 29672 bytes .../fonts/CSR64z1Qlv-GDxkbKVQ_TOQ.woff | Bin 75144 -> 75128 bytes .../fonts/CSR64z1Qlv-GDxkbKVQ_fOAKSw.woff | Bin 0 -> 16516 bytes ...xRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DBKXhM0.woff | Bin 0 -> 56036 bytes ...xRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DMyQhM0.woff | Bin 0 -> 56044 bytes ...g3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTbI1rSg.woff | Bin 0 -> 47776 bytes ...g3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTsoprSg.woff | Bin 0 -> 47984 bytes ...HjIg1_i6t8kCHKm4532VJOt5-QNFgpCtZ6Ew9.woff | Bin 0 -> 50800 bytes ...HjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Ew9.woff | Bin 0 -> 50768 bytes ...HjIg1_i6t8kCHKm4532VJOt5-QNFgpCuM70w9.woff | Bin 0 -> 51152 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fBBc-.woff | Bin 20532 -> 20544 bytes .../fonts/KFOlCnqEu92Fr1MmEU9vAA.woff | Bin 65492 -> 65756 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fBBc-.woff | Bin 20404 -> 20416 bytes .../fonts/KFOlCnqEu92Fr1MmSU5vAA.woff | Bin 64952 -> 65164 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfBBc-.woff | Bin 20396 -> 20408 bytes .../fonts/KFOlCnqEu92Fr1MmWUlvAA.woff | Bin 65292 -> 65556 bytes .../fonts/KFOmCnqEu92Fr1Me5g.woff | Bin 65244 -> 65456 bytes .../fonts/KFOmCnqEu92Fr1Mu4mxM.woff | Bin 20332 -> 20344 bytes .../fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhL.woff | Bin 0 -> 89776 bytes .../fonts/S6u8w4BMUTPHjxsAXC-s.woff | Bin 0 -> 29864 bytes .../fonts/S6u8w4BMUTPHjxswWA.woff | Bin 0 -> 35436 bytes .../fonts/S6u9w4BMUTPHh6UVSwiPHw.woff | Bin 0 -> 28044 bytes .../fonts/S6u9w4BMUTPHh6UVeww.woff | Bin 33380 -> 33296 bytes .../fonts/S6u9w4BMUTPHh7USSwiPHw.woff | Bin 0 -> 30016 bytes .../fonts/S6u9w4BMUTPHh7USeww.woff | Bin 35168 -> 35168 bytes .../fonts/S6uyw4BMUTPHjx4wWA.woff | Bin 0 -> 28648 bytes .../fonts/S6uyw4BMUTPHvxo.woff | Bin 0 -> 34020 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYMZs.woff | Bin 0 -> 140344 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZs.woff | Bin 0 -> 138892 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZs.woff | Bin 0 -> 129252 bytes .../XRXI3I6Li01BKofiOc5wtlZ2di8HDFwmRTA.woff | Bin 0 -> 53296 bytes .../XRXI3I6Li01BKofiOc5wtlZ2di8HDGUmRTA.woff | Bin 0 -> 54248 bytes .../XRXI3I6Li01BKofiOc5wtlZ2di8HDLshRTA.woff | Bin 0 -> 53960 bytes .../a98f7a7574819ba83bec6279a2cecd95.woff | Bin 0 -> 45884 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk0ZjaVQ.woff | Bin 0 -> 72136 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkWVAexg.woff | Bin 0 -> 23636 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkaVQ.woff | Bin 0 -> 74700 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkWVAexg.woff | Bin 0 -> 23576 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkaVQ.woff | Bin 74512 -> 74564 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk_RkaVQ.woff | Bin 0 -> 74940 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkxhjaVQ.woff | Bin 0 -> 74644 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjWVAexg.woff | Bin 0 -> 22964 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjaVQ.woff | Bin 0 -> 71660 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsg-1x4gaVQ.woff | Bin 0 -> 22332 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1y4k.woff | Bin 0 -> 68664 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsgH1y4k.woff | Bin 0 -> 70652 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgshZ1y4k.woff | Bin 0 -> 69392 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsiH0B4gaVQ.woff | Bin 0 -> 22940 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0C4k.woff | Bin 0 -> 70524 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVQ.woff | Bin 0 -> 22908 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0C4k.woff | Bin 70736 -> 70792 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjr0C4k.woff | Bin 0 -> 71144 bytes .../fonts/q5uGsou0JOdh94bfvQlr.woff | Bin 0 -> 31584 bytes {devel/deps => deps}/data-deps.txt | 4 +- .../jquery-3.6.0/jquery-3.6.0.js | 0 .../jquery-3.6.0/jquery-3.6.0.min.js | 0 .../jquery-3.6.0/jquery-3.6.0.min.map | 0 devel/.nojekyll | 1 - devel/404.html | 117 - devel/LICENSE.html | 166 - devel/articles/adbcva.html | 574 - .../datatables-crosstalk.css | 23 - .../css/jquery.dataTables.min.css | 1 - .../js/jquery.dataTables.min.js | 187 - .../css/buttons.dataTables.min.css | 1 - .../js/buttons.colVis.min.js | 10 - .../js/buttons.html5.min.js | 36 - .../js/buttons.print.min.js | 9 - .../js/dataTables.buttons.min.js | 51 - .../js/dataTables.colReorder.min.js | 40 - .../js/dataTables.scroller.min.js | 44 - .../source.min.js | 28 - .../htmlwidgets-1.5.4/htmlwidgets.js | 903 -- devel/articles/admiralophtha.html | 192 - devel/articles/adoe.html | 274 - devel/articles/advfq.html | 369 - devel/articles/index.html | 99 - devel/articles/standards.html | 220 - devel/authors.html | 153 - .../bootstrap-5.1.0/bootstrap.bundle.min.js | 7 - .../bootstrap.bundle.min.js.map | 1 - devel/deps/bootstrap-5.1.0/bootstrap.min.css | 1 - ...txg8zYS_SKggPN4iEgvnHyvveLxVs9pbCIPrc.woff | Bin 26128 -> 0 bytes ...txg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrc.woff | Bin 25804 -> 0 bytes .../fonts/4iCs6KVjbNBYlgo6ew.woff | Bin 133368 -> 0 bytes .../fonts/4iCs6KVjbNBYlgoKfw7w.woff | Bin 39164 -> 0 bytes .../fonts/4iCv6KVjbNBYlgoCxCvTtA.woff | Bin 116784 -> 0 bytes .../fonts/4iCv6KVjbNBYlgoCxCvjsGyL.woff | Bin 33424 -> 0 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDQ.woff | Bin 19368 -> 0 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPa7j.woff | Bin 39572 -> 0 bytes .../fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3aPA.woff | Bin 81008 -> 0 bytes .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7j.woff | Bin 20180 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3i54rAkw.woff | Bin 80556 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vAkw.woff | Bin 80084 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdo.woff | Bin 19896 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zAkw.woff | Bin 80588 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdo.woff | Bin 20204 -> 0 bytes .../fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNRevw.woff | Bin 16692 -> 0 bytes .../fonts/CSR64z1Qlv-GDxkbKVQ_TOQ.woff | Bin 75144 -> 0 bytes .../fonts/CSR64z1Qlv-GDxkbKVQ_fOAKSw.woff | Bin 16424 -> 0 bytes .../fonts/JTURjIg1_i6t8kCHKm45_ZpC7g0.woff | Bin 68108 -> 0 bytes .../fonts/JTURjIg1_i6t8kCHKm45_dJE7g0.woff | Bin 68180 -> 0 bytes .../fonts/JTUSjIg1_i6t8kCHKm45xW0.woff | Bin 68308 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmEU9vAA.woff | Bin 65492 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fBBc-.woff | Bin 20404 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmSU5vAA.woff | Bin 64952 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfBBc-.woff | Bin 20396 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmWUlvAA.woff | Bin 65292 -> 0 bytes .../fonts/KFOmCnqEu92Fr1Me5g.woff | Bin 65244 -> 0 bytes .../fonts/KFOmCnqEu92Fr1Mu4mxM.woff | Bin 20332 -> 0 bytes .../fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhL.woff | Bin 89708 -> 0 bytes .../fonts/S6u8w4BMUTPHjxsAXC-s.woff | Bin 29836 -> 0 bytes .../fonts/S6u8w4BMUTPHjxswWA.woff | Bin 35444 -> 0 bytes .../fonts/S6u9w4BMUTPHh6UVSwiPHw.woff | Bin 28052 -> 0 bytes .../fonts/S6u9w4BMUTPHh6UVeww.woff | Bin 33380 -> 0 bytes .../fonts/S6u9w4BMUTPHh7USSwiPHw.woff | Bin 30024 -> 0 bytes .../fonts/S6uyw4BMUTPHjx4wWA.woff | Bin 28660 -> 0 bytes .../fonts/S6uyw4BMUTPHvxo.woff | Bin 34040 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYMZs.woff | Bin 132068 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZs.woff | Bin 130576 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZs.woff | Bin 121716 -> 0 bytes .../fonts/XRXV3I6Li01BKof4MQ.woff | Bin 63952 -> 0 bytes .../fonts/XRXW3I6Li01BKofA6sKkZQ.woff | Bin 64560 -> 0 bytes .../fonts/XRXW3I6Li01BKofAjsOkZQ.woff | Bin 63804 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkWVAexg.woff | Bin 21848 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkaVQ.woff | Bin 74640 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkWVAexg.woff | Bin 21780 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjWVAexg.woff | Bin 21168 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjaVQ.woff | Bin 71656 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsg-1x4gaVQ.woff | Bin 20100 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1y4k.woff | Bin 68596 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsiH0B4gaVQ.woff | Bin 20684 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0C4k.woff | Bin 70456 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVQ.woff | Bin 20640 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0C4k.woff | Bin 70736 -> 0 bytes .../fonts/pe03MImSLYBIv1o4X1M8cc9iB_5p.woff | Bin 57672 -> 0 bytes .../fonts/pe0qMImSLYBIv1o4X1M8cfe5.woff | Bin 57300 -> 0 bytes .../fonts/q5uGsou0JOdh94bfvQlr.woff | Bin 31624 -> 0 bytes devel/index.html | 241 - devel/news/index.html | 147 - devel/pkgdown.yml | 14 - devel/pull_request_template.html | 133 - devel/reference/admiralophtha-package.html | 118 - devel/reference/admiralophtha_adbcva.html | 112 - devel/reference/admiralophtha_adoe.html | 112 - devel/reference/admiralophtha_advfq.html | 112 - devel/reference/convert_etdrs_to_logmar.html | 153 - devel/reference/convert_logmar_to_etdrs.html | 141 - devel/reference/derive_var_afeye.html | 172 - devel/reference/derive_var_bcvacritxfl.html | 243 - .../derive_var_bcvacritxfl_util.html | 171 - devel/reference/derive_var_studyeye.html | 164 - devel/reference/index.html | 187 - devel/search.json | 1 - devel/sitemap.xml | 72 - devel/favicon-16x16.png => favicon-16x16.png | Bin devel/favicon-32x32.png => favicon-32x32.png | Bin devel/favicon.ico => favicon.ico | Bin index.html | 246 +- devel/link.svg => link.svg | 0 devel/logo.png => logo.png | Bin main/.nojekyll | 1 - main/apple-touch-icon-120x120.png | Bin 8580 -> 0 bytes main/apple-touch-icon-152x152.png | Bin 11298 -> 0 bytes main/apple-touch-icon-180x180.png | Bin 14103 -> 0 bytes main/apple-touch-icon-60x60.png | Bin 3705 -> 0 bytes main/apple-touch-icon-76x76.png | Bin 5037 -> 0 bytes main/apple-touch-icon.png | Bin 14103 -> 0 bytes main/articles/adbcva.html | 580 - .../crosstalk-1.2.0/css/crosstalk.min.css | 1 - .../crosstalk-1.2.0/js/crosstalk.js | 1474 --- .../crosstalk-1.2.0/js/crosstalk.js.map | 37 - .../crosstalk-1.2.0/js/crosstalk.min.js | 2 - .../crosstalk-1.2.0/js/crosstalk.min.js.map | 1 - .../crosstalk-1.2.0/scss/crosstalk.scss | 75 - .../datatables-binding-0.21/datatables.js | 1494 --- .../datatables-crosstalk.css | 23 - .../css/jquery.dataTables.extra.css | 28 - .../css/jquery.dataTables.min.css | 1 - .../js/jquery.dataTables.min.js | 187 - .../css/buttons.dataTables.min.css | 1 - .../js/buttons.colVis.min.js | 10 - .../js/buttons.html5.min.js | 36 - .../js/buttons.print.min.js | 9 - .../js/dataTables.buttons.min.js | 51 - .../css/colReorder.dataTables.min.css | 1 - .../js/dataTables.colReorder.min.js | 40 - .../css/scroller.dataTables.min.css | 1 - .../js/dataTables.scroller.min.js | 44 - .../jquery.highlight.js | 140 - .../source.css | 11 - .../source.min.js | 28 - .../adbcva_files/dt-scroll-1.0.0/style.css | 16 - .../htmlwidgets-1.5.4/htmlwidgets.js | 903 -- .../jquery.nouislider.min.css | 4 - .../jquery.nouislider.min.js | 3 - .../selectize-0.12.0/selectize.bootstrap3.css | 401 - .../selectize-0.12.0/selectize.min.js | 3 - main/articles/advfq.html | 381 - .../bootstrap-5.1.0/bootstrap.bundle.min.js | 7 - .../bootstrap.bundle.min.js.map | 1 - main/deps/bootstrap-5.1.0/bootstrap.min.css | 1 - main/deps/bootstrap-5.1.0/font.css | 21 - ...txg8zYS_SKggPN4iEgvnHyvveLxVs9pbCIPrc.woff | Bin 26128 -> 0 bytes ...txg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrc.woff | Bin 25804 -> 0 bytes .../fonts/4iCs6KVjbNBYlgo6ew.woff | Bin 133368 -> 0 bytes .../fonts/4iCs6KVjbNBYlgoKfw7w.woff | Bin 39164 -> 0 bytes .../fonts/4iCv6KVjbNBYlgoCxCvTtA.woff | Bin 116784 -> 0 bytes .../fonts/4iCv6KVjbNBYlgoCxCvjsGyL.woff | Bin 33424 -> 0 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDQ.woff | Bin 19368 -> 0 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPa7j.woff | Bin 39572 -> 0 bytes .../fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3aPA.woff | Bin 81008 -> 0 bytes .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7j.woff | Bin 20180 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3i54rAkw.woff | Bin 80556 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vAkw.woff | Bin 80084 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdo.woff | Bin 19896 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zAkw.woff | Bin 80588 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdo.woff | Bin 20204 -> 0 bytes .../fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNRevw.woff | Bin 16692 -> 0 bytes .../fonts/CSR54z1Qlv-GDxkbKVQ_dFsvaNA.woff | Bin 29712 -> 0 bytes .../fonts/CSR64z1Qlv-GDxkbKVQ_fOAKSw.woff | Bin 16424 -> 0 bytes .../fonts/JTURjIg1_i6t8kCHKm45_ZpC7g0.woff | Bin 68108 -> 0 bytes .../fonts/JTURjIg1_i6t8kCHKm45_dJE7g0.woff | Bin 68180 -> 0 bytes .../fonts/JTUSjIg1_i6t8kCHKm45xW0.woff | Bin 68308 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fBBc-.woff | Bin 20532 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmEU9vAA.woff | Bin 65492 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fBBc-.woff | Bin 20404 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmSU5vAA.woff | Bin 64952 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfBBc-.woff | Bin 20396 -> 0 bytes .../fonts/KFOmCnqEu92Fr1Me5g.woff | Bin 65244 -> 0 bytes .../fonts/KFOmCnqEu92Fr1Mu4mxM.woff | Bin 20332 -> 0 bytes .../fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhL.woff | Bin 89708 -> 0 bytes .../fonts/S6u8w4BMUTPHjxsAXC-s.woff | Bin 29836 -> 0 bytes .../fonts/S6u8w4BMUTPHjxswWA.woff | Bin 35444 -> 0 bytes .../fonts/S6u9w4BMUTPHh6UVSwiPHw.woff | Bin 28052 -> 0 bytes .../fonts/S6u9w4BMUTPHh6UVeww.woff | Bin 33380 -> 0 bytes .../fonts/S6u9w4BMUTPHh7USSwiPHw.woff | Bin 30024 -> 0 bytes .../fonts/S6u9w4BMUTPHh7USeww.woff | Bin 35168 -> 0 bytes .../fonts/S6uyw4BMUTPHjx4wWA.woff | Bin 28660 -> 0 bytes .../fonts/S6uyw4BMUTPHvxo.woff | Bin 34040 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYMZs.woff | Bin 132068 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZs.woff | Bin 130576 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZs.woff | Bin 121716 -> 0 bytes .../fonts/XRXV3I6Li01BKof4MQ.woff | Bin 63952 -> 0 bytes .../fonts/XRXW3I6Li01BKofA6sKkZQ.woff | Bin 64560 -> 0 bytes .../fonts/XRXW3I6Li01BKofAjsOkZQ.woff | Bin 63804 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkWVAexg.woff | Bin 21848 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkaVQ.woff | Bin 74640 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkWVAexg.woff | Bin 21780 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkaVQ.woff | Bin 74512 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjWVAexg.woff | Bin 21168 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjaVQ.woff | Bin 71656 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsg-1x4gaVQ.woff | Bin 20100 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1y4k.woff | Bin 68596 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsiH0B4gaVQ.woff | Bin 20684 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0C4k.woff | Bin 70456 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVQ.woff | Bin 20640 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0C4k.woff | Bin 70736 -> 0 bytes .../fonts/pe03MImSLYBIv1o4X1M8cc9iB_5p.woff | Bin 57672 -> 0 bytes .../fonts/pe0qMImSLYBIv1o4X1M8cfe5.woff | Bin 57300 -> 0 bytes .../fonts/q5uGsou0JOdh94bfvQlr.woff | Bin 31624 -> 0 bytes main/deps/data-deps.txt | 4 - main/deps/jquery-3.6.0/jquery-3.6.0.js | 10881 ---------------- main/deps/jquery-3.6.0/jquery-3.6.0.min.js | 2 - main/deps/jquery-3.6.0/jquery-3.6.0.min.map | 1 - main/favicon-16x16.png | Bin 1290 -> 0 bytes main/favicon-32x32.png | Bin 1951 -> 0 bytes main/favicon.ico | Bin 15086 -> 0 bytes main/index.html | 253 - main/link.svg | 12 - main/logo.png | Bin 59553 -> 0 bytes main/pkgdown.js | 156 - main/pkgdown.yml | 14 - main/reference/Rplot001.png | Bin 1011 -> 0 bytes main/reference/figures/logo.png | Bin 59553 -> 0 bytes main/search.json | 1 - main/sitemap.xml | 72 - {main/news => news}/index.html | 18 +- devel/pkgdown.js => pkgdown.js | 0 pkgdown.yml | 14 + pre-release/.nojekyll | 1 - pre-release/404.html | 117 - pre-release/LICENSE.html | 166 - pre-release/apple-touch-icon-120x120.png | Bin 8580 -> 0 bytes pre-release/apple-touch-icon-152x152.png | Bin 11298 -> 0 bytes pre-release/apple-touch-icon-180x180.png | Bin 14103 -> 0 bytes pre-release/apple-touch-icon-60x60.png | Bin 3705 -> 0 bytes pre-release/apple-touch-icon-76x76.png | Bin 5037 -> 0 bytes pre-release/apple-touch-icon.png | Bin 14103 -> 0 bytes pre-release/articles/adbcva.html | 540 - .../crosstalk-1.2.0/css/crosstalk.min.css | 1 - .../crosstalk-1.2.0/js/crosstalk.js | 1474 --- .../crosstalk-1.2.0/js/crosstalk.js.map | 37 - .../crosstalk-1.2.0/js/crosstalk.min.js | 2 - .../crosstalk-1.2.0/js/crosstalk.min.js.map | 1 - .../crosstalk-1.2.0/scss/crosstalk.scss | 75 - .../datatables-binding-0.21/datatables.js | 1494 --- .../datatables-crosstalk.css | 23 - .../css/jquery.dataTables.extra.css | 28 - .../css/jquery.dataTables.min.css | 1 - .../js/jquery.dataTables.min.js | 187 - .../css/buttons.dataTables.min.css | 1 - .../js/buttons.colVis.min.js | 10 - .../js/buttons.html5.min.js | 36 - .../js/buttons.print.min.js | 9 - .../js/dataTables.buttons.min.js | 51 - .../css/colReorder.dataTables.min.css | 1 - .../js/dataTables.colReorder.min.js | 40 - .../css/scroller.dataTables.min.css | 1 - .../js/dataTables.scroller.min.js | 44 - .../jquery.highlight.js | 140 - .../source.css | 11 - .../source.min.js | 28 - .../adbcva_files/dt-scroll-1.0.0/style.css | 16 - .../jquery.nouislider.min.css | 4 - .../jquery.nouislider.min.js | 3 - .../selectize-0.12.0/selectize.bootstrap3.css | 401 - .../selectize-0.12.0/selectize.min.js | 3 - pre-release/articles/admiralophtha.html | 192 - pre-release/articles/adoe.html | 256 - pre-release/articles/advfq.html | 370 - pre-release/articles/index.html | 99 - pre-release/articles/standards.html | 201 - pre-release/authors.html | 153 - .../bootstrap-5.1.0/bootstrap.bundle.min.js | 7 - .../bootstrap.bundle.min.js.map | 1 - .../deps/bootstrap-5.1.0/bootstrap.min.css | 1 - pre-release/deps/bootstrap-5.1.0/font.css | 21 - ...txg8zYS_SKggPN4iEgvnHyvveLxVs9pbCIPrc.woff | Bin 26128 -> 0 bytes ...txg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrc.woff | Bin 25804 -> 0 bytes .../fonts/4iCs6KVjbNBYlgo6ew.woff | Bin 133368 -> 0 bytes .../fonts/4iCs6KVjbNBYlgoKfw7w.woff | Bin 39164 -> 0 bytes .../fonts/4iCv6KVjbNBYlgoCxCvTtA.woff | Bin 116784 -> 0 bytes .../fonts/4iCv6KVjbNBYlgoCxCvjsGyL.woff | Bin 33424 -> 0 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDQ.woff | Bin 19368 -> 0 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPa7j.woff | Bin 39572 -> 0 bytes .../fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3aPA.woff | Bin 81008 -> 0 bytes .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7j.woff | Bin 20180 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3i54rAkw.woff | Bin 80556 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vAkw.woff | Bin 80084 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdo.woff | Bin 19896 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zAkw.woff | Bin 80588 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdo.woff | Bin 20204 -> 0 bytes .../fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNRevw.woff | Bin 16692 -> 0 bytes .../fonts/CSR54z1Qlv-GDxkbKVQ_dFsvaNA.woff | Bin 29712 -> 0 bytes .../fonts/CSR64z1Qlv-GDxkbKVQ_TOQ.woff | Bin 75144 -> 0 bytes .../fonts/CSR64z1Qlv-GDxkbKVQ_fOAKSw.woff | Bin 16424 -> 0 bytes .../fonts/JTURjIg1_i6t8kCHKm45_ZpC7g0.woff | Bin 68108 -> 0 bytes .../fonts/JTURjIg1_i6t8kCHKm45_dJE7g0.woff | Bin 68180 -> 0 bytes .../fonts/JTUSjIg1_i6t8kCHKm45xW0.woff | Bin 68308 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fBBc-.woff | Bin 20532 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmWUlvAA.woff | Bin 65292 -> 0 bytes .../fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhL.woff | Bin 89708 -> 0 bytes .../fonts/S6u8w4BMUTPHjxsAXC-s.woff | Bin 29836 -> 0 bytes .../fonts/S6u8w4BMUTPHjxswWA.woff | Bin 35444 -> 0 bytes .../fonts/S6u9w4BMUTPHh6UVSwiPHw.woff | Bin 28052 -> 0 bytes .../fonts/S6u9w4BMUTPHh7USSwiPHw.woff | Bin 30024 -> 0 bytes .../fonts/S6u9w4BMUTPHh7USeww.woff | Bin 35168 -> 0 bytes .../fonts/S6uyw4BMUTPHjx4wWA.woff | Bin 28660 -> 0 bytes .../fonts/S6uyw4BMUTPHvxo.woff | Bin 34040 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYMZs.woff | Bin 132068 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZs.woff | Bin 130576 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZs.woff | Bin 121716 -> 0 bytes .../fonts/XRXV3I6Li01BKof4MQ.woff | Bin 63952 -> 0 bytes .../fonts/XRXW3I6Li01BKofA6sKkZQ.woff | Bin 64560 -> 0 bytes .../fonts/XRXW3I6Li01BKofAjsOkZQ.woff | Bin 63804 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkWVAexg.woff | Bin 21848 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkaVQ.woff | Bin 74640 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkWVAexg.woff | Bin 21780 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkaVQ.woff | Bin 74512 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjWVAexg.woff | Bin 21168 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjaVQ.woff | Bin 71656 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsg-1x4gaVQ.woff | Bin 20100 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1y4k.woff | Bin 68596 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsiH0B4gaVQ.woff | Bin 20684 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0C4k.woff | Bin 70456 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVQ.woff | Bin 20640 -> 0 bytes .../fonts/pe03MImSLYBIv1o4X1M8cc9iB_5p.woff | Bin 57672 -> 0 bytes .../fonts/pe0qMImSLYBIv1o4X1M8cfe5.woff | Bin 57300 -> 0 bytes .../fonts/q5uGsou0JOdh94bfvQlr.woff | Bin 31624 -> 0 bytes pre-release/deps/data-deps.txt | 4 - pre-release/deps/jquery-3.6.0/jquery-3.6.0.js | 10881 ---------------- .../deps/jquery-3.6.0/jquery-3.6.0.min.js | 2 - .../deps/jquery-3.6.0/jquery-3.6.0.min.map | 1 - pre-release/favicon-16x16.png | Bin 1290 -> 0 bytes pre-release/favicon-32x32.png | Bin 1951 -> 0 bytes pre-release/favicon.ico | Bin 15086 -> 0 bytes pre-release/index.html | 239 - pre-release/link.svg | 12 - pre-release/logo.png | Bin 59553 -> 0 bytes pre-release/news/index.html | 121 - pre-release/pkgdown.js | 156 - pre-release/pkgdown.yml | 14 - pre-release/pull_request_template.html | 133 - pre-release/reference/Rplot001.png | Bin 1011 -> 0 bytes .../reference/admiralophtha-package.html | 118 - .../reference/admiralophtha_adbcva.html | 114 - pre-release/reference/admiralophtha_adoe.html | 114 - .../reference/admiralophtha_advfq.html | 114 - pre-release/reference/admiralophtha_ex.html | 113 - pre-release/reference/admiralophtha_qs.html | 113 - .../reference/convert_etdrs_to_logmar.html | 149 - .../reference/convert_logmar_to_etdrs.html | 137 - pre-release/reference/derive_var_afeye.html | 155 - .../reference/derive_var_bcvacritxfl.html | 249 - .../derive_var_bcvacritxfl_util.html | 165 - .../reference/derive_var_studyeye.html | 169 - pre-release/reference/figures/logo.png | Bin 59553 -> 0 bytes pre-release/reference/index.html | 197 - pre-release/search.json | 1 - pre-release/sitemap.xml | 78 - ...emplate.html => pull_request_template.html | 52 +- {devel/reference => reference}/Rplot001.png | Bin .../admiralophtha-package.html | 14 +- .../admiralophtha_adbcva.html | 12 +- .../admiralophtha_adoe.html | 12 +- .../admiralophtha_advfq.html | 12 +- .../convert_etdrs_to_logmar.html | 42 +- .../convert_logmar_to_etdrs.html | 44 +- .../derive_var_afeye.html | 74 +- .../derive_var_bcvacritxfl.html | 126 +- .../derive_var_bcvacritxfl_util.html | 32 +- .../derive_var_studyeye.html | 60 +- .../reference => reference}/figures/logo.png | Bin {main/reference => reference}/index.html | 10 +- search.json | 1 + sitemap.xml | 72 + 492 files changed, 1733 insertions(+), 43539 deletions(-) rename main/404.html => 404.html (67%) rename main/LICENSE.html => LICENSE.html (88%) rename devel/apple-touch-icon-120x120.png => apple-touch-icon-120x120.png (100%) rename devel/apple-touch-icon-152x152.png => apple-touch-icon-152x152.png (100%) rename devel/apple-touch-icon-180x180.png => apple-touch-icon-180x180.png (100%) rename devel/apple-touch-icon-60x60.png => apple-touch-icon-60x60.png (100%) rename devel/apple-touch-icon-76x76.png => apple-touch-icon-76x76.png (100%) rename devel/apple-touch-icon.png => apple-touch-icon.png (100%) create mode 100644 articles/adbcva.html rename {devel/articles => articles}/adbcva_files/crosstalk-1.2.0/css/crosstalk.min.css (100%) rename {devel/articles => articles}/adbcva_files/crosstalk-1.2.0/js/crosstalk.js (100%) rename {devel/articles => articles}/adbcva_files/crosstalk-1.2.0/js/crosstalk.js.map (100%) rename {devel/articles => articles}/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js (100%) rename {devel/articles => articles}/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js.map (100%) rename {devel/articles => articles}/adbcva_files/crosstalk-1.2.0/scss/crosstalk.scss (100%) rename {devel/articles/adbcva_files/datatables-binding-0.21 => articles/adbcva_files/datatables-binding-0.30}/datatables.js (96%) create mode 100644 articles/adbcva_files/datatables-css-0.0.0/datatables-crosstalk.css rename {devel/articles/adbcva_files/dt-core-1.11.3 => articles/adbcva_files/dt-core-1.13.4}/css/jquery.dataTables.extra.css (100%) create mode 100644 articles/adbcva_files/dt-core-1.13.4/css/jquery.dataTables.min.css create mode 100644 articles/adbcva_files/dt-core-1.13.4/js/jquery.dataTables.min.js create mode 100644 articles/adbcva_files/dt-ext-buttons-1.13.4/css/buttons.dataTables.min.css create mode 100644 articles/adbcva_files/dt-ext-buttons-1.13.4/js/buttons.colVis.min.js create mode 100644 articles/adbcva_files/dt-ext-buttons-1.13.4/js/buttons.html5.min.js create mode 100644 articles/adbcva_files/dt-ext-buttons-1.13.4/js/buttons.print.min.js create mode 100644 articles/adbcva_files/dt-ext-buttons-1.13.4/js/dataTables.buttons.min.js rename {devel/articles/adbcva_files/dt-ext-colreorder-1.11.3 => articles/adbcva_files/dt-ext-colreorder-1.13.4}/css/colReorder.dataTables.min.css (100%) create mode 100644 articles/adbcva_files/dt-ext-colreorder-1.13.4/js/dataTables.colReorder.min.js rename {devel/articles/adbcva_files/dt-ext-scroller-1.11.3 => articles/adbcva_files/dt-ext-scroller-1.13.4}/css/scroller.dataTables.min.css (74%) create mode 100644 articles/adbcva_files/dt-ext-scroller-1.13.4/js/dataTables.scroller.min.js rename {devel/articles/adbcva_files/dt-plugin-searchhighlight-1.11.3 => articles/adbcva_files/dt-plugin-searchhighlight-1.13.4}/jquery.highlight.js (100%) rename {devel/articles/adbcva_files/dt-plugin-searchhighlight-1.11.3 => articles/adbcva_files/dt-plugin-searchhighlight-1.13.4}/source.css (100%) create mode 100644 articles/adbcva_files/dt-plugin-searchhighlight-1.13.4/source.min.js rename {devel/articles => articles}/adbcva_files/dt-scroll-1.0.0/style.css (100%) rename {pre-release/articles/adbcva_files/htmlwidgets-1.5.4 => articles/adbcva_files/htmlwidgets-1.6.2}/htmlwidgets.js (96%) rename {devel/articles => articles}/adbcva_files/nouislider-7.0.10/jquery.nouislider.min.css (100%) rename {devel/articles => articles}/adbcva_files/nouislider-7.0.10/jquery.nouislider.min.js (100%) rename {devel/articles => articles}/adbcva_files/selectize-0.12.0/selectize.bootstrap3.css (100%) rename {devel/articles => articles}/adbcva_files/selectize-0.12.0/selectize.min.js (100%) rename {main/articles => articles}/admiralophtha.html (90%) rename {main/articles => articles}/adoe.html (53%) create mode 100644 articles/advfq.html rename {main/articles => articles}/index.html (84%) rename {main/articles => articles}/standards.html (88%) rename main/authors.html => authors.html (87%) create mode 100644 deps/bootstrap-5.2.2/bootstrap.bundle.min.js create mode 100644 deps/bootstrap-5.2.2/bootstrap.bundle.min.js.map create mode 100644 deps/bootstrap-5.2.2/bootstrap.min.css rename {devel/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/font.css (100%) create mode 100644 deps/bootstrap-5.2.2/fonts/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVs9pbCIPrc.woff create mode 100644 deps/bootstrap-5.2.2/fonts/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrc.woff create mode 100644 deps/bootstrap-5.2.2/fonts/1adeadb2fe618c5ed46221f15e12b9c8.woff create mode 100644 deps/bootstrap-5.2.2/fonts/4iCs6KVjbNBYlgo6ew.woff create mode 100644 deps/bootstrap-5.2.2/fonts/4iCs6KVjbNBYlgoKfw7w.woff create mode 100644 deps/bootstrap-5.2.2/fonts/4iCv6KVjbNBYlgoCxCvTtA.woff create mode 100644 deps/bootstrap-5.2.2/fonts/4iCv6KVjbNBYlgoCxCvjsGyL.woff create mode 100644 deps/bootstrap-5.2.2/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDQ.woff create mode 100644 deps/bootstrap-5.2.2/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPa7j.woff create mode 100644 deps/bootstrap-5.2.2/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3aPA.woff create mode 100644 deps/bootstrap-5.2.2/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7j.woff create mode 100644 deps/bootstrap-5.2.2/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rAkw.woff create mode 100644 deps/bootstrap-5.2.2/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vAkw.woff create mode 100644 deps/bootstrap-5.2.2/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdo.woff create mode 100644 deps/bootstrap-5.2.2/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zAkw.woff create mode 100644 deps/bootstrap-5.2.2/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdo.woff create mode 100644 deps/bootstrap-5.2.2/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNRevw.woff rename {devel/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvaNA.woff (74%) rename {main/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/fonts/CSR64z1Qlv-GDxkbKVQ_TOQ.woff (79%) create mode 100644 deps/bootstrap-5.2.2/fonts/CSR64z1Qlv-GDxkbKVQ_fOAKSw.woff create mode 100644 deps/bootstrap-5.2.2/fonts/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DBKXhM0.woff create mode 100644 deps/bootstrap-5.2.2/fonts/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DMyQhM0.woff create mode 100644 deps/bootstrap-5.2.2/fonts/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTbI1rSg.woff create mode 100644 deps/bootstrap-5.2.2/fonts/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTsoprSg.woff create mode 100644 deps/bootstrap-5.2.2/fonts/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtZ6Ew9.woff create mode 100644 deps/bootstrap-5.2.2/fonts/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Ew9.woff create mode 100644 deps/bootstrap-5.2.2/fonts/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCuM70w9.woff rename {devel/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/fonts/KFOlCnqEu92Fr1MmEU9fBBc-.woff (86%) rename {pre-release/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/fonts/KFOlCnqEu92Fr1MmEU9vAA.woff (81%) rename {pre-release/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/fonts/KFOlCnqEu92Fr1MmSU5fBBc-.woff (87%) rename {pre-release/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/fonts/KFOlCnqEu92Fr1MmSU5vAA.woff (82%) rename {pre-release/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/fonts/KFOlCnqEu92Fr1MmWUlfBBc-.woff (87%) rename {main/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/fonts/KFOlCnqEu92Fr1MmWUlvAA.woff (81%) rename {pre-release/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/fonts/KFOmCnqEu92Fr1Me5g.woff (83%) rename {pre-release/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/fonts/KFOmCnqEu92Fr1Mu4mxM.woff (86%) create mode 100644 deps/bootstrap-5.2.2/fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhL.woff create mode 100644 deps/bootstrap-5.2.2/fonts/S6u8w4BMUTPHjxsAXC-s.woff create mode 100644 deps/bootstrap-5.2.2/fonts/S6u8w4BMUTPHjxswWA.woff create mode 100644 deps/bootstrap-5.2.2/fonts/S6u9w4BMUTPHh6UVSwiPHw.woff rename {pre-release/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/fonts/S6u9w4BMUTPHh6UVeww.woff (59%) create mode 100644 deps/bootstrap-5.2.2/fonts/S6u9w4BMUTPHh7USSwiPHw.woff rename {devel/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/fonts/S6u9w4BMUTPHh7USeww.woff (50%) create mode 100644 deps/bootstrap-5.2.2/fonts/S6uyw4BMUTPHjx4wWA.woff create mode 100644 deps/bootstrap-5.2.2/fonts/S6uyw4BMUTPHvxo.woff create mode 100644 deps/bootstrap-5.2.2/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYMZs.woff create mode 100644 deps/bootstrap-5.2.2/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZs.woff create mode 100644 deps/bootstrap-5.2.2/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZs.woff create mode 100644 deps/bootstrap-5.2.2/fonts/XRXI3I6Li01BKofiOc5wtlZ2di8HDFwmRTA.woff create mode 100644 deps/bootstrap-5.2.2/fonts/XRXI3I6Li01BKofiOc5wtlZ2di8HDGUmRTA.woff create mode 100644 deps/bootstrap-5.2.2/fonts/XRXI3I6Li01BKofiOc5wtlZ2di8HDLshRTA.woff create mode 100644 deps/bootstrap-5.2.2/fonts/a98f7a7574819ba83bec6279a2cecd95.woff create mode 100644 deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk0ZjaVQ.woff create mode 100644 deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkWVAexg.woff create mode 100644 deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkaVQ.woff create mode 100644 deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkWVAexg.woff rename {devel/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkaVQ.woff (86%) create mode 100644 deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk_RkaVQ.woff create mode 100644 deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkxhjaVQ.woff create mode 100644 deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjWVAexg.woff create mode 100644 deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjaVQ.woff create mode 100644 deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1x4gaVQ.woff create mode 100644 deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1y4k.woff create mode 100644 deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsgH1y4k.woff create mode 100644 deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgshZ1y4k.woff create mode 100644 deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0B4gaVQ.woff create mode 100644 deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0C4k.woff create mode 100644 deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVQ.woff rename {pre-release/deps/bootstrap-5.1.0 => deps/bootstrap-5.2.2}/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0C4k.woff (87%) create mode 100644 deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjr0C4k.woff create mode 100644 deps/bootstrap-5.2.2/fonts/q5uGsou0JOdh94bfvQlr.woff rename {devel/deps => deps}/data-deps.txt (56%) rename {devel/deps => deps}/jquery-3.6.0/jquery-3.6.0.js (100%) rename {devel/deps => deps}/jquery-3.6.0/jquery-3.6.0.min.js (100%) rename {devel/deps => deps}/jquery-3.6.0/jquery-3.6.0.min.map (100%) delete mode 100644 devel/.nojekyll delete mode 100644 devel/404.html delete mode 100644 devel/LICENSE.html delete mode 100644 devel/articles/adbcva.html delete mode 100644 devel/articles/adbcva_files/datatables-css-0.0.0/datatables-crosstalk.css delete mode 100644 devel/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.min.css delete mode 100644 devel/articles/adbcva_files/dt-core-1.11.3/js/jquery.dataTables.min.js delete mode 100644 devel/articles/adbcva_files/dt-ext-buttons-1.11.3/css/buttons.dataTables.min.css delete mode 100644 devel/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.colVis.min.js delete mode 100644 devel/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.html5.min.js delete mode 100644 devel/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.print.min.js delete mode 100644 devel/articles/adbcva_files/dt-ext-buttons-1.11.3/js/dataTables.buttons.min.js delete mode 100644 devel/articles/adbcva_files/dt-ext-colreorder-1.11.3/js/dataTables.colReorder.min.js delete mode 100644 devel/articles/adbcva_files/dt-ext-scroller-1.11.3/js/dataTables.scroller.min.js delete mode 100644 devel/articles/adbcva_files/dt-plugin-searchhighlight-1.11.3/source.min.js delete mode 100644 devel/articles/adbcva_files/htmlwidgets-1.5.4/htmlwidgets.js delete mode 100644 devel/articles/admiralophtha.html delete mode 100644 devel/articles/adoe.html delete mode 100644 devel/articles/advfq.html delete mode 100644 devel/articles/index.html delete mode 100644 devel/articles/standards.html delete mode 100644 devel/authors.html delete mode 100644 devel/deps/bootstrap-5.1.0/bootstrap.bundle.min.js delete mode 100644 devel/deps/bootstrap-5.1.0/bootstrap.bundle.min.js.map delete mode 100644 devel/deps/bootstrap-5.1.0/bootstrap.min.css delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVs9pbCIPrc.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrc.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/4iCs6KVjbNBYlgo6ew.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/4iCs6KVjbNBYlgoKfw7w.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/4iCv6KVjbNBYlgoCxCvTtA.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/4iCv6KVjbNBYlgoCxCvjsGyL.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDQ.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPa7j.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3aPA.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7j.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rAkw.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vAkw.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdo.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zAkw.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdo.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNRevw.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/CSR64z1Qlv-GDxkbKVQ_TOQ.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/CSR64z1Qlv-GDxkbKVQ_fOAKSw.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/JTURjIg1_i6t8kCHKm45_ZpC7g0.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/JTURjIg1_i6t8kCHKm45_dJE7g0.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/JTUSjIg1_i6t8kCHKm45xW0.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/KFOlCnqEu92Fr1MmEU9vAA.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/KFOlCnqEu92Fr1MmSU5fBBc-.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/KFOlCnqEu92Fr1MmSU5vAA.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/KFOlCnqEu92Fr1MmWUlfBBc-.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/KFOlCnqEu92Fr1MmWUlvAA.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/KFOmCnqEu92Fr1Me5g.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/KFOmCnqEu92Fr1Mu4mxM.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhL.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/S6u8w4BMUTPHjxsAXC-s.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/S6u8w4BMUTPHjxswWA.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/S6u9w4BMUTPHh6UVSwiPHw.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/S6u9w4BMUTPHh6UVeww.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/S6u9w4BMUTPHh7USSwiPHw.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/S6uyw4BMUTPHjx4wWA.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/S6uyw4BMUTPHvxo.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYMZs.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZs.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZs.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/XRXV3I6Li01BKof4MQ.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/XRXW3I6Li01BKofA6sKkZQ.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/XRXW3I6Li01BKofAjsOkZQ.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkWVAexg.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkaVQ.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkWVAexg.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjWVAexg.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjaVQ.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1x4gaVQ.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1y4k.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0B4gaVQ.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0C4k.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVQ.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0C4k.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/pe03MImSLYBIv1o4X1M8cc9iB_5p.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/pe0qMImSLYBIv1o4X1M8cfe5.woff delete mode 100644 devel/deps/bootstrap-5.1.0/fonts/q5uGsou0JOdh94bfvQlr.woff delete mode 100644 devel/index.html delete mode 100644 devel/news/index.html delete mode 100644 devel/pkgdown.yml delete mode 100644 devel/pull_request_template.html delete mode 100644 devel/reference/admiralophtha-package.html delete mode 100644 devel/reference/admiralophtha_adbcva.html delete mode 100644 devel/reference/admiralophtha_adoe.html delete mode 100644 devel/reference/admiralophtha_advfq.html delete mode 100644 devel/reference/convert_etdrs_to_logmar.html delete mode 100644 devel/reference/convert_logmar_to_etdrs.html delete mode 100644 devel/reference/derive_var_afeye.html delete mode 100644 devel/reference/derive_var_bcvacritxfl.html delete mode 100644 devel/reference/derive_var_bcvacritxfl_util.html delete mode 100644 devel/reference/derive_var_studyeye.html delete mode 100644 devel/reference/index.html delete mode 100644 devel/search.json delete mode 100644 devel/sitemap.xml rename devel/favicon-16x16.png => favicon-16x16.png (100%) rename devel/favicon-32x32.png => favicon-32x32.png (100%) rename devel/favicon.ico => favicon.ico (100%) rename devel/link.svg => link.svg (100%) rename devel/logo.png => logo.png (100%) delete mode 100644 main/.nojekyll delete mode 100644 main/apple-touch-icon-120x120.png delete mode 100644 main/apple-touch-icon-152x152.png delete mode 100644 main/apple-touch-icon-180x180.png delete mode 100644 main/apple-touch-icon-60x60.png delete mode 100644 main/apple-touch-icon-76x76.png delete mode 100644 main/apple-touch-icon.png delete mode 100644 main/articles/adbcva.html delete mode 100644 main/articles/adbcva_files/crosstalk-1.2.0/css/crosstalk.min.css delete mode 100644 main/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js delete mode 100644 main/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js.map delete mode 100644 main/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js delete mode 100644 main/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js.map delete mode 100644 main/articles/adbcva_files/crosstalk-1.2.0/scss/crosstalk.scss delete mode 100644 main/articles/adbcva_files/datatables-binding-0.21/datatables.js delete mode 100644 main/articles/adbcva_files/datatables-css-0.0.0/datatables-crosstalk.css delete mode 100644 main/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.extra.css delete mode 100644 main/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.min.css delete mode 100644 main/articles/adbcva_files/dt-core-1.11.3/js/jquery.dataTables.min.js delete mode 100644 main/articles/adbcva_files/dt-ext-buttons-1.11.3/css/buttons.dataTables.min.css delete mode 100644 main/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.colVis.min.js delete mode 100644 main/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.html5.min.js delete mode 100644 main/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.print.min.js delete mode 100644 main/articles/adbcva_files/dt-ext-buttons-1.11.3/js/dataTables.buttons.min.js delete mode 100644 main/articles/adbcva_files/dt-ext-colreorder-1.11.3/css/colReorder.dataTables.min.css delete mode 100644 main/articles/adbcva_files/dt-ext-colreorder-1.11.3/js/dataTables.colReorder.min.js delete mode 100644 main/articles/adbcva_files/dt-ext-scroller-1.11.3/css/scroller.dataTables.min.css delete mode 100644 main/articles/adbcva_files/dt-ext-scroller-1.11.3/js/dataTables.scroller.min.js delete mode 100644 main/articles/adbcva_files/dt-plugin-searchhighlight-1.11.3/jquery.highlight.js delete mode 100644 main/articles/adbcva_files/dt-plugin-searchhighlight-1.11.3/source.css delete mode 100644 main/articles/adbcva_files/dt-plugin-searchhighlight-1.11.3/source.min.js delete mode 100644 main/articles/adbcva_files/dt-scroll-1.0.0/style.css delete mode 100644 main/articles/adbcva_files/htmlwidgets-1.5.4/htmlwidgets.js delete mode 100644 main/articles/adbcva_files/nouislider-7.0.10/jquery.nouislider.min.css delete mode 100644 main/articles/adbcva_files/nouislider-7.0.10/jquery.nouislider.min.js delete mode 100644 main/articles/adbcva_files/selectize-0.12.0/selectize.bootstrap3.css delete mode 100644 main/articles/adbcva_files/selectize-0.12.0/selectize.min.js delete mode 100644 main/articles/advfq.html delete mode 100644 main/deps/bootstrap-5.1.0/bootstrap.bundle.min.js delete mode 100644 main/deps/bootstrap-5.1.0/bootstrap.bundle.min.js.map delete mode 100644 main/deps/bootstrap-5.1.0/bootstrap.min.css delete mode 100644 main/deps/bootstrap-5.1.0/font.css delete mode 100644 main/deps/bootstrap-5.1.0/fonts/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVs9pbCIPrc.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrc.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/4iCs6KVjbNBYlgo6ew.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/4iCs6KVjbNBYlgoKfw7w.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/4iCv6KVjbNBYlgoCxCvTtA.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/4iCv6KVjbNBYlgoCxCvjsGyL.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDQ.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPa7j.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3aPA.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7j.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rAkw.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vAkw.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdo.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zAkw.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdo.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNRevw.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvaNA.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/CSR64z1Qlv-GDxkbKVQ_fOAKSw.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/JTURjIg1_i6t8kCHKm45_ZpC7g0.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/JTURjIg1_i6t8kCHKm45_dJE7g0.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/JTUSjIg1_i6t8kCHKm45xW0.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/KFOlCnqEu92Fr1MmEU9fBBc-.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/KFOlCnqEu92Fr1MmEU9vAA.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/KFOlCnqEu92Fr1MmSU5fBBc-.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/KFOlCnqEu92Fr1MmSU5vAA.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/KFOlCnqEu92Fr1MmWUlfBBc-.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/KFOmCnqEu92Fr1Me5g.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/KFOmCnqEu92Fr1Mu4mxM.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhL.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/S6u8w4BMUTPHjxsAXC-s.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/S6u8w4BMUTPHjxswWA.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/S6u9w4BMUTPHh6UVSwiPHw.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/S6u9w4BMUTPHh6UVeww.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/S6u9w4BMUTPHh7USSwiPHw.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/S6u9w4BMUTPHh7USeww.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/S6uyw4BMUTPHjx4wWA.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/S6uyw4BMUTPHvxo.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYMZs.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZs.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZs.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/XRXV3I6Li01BKof4MQ.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/XRXW3I6Li01BKofA6sKkZQ.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/XRXW3I6Li01BKofAjsOkZQ.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkWVAexg.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkaVQ.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkWVAexg.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkaVQ.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjWVAexg.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjaVQ.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1x4gaVQ.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1y4k.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0B4gaVQ.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0C4k.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVQ.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0C4k.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/pe03MImSLYBIv1o4X1M8cc9iB_5p.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/pe0qMImSLYBIv1o4X1M8cfe5.woff delete mode 100644 main/deps/bootstrap-5.1.0/fonts/q5uGsou0JOdh94bfvQlr.woff delete mode 100644 main/deps/data-deps.txt delete mode 100644 main/deps/jquery-3.6.0/jquery-3.6.0.js delete mode 100644 main/deps/jquery-3.6.0/jquery-3.6.0.min.js delete mode 100644 main/deps/jquery-3.6.0/jquery-3.6.0.min.map delete mode 100644 main/favicon-16x16.png delete mode 100644 main/favicon-32x32.png delete mode 100644 main/favicon.ico delete mode 100644 main/index.html delete mode 100644 main/link.svg delete mode 100644 main/logo.png delete mode 100644 main/pkgdown.js delete mode 100644 main/pkgdown.yml delete mode 100644 main/reference/Rplot001.png delete mode 100644 main/reference/figures/logo.png delete mode 100644 main/search.json delete mode 100644 main/sitemap.xml rename {main/news => news}/index.html (88%) rename devel/pkgdown.js => pkgdown.js (100%) create mode 100644 pkgdown.yml delete mode 100644 pre-release/.nojekyll delete mode 100644 pre-release/404.html delete mode 100644 pre-release/LICENSE.html delete mode 100644 pre-release/apple-touch-icon-120x120.png delete mode 100644 pre-release/apple-touch-icon-152x152.png delete mode 100644 pre-release/apple-touch-icon-180x180.png delete mode 100644 pre-release/apple-touch-icon-60x60.png delete mode 100644 pre-release/apple-touch-icon-76x76.png delete mode 100644 pre-release/apple-touch-icon.png delete mode 100644 pre-release/articles/adbcva.html delete mode 100644 pre-release/articles/adbcva_files/crosstalk-1.2.0/css/crosstalk.min.css delete mode 100644 pre-release/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js delete mode 100644 pre-release/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js.map delete mode 100644 pre-release/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js delete mode 100644 pre-release/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js.map delete mode 100644 pre-release/articles/adbcva_files/crosstalk-1.2.0/scss/crosstalk.scss delete mode 100644 pre-release/articles/adbcva_files/datatables-binding-0.21/datatables.js delete mode 100644 pre-release/articles/adbcva_files/datatables-css-0.0.0/datatables-crosstalk.css delete mode 100644 pre-release/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.extra.css delete mode 100644 pre-release/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.min.css delete mode 100644 pre-release/articles/adbcva_files/dt-core-1.11.3/js/jquery.dataTables.min.js delete mode 100644 pre-release/articles/adbcva_files/dt-ext-buttons-1.11.3/css/buttons.dataTables.min.css delete mode 100644 pre-release/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.colVis.min.js delete mode 100644 pre-release/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.html5.min.js delete mode 100644 pre-release/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.print.min.js delete mode 100644 pre-release/articles/adbcva_files/dt-ext-buttons-1.11.3/js/dataTables.buttons.min.js delete mode 100644 pre-release/articles/adbcva_files/dt-ext-colreorder-1.11.3/css/colReorder.dataTables.min.css delete mode 100644 pre-release/articles/adbcva_files/dt-ext-colreorder-1.11.3/js/dataTables.colReorder.min.js delete mode 100644 pre-release/articles/adbcva_files/dt-ext-scroller-1.11.3/css/scroller.dataTables.min.css delete mode 100644 pre-release/articles/adbcva_files/dt-ext-scroller-1.11.3/js/dataTables.scroller.min.js delete mode 100644 pre-release/articles/adbcva_files/dt-plugin-searchhighlight-1.11.3/jquery.highlight.js delete mode 100644 pre-release/articles/adbcva_files/dt-plugin-searchhighlight-1.11.3/source.css delete mode 100644 pre-release/articles/adbcva_files/dt-plugin-searchhighlight-1.11.3/source.min.js delete mode 100644 pre-release/articles/adbcva_files/dt-scroll-1.0.0/style.css delete mode 100644 pre-release/articles/adbcva_files/nouislider-7.0.10/jquery.nouislider.min.css delete mode 100644 pre-release/articles/adbcva_files/nouislider-7.0.10/jquery.nouislider.min.js delete mode 100644 pre-release/articles/adbcva_files/selectize-0.12.0/selectize.bootstrap3.css delete mode 100644 pre-release/articles/adbcva_files/selectize-0.12.0/selectize.min.js delete mode 100644 pre-release/articles/admiralophtha.html delete mode 100644 pre-release/articles/adoe.html delete mode 100644 pre-release/articles/advfq.html delete mode 100644 pre-release/articles/index.html delete mode 100644 pre-release/articles/standards.html delete mode 100644 pre-release/authors.html delete mode 100644 pre-release/deps/bootstrap-5.1.0/bootstrap.bundle.min.js delete mode 100644 pre-release/deps/bootstrap-5.1.0/bootstrap.bundle.min.js.map delete mode 100644 pre-release/deps/bootstrap-5.1.0/bootstrap.min.css delete mode 100644 pre-release/deps/bootstrap-5.1.0/font.css delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVs9pbCIPrc.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrc.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/4iCs6KVjbNBYlgo6ew.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/4iCs6KVjbNBYlgoKfw7w.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/4iCv6KVjbNBYlgoCxCvTtA.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/4iCv6KVjbNBYlgoCxCvjsGyL.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDQ.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPa7j.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3aPA.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7j.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rAkw.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vAkw.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdo.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zAkw.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdo.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNRevw.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvaNA.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/CSR64z1Qlv-GDxkbKVQ_TOQ.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/CSR64z1Qlv-GDxkbKVQ_fOAKSw.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/JTURjIg1_i6t8kCHKm45_ZpC7g0.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/JTURjIg1_i6t8kCHKm45_dJE7g0.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/JTUSjIg1_i6t8kCHKm45xW0.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/KFOlCnqEu92Fr1MmEU9fBBc-.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/KFOlCnqEu92Fr1MmWUlvAA.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhL.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/S6u8w4BMUTPHjxsAXC-s.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/S6u8w4BMUTPHjxswWA.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/S6u9w4BMUTPHh6UVSwiPHw.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/S6u9w4BMUTPHh7USSwiPHw.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/S6u9w4BMUTPHh7USeww.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/S6uyw4BMUTPHjx4wWA.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/S6uyw4BMUTPHvxo.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYMZs.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZs.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZs.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/XRXV3I6Li01BKof4MQ.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/XRXW3I6Li01BKofA6sKkZQ.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/XRXW3I6Li01BKofAjsOkZQ.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkWVAexg.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkaVQ.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkWVAexg.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkaVQ.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjWVAexg.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjaVQ.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1x4gaVQ.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1y4k.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0B4gaVQ.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0C4k.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVQ.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/pe03MImSLYBIv1o4X1M8cc9iB_5p.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/pe0qMImSLYBIv1o4X1M8cfe5.woff delete mode 100644 pre-release/deps/bootstrap-5.1.0/fonts/q5uGsou0JOdh94bfvQlr.woff delete mode 100644 pre-release/deps/data-deps.txt delete mode 100644 pre-release/deps/jquery-3.6.0/jquery-3.6.0.js delete mode 100644 pre-release/deps/jquery-3.6.0/jquery-3.6.0.min.js delete mode 100644 pre-release/deps/jquery-3.6.0/jquery-3.6.0.min.map delete mode 100644 pre-release/favicon-16x16.png delete mode 100644 pre-release/favicon-32x32.png delete mode 100644 pre-release/favicon.ico delete mode 100644 pre-release/index.html delete mode 100644 pre-release/link.svg delete mode 100644 pre-release/logo.png delete mode 100644 pre-release/news/index.html delete mode 100644 pre-release/pkgdown.js delete mode 100644 pre-release/pkgdown.yml delete mode 100644 pre-release/pull_request_template.html delete mode 100644 pre-release/reference/Rplot001.png delete mode 100644 pre-release/reference/admiralophtha-package.html delete mode 100644 pre-release/reference/admiralophtha_adbcva.html delete mode 100644 pre-release/reference/admiralophtha_adoe.html delete mode 100644 pre-release/reference/admiralophtha_advfq.html delete mode 100644 pre-release/reference/admiralophtha_ex.html delete mode 100644 pre-release/reference/admiralophtha_qs.html delete mode 100644 pre-release/reference/convert_etdrs_to_logmar.html delete mode 100644 pre-release/reference/convert_logmar_to_etdrs.html delete mode 100644 pre-release/reference/derive_var_afeye.html delete mode 100644 pre-release/reference/derive_var_bcvacritxfl.html delete mode 100644 pre-release/reference/derive_var_bcvacritxfl_util.html delete mode 100644 pre-release/reference/derive_var_studyeye.html delete mode 100644 pre-release/reference/figures/logo.png delete mode 100644 pre-release/reference/index.html delete mode 100644 pre-release/search.json delete mode 100644 pre-release/sitemap.xml rename main/pull_request_template.html => pull_request_template.html (64%) rename {devel/reference => reference}/Rplot001.png (100%) rename {main/reference => reference}/admiralophtha-package.html (88%) rename {main/reference => reference}/admiralophtha_adbcva.html (86%) rename {main/reference => reference}/admiralophtha_adoe.html (85%) rename {main/reference => reference}/admiralophtha_advfq.html (86%) rename {main/reference => reference}/convert_etdrs_to_logmar.html (69%) rename {main/reference => reference}/convert_logmar_to_etdrs.html (62%) rename {main/reference => reference}/derive_var_afeye.html (58%) rename {main/reference => reference}/derive_var_bcvacritxfl.html (58%) rename {main/reference => reference}/derive_var_bcvacritxfl_util.html (85%) rename {main/reference => reference}/derive_var_studyeye.html (67%) rename {devel/reference => reference}/figures/logo.png (100%) rename {main/reference => reference}/index.html (88%) create mode 100644 search.json create mode 100644 sitemap.xml diff --git a/main/404.html b/404.html similarity index 67% rename from main/404.html rename to 404.html index c1594956..985539ca 100644 --- a/main/404.html +++ b/404.html @@ -6,30 +6,30 @@ Page not found (404) • admiralophtha - - - - - - - - - + + + + + + + + + - - + + - Skip to contents + Skip to contents
diff --git a/main/LICENSE.html b/LICENSE.html similarity index 88% rename from main/LICENSE.html rename to LICENSE.html index 77fe899e..004f7802 100644 --- a/main/LICENSE.html +++ b/LICENSE.html @@ -1,5 +1,5 @@ -Apache License • admiralophthaApache License • admiralophtha @@ -36,14 +36,6 @@ - - @@ -82,7 +74,7 @@

Terms and Conditions for use, reproduction, and distribution

-

1. Definitions

+

1. Definitions

“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

@@ -95,15 +87,15 @@

1. Definitions“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

- +

Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

-

3. Grant of Patent License

+

3. Grant of Patent License

Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

-

4. Redistribution

+

4. Redistribution

You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

-

5. Submission of Contributions

+

5. Submission of Contributions

Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

-

6. Trademarks

+

6. Trademarks

This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

-

7. Disclaimer of Warranty

+

7. Disclaimer of Warranty

Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

-

8. Limitation of Liability

+

8. Limitation of Liability

In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

-

9. Accepting Warranty or Additional Liability

+

9. Accepting Warranty or Additional Liability

While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

diff --git a/devel/apple-touch-icon-120x120.png b/apple-touch-icon-120x120.png similarity index 100% rename from devel/apple-touch-icon-120x120.png rename to apple-touch-icon-120x120.png diff --git a/devel/apple-touch-icon-152x152.png b/apple-touch-icon-152x152.png similarity index 100% rename from devel/apple-touch-icon-152x152.png rename to apple-touch-icon-152x152.png diff --git a/devel/apple-touch-icon-180x180.png b/apple-touch-icon-180x180.png similarity index 100% rename from devel/apple-touch-icon-180x180.png rename to apple-touch-icon-180x180.png diff --git a/devel/apple-touch-icon-60x60.png b/apple-touch-icon-60x60.png similarity index 100% rename from devel/apple-touch-icon-60x60.png rename to apple-touch-icon-60x60.png diff --git a/devel/apple-touch-icon-76x76.png b/apple-touch-icon-76x76.png similarity index 100% rename from devel/apple-touch-icon-76x76.png rename to apple-touch-icon-76x76.png diff --git a/devel/apple-touch-icon.png b/apple-touch-icon.png similarity index 100% rename from devel/apple-touch-icon.png rename to apple-touch-icon.png diff --git a/articles/adbcva.html b/articles/adbcva.html new file mode 100644 index 00000000..6e3e123c --- /dev/null +++ b/articles/adbcva.html @@ -0,0 +1,572 @@ + + + + + + + + +Creating ADBCVA • admiralophtha + + + + + + + + + + + + + + + + + Skip to contents + + +
+ + + + + + + + + + + + + + +
+
+ + + +
+

Introduction +

+

This article describes creating an ADBCVA ADaM with Best-Corrected +Visual Acuity (BCVA) data for ophthalmology endpoints. It is to be used +in conjunction with the article on creating +a BDS dataset from SDTM. As such, derivations and processes that are +not specific to ADBCVA are absent, and the user is invited to consult +the aforementioned article for guidance.

+

Note: All examples assume CDISC SDTM and/or ADaM +format as input unless otherwise specified.

+
+

Dataset Contents +

+

As the name ADBCVA implies, admiralophtha suggests to +populate ADBCVA solely with BCVA records from the OE SDTM.

+
+
+

Required Packages +

+

The examples of this vignette require the following packages.

+ +
+
+
+

Programming Workflow +

+ +
+

Initial set up of ADBCVA +

+

As with all BDS ADaM datasets, one should start from the OE SDTM, +where only the BCVA records are of interest. For the purposes of the +next two sections, we shall be using the admiral OE and +ADSL test data. We will also require a lookup table for the mapping of +parameter codes.

+

Note: to simulate an ophthalmology study, we add a +randomly generated STUDYEYE variable to ADSL, but in +practice STUDYEYE will already have been derived using +derive_var_studyeye().

+
+data("oe_ophtha")
+data("admiral_adsl")
+
+# Add STUDYEYE to ADSL to simulate an ophtha dataset
+adsl <- admiral_adsl %>%
+  as.data.frame() %>%
+  mutate(STUDYEYE = sample(c("LEFT", "RIGHT"), n(), replace = TRUE)) %>%
+  convert_blanks_to_na()
+
+oe <- convert_blanks_to_na(oe_ophtha) %>%
+  ungroup()
+
+# ---- Lookup table ----
+param_lookup <- tibble::tribble(
+  ~OETESTCD, ~OECAT, ~OESCAT, ~AFEYE, ~PARAMCD, ~PARAM, ~PARAMN,
+  "VACSCORE", "BEST CORRECTED VISUAL ACUITY", "OVERALL EVALUATION", "Study Eye", "SBCVA", "Study Eye Visual Acuity Score (letters)", 1, # nolint
+  "VACSCORE", "BEST CORRECTED VISUAL ACUITY", "OVERALL EVALUATION", "Fellow Eye", "FBCVA", "Fellow Eye Visual Acuity Score (letters)", 2, # nolint
+)
+

Following this setup, the programmer can start constructing ADBCVA. +The first step is to subset OE to only BCVA parameters and merge with +ADSL. This is required for two reasons: firstly, STUDYEYE +is crucial in the mapping of AFEYE and +PARAMCD’s. Secondly, the treatment start date +(TRTSDT) is also a prerequisite for the derivation of +variables such as Analysis Day (ADY).

+
+adsl_vars <- exprs(TRTSDT, TRTEDT, TRT01A, TRT01P, STUDYEYE)
+
+adbcva <- oe %>%
+  filter(
+    OETESTCD %in% c("VACSCORE")
+  ) %>%
+  derive_vars_merged(
+    dataset_add = adsl,
+    new_vars = adsl_vars,
+    by_vars = exprs(STUDYID, USUBJID)
+  )
+

The next item of business is to derive AVAL, +AVALU, and DTYPE. In this example, due to the +small number of parameters their derivation is trivial. +AFEYE is also created in this step using the function +derive_var_afeye().

+
+adbcva <- adbcva %>%
+  mutate(
+    AVAL = OESTRESN,
+    AVALU = "letters",
+    DTYPE = NA_character_
+  ) %>%
+  derive_var_afeye(OELOC, OELAT)
+

Moving forwards, PARAM and PARAMCD can be +assigned using derive_vars_merged() from +admiral and the lookup table param_lookup +generated above.

+
+adbcva <- adbcva %>%
+  derive_vars_merged(
+    dataset_add = param_lookup,
+    new_vars = exprs(PARAM, PARAMCD),
+    by_vars = exprs(OETESTCD, AFEYE),
+    filter_add = PARAMCD %in% c("SBCVA", "FBCVA")
+  )
+
+
+

Deriving LogMAR Score Parameters +

+

Often ADBCVA datasets contain derived records for BCVA in LogMAR +units. This can easily be achieved as follows using +derive_param_computed(). The conversion of units is done +using convert_etdrs_to_logmar(). Two separate calls are +required due to the parameters being split by study and fellow eye. Once +these extra parameters are added, all the records that will be in the +end dataset are now present, so AVALC and day/date +variables such as ADY and ADT can be +derived.

+
+adbcva <- adbcva %>%
+  derive_param_computed(
+    by_vars = c(exprs(STUDYID, USUBJID, VISIT, VISITNUM, OEDY, OEDTC, AFEYE), adsl_vars),
+    parameters = c("SBCVA"),
+    set_values_to = exprs(
+      AVAL = convert_etdrs_to_logmar(AVAL.SBCVA),
+      PARAMCD = "SBCVALOG",
+      PARAM = "Study Eye Visual Acuity LogMAR Score",
+      DTYPE = NA_character_,
+      AVALU = "LogMAR"
+    )
+  ) %>%
+  derive_param_computed(
+    by_vars = c(exprs(STUDYID, USUBJID, VISIT, OEDY, OEDTC, AFEYE), adsl_vars),
+    parameters = c("FBCVA"),
+    set_values_to = exprs(
+      AVAL = convert_etdrs_to_logmar(AVAL.FBCVA),
+      PARAMCD = "FBCVALOG",
+      PARAM = "Fellow Eye Visual Acuity LogMAR Score",
+      DTYPE = NA_character_,
+      AVALU = "LogMAR"
+    )
+  ) %>%
+  mutate(AVALC = as.character(AVAL)) %>%
+  derive_vars_dt(
+    new_vars_prefix = "A",
+    dtc = OEDTC,
+    flag_imputation = "none"
+  ) %>%
+  derive_vars_dy(reference_date = TRTSDT, source_vars = exprs(ADT))
+

Importantly, the above calls to derive_param_computed() +list the SDTM variables VISIT, VISITNUM, +OEDY and OEDTC as by_vars for the +function. This is because they will be necessary to derive ADaM +variables such as AVISIT and ADY in successive +steps. Once all the ADaM variables which require them are derived, the +SDTM variables should be set to missing for the derived records, as per +ADaM standards:

+
+adbcva <- adbcva %>%
+  mutate(
+    VISIT = ifelse(PARAMCD %in% c("SBCVALOG", "FBCVALOG"), NA_character_, VISIT),
+    VISITNUM = ifelse(PARAMCD %in% c("SBCVALOG", "FBCVALOG"), NA, VISITNUM),
+    OEDY = ifelse(PARAMCD %in% c("SBCVALOG", "FBCVALOG"), NA, OEDY),
+    OEDTC = ifelse(PARAMCD %in% c("SBCVALOG", "FBCVALOG"), NA_character_, OEDTC)
+  )
+
+
+

Further Derivations of Standard BDS Variables +

+

The user is invited to consult the article on creating +a BDS dataset from SDTM to learn how to add standard BDS variables +to ADBCVA. Henceforth, for the purposes of this article, the following +sections use the ADBCVA dataset generated by the corresponding +admiralophtha template program as a starting point.

+

Note: This dataset already comes with some criterion +flags and analysis value categorisation variables, so for illustration +purposes these are removed.

+
+data("admiralophtha_adbcva")
+
+adbcva <- admiralophtha_adbcva %>%
+  select(-starts_with("CRIT"), -starts_with("AVALCA"))
+
+
+

Deriving Analysis Value Categories for Snellen Scores +

+

Some ophthalmology studies may desire to subdivide BCVA records +according to which Snellen category they fall into (eg, 20/320, 20/100, +20/20 etc). This is best done through the use of +AVALCATx/AVALCAxN variable pairs. Currently, +admiralophtha does not provide specific functionality to +create AVALCATx/AVALCAxN pairs, although this +may be included in future releases of the package. With the current +toolset, the suggested approach to derive such variables is to:

+
    +
  • Create a lookup table which assigns numeric equivalents +(i.e. AVALCAxN) to Snellen categories.
  • +
  • Create a format function to map each AVAL to a numeric +category.
  • +
  • Add AVALCAxN through a mutate statement using the +format function.
  • +
  • Add AVALCATx using derive_vars_merged in +combination with the lookup table.
  • +
+
+avalcat_lookup <- tibble::tribble(
+  ~PARAMCD, ~AVALCA1N, ~AVALCAT1,
+  "SBCVA", 1000, "< 20/800",
+  "SBCVA", 800, "20/800",
+  "SBCVA", 640, "20/640",
+  "SBCVA", 500, "20/500",
+  "SBCVA", 400, "20/400",
+  "SBCVA", 320, "20/320",
+  "SBCVA", 250, "20/250",
+  "SBCVA", 200, "20/200",
+  "SBCVA", 160, "20/160",
+  "SBCVA", 125, "20/125",
+  "SBCVA", 100, "20/100",
+  "SBCVA", 80, "20/80",
+  "SBCVA", 63, "20/63",
+  "SBCVA", 50, "20/50",
+  "SBCVA", 40, "20/40",
+  "SBCVA", 32, "20/32",
+  "SBCVA", 25, "20/25",
+  "SBCVA", 20, "20/20",
+  "SBCVA", 16, "20/16",
+  "SBCVA", 12, "20/12",
+  "SBCVA", 1, "> 20/12",
+)
+
+avalcat_lookup <- avalcat_lookup %>%
+  mutate(PARAMCD = "FBCVA") %>%
+  rbind(avalcat_lookup)
+
+format_avalcat1n <- function(param, aval) {
+  case_when(
+    param %in% c("SBCVA", "FBCVA") & aval >= 0 & aval <= 3 ~ 1000,
+    param %in% c("SBCVA", "FBCVA") & aval >= 4 & aval <= 8 ~ 800,
+    param %in% c("SBCVA", "FBCVA") & aval >= 9 & aval <= 13 ~ 640,
+    param %in% c("SBCVA", "FBCVA") & aval >= 14 & aval <= 18 ~ 500,
+    param %in% c("SBCVA", "FBCVA") & aval >= 19 & aval <= 23 ~ 400,
+    param %in% c("SBCVA", "FBCVA") & aval >= 24 & aval <= 28 ~ 320,
+    param %in% c("SBCVA", "FBCVA") & aval >= 29 & aval <= 33 ~ 250,
+    param %in% c("SBCVA", "FBCVA") & aval >= 34 & aval <= 38 ~ 200,
+    param %in% c("SBCVA", "FBCVA") & aval >= 39 & aval <= 43 ~ 160,
+    param %in% c("SBCVA", "FBCVA") & aval >= 44 & aval <= 48 ~ 125,
+    param %in% c("SBCVA", "FBCVA") & aval >= 49 & aval <= 53 ~ 100,
+    param %in% c("SBCVA", "FBCVA") & aval >= 54 & aval <= 58 ~ 80,
+    param %in% c("SBCVA", "FBCVA") & aval >= 59 & aval <= 63 ~ 63,
+    param %in% c("SBCVA", "FBCVA") & aval >= 64 & aval <= 68 ~ 50,
+    param %in% c("SBCVA", "FBCVA") & aval >= 69 & aval <= 73 ~ 40,
+    param %in% c("SBCVA", "FBCVA") & aval >= 74 & aval <= 78 ~ 32,
+    param %in% c("SBCVA", "FBCVA") & aval >= 79 & aval <= 83 ~ 25,
+    param %in% c("SBCVA", "FBCVA") & aval >= 84 & aval <= 88 ~ 20,
+    param %in% c("SBCVA", "FBCVA") & aval >= 89 & aval <= 93 ~ 16,
+    param %in% c("SBCVA", "FBCVA") & aval >= 94 & aval <= 97 ~ 12,
+    param %in% c("SBCVA", "FBCVA") & aval >= 98 ~ 1
+  )
+}
+
+adbcva <- adbcva %>%
+  mutate(AVALCA1N = format_avalcat1n(param = PARAMCD, aval = AVAL)) %>%
+  derive_vars_merged(
+    avalcat_lookup,
+    by = exprs(PARAMCD, AVALCA1N)
+  )
+

The resulting output is shown below (limited to the first patient +only):

+
+ +
+
+

Deriving Criterion Flags for BCVA Change +

+

admiralophtha suggests the use of criterion flag +variable pairs (CRITx/CRITxFL) to program BCVA +endpoints such as Avoiding a loss of x letters or Gain of y +letters or Gain of between x and y letters (relative to +baseline or other basetypes). The package provides the function +derive_var_bcvacritxfl() to program these endpoints +efficiently and consistently. In terms of the logic to apply to the +variable CHG, the endpoints fall into three classes, which +can be represented by inequalities:

+
    +
  • Class 1: CHG value lying inside a range, +a <= CHG <= b.
  • +
  • Class 2: CHG value below an upper limit, +CHG <= a.
  • +
  • Class 3: CHG value above a lower limit, +CHG => b.
  • +
+

By using derive_var_bcvacritxfl(), the ADaM programmer +can implement all three types of endpoint at once. This is achieved by +feeding the appropriate ranges, upper limits and lower limits to the +bcva_ranges, bcva_uplims and +bcva_lowlims arguments of the function. For instance, let’s +suppose that the endpoints of interest are:

+
    +
  • +Gain of between 5 and 10 letters relative to baseline +(Class 1: 5 <= CHG <= 10)
  • +
  • +Gain of 25 letters or fewer relative to baseline (Class 2: +CHG <= 25)
  • +
  • +Loss of 5 letters or more relative to baseline (Class 2: +CHG <= -5)
  • +
  • +Gain of 15 letters or more relative to baseline (Class 3: +CHG >= 15)
  • +
  • +Loss of 10 letters or fewer relative to baseline (Class 3: +CHG >= -10).
  • +
+

Then, the following call will implement criterion variable/flag pairs +for the endpoints above. The CRITx variables will +automatically encode the correct inequality. Note that that +restrict_derivation() is wrapped around the call so as to +only derive the variables for the relevant parameters. In this way, the +filter argument can be altered to restrict derivation to +only relevant records. Note also that the argument +crit_var = exprs(CHG) has to be specified so that the +criterion flags are derived with respect to the correct variable.

+
+adbcva <- adbcva %>% restrict_derivation(
+  derivation = derive_var_bcvacritxfl,
+  args = params(
+    crit_var = exprs(CHG),
+    bcva_ranges = list(c(5, 10)),
+    bcva_uplims = list(25, -5),
+    bcva_lowlims = list(15, -10)
+  ),
+  filter = PARAMCD %in% c("SBCVA", "FBCVA")
+)
+

The resulting output is shown below (limited to the first patient +only):

+
+

It is also possible to assign significance to the “x” in +CRITxFL. For instance, one could designate all criterion +flags of Class 1 as CRIT1yFL, Class 2 as +CRIT2yFL, and Class 3 as CRIT3yFL. The +argument critxfl_index allows a simple implementation of +this in conjunction with three separate calls to +derive_var_bcvacritxfl():

+
+adbcva <- adbcva %>%
+  restrict_derivation(
+    derivation = derive_var_bcvacritxfl,
+    args = params(
+      crit_var = exprs(CHG),
+      bcva_ranges = list(c(5, 10)),
+      critxfl_index = 10
+    ),
+    filter = PARAMCD %in% c("SBCVA", "FBCVA")
+  ) %>%
+  restrict_derivation(
+    derivation = derive_var_bcvacritxfl,
+    args = params(
+      crit_var = exprs(CHG),
+      bcva_uplims = list(25, -5),
+      critxfl_index = 20
+    ),
+    filter = PARAMCD %in% c("SBCVA", "FBCVA")
+  ) %>%
+  restrict_derivation(
+    derivation = derive_var_bcvacritxfl,
+    args = params(
+      crit_var = exprs(CHG),
+      bcva_lowlims = list(15, -10),
+      critxfl_index = 30
+    ),
+    filter = PARAMCD %in% c("SBCVA", "FBCVA")
+  )
+
+
+

Additional Notes +

+
    +
  • When interpreting endpoints such as Loss of 5 letters or +fewer relative to baseline, it is implicitly assumed in this +article that this also includes the case where letters are +gained, so that the inequality reads CHG >= -5. +One would then use the bcva_lowlims = list(-5) argument of +derive_var_bcvacritxfl() to program such an endpoint. If +this is not the case, i.e. one wishes to exclude cases of letter gains, +then the inequality of interest would instead be +-5 <= CHG <= -1. Importantly, +derive_var_bcvacritxfl() could still be used, but with the +argument bcva_ranges = list(c(-5, -1)).

  • +
  • This vignette extensively showcases the use of +derive_var_bcvacritxfl() applied to the variable +CHG, but through the argument crit_var the +function can also be used to create criterion flag relative to other +variables (e.g. crit_var = exprs(AVAL) for +AVAL).

  • +
+
+
+

Example Script +

+ ++++ + + + + + + + + +
ADaMSample Code
ADBCVAad_adbcva.R
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/devel/articles/adbcva_files/crosstalk-1.2.0/css/crosstalk.min.css b/articles/adbcva_files/crosstalk-1.2.0/css/crosstalk.min.css similarity index 100% rename from devel/articles/adbcva_files/crosstalk-1.2.0/css/crosstalk.min.css rename to articles/adbcva_files/crosstalk-1.2.0/css/crosstalk.min.css diff --git a/devel/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js b/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js similarity index 100% rename from devel/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js rename to articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js diff --git a/devel/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js.map b/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js.map similarity index 100% rename from devel/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js.map rename to articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js.map diff --git a/devel/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js b/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js similarity index 100% rename from devel/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js rename to articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js diff --git a/devel/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js.map b/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js.map similarity index 100% rename from devel/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js.map rename to articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js.map diff --git a/devel/articles/adbcva_files/crosstalk-1.2.0/scss/crosstalk.scss b/articles/adbcva_files/crosstalk-1.2.0/scss/crosstalk.scss similarity index 100% rename from devel/articles/adbcva_files/crosstalk-1.2.0/scss/crosstalk.scss rename to articles/adbcva_files/crosstalk-1.2.0/scss/crosstalk.scss diff --git a/devel/articles/adbcva_files/datatables-binding-0.21/datatables.js b/articles/adbcva_files/datatables-binding-0.30/datatables.js similarity index 96% rename from devel/articles/adbcva_files/datatables-binding-0.21/datatables.js rename to articles/adbcva_files/datatables-binding-0.30/datatables.js index 27ed7eaf..d968d8be 100644 --- a/devel/articles/adbcva_files/datatables-binding-0.21/datatables.js +++ b/articles/adbcva_files/datatables-binding-0.30/datatables.js @@ -2,7 +2,7 @@ // some helper functions: using a global object DTWidget so that it can be used // in JS() code, e.g. datatable(options = list(foo = JS('code'))); unlike R's -// dynamic scoping, when 'code' is eval()'ed, JavaScript does not know objects +// dynamic scoping, when 'code' is eval'ed, JavaScript does not know objects // from the "parent frame", e.g. JS('DTWidget') will not work unless it was made // a global object var DTWidget = {}; @@ -71,12 +71,20 @@ DTWidget.formatDate = function(data, method, params) { window.DTWidget = DTWidget; -// A helper function to update the lims of the existing filters -var set_filter_lims = function(td, new_vals) { +// A helper function to update the properties of existing filters +var setFilterProps = function(td, props) { + // Update enabled/disabled state + var $input = $(td).find('input').first(); + var searchable = $input.data('searchable'); + $input.prop('disabled', !searchable || props.disabled); + // Based on the filter type, set its new values - if (['factor', 'logical'].includes(td.getAttribute('data-type'))) { + var type = td.getAttribute('data-type'); + if (['factor', 'logical'].includes(type)) { // Reformat the new dropdown options for use with selectize - new_vals = new_vals.map(function(item) {return {text: item, value: item}}); + var new_vals = props.params.options.map(function(item) { + return { text: item, value: item }; + }); // Find the selectize object var dropdown = $(td).find('.selectized').eq(0)[0].selectize; @@ -93,12 +101,16 @@ var set_filter_lims = function(td, new_vals) { // Preserve the existing values dropdown.setValue(old_vals); - } else if (['number', 'integer', 'date', 'time'].includes(td.getAttribute('data-type'))) { + } else if (['number', 'integer', 'date', 'time'].includes(type)) { + // Apply internal scaling to new limits. Updating scale not yet implemented. + var slider = $(td).find('.noUi-target').eq(0); + var scale = Math.pow(10, Math.max(0, +slider.data('scale') || 0)); + var new_vals = [props.params.min * scale, props.params.max * scale]; + // Note what the new limits will be just for this filter - var new_lims = [...new_vals]; + var new_lims = new_vals.slice(); // Determine the current values and limits - var slider = $(td).find('.noUi-target').eq(0); var old_vals = slider.val().map(Number); var old_lims = slider.noUiSlider('options').range; old_lims = [old_lims.min, old_lims.max]; @@ -151,6 +163,13 @@ HTMLWidgets.widget({ type: "output", renderOnNullValue: true, initialize: function(el, width, height) { + // in order that the type=number inputs return a number + $.valHooks.number = { + get: function(el) { + var value = parseFloat(el.value); + return isNaN(value) ? "" : value; + } + }; $(el).html(' '); return { data: null, @@ -406,13 +425,6 @@ HTMLWidgets.widget({ return $.inArray(val, $.makeArray(array)) > -1; }; - // encode + to %2B when searching in the table on server side, because - // shiny::parseQueryString() treats + as spaces, and DataTables does not - // encode + to %2B (or % to %25) when sending the request - var encode_plus = function(x) { - return server ? x.replace(/%/g, '%25').replace(/\+/g, '%2B') : x; - }; - // search the i-th column var searchColumn = function(i, value) { var regex = false, ci = true; @@ -420,7 +432,7 @@ HTMLWidgets.widget({ regex = options.search.regex, ci = options.search.caseInsensitive !== false; } - return table.column(i).search(encode_plus(value), regex, !regex, ci); + return table.column(i).search(value, regex, !regex, ci); }; if (data.filter !== 'none') { @@ -429,7 +441,10 @@ HTMLWidgets.widget({ var $td = $(td), type = $td.data('type'), filter; var $input = $td.children('div').first().children('input'); - $input.prop('disabled', !table.settings()[0].aoColumns[i].bSearchable || type === 'disabled'); + var disabled = $input.prop('disabled'); + var searchable = table.settings()[0].aoColumns[i].bSearchable; + $input.prop('disabled', !searchable || disabled); + $input.data('searchable', searchable); // for updating later $input.on('input blur', function() { $input.next('span').toggle(Boolean($input.val())); }); @@ -478,7 +493,9 @@ HTMLWidgets.widget({ $input.parent().hide(); $x.show().trigger('show'); filter[0].selectize.focus(); }, input: function() { - if ($input.val() === '') filter[0].selectize.setValue([]); + var v1 = JSON.stringify(filter[0].selectize.getValue()), v2 = $input.val(); + if (v1 === '[]') v1 = ''; + if (v1 !== v2) filter[0].selectize.setValue(v2 === '' ? [] : JSON.parse(v2)); } }); var $input2 = $x.children('select'); @@ -494,7 +511,7 @@ HTMLWidgets.widget({ if (value.length) $input.trigger('input'); $input.attr('title', $input.val()); if (server) { - table.column(i).search(value.length ? encode_plus(JSON.stringify(value)) : '').draw(); + table.column(i).search(value.length ? JSON.stringify(value) : '').draw(); return; } // turn off filter if nothing selected @@ -808,6 +825,7 @@ HTMLWidgets.widget({ var disableCols = data.editable.disable ? data.editable.disable.columns : null; var numericCols = data.editable.numeric; var areaCols = data.editable.area; + var dateCols = data.editable.date; for (var i = 0; i < target.length; i++) { (function(cell, current) { var $cell = $(cell), html = $cell.html(); @@ -817,6 +835,8 @@ HTMLWidgets.widget({ $input = $(''); } else if (inArray(index, areaCols)) { $input = $(''); + } else if (inArray(index, dateCols)) { + $input = $(''); } else { $input = $(''); } @@ -834,7 +854,7 @@ HTMLWidgets.widget({ if (immediate) $input.on('blur', function(e) { var valueNew = $input.val(); - if (valueNew != value) { + if (valueNew !== value) { _cell.data(valueNew); if (HTMLWidgets.shinyMode) { changeInput('cell_edit', [cellInfo(cell)], 'DT.cellInfo', null, {priority: 'event'}); @@ -1380,7 +1400,7 @@ HTMLWidgets.widget({ console.log('The search keyword for column ' + i + ' is undefined') return; } - $(td).find('input').first().val(v); + $(td).find('input').first().val(v).trigger('input'); searchColumn(i, v); }); table.draw(); @@ -1416,16 +1436,19 @@ HTMLWidgets.widget({ } // update table filters (set new limits of sliders) - methods.updateFilters = function(newLims) { + methods.updateFilters = function(newProps) { // loop through each filter in the filter row filterRow.each(function(i, td) { var k = i; - if (filterRow.length > newLims.length) { + if (filterRow.length > newProps.length) { if (i === 0) return; // first column is row names k = i - 1; } - // Update the filters to reflect the updated data - set_filter_lims(td, newLims[k]); + // Update the filters to reflect the updated data. + // Allow "falsy" (e.g. NULL) to signify a no-op. + if (newProps[k]) { + setFilterProps(td, newProps[k]); + } }); }; diff --git a/articles/adbcva_files/datatables-css-0.0.0/datatables-crosstalk.css b/articles/adbcva_files/datatables-css-0.0.0/datatables-crosstalk.css new file mode 100644 index 00000000..bd1159c8 --- /dev/null +++ b/articles/adbcva_files/datatables-css-0.0.0/datatables-crosstalk.css @@ -0,0 +1,32 @@ +.dt-crosstalk-fade { + opacity: 0.2; +} + +html body div.DTS div.dataTables_scrollBody { + background: none; +} + + +/* +Fix https://github.com/rstudio/DT/issues/563 +If the `table.display` is set to "block" (e.g., pkgdown), the browser will display +datatable objects strangely. The search panel and the page buttons will still be +in full-width but the table body will be "compact" and shorter. +In therory, having this attributes will affect `dom="t"` +with `display: block` users. But in reality, there should be no one. +We may remove the below lines in the future if the upstream agree to have this there. +See https://github.com/DataTables/DataTablesSrc/issues/160 +*/ + +table.dataTable { + display: table; +} + + +/* +When DTOutput(fill = TRUE), it receives a .html-fill-item class (via htmltools::bindFillRole()), which effectively amounts to `flex: 1 1 auto`. That's mostly fine, but the case where `fillContainer=TRUE`+`height:auto`+`flex-basis:auto` and the container (e.g., a bslib::card()) doesn't have a defined height is a bit problematic since the table wants to fit the parent but the parent wants to fit the table, which results pretty small table height (maybe because there is a minimum height somewhere?). It seems better in this case to impose a 400px height default for the table, which we can do by setting `flex-basis` to 400px (the table is still allowed to grow/shrink when the container has an opinionated height). +*/ + +.html-fill-container > .html-fill-item.datatables { + flex-basis: 400px; +} diff --git a/devel/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.extra.css b/articles/adbcva_files/dt-core-1.13.4/css/jquery.dataTables.extra.css similarity index 100% rename from devel/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.extra.css rename to articles/adbcva_files/dt-core-1.13.4/css/jquery.dataTables.extra.css diff --git a/articles/adbcva_files/dt-core-1.13.4/css/jquery.dataTables.min.css b/articles/adbcva_files/dt-core-1.13.4/css/jquery.dataTables.min.css new file mode 100644 index 00000000..aff1ca67 --- /dev/null +++ b/articles/adbcva_files/dt-core-1.13.4/css/jquery.dataTables.min.css @@ -0,0 +1 @@ +:root{--dt-row-selected: 13, 110, 253;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc_disabled,table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc_disabled{cursor:pointer;position:relative;padding-right:26px}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after{position:absolute;display:block;opacity:.125;right:10px;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:before{bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:after{top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dataTables_scrollBody>table.dataTable>thead>tr>th:before,div.dataTables_scrollBody>table.dataTable>thead>tr>th:after,div.dataTables_scrollBody>table.dataTable>thead>tr>td:before,div.dataTables_scrollBody>table.dataTable>thead>tr>td:after{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(13, 110, 253);background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px;border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 10px 6px 10px;border-top:1px solid rgba(0, 0, 0, 0.3)}table.dataTable tbody tr{background-color:transparent}table.dataTable tbody tr.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.9);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.9);color:rgb(255, 255, 255);color:rgb(var(--dt-row-selected-text))}table.dataTable tbody tr.selected a{color:rgb(9, 10, 11);color:rgb(var(--dt-row-selected-link))}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid rgba(0, 0, 0, 0.15);border-right:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe>tbody>tr.odd>*,table.dataTable.display>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.023)}table.dataTable.stripe>tbody>tr.odd.selected>*,table.dataTable.display>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.923);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.923))}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px #0d6efd !important;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 1)) !important}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.919))}table.dataTable.display>tbody>tr.odd>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.054)}table.dataTable.display>tbody>tr.odd>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.047)}table.dataTable.display>tbody>tr.odd>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.039)}table.dataTable.display>tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.954);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.954))}table.dataTable.display>tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.947);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.947))}table.dataTable.display>tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.939);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.939))}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.919))}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.911);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.911))}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.903);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.903))}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.982);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.982))}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.974);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.974))}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.962);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.962))}table.dataTable.no-footer{border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable.compact thead th,table.dataTable.compact thead td,table.dataTable.compact tfoot th,table.dataTable.compact tfoot td,table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;color:inherit !important;border:1px solid transparent;border-radius:2px;background:transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:inherit !important;border:1px solid rgba(0, 0, 0, 0.3);background-color:rgba(230, 230, 230, 0.1);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(230, 230, 230, 0.1)), color-stop(100%, rgba(0, 0, 0, 0.1)));background:-webkit-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-moz-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-ms-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-o-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:linear-gradient(to bottom, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:inherit}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid rgba(0, 0, 0, 0.3)}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}} diff --git a/articles/adbcva_files/dt-core-1.13.4/js/jquery.dataTables.min.js b/articles/adbcva_files/dt-core-1.13.4/js/jquery.dataTables.min.js new file mode 100644 index 00000000..c89263c6 --- /dev/null +++ b/articles/adbcva_files/dt-core-1.13.4/js/jquery.dataTables.min.js @@ -0,0 +1,4 @@ +/*! DataTables 1.13.4 + * ©2008-2023 SpryMedia Ltd - datatables.net/license + */ +!function(n){"use strict";var a;"function"==typeof define&&define.amd?define(["jquery"],function(t){return n(t,window,document)}):"object"==typeof exports?(a=require("jquery"),"undefined"!=typeof window?module.exports=function(t,e){return t=t||window,e=e||a(t),n(e,t,t.document)}:n(a,window,window.document)):window.DataTable=n(jQuery,window,document)}(function(P,j,y,N){"use strict";function d(t){var e=parseInt(t,10);return!isNaN(e)&&isFinite(t)?e:null}function l(t,e,n){var a=typeof t,r="string"==a;return"number"==a||"bigint"==a||!!h(t)||(e&&r&&(t=G(t,e)),n&&r&&(t=t.replace(q,"")),!isNaN(parseFloat(t))&&isFinite(t))}function a(t,e,n){var a;return!!h(t)||(h(a=t)||"string"==typeof a)&&!!l(t.replace(V,""),e,n)||null}function m(t,e,n,a){var r=[],o=0,i=e.length;if(a!==N)for(;o").appendTo(l)),h.nTHead=n[0],l.children("tbody")),n=(0===a.length&&(a=P("").insertAfter(n)),h.nTBody=a[0],l.children("tfoot"));if(0===(n=0===n.length&&0").appendTo(l):n).length||0===n.children().length?l.addClass(p.sNoFooter):0/g,X=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,J=new RegExp("(\\"+["/",".","*","+","?","|","(",")","[","]","{","}","\\","$","^","-"].join("|\\")+")","g"),q=/['\u00A0,$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,h=function(t){return!t||!0===t||"-"===t},G=function(t,e){return c[e]||(c[e]=new RegExp(Ot(e),"g")),"string"==typeof t&&"."!==e?t.replace(/\./g,"").replace(c[e],"."):t},H=function(t,e,n){var a=[],r=0,o=t.length;if(n!==N)for(;r").css({position:"fixed",top:0,left:-1*P(j).scrollLeft(),height:1,width:1,overflow:"hidden"}).append(P("
").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(P("
").css({width:"100%",height:10}))).appendTo("body")).children()).children(),e.barWidth=a[0].offsetWidth-a[0].clientWidth,e.bScrollOversize=100===r[0].offsetWidth&&100!==a[0].clientWidth,e.bScrollbarLeft=1!==Math.round(r.offset().left),e.bBounding=!!n[0].getBoundingClientRect().width,n.remove()),P.extend(t.oBrowser,w.__browser),t.oScroll.iBarWidth=w.__browser.barWidth}function et(t,e,n,a,r,o){var i,l=a,s=!1;for(n!==N&&(i=n,s=!0);l!==r;)t.hasOwnProperty(l)&&(i=s?e(i,t[l],l,t):t[l],s=!0,l+=o);return i}function nt(t,e){var n=w.defaults.column,a=t.aoColumns.length,n=P.extend({},w.models.oColumn,n,{nTh:e||y.createElement("th"),sTitle:n.sTitle||(e?e.innerHTML:""),aDataSort:n.aDataSort||[a],mData:n.mData||a,idx:a}),n=(t.aoColumns.push(n),t.aoPreSearchCols);n[a]=P.extend({},w.models.oSearch,n[a]),at(t,a,P(e).data())}function at(t,e,n){function a(t){return"string"==typeof t&&-1!==t.indexOf("@")}var e=t.aoColumns[e],r=t.oClasses,o=P(e.nTh),i=(!e.sWidthOrig&&(e.sWidthOrig=o.attr("width")||null,u=(o.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/))&&(e.sWidthOrig=u[1]),n!==N&&null!==n&&(Q(n),C(w.defaults.column,n,!0),n.mDataProp===N||n.mData||(n.mData=n.mDataProp),n.sType&&(e._sManualType=n.sType),n.className&&!n.sClass&&(n.sClass=n.className),n.sClass&&o.addClass(n.sClass),u=e.sClass,P.extend(e,n),F(e,n,"sWidth","sWidthOrig"),u!==e.sClass&&(e.sClass=u+" "+e.sClass),n.iDataSort!==N&&(e.aDataSort=[n.iDataSort]),F(e,n,"aDataSort")),e.mData),l=A(i),s=e.mRender?A(e.mRender):null,u=(e._bAttrSrc=P.isPlainObject(i)&&(a(i.sort)||a(i.type)||a(i.filter)),e._setter=null,e.fnGetData=function(t,e,n){var a=l(t,e,N,n);return s&&e?s(a,e,t,n):a},e.fnSetData=function(t,e,n){return b(i)(t,e,n)},"number"==typeof i||e._isArrayHost||(t._rowReadObject=!0),t.oFeatures.bSort||(e.bSortable=!1,o.addClass(r.sSortableNone)),-1!==P.inArray("asc",e.asSorting)),n=-1!==P.inArray("desc",e.asSorting);e.bSortable&&(u||n)?u&&!n?(e.sSortingClass=r.sSortableAsc,e.sSortingClassJUI=r.sSortJUIAscAllowed):!u&&n?(e.sSortingClass=r.sSortableDesc,e.sSortingClassJUI=r.sSortJUIDescAllowed):(e.sSortingClass=r.sSortable,e.sSortingClassJUI=r.sSortJUI):(e.sSortingClass=r.sSortableNone,e.sSortingClassJUI="")}function O(t){if(!1!==t.oFeatures.bAutoWidth){var e=t.aoColumns;ee(t);for(var n=0,a=e.length;ne&&t[r]--;-1!=a&&n===N&&t.splice(a,1)}function bt(n,a,t,e){function r(t,e){for(;t.childNodes.length;)t.removeChild(t.firstChild);t.innerHTML=S(n,a,e,"display")}var o,i,l=n.aoData[a];if("dom"!==t&&(t&&"auto"!==t||"dom"!==l.src)){var s=l.anCells;if(s)if(e!==N)r(s[e],e);else for(o=0,i=s.length;o").appendTo(r)),c=0,f=s.length;c=s.fnRecordsDisplay()?0:l,s.iInitDisplayStart=-1);var n=R(t,"aoPreDrawCallback","preDraw",[t]);if(-1!==P.inArray(!1,n))D(t,!1);else{var a=[],r=0,o=t.asStripeClasses,i=o.length,l=t.oLanguage,s="ssp"==E(t),u=t.aiDisplay,n=t._iDisplayStart,c=t.fnDisplayEnd();if(t.bDrawing=!0,t.bDeferLoading)t.bDeferLoading=!1,t.iDraw++,D(t,!1);else if(s){if(!t.bDestroying&&!e)return void xt(t)}else t.iDraw++;if(0!==u.length)for(var f=s?t.aoData.length:c,d=s?0:n;d",{class:i?o[0]:""}).append(P("",{valign:"top",colSpan:T(t),class:t.oClasses.sRowEmpty}).html(e))[0]}R(t,"aoHeaderCallback","header",[P(t.nTHead).children("tr")[0],ht(t),n,c,u]),R(t,"aoFooterCallback","footer",[P(t.nTFoot).children("tr")[0],ht(t),n,c,u]);s=P(t.nTBody);s.children().detach(),s.append(P(a)),R(t,"aoDrawCallback","draw",[t]),t.bSorted=!1,t.bFiltered=!1,t.bDrawing=!1}}function u(t,e){var n=t.oFeatures,a=n.bSort,n=n.bFilter;a&&ie(t),n?Rt(t,t.oPreviousSearch):t.aiDisplay=t.aiDisplayMaster.slice(),!0!==e&&(t._iDisplayStart=0),t._drawHold=e,v(t),t._drawHold=!1}function _t(t){for(var e,n,a,r,o,i,l,s=t.oClasses,u=P(t.nTable),u=P("
").insertBefore(u),c=t.oFeatures,f=P("
",{id:t.sTableId+"_wrapper",class:s.sWrapper+(t.nTFoot?"":" "+s.sNoFooter)}),d=(t.nHolding=u[0],t.nTableWrapper=f[0],t.nTableReinsertBefore=t.nTable.nextSibling,t.sDom.split("")),h=0;h")[0],"'"==(r=d[h+1])||'"'==r){for(o="",i=2;d[h+i]!=r;)o+=d[h+i],i++;"H"==o?o=s.sJUIHeader:"F"==o&&(o=s.sJUIFooter),-1!=o.indexOf(".")?(l=o.split("."),a.id=l[0].substr(1,l[0].length-1),a.className=l[1]):"#"==o.charAt(0)?a.id=o.substr(1,o.length-1):a.className=o,h+=i}f.append(a),f=P(a)}else if(">"==n)f=f.parent();else if("l"==n&&c.bPaginate&&c.bLengthChange)e=$t(t);else if("f"==n&&c.bFilter)e=Lt(t);else if("r"==n&&c.bProcessing)e=Zt(t);else if("t"==n)e=Kt(t);else if("i"==n&&c.bInfo)e=Ut(t);else if("p"==n&&c.bPaginate)e=zt(t);else if(0!==w.ext.feature.length)for(var p=w.ext.feature,g=0,b=p.length;g',s=(s=r.sSearch).match(/_INPUT_/)?s.replace("_INPUT_",l):s+l,l=P("
",{id:i.f?null:a+"_filter",class:t.sFilter}).append(P("
").addClass(t.sLength);return a.aanFeatures.l||(c[0].id=e+"_length"),c.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",l[0].outerHTML)),P("select",c).val(a._iDisplayLength).on("change.DT",function(t){Gt(a,P(this).val()),v(a)}),P(a.nTable).on("length.dt.DT",function(t,e,n){a===e&&P("select",c).val(n)}),c[0]}function zt(t){function c(t){v(t)}var e=t.sPaginationType,f=w.ext.pager[e],d="function"==typeof f,e=P("
").addClass(t.oClasses.sPaging+e)[0],h=t.aanFeatures;return d||f.fnInit(t,e,c),h.p||(e.id=t.sTableId+"_paginate",t.aoDrawCallback.push({fn:function(t){if(d)for(var e=t._iDisplayStart,n=t._iDisplayLength,a=t.fnRecordsDisplay(),r=-1===n,o=r?0:Math.ceil(e/n),i=r?1:Math.ceil(a/n),l=f(o,i),s=0,u=h.p.length;s",{id:t.aanFeatures.r?null:t.sTableId+"_processing",class:t.oClasses.sProcessing,role:"status"}).html(t.oLanguage.sProcessing).append("
").insertBefore(t.nTable)[0]}function D(t,e){t.oFeatures.bProcessing&&P(t.aanFeatures.r).css("display",e?"block":"none"),R(t,null,"processing",[t,e])}function Kt(t){var e,n,a,r,o,i,l,s,u,c,f,d,h=P(t.nTable),p=t.oScroll;return""===p.sX&&""===p.sY?t.nTable:(e=p.sX,n=p.sY,a=t.oClasses,o=(r=h.children("caption")).length?r[0]._captionSide:null,s=P(h[0].cloneNode(!1)),i=P(h[0].cloneNode(!1)),u=function(t){return t?M(t):null},(l=h.children("tfoot")).length||(l=null),s=P(f="
",{class:a.sScrollWrapper}).append(P(f,{class:a.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:e?u(e):"100%"}).append(P(f,{class:a.sScrollHeadInner}).css({"box-sizing":"content-box",width:p.sXInner||"100%"}).append(s.removeAttr("id").css("margin-left",0).append("top"===o?r:null).append(h.children("thead"))))).append(P(f,{class:a.sScrollBody}).css({position:"relative",overflow:"auto",width:u(e)}).append(h)),l&&s.append(P(f,{class:a.sScrollFoot}).css({overflow:"hidden",border:0,width:e?u(e):"100%"}).append(P(f,{class:a.sScrollFootInner}).append(i.removeAttr("id").css("margin-left",0).append("bottom"===o?r:null).append(h.children("tfoot"))))),u=s.children(),c=u[0],f=u[1],d=l?u[2]:null,e&&P(f).on("scroll.DT",function(t){var e=this.scrollLeft;c.scrollLeft=e,l&&(d.scrollLeft=e)}),P(f).css("max-height",n),p.bCollapse||P(f).css("height",n),t.nScrollHead=c,t.nScrollBody=f,t.nScrollFoot=d,t.aoDrawCallback.push({fn:Qt,sName:"scrolling"}),s[0])}function Qt(n){function t(t){(t=t.style).paddingTop="0",t.paddingBottom="0",t.borderTopWidth="0",t.borderBottomWidth="0",t.height=0}var e,a,r,o,i,l=n.oScroll,s=l.sX,u=l.sXInner,c=l.sY,l=l.iBarWidth,f=P(n.nScrollHead),d=f[0].style,h=f.children("div"),p=h[0].style,h=h.children("table"),g=n.nScrollBody,b=P(g),m=g.style,S=P(n.nScrollFoot).children("div"),v=S.children("table"),y=P(n.nTHead),D=P(n.nTable),_=D[0],w=_.style,C=n.nTFoot?P(n.nTFoot):null,T=n.oBrowser,x=T.bScrollOversize,A=(H(n.aoColumns,"nTh"),[]),I=[],F=[],L=[],R=g.scrollHeight>g.clientHeight;n.scrollBarVis!==R&&n.scrollBarVis!==N?(n.scrollBarVis=R,O(n)):(n.scrollBarVis=R,D.children("thead, tfoot").remove(),C&&(R=C.clone().prependTo(D),i=C.find("tr"),a=R.find("tr"),R.find("[id]").removeAttr("id")),R=y.clone().prependTo(D),y=y.find("tr"),e=R.find("tr"),R.find("th, td").removeAttr("tabindex"),R.find("[id]").removeAttr("id"),s||(m.width="100%",f[0].style.width="100%"),P.each(Ct(n,R),function(t,e){r=rt(n,t),e.style.width=n.aoColumns[r].sWidth}),C&&k(function(t){t.style.width=""},a),f=D.outerWidth(),""===s?(w.width="100%",x&&(D.find("tbody").height()>g.offsetHeight||"scroll"==b.css("overflow-y"))&&(w.width=M(D.outerWidth()-l)),f=D.outerWidth()):""!==u&&(w.width=M(u),f=D.outerWidth()),k(t,e),k(function(t){var e=j.getComputedStyle?j.getComputedStyle(t).width:M(P(t).width());F.push(t.innerHTML),A.push(e)},e),k(function(t,e){t.style.width=A[e]},y),P(e).css("height",0),C&&(k(t,a),k(function(t){L.push(t.innerHTML),I.push(M(P(t).css("width")))},a),k(function(t,e){t.style.width=I[e]},i),P(a).height(0)),k(function(t,e){t.innerHTML='
'+F[e]+"
",t.childNodes[0].style.height="0",t.childNodes[0].style.overflow="hidden",t.style.width=A[e]},e),C&&k(function(t,e){t.innerHTML='
'+L[e]+"
",t.childNodes[0].style.height="0",t.childNodes[0].style.overflow="hidden",t.style.width=I[e]},a),Math.round(D.outerWidth())g.offsetHeight||"scroll"==b.css("overflow-y")?f+l:f,x&&(g.scrollHeight>g.offsetHeight||"scroll"==b.css("overflow-y"))&&(w.width=M(o-l)),""!==s&&""===u||W(n,1,"Possible column misalignment",6)):o="100%",m.width=M(o),d.width=M(o),C&&(n.nScrollFoot.style.width=M(o)),c||x&&(m.height=M(_.offsetHeight+l)),R=D.outerWidth(),h[0].style.width=M(R),p.width=M(R),y=D.height()>g.clientHeight||"scroll"==b.css("overflow-y"),p[i="padding"+(T.bScrollbarLeft?"Left":"Right")]=y?l+"px":"0px",C&&(v[0].style.width=M(R),S[0].style.width=M(R),S[0].style[i]=y?l+"px":"0px"),D.children("colgroup").insertBefore(D.children("thead")),b.trigger("scroll"),!n.bSorted&&!n.bFiltered||n._drawHold||(g.scrollTop=0))}function k(t,e,n){for(var a,r,o=0,i=0,l=e.length;i/g;function ee(t){var e,n,a=t.nTable,r=t.aoColumns,o=t.oScroll,i=o.sY,l=o.sX,o=o.sXInner,s=r.length,u=it(t,"bVisible"),c=P("th",t.nTHead),f=a.getAttribute("width"),d=a.parentNode,h=!1,p=t.oBrowser,g=p.bScrollOversize,b=a.style.width;for(b&&-1!==b.indexOf("%")&&(f=b),D=0;D").appendTo(b.find("tbody")));for(b.find("thead, tfoot").remove(),b.append(P(t.nTHead).clone()).append(P(t.nTFoot).clone()),b.find("tfoot th, tfoot td").css("width",""),c=Ct(t,b.find("thead")[0]),D=0;D").css({width:e.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(t.aoData.length)for(D=0;D").css(l||i?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(b).appendTo(d),y=(l&&o?b.width(o):l?(b.css("width","auto"),b.removeAttr("width"),b.width()").css("width",M(t)).appendTo(e||y.body))[0].offsetWidth,t.remove(),e):0}function re(t,e){var n,a=oe(t,e);return a<0?null:(n=t.aoData[a]).nTr?n.anCells[e]:P("").html(S(t,a,e,"display"))[0]}function oe(t,e){for(var n,a=-1,r=-1,o=0,i=t.aoData.length;oa&&(a=n.length,r=o);return r}function M(t){return null===t?"0px":"number"==typeof t?t<0?"0px":t+"px":t.match(/\d$/)?t+"px":t}function I(t){function e(t){t.length&&!Array.isArray(t[0])?h.push(t):P.merge(h,t)}var n,a,r,o,i,l,s,u=[],c=t.aoColumns,f=t.aaSortingFixed,d=P.isPlainObject(f),h=[];for(Array.isArray(f)&&e(f),d&&f.pre&&e(f.pre),e(t.aaSorting),d&&f.post&&e(f.post),n=0;n/g,""),u=i.nTh;u.removeAttribute("aria-sort"),i=i.bSortable?s+("asc"===(0=o.length?[0,e[1]]:e)})),t.search!==N&&P.extend(n.oPreviousSearch,Bt(t.search)),t.columns){for(a=0,r=t.columns.length;a").addClass(e),P("td",n).addClass(e).html(t)[0].colSpan=T(o),l.push(n[0]))}var l=[];i(e,n),t._details&&t._details.detach(),t._details=P(l),t._detailsShow&&t._details.insertAfter(t.nTr)}function xe(t,e){var n=t.context;if(n.length&&t.length){var a=n[0].aoData[t[0]];if(a._details){(a._detailsShow=e)?(a._details.insertAfter(a.nTr),P(a.nTr).addClass("dt-hasChild")):(a._details.detach(),P(a.nTr).removeClass("dt-hasChild")),R(n[0],null,"childRow",[e,t.row(t[0])]);var s=n[0],r=new B(s),a=".dt.DT_details",e="draw"+a,t="column-sizing"+a,a="destroy"+a,u=s.aoData;if(r.off(e+" "+t+" "+a),H(u,"_details").length>0){r.on(e,function(t,e){if(s!==e)return;r.rows({page:"current"}).eq(0).each(function(t){var e=u[t];if(e._detailsShow)e._details.insertAfter(e.nTr)})});r.on(t,function(t,e,n,a){if(s!==e)return;var r,o=T(e);for(var i=0,l=u.length;it?new B(e[t],this[t]):null},filter:function(t){var e=[];if(o.filter)e=o.filter.call(this,t,this);else for(var n=0,a=this.length;n").appendTo(t);p(u,n)}else{switch(g=null,b=n,a=c.iTabIndex,n){case"ellipsis":t.append('');break;case"first":g=S.sFirst,0===d&&(a=-1,b+=" "+o);break;case"previous":g=S.sPrevious,0===d&&(a=-1,b+=" "+o);break;case"next":g=S.sNext,0!==h&&d!==h-1||(a=-1,b+=" "+o);break;case"last":g=S.sLast,0!==h&&d!==h-1||(a=-1,b+=" "+o);break;default:g=c.fnFormatNumber(n+1),b=d===n?m.sPageButtonActive:""}null!==g&&(u=c.oInit.pagingTag||"a",r=-1!==b.indexOf(o),me(P("<"+u+">",{class:m.sPageButton+" "+b,"aria-controls":c.sTableId,"aria-disabled":r?"true":null,"aria-label":v[n],"aria-role":"link","aria-current":b===m.sPageButtonActive?"page":null,"data-dt-idx":n,tabindex:a,id:0===f&&"string"==typeof n?c.sTableId+"_"+n:null}).html(g).appendTo(t),{action:n},i))}}var g,b,n,m=c.oClasses,S=c.oLanguage.oPaginate,v=c.oLanguage.oAria.paginate||{};try{n=P(t).find(y.activeElement).data("dt-idx")}catch(t){}p(P(t).empty(),e),n!==N&&P(t).find("[data-dt-idx="+n+"]").trigger("focus")}}}),P.extend(w.ext.type.detect,[function(t,e){e=e.oLanguage.sDecimal;return l(t,e)?"num"+e:null},function(t,e){var n;return(!t||t instanceof Date||X.test(t))&&(null!==(n=Date.parse(t))&&!isNaN(n)||h(t))?"date":null},function(t,e){e=e.oLanguage.sDecimal;return l(t,e,!0)?"num-fmt"+e:null},function(t,e){e=e.oLanguage.sDecimal;return a(t,e)?"html-num"+e:null},function(t,e){e=e.oLanguage.sDecimal;return a(t,e,!0)?"html-num-fmt"+e:null},function(t,e){return h(t)||"string"==typeof t&&-1!==t.indexOf("<")?"html":null}]),P.extend(w.ext.type.search,{html:function(t){return h(t)?t:"string"==typeof t?t.replace(U," ").replace(V,""):""},string:function(t){return!h(t)&&"string"==typeof t?t.replace(U," "):t}});function ke(t,e,n,a){var r;return 0===t||t&&"-"!==t?"number"==(r=typeof t)||"bigint"==r?t:+(t=(t=e?G(t,e):t).replace&&(n&&(t=t.replace(n,"")),a)?t.replace(a,""):t):-1/0}function Me(n){P.each({num:function(t){return ke(t,n)},"num-fmt":function(t){return ke(t,n,q)},"html-num":function(t){return ke(t,n,V)},"html-num-fmt":function(t){return ke(t,n,V,q)}},function(t,e){p.type.order[t+n+"-pre"]=e,t.match(/^html\-/)&&(p.type.search[t+n]=p.type.search.html)})}P.extend(p.type.order,{"date-pre":function(t){t=Date.parse(t);return isNaN(t)?-1/0:t},"html-pre":function(t){return h(t)?"":t.replace?t.replace(/<.*?>/g,"").toLowerCase():t+""},"string-pre":function(t){return h(t)?"":"string"==typeof t?t.toLowerCase():t.toString?t.toString():""},"string-asc":function(t,e){return t").addClass(l.sSortJUIWrapper).append(o.contents()).append(P("").addClass(l.sSortIcon+" "+i.sSortingClassJUI)).appendTo(o),P(r.nTable).on("order.dt.DT",function(t,e,n,a){r===e&&(e=i.idx,o.removeClass(l.sSortAsc+" "+l.sSortDesc).addClass("asc"==a[e]?l.sSortAsc:"desc"==a[e]?l.sSortDesc:i.sSortingClass),o.find("span."+l.sSortIcon).removeClass(l.sSortJUIAsc+" "+l.sSortJUIDesc+" "+l.sSortJUI+" "+l.sSortJUIAscAllowed+" "+l.sSortJUIDescAllowed).addClass("asc"==a[e]?l.sSortJUIAsc:"desc"==a[e]?l.sSortJUIDesc:i.sSortingClassJUI))})}}});function We(t){return"string"==typeof(t=Array.isArray(t)?t.join(","):t)?t.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""):t}function Ee(t,e,n,a,r){return j.moment?t[e](r):j.luxon?t[n](r):a?t[a](r):t}var Be=!1;function Ue(t,e,n){var a;if(j.moment){if(!(a=j.moment.utc(t,e,n,!0)).isValid())return null}else if(j.luxon){if(!(a=e&&"string"==typeof t?j.luxon.DateTime.fromFormat(t,e):j.luxon.DateTime.fromISO(t)).isValid)return null;a.setLocale(n)}else e?(Be||alert("DataTables warning: Formatted date without Moment.js or Luxon - https://datatables.net/tn/17"),Be=!0):a=new Date(t);return a}function Ve(s){return function(a,r,o,i){0===arguments.length?(o="en",a=r=null):1===arguments.length?(o="en",r=a,a=null):2===arguments.length&&(o=r,r=a,a=null);var l="datetime-"+r;return w.ext.type.order[l]||(w.ext.type.detect.unshift(function(t){return t===l&&l}),w.ext.type.order[l+"-asc"]=function(t,e){t=t.valueOf(),e=e.valueOf();return t===e?0:tdiv{padding:1em}div.dtb-popover-close{position:absolute;top:10px;right:10px;width:22px;height:22px;border:1px solid #eaeaea;background-color:#f9f9f9;text-align:center;border-radius:3px;cursor:pointer;z-index:2003}button.dtb-hide-drop{display:none !important}div.dt-button-collection-title{text-align:center;padding:.3em 0 .5em;margin-left:.5em;margin-right:.5em;font-size:.9em}div.dt-button-collection-title:empty{display:none}span.dt-button-spacer{display:inline-block;margin:.5em;white-space:nowrap}span.dt-button-spacer.bar{border-left:1px solid rgba(0, 0, 0, 0.3);vertical-align:middle;padding-left:.5em}span.dt-button-spacer.bar:empty{height:1em;width:1px;padding-left:0}div.dt-button-collection span.dt-button-spacer{width:100%;font-size:.9em;text-align:center;margin:.5em 0}div.dt-button-collection span.dt-button-spacer:empty{height:0;width:100%}div.dt-button-collection span.dt-button-spacer.bar{border-left:none;border-bottom:1px solid rgba(0, 0, 0, 0.3);padding-left:0}button.dt-button,div.dt-button,a.dt-button,input.dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-left:.167em;margin-right:.167em;margin-bottom:.333em;padding:.5em 1em;border:1px solid rgba(0, 0, 0, 0.3);border-radius:2px;cursor:pointer;font-size:.88em;line-height:1.6em;color:black;white-space:nowrap;overflow:hidden;background-color:rgba(0, 0, 0, 0.1);background:linear-gradient(to bottom, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(230, 230, 230, 0.1)", EndColorStr="rgba(0, 0, 0, 0.1)");-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}button.dt-button:first-child,div.dt-button:first-child,a.dt-button:first-child,input.dt-button:first-child{margin-left:0}button.dt-button.disabled,div.dt-button.disabled,a.dt-button.disabled,input.dt-button.disabled{cursor:default;opacity:.4}button.dt-button.active:not(.disabled),div.dt-button.active:not(.disabled),a.dt-button.active:not(.disabled),input.dt-button.active:not(.disabled){background-color:rgba(0, 0, 0, 0.1);background:linear-gradient(to bottom, rgba(179, 179, 179, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(179, 179, 179, 0.1)", EndColorStr="rgba(0, 0, 0, 0.1)");box-shadow:inset 1px 1px 3px #999}button.dt-button.active:not(.disabled):hover:not(.disabled),div.dt-button.active:not(.disabled):hover:not(.disabled),a.dt-button.active:not(.disabled):hover:not(.disabled),input.dt-button.active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999;background-color:rgba(0, 0, 0, 0.1);background:linear-gradient(to bottom, rgba(128, 128, 128, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(128, 128, 128, 0.1)", EndColorStr="rgba(0, 0, 0, 0.1)")}button.dt-button:hover,div.dt-button:hover,a.dt-button:hover,input.dt-button:hover{text-decoration:none}button.dt-button:hover:not(.disabled),div.dt-button:hover:not(.disabled),a.dt-button:hover:not(.disabled),input.dt-button:hover:not(.disabled){border:1px solid #666;background-color:rgba(0, 0, 0, 0.1);background:linear-gradient(to bottom, rgba(153, 153, 153, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(153, 153, 153, 0.1)", EndColorStr="rgba(0, 0, 0, 0.1)")}button.dt-button:focus:not(.disabled),div.dt-button:focus:not(.disabled),a.dt-button:focus:not(.disabled),input.dt-button:focus:not(.disabled){border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;outline:none;background-color:rgb(121, 172, 233);background:linear-gradient(to bottom, #d1e2f7 0%, rgb(121, 172, 233) 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="#d1e2f7", EndColorStr="rgb(121, 172, 233)")}button.dt-button.active:focus:not(.disabled),div.dt-button.active:focus:not(.disabled),a.dt-button.active:focus:not(.disabled),input.dt-button.active:focus:not(.disabled){background:linear-gradient(to bottom, #d1e2f7 0%, rgb(121, 172, 233) 100%) !important}button.dt-button span.dt-down-arrow,div.dt-button span.dt-down-arrow,a.dt-button span.dt-down-arrow,input.dt-button span.dt-down-arrow{position:relative;top:-2px;color:rgba(70, 70, 70, 0.75);font-size:8px;padding-left:10px;line-height:1em}.dt-button embed{outline:none}div.dt-buttons{float:left}div.dt-buttons.buttons-right{float:right}div.dataTables_layout_cell div.dt-buttons{float:none}div.dataTables_layout_cell div.dt-buttons.buttons-right{float:none}div.dt-btn-split-wrapper{display:inline-block}div.dt-button-collection{position:absolute;top:0;left:0;width:200px;margin-top:3px;margin-bottom:3px;padding:4px 4px 2px 4px;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.4);background-color:white;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 4px 10px 1px rgba(0, 0, 0, 0.3);box-sizing:border-box}div.dt-button-collection button.dt-button,div.dt-button-collection div.dt-button,div.dt-button-collection a.dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;margin:4px 0 2px 0}div.dt-button-collection button.dt-button:active:not(.disabled),div.dt-button-collection button.dt-button.active:not(.disabled),div.dt-button-collection div.dt-button:active:not(.disabled),div.dt-button-collection div.dt-button.active:not(.disabled),div.dt-button-collection a.dt-button:active:not(.disabled),div.dt-button-collection a.dt-button.active:not(.disabled){background-color:#dadada;background:linear-gradient(to bottom, #f0f0f0 0%, #dadada 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="#f0f0f0", EndColorStr="#dadada");box-shadow:inset 1px 1px 3px #666}div.dt-button-collection button.dt-button:first-child,div.dt-button-collection div.dt-button:first-child,div.dt-button-collection a.dt-button:first-child{margin-top:0;border-top-left-radius:3px;border-top-right-radius:3px}div.dt-button-collection button.dt-button:last-child,div.dt-button-collection div.dt-button:last-child,div.dt-button-collection a.dt-button:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}div.dt-button-collection div.dt-btn-split-wrapper{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;margin:4px 0 2px 0}div.dt-button-collection div.dt-btn-split-wrapper button.dt-button{margin:0;display:inline-block;width:0;flex-grow:1;flex-shrink:0;flex-basis:50px;border-radius:0}div.dt-button-collection div.dt-btn-split-wrapper button.dt-btn-split-drop{min-width:20px;flex-grow:0;flex-shrink:0;flex-basis:0}div.dt-button-collection div.dt-btn-split-wrapper:first-child{margin-top:0}div.dt-button-collection div.dt-btn-split-wrapper:first-child button.dt-button{border-top-left-radius:3px}div.dt-button-collection div.dt-btn-split-wrapper:first-child button.dt-btn-split-drop{border-top-right-radius:3px}div.dt-button-collection div.dt-btn-split-wrapper:last-child button.dt-button{border-bottom-left-radius:3px}div.dt-button-collection div.dt-btn-split-wrapper:last-child button.dt-btn-split-drop{border-bottom-right-radius:3px}div.dt-button-collection div.dt-btn-split-wrapper:active:not(.disabled) button.dt-button,div.dt-button-collection div.dt-btn-split-wrapper.active:not(.disabled) button.dt-button{background-color:#dadada;background:linear-gradient(to bottom, #f0f0f0 0%, #dadada 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="#f0f0f0", EndColorStr="#dadada");box-shadow:inset 0px 0px 4px #666}div.dt-button-collection div.dt-btn-split-wrapper:active:not(.disabled) button.dt-btn-split-drop,div.dt-button-collection div.dt-btn-split-wrapper.active:not(.disabled) button.dt-btn-split-drop{box-shadow:none}div.dt-button-collection.fixed .dt-button:first-child{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}div.dt-button-collection.fixed .dt-button:last-child{border-bottom-left-radius:0;border-bottom-right-radius:0}div.dt-button-collection.fixed{position:fixed;display:block;top:50%;left:50%;margin-left:-75px;border-radius:5px;background-color:white}div.dt-button-collection.fixed.two-column{margin-left:-200px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection.fixed.columns{margin-left:-409px}@media screen and (max-width: 1024px){div.dt-button-collection.fixed.columns{margin-left:-308px}}@media screen and (max-width: 640px){div.dt-button-collection.fixed.columns{margin-left:-203px}}@media screen and (max-width: 460px){div.dt-button-collection.fixed.columns{margin-left:-100px}}div.dt-button-collection.fixed>:last-child{max-height:100vh;overflow:auto}div.dt-button-collection.two-column>:last-child,div.dt-button-collection.three-column>:last-child,div.dt-button-collection.four-column>:last-child{display:block !important;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection.two-column>:last-child>*,div.dt-button-collection.three-column>:last-child>*,div.dt-button-collection.four-column>:last-child>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:400px}div.dt-button-collection.two-column>:last-child{padding-bottom:1px;column-count:2}div.dt-button-collection.three-column{width:450px}div.dt-button-collection.three-column>:last-child{padding-bottom:1px;column-count:3}div.dt-button-collection.four-column{width:600px}div.dt-button-collection.four-column>:last-child{padding-bottom:1px;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-collection.columns{width:auto}div.dt-button-collection.columns>:last-child{display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:center;gap:6px;width:818px;padding-bottom:1px}div.dt-button-collection.columns>:last-child .dt-button{min-width:200px;flex:0 1;margin:0}div.dt-button-collection.columns.dtb-b3>:last-child,div.dt-button-collection.columns.dtb-b2>:last-child,div.dt-button-collection.columns.dtb-b1>:last-child{justify-content:space-between}div.dt-button-collection.columns.dtb-b3 .dt-button{flex:1 1 32%}div.dt-button-collection.columns.dtb-b2 .dt-button{flex:1 1 48%}div.dt-button-collection.columns.dtb-b1 .dt-button{flex:1 1 100%}@media screen and (max-width: 1024px){div.dt-button-collection.columns>:last-child{width:612px}}@media screen and (max-width: 640px){div.dt-button-collection.columns>:last-child{width:406px}div.dt-button-collection.columns.dtb-b3 .dt-button{flex:0 1 32%}}@media screen and (max-width: 460px){div.dt-button-collection.columns>:last-child{width:200px}}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0, 0, 0, 0.7);background:radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);z-index:2001}@media screen and (max-width: 640px){div.dt-buttons{float:none !important;text-align:center}}button.dt-button.processing,div.dt-button.processing,a.dt-button.processing{color:rgba(0, 0, 0, 0.2)}button.dt-button.processing:after,div.dt-button.processing:after,a.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:" ";border:2px solid rgb(40, 40, 40);border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear}button.dt-btn-split-drop{margin-left:calc(-1px - .333em);padding-bottom:calc(.5em - 1px);border-radius:0px 1px 1px 0px;color:rgba(70, 70, 70, 0.9);border-left:none}button.dt-btn-split-drop span.dt-btn-split-drop-arrow{position:relative;top:-1px;left:-2px;font-size:8px}button.dt-btn-split-drop:hover{z-index:2}button.buttons-split{border-right:1px solid rgba(70, 70, 70, 0);border-radius:1px 0px 0px 1px}button.dt-btn-split-drop-button{background-color:rgb(255, 255, 255)}button.dt-btn-split-drop-button:hover{background-color:rgb(255, 255, 255)} diff --git a/articles/adbcva_files/dt-ext-buttons-1.13.4/js/buttons.colVis.min.js b/articles/adbcva_files/dt-ext-buttons-1.13.4/js/buttons.colVis.min.js new file mode 100644 index 00000000..f81084bb --- /dev/null +++ b/articles/adbcva_files/dt-ext-buttons-1.13.4/js/buttons.colVis.min.js @@ -0,0 +1,5 @@ +/*! + * Column visibility buttons for Buttons and DataTables. + * 2016 SpryMedia Ltd - datatables.net/license + */ +!function(t){var o,i;"function"==typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(n){return t(n,window,document)}):"object"==typeof exports?(o=require("jquery"),i=function(n,e){e.fn.dataTable||require("datatables.net")(n,e),e.fn.dataTable.Buttons||require("datatables.net-buttons")(n,e)},"undefined"!=typeof window?module.exports=function(n,e){return n=n||window,e=e||o(n),i(n,e),t(e,0,n.document)}:(i(window,o),module.exports=t(o,window,window.document))):t(jQuery,window,document)}(function(n,e,t,l){"use strict";var o=n.fn.dataTable;return n.extend(o.ext.buttons,{colvis:function(o,i){var l=null,n={extend:"collection",init:function(n,e){l=e},text:function(n){return n.i18n("buttons.colvis","Column visibility")},className:"buttons-colvis",closeButton:!1,buttons:[{extend:"columnsToggle",columns:i.columns,columnText:i.columnText}]};return o.on("column-reorder.dt"+i.namespace,function(n,e,t){o.button(null,o.button(null,l).node()).collectionRebuild([{extend:"columnsToggle",columns:i.columns,columnText:i.columnText}])}),n},columnsToggle:function(n,e){return n.columns(e.columns).indexes().map(function(n){return{extend:"columnToggle",columns:n,columnText:e.columnText}}).toArray()},columnToggle:function(n,e){return{extend:"columnVisibility",columns:e.columns,columnText:e.columnText}},columnsVisibility:function(n,e){return n.columns(e.columns).indexes().map(function(n){return{extend:"columnVisibility",columns:n,visibility:e.visibility,columnText:e.columnText}}).toArray()},columnVisibility:{columns:l,text:function(n,e,t){return t._columnText(n,t)},className:"buttons-columnVisibility",action:function(n,e,t,o){var e=e.columns(o.columns),i=e.visible();e.visible(o.visibility!==l?o.visibility:!(i.length&&i[0]))},init:function(o,n,i){var l=this;n.attr("data-cv-idx",i.columns),o.on("column-visibility.dt"+i.namespace,function(n,e){e.bDestroying||e.nTable!=o.settings()[0].nTable||l.active(o.column(i.columns).visible())}).on("column-reorder.dt"+i.namespace,function(n,e,t){i.destroying||1===o.columns(i.columns).count()&&(l.text(i._columnText(o,i)),l.active(o.column(i.columns).visible()))}),this.active(o.column(i.columns).visible())},destroy:function(n,e,t){n.off("column-visibility.dt"+t.namespace).off("column-reorder.dt"+t.namespace)},_columnText:function(n,e){var t=n.column(e.columns).index(),o=n.settings()[0].aoColumns[t].sTitle;return o=(o=o||n.column(t).header().innerHTML).replace(/\n/g," ").replace(//gi," ").replace(//g,"").replace(//g,"").replace(/<.*?>/g,"").replace(/^\s+|\s+$/g,""),e.columnText?e.columnText(n,t,o):o}},colvisRestore:{className:"buttons-colvisRestore",text:function(n){return n.i18n("buttons.colvisRestore","Restore visibility")},init:function(e,n,t){t._visOriginal=e.columns().indexes().map(function(n){return e.column(n).visible()}).toArray()},action:function(n,e,t,o){e.columns().every(function(n){n=e.colReorder&&e.colReorder.transpose?e.colReorder.transpose(n,"toOriginal"):n;this.visible(o._visOriginal[n])})}},colvisGroup:{className:"buttons-colvisGroup",action:function(n,e,t,o){e.columns(o.show).visible(!0,!1),e.columns(o.hide).visible(!1,!1),e.columns.adjust()},show:[],hide:[]}}),o}); \ No newline at end of file diff --git a/articles/adbcva_files/dt-ext-buttons-1.13.4/js/buttons.html5.min.js b/articles/adbcva_files/dt-ext-buttons-1.13.4/js/buttons.html5.min.js new file mode 100644 index 00000000..28d5b8cb --- /dev/null +++ b/articles/adbcva_files/dt-ext-buttons-1.13.4/js/buttons.html5.min.js @@ -0,0 +1,8 @@ +/*! + * HTML5 export buttons for Buttons and DataTables. + * 2016 SpryMedia Ltd - datatables.net/license + * + * FileSaver.js (1.3.3) - MIT license + * Copyright © 2016 Eli Grey - http://eligrey.com + */ +!function(n){var r,a;"function"==typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(t){return n(t,window,document)}):"object"==typeof exports?(r=require("jquery"),a=function(t,e){e.fn.dataTable||require("datatables.net")(t,e),e.fn.dataTable.Buttons||require("datatables.net-buttons")(t,e)},"undefined"!=typeof window?module.exports=function(t,e,o,l){return t=t||window,e=e||r(t),a(t,e),n(e,t,t.document)}:(a(window,r),module.exports=n(r,window,window.document))):n(jQuery,window,document)}(function(C,T,y,t,e,k){"use strict";var o,l,n=C.fn.dataTable;function S(){return o||T.JSZip}function s(){return l||T.pdfMake}n.Buttons.pdfMake=function(t){if(!t)return s();l=t},n.Buttons.jszip=function(t){if(!t)return S();o=t};function N(t){var e="Sheet1";return e=t.sheetName?t.sheetName.replace(/[\[\]\*\/\\\?\:]/g,""):e}function u(t,e){for(var o=c(e),l=t.buttons.exportData(e.exportOptions),n=e.fieldBoundary,r=e.fieldSeparator,a=new RegExp(n,"g"),d=e.escapeChar!==k?e.escapeChar:"\\",p=function(t){for(var e="",o=0,l=t.length;o',"xl/_rels/workbook.xml.rels":'',"[Content_Types].xml":'',"xl/workbook.xml":'',"xl/worksheets/sheet1.xml":'',"xl/styles.xml":''},R=[{match:/^\-?\d+\.\d%$/,style:60,fmt:function(t){return t/100}},{match:/^\-?\d+\.?\d*%$/,style:56,fmt:function(t){return t/100}},{match:/^\-?\$[\d,]+.?\d*$/,style:57},{match:/^\-?£[\d,]+.?\d*$/,style:58},{match:/^\-?€[\d,]+.?\d*$/,style:59},{match:/^\-?\d+$/,style:65},{match:/^\-?\d+\.\d{2}$/,style:66},{match:/^\([\d,]+\)$/,style:61,fmt:function(t){return-1*t.replace(/[\(\)]/g,"")}},{match:/^\([\d,]+\.\d{2}\)$/,style:62,fmt:function(t){return-1*t.replace(/[\(\)]/g,"")}},{match:/^\-?[\d,]+$/,style:63},{match:/^\-?[\d,]+\.\d{2}$/,style:64},{match:/^[\d]{4}\-[01][\d]\-[0123][\d]$/,style:67,fmt:function(t){return Math.round(25569+Date.parse(t)/864e5)}}];return n.ext.buttons.copyHtml5={className:"buttons-copy buttons-html5",text:function(t){return t.i18n("buttons.copy","Copy")},action:function(t,e,o,l){this.processing(!0);var n=this,r=u(e,l),a=e.buttons.exportInfo(l),d=c(l),p=r.str,i=C("
").css({height:1,width:1,overflow:"hidden",position:"fixed",top:0,left:0}),d=(a.title&&(p=a.title+d+d+p),a.messageTop&&(p=a.messageTop+d+d+p),a.messageBottom&&(p=p+d+d+a.messageBottom),l.customize&&(p=l.customize(p,l,e)),C("'); - } else { - $input = $(''); - } - if (!immediate) { - $cell.data('input', $input).data('html', html); - $input.attr('title', 'Hit Ctrl+Enter to finish editing, or Esc to cancel'); - } - $input.val(value); - if (inArray(index, disableCols)) { - $input.attr('readonly', '').css('filter', 'invert(25%)'); - } - $cell.empty().append($input); - if (cell === current) $input.focus(); - $input.css('width', '100%'); - - if (immediate) $input.on('blur', function(e) { - var valueNew = $input.val(); - if (valueNew != value) { - _cell.data(valueNew); - if (HTMLWidgets.shinyMode) { - changeInput('cell_edit', [cellInfo(cell)], 'DT.cellInfo', null, {priority: 'event'}); - } - // for server-side processing, users have to call replaceData() to update the table - if (!server) table.draw(false); - } else { - $cell.html(html); - } - }).on('keyup', function(e) { - // hit Escape to cancel editing - if (e.keyCode === 27) $input.trigger('blur'); - }); - - // bulk edit (row, column, or all) - if (!immediate) $input.on('keyup', function(e) { - var removeInput = function($cell, restore) { - $cell.data('input').remove(); - if (restore) $cell.html($cell.data('html')); - } - if (e.keyCode === 27) { - for (var i = 0; i < target.length; i++) { - removeInput($(target[i]), true); - } - } else if (e.keyCode === 13 && e.ctrlKey) { - // Ctrl + Enter - var cell, $cell, _cell, cellData = []; - for (var i = 0; i < target.length; i++) { - cell = target[i]; $cell = $(cell); _cell = table.cell(cell); - _cell.data($cell.data('input').val()); - HTMLWidgets.shinyMode && cellData.push(cellInfo(cell)); - removeInput($cell, false); - } - if (HTMLWidgets.shinyMode) { - changeInput('cell_edit', cellData, 'DT.cellInfo', null, {priority: "event"}); - } - if (!server) table.draw(false); - } - }); - })(target[i], this); - } - }); - - // interaction with shiny - if (!HTMLWidgets.shinyMode && !crosstalkOptions.group) return; - - var methods = {}; - var shinyData = {}; - - methods.updateCaption = function(caption) { - if (!caption) return; - $table.children('caption').replaceWith(caption); - } - - // register clear functions to remove input values when the table is removed - instance.clearInputs = {}; - - var changeInput = function(id, value, type, noCrosstalk, opts) { - var event = id; - id = el.id + '_' + id; - if (type) id = id + ':' + type; - // do not update if the new value is the same as old value - if (event !== 'cell_edit' && !/_clicked$/.test(event) && shinyData.hasOwnProperty(id) && shinyData[id] === JSON.stringify(value)) - return; - shinyData[id] = JSON.stringify(value); - if (HTMLWidgets.shinyMode && Shiny.setInputValue) { - Shiny.setInputValue(id, value, opts); - if (!instance.clearInputs[id]) instance.clearInputs[id] = function() { - Shiny.setInputValue(id, null); - } - } - - // HACK - if (event === "rows_selected" && !noCrosstalk) { - if (crosstalkOptions.group) { - var keys = crosstalkOptions.key; - var selectedKeys = null; - if (value) { - selectedKeys = []; - for (var i = 0; i < value.length; i++) { - // The value array's contents use 1-based row numbers, so we must - // convert to 0-based before indexing into the keys array. - selectedKeys.push(keys[value[i] - 1]); - } - } - instance.ctselectHandle.set(selectedKeys); - } - } - }; - - var addOne = function(x) { - return x.map(function(i) { return 1 + i; }); - }; - - var unique = function(x) { - var ux = []; - $.each(x, function(i, el){ - if ($.inArray(el, ux) === -1) ux.push(el); - }); - return ux; - } - - // change the row index of a cell - var tweakCellIndex = function(cell) { - var info = cell.index(); - // some cell may not be valid. e.g, #759 - // when using the RowGroup extension, datatables will - // generate the row label and the cells are not part of - // the data thus contain no row/col info - if (info === undefined) - return {row: null, col: null}; - if (server) { - info.row = DT_rows_current[info.row]; - } else { - info.row += 1; - } - return {row: info.row, col: info.column}; - } - - var cleanSelectedValues = function() { - changeInput('rows_selected', []); - changeInput('columns_selected', []); - changeInput('cells_selected', transposeArray2D([]), 'shiny.matrix'); - } - // #828 we should clean the selection on the server-side when the table reloads - cleanSelectedValues(); - - // a flag to indicates if select extension is initialized or not - var flagSelectExt = table.settings()[0]._select !== undefined; - // the Select extension should only be used in the client mode and - // when the selection.mode is set to none - if (data.selection.mode === 'none' && !server && flagSelectExt) { - var updateRowsSelected = function() { - var rows = table.rows({selected: true}); - var selected = []; - $.each(rows.indexes().toArray(), function(i, v) { - selected.push(v + 1); - }); - changeInput('rows_selected', selected); - } - var updateColsSelected = function() { - var columns = table.columns({selected: true}); - changeInput('columns_selected', columns.indexes().toArray()); - } - var updateCellsSelected = function() { - var cells = table.cells({selected: true}); - var selected = []; - cells.every(function() { - var row = this.index().row; - var col = this.index().column; - selected = selected.concat([[row + 1, col]]); - }); - changeInput('cells_selected', transposeArray2D(selected), 'shiny.matrix'); - } - table.on('select deselect', function(e, dt, type, indexes) { - updateRowsSelected(); - updateColsSelected(); - updateCellsSelected(); - }) - } - - var selMode = data.selection.mode, selTarget = data.selection.target; - var selDisable = data.selection.selectable === false; - if (inArray(selMode, ['single', 'multiple'])) { - var selClass = inArray(data.style, ['bootstrap', 'bootstrap4']) ? 'active' : 'selected'; - // selected1: row indices; selected2: column indices - var initSel = function(x) { - if (x === null || typeof x === 'boolean' || selTarget === 'cell') { - return {rows: [], cols: []}; - } else if (selTarget === 'row') { - return {rows: $.makeArray(x), cols: []}; - } else if (selTarget === 'column') { - return {rows: [], cols: $.makeArray(x)}; - } else if (selTarget === 'row+column') { - return {rows: $.makeArray(x.rows), cols: $.makeArray(x.cols)}; - } - } - var selected = data.selection.selected; - var selected1 = initSel(selected).rows, selected2 = initSel(selected).cols; - // selectable should contain either all positive or all non-positive values, not both - // positive values indicate "selectable" while non-positive values means "nonselectable" - // the assertion is performed on R side. (only column indicides could be zero which indicates - // the row name) - var selectable = data.selection.selectable; - var selectable1 = initSel(selectable).rows, selectable2 = initSel(selectable).cols; - - // After users reorder the rows or filter the table, we cannot use the table index - // directly. Instead, we need this function to find out the rows between the two clicks. - // If user filter the table again between the start click and the end click, the behavior - // would be undefined, but it should not be a problem. - var shiftSelRowsIndex = function(start, end) { - var indexes = server ? DT_rows_all : table.rows({ search: 'applied' }).indexes().toArray(); - start = indexes.indexOf(start); end = indexes.indexOf(end); - // if start is larger than end, we need to swap - if (start > end) { - var tmp = end; end = start; start = tmp; - } - return indexes.slice(start, end + 1); - } - - var serverRowIndex = function(clientRowIndex) { - return server ? DT_rows_current[clientRowIndex] : clientRowIndex + 1; - } - - // row, column, or cell selection - var lastClickedRow; - if (inArray(selTarget, ['row', 'row+column'])) { - // Get the current selected rows. It will also - // update the selected1's value based on the current row selection state - // Note we can't put this function inside selectRows() directly, - // the reason is method.selectRows() will override selected1's value but this - // function will add rows to selected1 (keep the existing selection), which is - // inconsistent with column and cell selection. - var selectedRows = function() { - var rows = table.rows('.' + selClass); - var idx = rows.indexes().toArray(); - if (!server) { - selected1 = addOne(idx); - return selected1; - } - idx = idx.map(function(i) { - return DT_rows_current[i]; - }); - selected1 = selMode === 'multiple' ? unique(selected1.concat(idx)) : idx; - return selected1; - } - // Change selected1's value based on selectable1, then refresh the row state - var onlyKeepSelectableRows = function() { - if (selDisable) { // users can't select; useful when only want backend select - selected1 = []; - return; - } - if (selectable1.length === 0) return; - var nonselectable = selectable1[0] <= 0; - if (nonselectable) { - // should make selectable1 positive - selected1 = $(selected1).not(selectable1.map(function(i) { return -i; })).get(); - } else { - selected1 = $(selected1).filter(selectable1).get(); - } - } - // Change selected1's value based on selectable1, then - // refresh the row selection state according to values in selected1 - var selectRows = function(ignoreSelectable) { - if (!ignoreSelectable) onlyKeepSelectableRows(); - table.$('tr.' + selClass).removeClass(selClass); - if (selected1.length === 0) return; - if (server) { - table.rows({page: 'current'}).every(function() { - if (inArray(DT_rows_current[this.index()], selected1)) { - $(this.node()).addClass(selClass); - } - }); - } else { - var selected0 = selected1.map(function(i) { return i - 1; }); - $(table.rows(selected0).nodes()).addClass(selClass); - } - } - table.on('mousedown.dt', 'tbody tr', function(e) { - var $this = $(this), thisRow = table.row(this); - if (selMode === 'multiple') { - if (e.shiftKey && lastClickedRow !== undefined) { - // select or de-select depends on the last clicked row's status - var flagSel = !$this.hasClass(selClass); - var crtClickedRow = serverRowIndex(thisRow.index()); - if (server) { - var rowsIndex = shiftSelRowsIndex(lastClickedRow, crtClickedRow); - // update current page's selClass - rowsIndex.map(function(i) { - var rowIndex = DT_rows_current.indexOf(i); - if (rowIndex >= 0) { - var row = table.row(rowIndex).nodes().to$(); - var flagRowSel = !row.hasClass(selClass); - if (flagSel === flagRowSel) row.toggleClass(selClass); - } - }); - // update selected1 - if (flagSel) { - selected1 = unique(selected1.concat(rowsIndex)); - } else { - selected1 = selected1.filter(function(index) { - return !inArray(index, rowsIndex); - }); - } - } else { - // js starts from 0 - shiftSelRowsIndex(lastClickedRow - 1, crtClickedRow - 1).map(function(value) { - var row = table.row(value).nodes().to$(); - var flagRowSel = !row.hasClass(selClass); - if (flagSel === flagRowSel) row.toggleClass(selClass); - }); - } - e.preventDefault(); - } else { - $this.toggleClass(selClass); - } - } else { - if ($this.hasClass(selClass)) { - $this.removeClass(selClass); - } else { - table.$('tr.' + selClass).removeClass(selClass); - $this.addClass(selClass); - } - } - if (server && !$this.hasClass(selClass)) { - var id = DT_rows_current[thisRow.index()]; - // remove id from selected1 since its class .selected has been removed - if (inArray(id, selected1)) selected1.splice($.inArray(id, selected1), 1); - } - selectedRows(); // update selected1's value based on selClass - selectRows(false); // only keep the selectable rows - changeInput('rows_selected', selected1); - changeInput('row_last_clicked', serverRowIndex(thisRow.index()), null, null, {priority: 'event'}); - lastClickedRow = serverRowIndex(thisRow.index()); - }); - selectRows(false); // in case users have specified pre-selected rows - // restore selected rows after the table is redrawn (e.g. sort/search/page); - // client-side tables will preserve the selections automatically; for - // server-side tables, we have to *real* row indices are in `selected1` - changeInput('rows_selected', selected1); - if (server) table.on('draw.dt', function(e) { selectRows(false); }); - methods.selectRows = function(selected, ignoreSelectable) { - selected1 = $.makeArray(selected); - selectRows(ignoreSelectable); - changeInput('rows_selected', selected1); - } - } - - if (inArray(selTarget, ['column', 'row+column'])) { - if (selTarget === 'row+column') { - $(table.columns().footer()).css('cursor', 'pointer'); - } - // update selected2's value based on selectable2 - var onlyKeepSelectableCols = function() { - if (selDisable) { // users can't select; useful when only want backend select - selected2 = []; - return; - } - if (selectable2.length === 0) return; - var nonselectable = selectable2[0] <= 0; - if (nonselectable) { - // need to make selectable2 positive - selected2 = $(selected2).not(selectable2.map(function(i) { return -i; })).get(); - } else { - selected2 = $(selected2).filter(selectable2).get(); - } - } - // update selected2 and then - // refresh the col selection state according to values in selected2 - var selectCols = function(ignoreSelectable) { - if (!ignoreSelectable) onlyKeepSelectableCols(); - // if selected2 is not a valide index (e.g., larger than the column number) - // table.columns(selected2) will fail and result in a blank table - // this is different from the table.rows(), where the out-of-range indexes - // doesn't affect at all - selected2 = $(selected2).filter(table.columns().indexes()).get(); - table.columns().nodes().flatten().to$().removeClass(selClass); - if (selected2.length > 0) - table.columns(selected2).nodes().flatten().to$().addClass(selClass); - } - var callback = function() { - var colIdx = selTarget === 'column' ? table.cell(this).index().column : - $.inArray(this, table.columns().footer()), - thisCol = $(table.column(colIdx).nodes()); - if (colIdx === -1) return; - if (thisCol.hasClass(selClass)) { - thisCol.removeClass(selClass); - selected2.splice($.inArray(colIdx, selected2), 1); - } else { - if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass); - thisCol.addClass(selClass); - selected2 = selMode === 'single' ? [colIdx] : unique(selected2.concat([colIdx])); - } - selectCols(false); // update selected2 based on selectable - changeInput('columns_selected', selected2); - } - if (selTarget === 'column') { - $(table.table().body()).on('click.dt', 'td', callback); - } else { - $(table.table().footer()).on('click.dt', 'tr th', callback); - } - selectCols(false); // in case users have specified pre-selected columns - changeInput('columns_selected', selected2); - if (server) table.on('draw.dt', function(e) { selectCols(false); }); - methods.selectColumns = function(selected, ignoreSelectable) { - selected2 = $.makeArray(selected); - selectCols(ignoreSelectable); - changeInput('columns_selected', selected2); - } - } - - if (selTarget === 'cell') { - var selected3 = [], selectable3 = []; - if (selected !== null) selected3 = selected; - if (selectable !== null && typeof selectable !== 'boolean') selectable3 = selectable; - var findIndex = function(ij, sel) { - for (var i = 0; i < sel.length; i++) { - if (ij[0] === sel[i][0] && ij[1] === sel[i][1]) return i; - } - return -1; - } - // Change selected3's value based on selectable3, then refresh the cell state - var onlyKeepSelectableCells = function() { - if (selDisable) { // users can't select; useful when only want backend select - selected3 = []; - return; - } - if (selectable3.length === 0) return; - var nonselectable = selectable3[0][0] <= 0; - var out = []; - if (nonselectable) { - selected3.map(function(ij) { - // should make selectable3 positive - if (findIndex([-ij[0], -ij[1]], selectable3) === -1) { out.push(ij); } - }); - } else { - selected3.map(function(ij) { - if (findIndex(ij, selectable3) > -1) { out.push(ij); } - }); - } - selected3 = out; - } - // Change selected3's value based on selectable3, then - // refresh the cell selection state according to values in selected3 - var selectCells = function(ignoreSelectable) { - if (!ignoreSelectable) onlyKeepSelectableCells(); - table.$('td.' + selClass).removeClass(selClass); - if (selected3.length === 0) return; - if (server) { - table.cells({page: 'current'}).every(function() { - var info = tweakCellIndex(this); - if (findIndex([info.row, info.col], selected3) > -1) - $(this.node()).addClass(selClass); - }); - } else { - selected3.map(function(ij) { - $(table.cell(ij[0] - 1, ij[1]).node()).addClass(selClass); - }); - } - }; - table.on('click.dt', 'tbody td', function() { - var $this = $(this), info = tweakCellIndex(table.cell(this)); - if ($this.hasClass(selClass)) { - $this.removeClass(selClass); - selected3.splice(findIndex([info.row, info.col], selected3), 1); - } else { - if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass); - $this.addClass(selClass); - selected3 = selMode === 'single' ? [[info.row, info.col]] : - unique(selected3.concat([[info.row, info.col]])); - } - selectCells(false); // must call this to update selected3 based on selectable3 - changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); - }); - selectCells(false); // in case users have specified pre-selected columns - changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); - - if (server) table.on('draw.dt', function(e) { selectCells(false); }); - methods.selectCells = function(selected, ignoreSelectable) { - selected3 = selected ? selected : []; - selectCells(ignoreSelectable); - changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); - } - } - } - - // expose some table info to Shiny - var updateTableInfo = function(e, settings) { - // TODO: is anyone interested in the page info? - // changeInput('page_info', table.page.info()); - var updateRowInfo = function(id, modifier) { - var idx; - if (server) { - idx = modifier.page === 'current' ? DT_rows_current : DT_rows_all; - } else { - var rows = table.rows($.extend({ - search: 'applied', - page: 'all' - }, modifier)); - idx = addOne(rows.indexes().toArray()); - } - changeInput('rows' + '_' + id, idx); - }; - updateRowInfo('current', {page: 'current'}); - updateRowInfo('all', {}); - } - table.on('draw.dt', updateTableInfo); - updateTableInfo(); - - // state info - table.on('draw.dt column-visibility.dt', function() { - changeInput('state', table.state()); - }); - changeInput('state', table.state()); - - // search info - var updateSearchInfo = function() { - changeInput('search', table.search()); - if (filterRow) changeInput('search_columns', filterRow.toArray().map(function(td) { - return $(td).find('input').first().val(); - })); - } - table.on('draw.dt', updateSearchInfo); - updateSearchInfo(); - - var cellInfo = function(thiz) { - var info = tweakCellIndex(table.cell(thiz)); - info.value = table.cell(thiz).data(); - return info; - } - // the current cell clicked on - table.on('click.dt', 'tbody td', function() { - changeInput('cell_clicked', cellInfo(this), null, null, {priority: 'event'}); - }) - changeInput('cell_clicked', {}); - - // do not trigger table selection when clicking on links unless they have classes - table.on('click.dt', 'tbody td a', function(e) { - if (this.className === '') e.stopPropagation(); - }); - - methods.addRow = function(data, rowname, resetPaging) { - var n = table.columns().indexes().length, d = n - data.length; - if (d === 1) { - data = rowname.concat(data) - } else if (d !== 0) { - console.log(data); - console.log(table.columns().indexes()); - throw 'New data must be of the same length as current data (' + n + ')'; - }; - table.row.add(data).draw(resetPaging); - } - - methods.updateSearch = function(keywords) { - if (keywords.global !== null) - $(table.table().container()).find('input[type=search]').first() - .val(keywords.global).trigger('input'); - var columns = keywords.columns; - if (!filterRow || columns === null) return; - filterRow.toArray().map(function(td, i) { - var v = typeof columns === 'string' ? columns : columns[i]; - if (typeof v === 'undefined') { - console.log('The search keyword for column ' + i + ' is undefined') - return; - } - $(td).find('input').first().val(v); - searchColumn(i, v); - }); - table.draw(); - } - - methods.hideCols = function(hide, reset) { - if (reset) table.columns().visible(true, false); - table.columns(hide).visible(false); - } - - methods.showCols = function(show, reset) { - if (reset) table.columns().visible(false, false); - table.columns(show).visible(true); - } - - methods.colReorder = function(order, origOrder) { - table.colReorder.order(order, origOrder); - } - - methods.selectPage = function(page) { - if (table.page.info().pages < page || page < 1) { - throw 'Selected page is out of range'; - }; - table.page(page - 1).draw(false); - } - - methods.reloadData = function(resetPaging, clearSelection) { - // empty selections first if necessary - if (methods.selectRows && inArray('row', clearSelection)) methods.selectRows([]); - if (methods.selectColumns && inArray('column', clearSelection)) methods.selectColumns([]); - if (methods.selectCells && inArray('cell', clearSelection)) methods.selectCells([]); - table.ajax.reload(null, resetPaging); - } - - // update table filters (set new limits of sliders) - methods.updateFilters = function(newLims) { - // loop through each filter in the filter row - filterRow.each(function(i, td) { - var k = i; - if (filterRow.length > newLims.length) { - if (i === 0) return; // first column is row names - k = i - 1; - } - // Update the filters to reflect the updated data - set_filter_lims(td, newLims[k]); - }); - }; - - table.shinyMethods = methods; - }, - resize: function(el, width, height, instance) { - if (instance.data) this.renderValue(el, instance.data, instance); - - // dynamically adjust height if fillContainer = TRUE - if (instance.fillContainer) - this.fillAvailableHeight(el, height); - - this.adjustWidth(el); - }, - - // dynamically set the scroll body to fill available height - // (used with fillContainer = TRUE) - fillAvailableHeight: function(el, availableHeight) { - - // see how much of the table is occupied by header/footer elements - // and use that to compute a target scroll body height - var dtWrapper = $(el).find('div.dataTables_wrapper'); - var dtScrollBody = $(el).find($('div.dataTables_scrollBody')); - var framingHeight = dtWrapper.innerHeight() - dtScrollBody.innerHeight(); - var scrollBodyHeight = availableHeight - framingHeight; - - // we need to set `max-height` to none as datatables library now sets this - // to a fixed height, disabling the ability to resize to fill the window, - // as it will be set to a fixed 100px under such circumstances, e.g., RStudio IDE, - // or FlexDashboard - // see https://github.com/rstudio/DT/issues/951#issuecomment-1026464509 - dtScrollBody.css('max-height', 'none'); - // set the height - dtScrollBody.height(scrollBodyHeight + 'px'); - }, - - // adjust the width of columns; remove the hard-coded widths on table and the - // scroll header when scrollX/Y are enabled - adjustWidth: function(el) { - var $el = $(el), table = $el.data('datatable'); - if (table) table.columns.adjust(); - $el.find('.dataTables_scrollHeadInner').css('width', '') - .children('table').css('margin-left', ''); - } -}); - - if (!HTMLWidgets.shinyMode) return; - - Shiny.addCustomMessageHandler('datatable-calls', function(data) { - var id = data.id; - var el = document.getElementById(id); - var table = el ? $(el).data('datatable') : null; - if (!table) { - console.log("Couldn't find table with id " + id); - return; - } - - var methods = table.shinyMethods, call = data.call; - if (methods[call.method]) { - methods[call.method].apply(table, call.args); - } else { - console.log("Unknown method " + call.method); - } - }); - -})(); diff --git a/main/articles/adbcva_files/datatables-css-0.0.0/datatables-crosstalk.css b/main/articles/adbcva_files/datatables-css-0.0.0/datatables-crosstalk.css deleted file mode 100644 index fb5bae84..00000000 --- a/main/articles/adbcva_files/datatables-css-0.0.0/datatables-crosstalk.css +++ /dev/null @@ -1,23 +0,0 @@ -.dt-crosstalk-fade { - opacity: 0.2; -} - -html body div.DTS div.dataTables_scrollBody { - background: none; -} - - -/* -Fix https://github.com/rstudio/DT/issues/563 -If the `table.display` is set to "block" (e.g., pkgdown), the browser will display -datatable objects strangely. The search panel and the page buttons will still be -in full-width but the table body will be "compact" and shorter. -In therory, having this attributes will affect `dom="t"` -with `display: block` users. But in reality, there should be no one. -We may remove the below lines in the future if the upstream agree to have this there. -See https://github.com/DataTables/DataTablesSrc/issues/160 -*/ - -table.dataTable { - display: table; -} diff --git a/main/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.extra.css b/main/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.extra.css deleted file mode 100644 index b2dd141f..00000000 --- a/main/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.extra.css +++ /dev/null @@ -1,28 +0,0 @@ -/* Selected rows/cells */ -table.dataTable tr.selected td, table.dataTable td.selected { - background-color: #b0bed9 !important; -} -/* In case of scrollX/Y or FixedHeader */ -.dataTables_scrollBody .dataTables_sizing { - visibility: hidden; -} - -/* The datatables' theme CSS file doesn't define -the color but with white background. It leads to an issue that -when the HTML's body color is set to 'white', the user can't -see the text since the background is white. One case happens in the -RStudio's IDE when inline viewing the DT table inside an Rmd file, -if the IDE theme is set to "Cobalt". - -See https://github.com/rstudio/DT/issues/447 for more info - -This fixes should have little side-effects because all the other elements -of the default theme use the #333 font color. - -TODO: The upstream may use relative colors for both the table background -and the color. It means the table can display well without this patch -then. At that time, we need to remove the below CSS attributes. -*/ -div.datatables { - color: #333; -} diff --git a/main/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.min.css b/main/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.min.css deleted file mode 100644 index f1db0e82..00000000 --- a/main/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.min.css +++ /dev/null @@ -1 +0,0 @@ -td.dt-control{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAACjElEQVR4Aa2V30uTURjHnVBUgglCaXVTJJVLMdhQm7+1JEvJiKAggmgSQiKJl0V0E13UVf0HQZmBLcvlpqa55tqV0YoMzIhY6js0yDH11X17vuO8Sq5Zgl/48DznPD/G63nOMSmBkoUNwhYhTUgn9NUeY8z5p0wqOVXYKRwQLMJhhYV7Kpaqck2rNdskbBPMdrv9osfjcQaDwW/RaHSR0OceY8xhrqox/a3ZZmGHkO9wOB7ouj6PBGKMOcxlzcqmdDYKGZmZmSWjo6PvIYosRuDWXGj50IwTb4+hxleN5sAVvJh4jvBCGBRzWSO121UPk3EAaUKuz+d7ycTp+Wnc/nwL1d4qHBVidmjZv/npBkJzGiiv19vFWmGrcVDsvKupqeky/056VMf1j9dQOViBKo9Aa/ixdbnYcrQGWsBc1jQ2NtrZQ/VKShHM8kvdEPVN9qJsoBRl/aUoHyiJ+UpcCxJTtmfCDYoHJT2yYyOlPtcaCoUmGGwdbkVRbxGK+2y0gg2GisUvNmJCy/BVUJqm/eBIxXqpgbUtiBise12HQlc+ClwFSKRCiZH6wXpQs7OzETWn6XENa/trYemywuK0IpGsTotgRU3fcVBzouWG6pOnpqY0BhuGGpDXeUjIW7JKcfuX3tjjP9k4FBkZN4PtY+042JGzzNMcGDJ35C7tmcU++tJmjE63OpSUuLEJ62GcfXUO+59kr8rJnlOY0WfAGtYaY/PHYPv9fhdEY7++4nz/BWS17UPWY0Es2avWp3vOYOTnCCheBtaqHskJr95kZBL3AvdR2XkEex5mYbdQ+qwCd97dRTAcXHn1Moyrt16PA2tN//V8jY+Pf4cS/VWerzU9sDay1gd2Xf4F/AZqlpeB9836LwAAAABJRU5ErkJggg==) no-repeat center center;cursor:pointer}tr.dt-hasChild td.dt-control{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAACdUlEQVR4Aa2V30tTYRjHVSgsoQKhXPUPlKZMlImiIIg/pggiiDeCBAdqyC4Kf9zVhVdeelX33QnCbtYvxZsxxkoqKxiz1SzdFudMb5xO5/bt+fa+sPCw3IVf+PA+532e5ytn53lfK0qoSrggXBauCbUKxtxjjjVnq1IXXxFuCXeEFqGdMOYec6zRtZX/M6sWrgv1hmHcDwQCLxOJxM9CoZAnjLnHHGt0bbXdVG1cEm4KLp/P9yKXyx2jhJhjDWvZc9qUwUWhzuFwdMVisc8QFQ4PcbCygvT0NJLDw0gNDSH96DEyfj8KmQwo1rJHem8oD2VapX/sxlAo9Aqi/N4e9hYWsDMwgARxD2DH7ZZYren5eZxYFqhgMOhnr3BVeSnn216v98Hf3yqXg/X0CX719YFs9/WquJfPGtkzZ2fBWvZ4PB6DHtqrokaol7/0GqLM2hq2enpsxMmpvf3VVVD8UOJxV42Uet1Wy7J+M5mam8P37u6ySM7MgDJNM8mRUl5qYDtOREz+GB3FZlcXNjs7UUrMk/jYGKhsNnuo57TWZhgTw0hHO0EpRdpV/tvICKgjUdFQv/Lu7q7JZHxqCl9dLqGtSJtL4VJ80Wvc8xD2V9YfRUbmLZPp5WVstLTYaSWt+lmt1tISKH5Q/VFqbGOTl6GNTk7iQ3Oz4FSrU8UfuTqdBJHxceQz+2APe/8Zm+Jgh8PhNxBlt7YQNQysNzVivbEJ7wXGiiZEJiZwEI2C4mFgr/aoKnn0jk0TiWfPsTE4iHcN9xBuaMCn/n5sLy7iKJk8ffTqikfvfC4H9laWdX2lUqltaDEu9/o664LtIOVfsOf4L+APb5yaiwyN8+8AAAAASUVORK5CYII=) no-repeat center center}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand;background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC)}table.dataTable thead .sorting_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==) !important}table.dataTable thead .sorting_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=) !important}table.dataTable thead .sorting_asc_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAWUlEQVQoz2NgGAWDCtyJvPPzznc4/HknEbsy9js77vyHw313eHGZZ3PnE1TRuzuOuK1lvDMRqmzuHUZ87lO+cxuo6PEdLUIeyb7z604pYf+y3Zlwh4u2YQoAc7ZCBHH4jigAAAAASUVORK5CYII=)}table.dataTable thead .sorting_desc_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAW0lEQVQoz2NgoCm4w3Vnwh02wspK7/y6k01Ikdadx3f+37l9RxmfIsY7c4GKQHDiHUbcyhzvvIMq+3THBpci3jv7oIpAcMcdduzKEu/8vPMdDn/eiWQYBYMKAAC3ykIEuYQJUgAAAABJRU5ErkJggg==)}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, white 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, white 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, white 0%, #dcdcdc 100%);background:-o-linear-gradient(top, white 0%, #dcdcdc 100%);background:linear-gradient(to bottom, white 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));background:-webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}} diff --git a/main/articles/adbcva_files/dt-core-1.11.3/js/jquery.dataTables.min.js b/main/articles/adbcva_files/dt-core-1.11.3/js/jquery.dataTables.min.js deleted file mode 100644 index ff23e914..00000000 --- a/main/articles/adbcva_files/dt-core-1.11.3/js/jquery.dataTables.min.js +++ /dev/null @@ -1,187 +0,0 @@ -/*! - Copyright 2008-2021 SpryMedia Ltd. - - This source file is free software, available under the following license: - MIT license - http://datatables.net/license - - This source file is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. - - For details please refer to: http://www.datatables.net - DataTables 1.11.3 - ©2008-2021 SpryMedia Ltd - datatables.net/license -*/ -var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(l,z,A){l instanceof String&&(l=String(l));for(var q=l.length,E=0;E").css({position:"fixed",top:0,left:-1*l(z).scrollLeft(),height:1, -width:1,overflow:"hidden"}).append(l("
").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(l("
").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}l.extend(a.oBrowser,u.__browser);a.oScroll.iBarWidth=u.__browser.barWidth} -function Cb(a,b,c,d,e,h){var f=!1;if(c!==q){var g=c;f=!0}for(;d!==e;)a.hasOwnProperty(d)&&(g=f?b(g,a[d],d,a):a[d],f=!0,d+=h);return g}function Xa(a,b){var c=u.defaults.column,d=a.aoColumns.length;c=l.extend({},u.models.oColumn,c,{nTh:b?b:A.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=l.extend({},u.models.oSearch,c[d]);Ga(a,d,l(b).data())}function Ga(a,b,c){b=a.aoColumns[b]; -var d=a.oClasses,e=l(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var h=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);h&&(b.sWidthOrig=h[1])}c!==q&&null!==c&&(Ab(c),P(u.defaults.column,c,!0),c.mDataProp===q||c.mData||(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),l.extend(b,c),X(b,c,"sWidth","sWidthOrig"),c.iDataSort!==q&&(b.aDataSort=[c.iDataSort]),X(b,c,"aDataSort"));var f=b.mData,g=na(f), -k=b.mRender?na(b.mRender):null;c=function(m){return"string"===typeof m&&-1!==m.indexOf("@")};b._bAttrSrc=l.isPlainObject(f)&&(c(f.sort)||c(f.type)||c(f.filter));b._setter=null;b.fnGetData=function(m,n,p){var t=g(m,n,q,p);return k&&n?k(t,n,m,p):t};b.fnSetData=function(m,n,p){return ha(f)(m,n,p)};"number"!==typeof f&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==l.inArray("asc",b.asSorting);c=-1!==l.inArray("desc",b.asSorting);b.bSortable&&(a||c)?a&&!c? -(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI):(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI="")}function ta(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ya(a);for(var c=0,d=b.length;cm[n])d(g.length+m[n],k);else if("string"===typeof m[n]){var p=0;for(f=g.length;pb&&a[e]--; -1!=d&&c===q&&a.splice(d,1)}function wa(a,b,c,d){var e=a.aoData[b],h,f=function(k,m){for(;k.childNodes.length;)k.removeChild(k.firstChild);k.innerHTML=T(a,b,m,"display")};if("dom"!==c&&(c&&"auto"!==c||"dom"!==e.src)){var g=e.anCells;if(g)if(d!==q)f(g[d],d);else for(c=0,h=g.length;c").appendTo(d));var k=0;for(b=g.length;k=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);g=a._iDisplayStart;var n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,V(a,!1);else if(!k)a.iDraw++;else if(!a.bDestroying&&!b){Gb(a);return}if(0!==m.length)for(b=k?a.aoData.length:n,f=k?0:g;f",{"class":h?e[0]:""}).append(l("",{valign:"top",colSpan:oa(a),"class":a.oClasses.sRowEmpty}).html(d))[0];F(a,"aoHeaderCallback","header",[l(a.nTHead).children("tr")[0],cb(a),g,n,m]);F(a,"aoFooterCallback", -"footer",[l(a.nTFoot).children("tr")[0],cb(a),g,n,m]);e=l(a.nTBody);e.children().detach();e.append(l(c));F(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function ka(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&Hb(a);d?za(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;ja(a);a._drawHold=!1}function Ib(a){var b=a.oClasses,c=l(a.nTable);c=l("
").insertBefore(c);var d=a.oFeatures,e=l("
",{id:a.sTableId+"_wrapper", -"class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var h=a.sDom.split(""),f,g,k,m,n,p,t=0;t")[0];m=h[t+1];if("'"==m||'"'==m){n="";for(p=2;h[t+p]!=m;)n+=h[t+p],p++;"H"==n?n=b.sJUIHeader:"F"==n&&(n=b.sJUIFooter);-1!=n.indexOf(".")?(m=n.split("."),k.id=m[0].substr(1,m[0].length-1),k.className=m[1]):"#"==n.charAt(0)?k.id=n.substr(1,n.length-1):k.className=n;t+=p}e.append(k); -e=l(k)}else if(">"==g)e=e.parent();else if("l"==g&&d.bPaginate&&d.bLengthChange)f=Jb(a);else if("f"==g&&d.bFilter)f=Kb(a);else if("r"==g&&d.bProcessing)f=Lb(a);else if("t"==g)f=Mb(a);else if("i"==g&&d.bInfo)f=Nb(a);else if("p"==g&&d.bPaginate)f=Ob(a);else if(0!==u.ext.feature.length)for(k=u.ext.feature,p=0,m=k.length;p',g=d.sSearch;g=g.match(/_INPUT_/)?g.replace("_INPUT_",f):g+f;b=l("
",{id:h.f?null:c+"_filter","class":b.sFilter}).append(l("
").addClass(b.sLength);a.aanFeatures.l||(k[0].id=c+"_length");k.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));l("select",k).val(a._iDisplayLength).on("change.DT",function(m){jb(a,l(this).val());ja(a)});l(a.nTable).on("length.dt.DT",function(m,n,p){a===n&&l("select",k).val(p)});return k[0]}function Ob(a){var b=a.sPaginationType,c=u.ext.pager[b],d="function"===typeof c,e=function(f){ja(f)};b=l("
").addClass(a.oClasses.sPaging+b)[0]; -var h=a.aanFeatures;d||c.fnInit(a,b,e);h.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(f){if(d){var g=f._iDisplayStart,k=f._iDisplayLength,m=f.fnRecordsDisplay(),n=-1===k;g=n?0:Math.ceil(g/k);k=n?1:Math.ceil(m/k);m=c(g,k);var p;n=0;for(p=h.p.length;nh&& -(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e",{id:a.aanFeatures.r?null:a.sTableId+"_processing","class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function V(a,b){a.oFeatures.bProcessing&&l(a.aanFeatures.r).css("display",b?"block":"none"); -F(a,null,"processing",[a,b])}function Mb(a){var b=l(a.nTable),c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,h=a.oClasses,f=b.children("caption"),g=f.length?f[0]._captionSide:null,k=l(b[0].cloneNode(!1)),m=l(b[0].cloneNode(!1)),n=b.children("tfoot");n.length||(n=null);k=l("
",{"class":h.sScrollWrapper}).append(l("
",{"class":h.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?d?K(d):null:"100%"}).append(l("
",{"class":h.sScrollHeadInner}).css({"box-sizing":"content-box", -width:c.sXInner||"100%"}).append(k.removeAttr("id").css("margin-left",0).append("top"===g?f:null).append(b.children("thead"))))).append(l("
",{"class":h.sScrollBody}).css({position:"relative",overflow:"auto",width:d?K(d):null}).append(b));n&&k.append(l("
",{"class":h.sScrollFoot}).css({overflow:"hidden",border:0,width:d?d?K(d):null:"100%"}).append(l("
",{"class":h.sScrollFootInner}).append(m.removeAttr("id").css("margin-left",0).append("bottom"===g?f:null).append(b.children("tfoot"))))); -b=k.children();var p=b[0];h=b[1];var t=n?b[2]:null;if(d)l(h).on("scroll.DT",function(v){v=this.scrollLeft;p.scrollLeft=v;n&&(t.scrollLeft=v)});l(h).css("max-height",e);c.bCollapse||l(h).css("height",e);a.nScrollHead=p;a.nScrollBody=h;a.nScrollFoot=t;a.aoDrawCallback.push({fn:Ha,sName:"scrolling"});return k[0]}function Ha(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY;b=b.iBarWidth;var h=l(a.nScrollHead),f=h[0].style,g=h.children("div"),k=g[0].style,m=g.children("table");g=a.nScrollBody;var n=l(g),p= -g.style,t=l(a.nScrollFoot).children("div"),v=t.children("table"),x=l(a.nTHead),w=l(a.nTable),r=w[0],C=r.style,G=a.nTFoot?l(a.nTFoot):null,aa=a.oBrowser,L=aa.bScrollOversize;U(a.aoColumns,"nTh");var O=[],I=[],H=[],ea=[],Y,Ca=function(D){D=D.style;D.paddingTop="0";D.paddingBottom="0";D.borderTopWidth="0";D.borderBottomWidth="0";D.height=0};var fa=g.scrollHeight>g.clientHeight;if(a.scrollBarVis!==fa&&a.scrollBarVis!==q)a.scrollBarVis=fa,ta(a);else{a.scrollBarVis=fa;w.children("thead, tfoot").remove(); -if(G){var ba=G.clone().prependTo(w);var la=G.find("tr");ba=ba.find("tr")}var mb=x.clone().prependTo(w);x=x.find("tr");fa=mb.find("tr");mb.find("th, td").removeAttr("tabindex");c||(p.width="100%",h[0].style.width="100%");l.each(Na(a,mb),function(D,W){Y=ua(a,D);W.style.width=a.aoColumns[Y].sWidth});G&&ca(function(D){D.style.width=""},ba);h=w.outerWidth();""===c?(C.width="100%",L&&(w.find("tbody").height()>g.offsetHeight||"scroll"==n.css("overflow-y"))&&(C.width=K(w.outerWidth()-b)),h=w.outerWidth()): -""!==d&&(C.width=K(d),h=w.outerWidth());ca(Ca,fa);ca(function(D){var W=z.getComputedStyle?z.getComputedStyle(D).width:K(l(D).width());H.push(D.innerHTML);O.push(W)},fa);ca(function(D,W){D.style.width=O[W]},x);l(fa).height(0);G&&(ca(Ca,ba),ca(function(D){ea.push(D.innerHTML);I.push(K(l(D).css("width")))},ba),ca(function(D,W){D.style.width=I[W]},la),l(ba).height(0));ca(function(D,W){D.innerHTML='
'+H[W]+"
";D.childNodes[0].style.height="0";D.childNodes[0].style.overflow= -"hidden";D.style.width=O[W]},fa);G&&ca(function(D,W){D.innerHTML='
'+ea[W]+"
";D.childNodes[0].style.height="0";D.childNodes[0].style.overflow="hidden";D.style.width=I[W]},ba);w.outerWidth()g.offsetHeight||"scroll"==n.css("overflow-y")?h+b:h,L&&(g.scrollHeight>g.offsetHeight||"scroll"==n.css("overflow-y"))&&(C.width=K(la-b)),""!==c&&""===d||da(a,1,"Possible column misalignment",6)):la="100%";p.width=K(la);f.width=K(la);G&&(a.nScrollFoot.style.width= -K(la));!e&&L&&(p.height=K(r.offsetHeight+b));c=w.outerWidth();m[0].style.width=K(c);k.width=K(c);d=w.height()>g.clientHeight||"scroll"==n.css("overflow-y");e="padding"+(aa.bScrollbarLeft?"Left":"Right");k[e]=d?b+"px":"0px";G&&(v[0].style.width=K(c),t[0].style.width=K(c),t[0].style[e]=d?b+"px":"0px");w.children("colgroup").insertBefore(w.children("thead"));n.trigger("scroll");!a.bSorted&&!a.bFiltered||a._drawHold||(g.scrollTop=0)}}function ca(a,b,c){for(var d=0,e=0,h=b.length,f,g;e").appendTo(g.find("tbody"));g.find("thead, tfoot").remove();g.append(l(a.nTHead).clone()).append(l(a.nTFoot).clone());g.find("tfoot th, tfoot td").css("width","");m=Na(a,g.find("thead")[0]);for(v=0;v").css({width:w.sWidthOrig, -margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(v=0;v").css(h||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(g).appendTo(p);h&&f?g.width(f):h?(g.css("width","auto"),g.removeAttr("width"),g.width()").css("width",K(a)).appendTo(b||A.body);b=a[0].offsetWidth;a.remove();return b}function $b(a,b){var c=ac(a,b);if(0>c)return null;var d=a.aoData[c];return d.nTr?d.anCells[b]: -l("").html(T(a,c,b,"display"))[0]}function ac(a,b){for(var c,d=-1,e=-1,h=0,f=a.aoData.length;hd&&(d=c.length,e=h);return e}function K(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function pa(a){var b=[],c=a.aoColumns;var d=a.aaSortingFixed;var e=l.isPlainObject(d);var h=[];var f=function(n){n.length&&!Array.isArray(n[0])?h.push(n):l.merge(h,n)};Array.isArray(d)&&f(d); -e&&d.pre&&f(d.pre);f(a.aaSorting);e&&d.post&&f(d.post);for(a=0;aG?1:0;if(0!==C)return"asc"===r.dir?C:-C}C=c[n];G=c[p];return CG?1:0}):f.sort(function(n,p){var t,v=g.length,x=e[n]._aSortData,w=e[p]._aSortData;for(t=0;tG?1:0})}a.bSorted=!0}function cc(a){var b=a.aoColumns,c=pa(a);a=a.oLanguage.oAria;for(var d=0,e=b.length;d/g,"");var k=h.nTh;k.removeAttribute("aria-sort");h.bSortable&&(0e?e+1:3))}e=0;for(h=d.length;ee?e+1:3))}a.aLastSort=d}function bc(a,b){var c=a.aoColumns[b],d=u.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,va(a,b)));for(var h,f=u.ext.type.order[c.sType+"-pre"],g=0,k=a.aoData.length;g=e.length?[0, -m[1]]:m)}));b.search!==q&&l.extend(a.oPreviousSearch,Wb(b.search));if(b.columns){f=0;for(d=b.columns.length;f=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function fb(a,b){a=a.renderer;var c=u.ext.renderer[b];return l.isPlainObject(a)&&a[b]?c[a[b]]||c._:"string"===typeof a?c[a]||c._:c._}function Q(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Da(a,b){var c=ec.numbers_length,d=Math.floor(c/2); -b<=c?a=ra(0,b):a<=d?(a=ra(0,c-2),a.push("ellipsis"),a.push(b-1)):(a>=b-1-d?a=ra(b-(c-2),b):(a=ra(a-d+2,a+d-1),a.push("ellipsis"),a.push(b-1)),a.splice(0,0,"ellipsis"),a.splice(0,0,0));a.DT_el="span";return a}function Wa(a){l.each({num:function(b){return Ta(b,a)},"num-fmt":function(b){return Ta(b,a,rb)},"html-num":function(b){return Ta(b,a,Ua)},"html-num-fmt":function(b){return Ta(b,a,Ua,rb)}},function(b,c){M.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(M.type.search[b+a]=M.type.search.html)})}function fc(a){return function(){var b= -[Sa(this[u.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return u.ext.internal[a].apply(this,b)}}var u=function(a,b){if(this instanceof u)return l(a).DataTable(b);b=a;this.$=function(f,g){return this.api(!0).$(f,g)};this._=function(f,g){return this.api(!0).rows(f,g).data()};this.api=function(f){return f?new B(Sa(this[M.iApiIndex])):new B(this)};this.fnAddData=function(f,g){var k=this.api(!0);f=Array.isArray(f)&&(Array.isArray(f[0])||l.isPlainObject(f[0]))?k.rows.add(f):k.row.add(f); -(g===q||g)&&k.draw();return f.flatten().toArray()};this.fnAdjustColumnSizing=function(f){var g=this.api(!0).columns.adjust(),k=g.settings()[0],m=k.oScroll;f===q||f?g.draw(!1):(""!==m.sX||""!==m.sY)&&Ha(k)};this.fnClearTable=function(f){var g=this.api(!0).clear();(f===q||f)&&g.draw()};this.fnClose=function(f){this.api(!0).row(f).child.hide()};this.fnDeleteRow=function(f,g,k){var m=this.api(!0);f=m.rows(f);var n=f.settings()[0],p=n.aoData[f[0][0]];f.remove();g&&g.call(this,n,p);(k===q||k)&&m.draw(); -return p};this.fnDestroy=function(f){this.api(!0).destroy(f)};this.fnDraw=function(f){this.api(!0).draw(f)};this.fnFilter=function(f,g,k,m,n,p){n=this.api(!0);null===g||g===q?n.search(f,k,m,p):n.column(g).search(f,k,m,p);n.draw()};this.fnGetData=function(f,g){var k=this.api(!0);if(f!==q){var m=f.nodeName?f.nodeName.toLowerCase():"";return g!==q||"td"==m||"th"==m?k.cell(f,g).data():k.row(f).data()||null}return k.data().toArray()};this.fnGetNodes=function(f){var g=this.api(!0);return f!==q?g.row(f).node(): -g.rows().nodes().flatten().toArray()};this.fnGetPosition=function(f){var g=this.api(!0),k=f.nodeName.toUpperCase();return"TR"==k?g.row(f).index():"TD"==k||"TH"==k?(f=g.cell(f).index(),[f.row,f.columnVisible,f.column]):null};this.fnIsOpen=function(f){return this.api(!0).row(f).child.isShown()};this.fnOpen=function(f,g,k){return this.api(!0).row(f).child(g,k).show().child()[0]};this.fnPageChange=function(f,g){f=this.api(!0).page(f);(g===q||g)&&f.draw(!1)};this.fnSetColumnVis=function(f,g,k){f=this.api(!0).column(f).visible(g); -(k===q||k)&&f.columns.adjust().draw()};this.fnSettings=function(){return Sa(this[M.iApiIndex])};this.fnSort=function(f){this.api(!0).order(f).draw()};this.fnSortListener=function(f,g,k){this.api(!0).order.listener(f,g,k)};this.fnUpdate=function(f,g,k,m,n){var p=this.api(!0);k===q||null===k?p.row(g).data(f):p.cell(g,k).data(f);(n===q||n)&&p.columns.adjust();(m===q||m)&&p.draw();return 0};this.fnVersionCheck=M.fnVersionCheck;var c=this,d=b===q,e=this.length;d&&(b={});this.oApi=this.internal=M.internal; -for(var h in u.ext.internal)h&&(this[h]=fc(h));this.each(function(){var f={},g=1").appendTo(t));r.nTHead=H[0];var ea=t.children("tbody");0===ea.length&&(ea=l("").insertAfter(H)); -r.nTBody=ea[0];H=t.children("tfoot");0===H.length&&0").appendTo(t));0===H.length||0===H.children().length?t.addClass(C.sNoFooter):0/g,uc=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,vc=/(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\}|\\|\$|\^|\-)/g,rb=/['\u00A0,$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,Z=function(a){return a&&!0!==a&&"-"!==a?!1:!0},hc=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},ic=function(a,b){sb[b]||(sb[b]=new RegExp(ib(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g, -"").replace(sb[b],"."):a},tb=function(a,b,c){var d="string"===typeof a;if(Z(a))return!0;b&&d&&(a=ic(a,b));c&&d&&(a=a.replace(rb,""));return!isNaN(parseFloat(a))&&isFinite(a)},jc=function(a,b,c){return Z(a)?!0:Z(a)||"string"===typeof a?tb(a.replace(Ua,""),b,c)?!0:null:null},U=function(a,b,c){var d=[],e=0,h=a.length;if(c!==q)for(;ea.length)){var b=a.slice().sort();for(var c=b[0],d=1,e=b.length;d")[0],sc=Qa.textContent!==q,tc=/<.*?>/g,gb=u.util.throttle,nc=[],N=Array.prototype,wc=function(a){var b,c=u.settings,d=l.map(c,function(h,f){return h.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase()){var e=l.inArray(a,d);return-1!==e?[c[e]]:null}if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?b=l(a):a instanceof l&&(b=a)}else return[];if(b)return b.map(function(h){e= -l.inArray(this,d);return-1!==e?c[e]:null}).toArray()};var B=function(a,b){if(!(this instanceof B))return new B(a,b);var c=[],d=function(f){(f=wc(f))&&c.push.apply(c,f)};if(Array.isArray(a))for(var e=0,h=a.length;ea?new B(b[a],this[a]):null},filter:function(a){var b=[];if(N.filter)b=N.filter.call(this,a,this);else for(var c=0,d=this.length;c").addClass(g),l("td",k).addClass(g).html(f)[0].colSpan= -oa(a),e.push(k[0]))};h(c,d);b._details&&b._details.detach();b._details=l(e);b._detailsShow&&b._details.insertAfter(b.nTr)},xb=function(a,b){var c=a.context;c.length&&(a=c[0].aoData[b!==q?b:a[0]])&&a._details&&(a._details.remove(),a._detailsShow=q,a._details=q,l(a.nTr).removeClass("dt-hasChild"),qa(c[0]))},qc=function(a,b){var c=a.context;if(c.length&&a.length){var d=c[0].aoData[a[0]];d._details&&((d._detailsShow=b)?(d._details.insertAfter(d.nTr),l(d.nTr).addClass("dt-hasChild")):(d._details.detach(), -l(d.nTr).removeClass("dt-hasChild")),F(c[0],null,"childRow",[b,a.row(a[0])]),zc(c[0]),qa(c[0]))}},zc=function(a){var b=new B(a),c=a.aoData;b.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0g){var n=l.map(d,function(p,t){return p.bVisible?t:null});return[n[n.length+g]]}return[ua(a,g)];case "name":return l.map(e,function(p,t){return p===m[1]?t:null});default:return[]}if(f.nodeName&&f._DT_CellIndex)return[f._DT_CellIndex.column]; -g=l(h).filter(f).map(function(){return l.inArray(this,h)}).toArray();if(g.length||!f.nodeName)return g;g=l(f).closest("*[data-dt-column]");return g.length?[g.data("dt-column")]:[]},a,c)};y("columns()",function(a,b){a===q?a="":l.isPlainObject(a)&&(b=a,a="");b=vb(b);var c=this.iterator("table",function(d){return Bc(d,a,b)},1);c.selector.cols=a;c.selector.opts=b;return c});J("columns().header()","column().header()",function(a,b){return this.iterator("column",function(c,d){return c.aoColumns[d].nTh}, -1)});J("columns().footer()","column().footer()",function(a,b){return this.iterator("column",function(c,d){return c.aoColumns[d].nTf},1)});J("columns().data()","column().data()",function(){return this.iterator("column-rows",rc,1)});J("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});J("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,h){return Ea(b.aoData,h,"search"=== -a?"_aFilterData":"_aSortData",c)},1)});J("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return Ea(a.aoData,e,"anCells",b)},1)});J("columns().visible()","column().visible()",function(a,b){var c=this,d=this.iterator("column",function(e,h){if(a===q)return e.aoColumns[h].bVisible;var f=e.aoColumns,g=f[h],k=e.aoData,m;if(a!==q&&g.bVisible!==a){if(a){var n=l.inArray(!0,U(f,"bVisible"),h+1);f=0;for(m=k.length;fd;return!0};u.isDataTable=u.fnIsDataTable=function(a){var b= -l(a).get(0),c=!1;if(a instanceof u.Api)return!0;l.each(u.settings,function(d,e){d=e.nScrollHead?l("table",e.nScrollHead)[0]:null;var h=e.nScrollFoot?l("table",e.nScrollFoot)[0]:null;if(e.nTable===b||d===b||h===b)c=!0});return c};u.tables=u.fnTables=function(a){var b=!1;l.isPlainObject(a)&&(b=a.api,a=a.visible);var c=l.map(u.settings,function(d){if(!a||a&&l(d.nTable).is(":visible"))return d.nTable});return b?new B(c):c};u.camelToHungarian=P;y("$()",function(a,b){b=this.rows(b).nodes();b=l(b);return l([].concat(b.filter(a).toArray(), -b.find(a).toArray()))});l.each(["on","one","off"],function(a,b){y(b+"()",function(){var c=Array.prototype.slice.call(arguments);c[0]=l.map(c[0].split(/\s/),function(e){return e.match(/\.dt\b/)?e:e+".dt"}).join(" ");var d=l(this.tables().nodes());d[b].apply(d,c);return this})});y("clear()",function(){return this.iterator("table",function(a){Ka(a)})});y("settings()",function(){return new B(this.context,this.context)});y("init()",function(){var a=this.context;return a.length?a[0].oInit:null});y("data()", -function(){return this.iterator("table",function(a){return U(a.aoData,"_aData")}).flatten()});y("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,h=b.nTBody,f=b.nTHead,g=b.nTFoot,k=l(e);h=l(h);var m=l(b.nTableWrapper),n=l.map(b.aoData,function(t){return t.nTr}),p;b.bDestroying=!0;F(b,"aoDestroyCallback","destroy",[b]);a||(new B(b)).columns().visible(!0);m.off(".DT").find(":not(tbody *)").off(".DT");l(z).off(".DT-"+b.sInstance); -e!=f.parentNode&&(k.children("thead").detach(),k.append(f));g&&e!=g.parentNode&&(k.children("tfoot").detach(),k.append(g));b.aaSorting=[];b.aaSortingFixed=[];Ra(b);l(n).removeClass(b.asStripeClasses.join(" "));l("th, td",f).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);h.children().detach();h.append(n);f=a?"remove":"detach";k[f]();m[f]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),k.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&& -h.children().each(function(t){l(this).addClass(b.asDestroyStripes[t%p])}));c=l.inArray(b,u.settings);-1!==c&&u.settings.splice(c,1)})});l.each(["column","row","cell"],function(a,b){y(b+"s().every()",function(c){var d=this.selector.opts,e=this;return this.iterator(b,function(h,f,g,k,m){c.call(e[b](f,"cell"===b?g:d,"cell"===b?d:q),f,g,k,m)})})});y("i18n()",function(a,b,c){var d=this.context[0];a=na(a)(d.oLanguage);a===q&&(a=b);c!==q&&l.isPlainObject(a)&&(a=a[c]!==q?a[c]:a._);return a.replace("%d",c)}); -u.version="1.11.3";u.settings=[];u.models={};u.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0,"return":!1};u.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};u.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null, -sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};u.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1, -bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){return{}}}, -fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last", -sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:l.extend({},u.models.oSearch),sAjaxDataProp:"data", -sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};E(u.defaults);u.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};E(u.defaults.column);u.models.oSettings= -{oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{}, -aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0, -aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,jqXHR:null,json:q,oAjaxData:q,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==Q(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length}, -fnRecordsDisplay:function(){return"ssp"==Q(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,h=e.bPaginate;return e.bServerSide?!1===h||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!h||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};u.ext=M={buttons:{},classes:{},builder:"-source-", -errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:u.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:u.version};l.extend(M,{afnFiltering:M.search,aTypes:M.type.detect,ofnSearch:M.type.search,oSort:M.type.order,afnSortData:M.order,aoFeatures:M.feature,oApi:M.internal,oStdClasses:M.classes,oPagination:M.pager});l.extend(u.ext.classes, -{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_desc_disabled",sSortableDesc:"sorting_asc_disabled", -sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var ec= -u.ext.pager;l.extend(ec,{simple:function(a,b){return["previous","next"]},full:function(a,b){return["first","previous","next","last"]},numbers:function(a,b){return[Da(a,b)]},simple_numbers:function(a,b){return["previous",Da(a,b),"next"]},full_numbers:function(a,b){return["first","previous",Da(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",Da(a,b),"last"]},_numbers:Da,numbers_length:7});l.extend(!0,u.ext.renderer,{pageButton:{_:function(a,b,c,d,e,h){var f=a.oClasses,g=a.oLanguage.oPaginate, -k=a.oLanguage.oAria.paginate||{},m,n,p=0,t=function(x,w){var r,C=f.sPageButtonDisabled,G=function(I){lb(a,I.data.action,!0)};var aa=0;for(r=w.length;aa").appendTo(x);t(O,L)}else{m=null;n=L;O=a.iTabIndex;switch(L){case "ellipsis":x.append('');break;case "first":m=g.sFirst;0===e&&(O=-1,n+=" "+C);break;case "previous":m=g.sPrevious;0===e&&(O=-1,n+=" "+C);break;case "next":m=g.sNext;if(0=== -h||e===h-1)O=-1,n+=" "+C;break;case "last":m=g.sLast;if(0===h||e===h-1)O=-1,n+=" "+C;break;default:m=a.fnFormatNumber(L+1),n=e===L?f.sPageButtonActive:""}null!==m&&(O=l("",{"class":f.sPageButton+" "+n,"aria-controls":a.sTableId,"aria-label":k[L],"data-dt-idx":p,tabindex:O,id:0===c&&"string"===typeof L?a.sTableId+"_"+L:null}).html(m).appendTo(x),ob(O,{action:L},G),p++)}}};try{var v=l(b).find(A.activeElement).data("dt-idx")}catch(x){}t(l(b).empty(),d);v!==q&&l(b).find("[data-dt-idx="+v+"]").trigger("focus")}}}); -l.extend(u.ext.type.detect,[function(a,b){b=b.oLanguage.sDecimal;return tb(a,b)?"num"+b:null},function(a,b){if(a&&!(a instanceof Date)&&!uc.test(a))return null;b=Date.parse(a);return null!==b&&!isNaN(b)||Z(a)?"date":null},function(a,b){b=b.oLanguage.sDecimal;return tb(a,b,!0)?"num-fmt"+b:null},function(a,b){b=b.oLanguage.sDecimal;return jc(a,b)?"html-num"+b:null},function(a,b){b=b.oLanguage.sDecimal;return jc(a,b,!0)?"html-num-fmt"+b:null},function(a,b){return Z(a)||"string"===typeof a&&-1!==a.indexOf("<")? -"html":null}]);l.extend(u.ext.type.search,{html:function(a){return Z(a)?a:"string"===typeof a?a.replace(gc," ").replace(Ua,""):""},string:function(a){return Z(a)?a:"string"===typeof a?a.replace(gc," "):a}});var Ta=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=ic(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};l.extend(M.type.order,{"date-pre":function(a){a=Date.parse(a);return isNaN(a)?-Infinity:a},"html-pre":function(a){return Z(a)?"":a.replace?a.replace(/<.*?>/g, -"").toLowerCase():a+""},"string-pre":function(a){return Z(a)?"":"string"===typeof a?a.toLowerCase():a.toString?a.toString():""},"string-asc":function(a,b){return ab?1:0},"string-desc":function(a,b){return ab?-1:0}});Wa("");l.extend(!0,u.ext.renderer,{header:{_:function(a,b,c,d){l(a.nTable).on("order.dt.DT",function(e,h,f,g){a===h&&(e=c.idx,b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass("asc"==g[e]?d.sSortAsc:"desc"==g[e]?d.sSortDesc:c.sSortingClass))})},jqueryui:function(a,b,c, -d){l("
").addClass(d.sSortJUIWrapper).append(b.contents()).append(l("").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);l(a.nTable).on("order.dt.DT",function(e,h,f,g){a===h&&(e=c.idx,b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass("asc"==g[e]?d.sSortAsc:"desc"==g[e]?d.sSortDesc:c.sSortingClass),b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass("asc"==g[e]?d.sSortJUIAsc:"desc"== -g[e]?d.sSortJUIDesc:c.sSortingClassJUI))})}}});var yb=function(a){Array.isArray(a)&&(a=a.join(","));return"string"===typeof a?a.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""):a};u.render={number:function(a,b,c,d,e){return{display:function(h){if("number"!==typeof h&&"string"!==typeof h)return h;var f=0>h?"-":"",g=parseFloat(h);if(isNaN(g))return yb(h);g=g.toFixed(c);h=Math.abs(g);g=parseInt(h,10);h=c?b+(h-g).toFixed(c).substring(2):"";0===g&&0===parseFloat(h)&& -(f="");return f+(d||"")+g.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+h+(e||"")}}},text:function(){return{display:yb,filter:yb}}};l.extend(u.ext.internal,{_fnExternApiFunc:fc,_fnBuildAjax:Oa,_fnAjaxUpdate:Gb,_fnAjaxParameters:Pb,_fnAjaxUpdateDraw:Qb,_fnAjaxDataSrc:Aa,_fnAddColumn:Xa,_fnColumnOptions:Ga,_fnAdjustColumnSizing:ta,_fnVisibleToColumnIndex:ua,_fnColumnIndexToVisible:va,_fnVisbleColumns:oa,_fnGetColumns:Ia,_fnColumnTypes:Za,_fnApplyColumnDefs:Db,_fnHungarianMap:E,_fnCamelToHungarian:P, -_fnLanguageCompat:ma,_fnBrowserDetect:Bb,_fnAddData:ia,_fnAddTr:Ja,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==q?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return l.inArray(c,a.aoData[b].anCells)},_fnGetCellData:T,_fnSetCellData:Eb,_fnSplitObjNotation:bb,_fnGetObjectDataFn:na,_fnSetObjectDataFn:ha,_fnGetDataMaster:cb,_fnClearTable:Ka,_fnDeleteIndex:La,_fnInvalidate:wa,_fnGetRowElements:ab,_fnCreateTr:$a,_fnBuildHead:Fb,_fnDrawHead:ya,_fnDraw:ja,_fnReDraw:ka,_fnAddOptionsHtml:Ib, -_fnDetectHeader:xa,_fnGetUniqueThs:Na,_fnFeatureHtmlFilter:Kb,_fnFilterComplete:za,_fnFilterCustom:Tb,_fnFilterColumn:Sb,_fnFilter:Rb,_fnFilterCreateSearch:hb,_fnEscapeRegex:ib,_fnFilterData:Ub,_fnFeatureHtmlInfo:Nb,_fnUpdateInfo:Xb,_fnInfoMacros:Yb,_fnInitialise:Ba,_fnInitComplete:Pa,_fnLengthChange:jb,_fnFeatureHtmlLength:Jb,_fnFeatureHtmlPaginate:Ob,_fnPageChange:lb,_fnFeatureHtmlProcessing:Lb,_fnProcessingDisplay:V,_fnFeatureHtmlTable:Mb,_fnScrollDraw:Ha,_fnApplyToChildren:ca,_fnCalculateColumnWidths:Ya, -_fnThrottle:gb,_fnConvertToWidth:Zb,_fnGetWidestNode:$b,_fnGetMaxLenString:ac,_fnStringToCss:K,_fnSortFlatten:pa,_fnSort:Hb,_fnSortAria:cc,_fnSortListener:nb,_fnSortAttachListener:eb,_fnSortingClasses:Ra,_fnSortData:bc,_fnSaveState:qa,_fnLoadState:dc,_fnImplementState:pb,_fnSettingsFromNode:Sa,_fnLog:da,_fnMap:X,_fnBindAction:ob,_fnCallbackReg:R,_fnCallbackFire:F,_fnLengthOverflow:kb,_fnRenderer:fb,_fnDataSource:Q,_fnRowAttributes:db,_fnExtend:qb,_fnCalculateEnd:function(){}});l.fn.dataTable=u;u.$= -l;l.fn.dataTableSettings=u.settings;l.fn.dataTableExt=u.ext;l.fn.DataTable=function(a){return l(this).dataTable(a).api()};l.each(u,function(a,b){l.fn.DataTable[a]=b});return u}); diff --git a/main/articles/adbcva_files/dt-ext-buttons-1.11.3/css/buttons.dataTables.min.css b/main/articles/adbcva_files/dt-ext-buttons-1.11.3/css/buttons.dataTables.min.css deleted file mode 100644 index a3d28f85..00000000 --- a/main/articles/adbcva_files/dt-ext-buttons-1.11.3/css/buttons.dataTables.min.css +++ /dev/null @@ -1 +0,0 @@ -@keyframes dtb-spinner{100%{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0, 0, 0, 0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}button.dtb-hide-drop{display:none !important}div.dt-button-collection-title{text-align:center;padding:.3em 0 .5em;font-size:.9em}div.dt-button-collection-title:empty{display:none}button.dt-button,div.dt-button,a.dt-button,input.dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-right:.333em;margin-bottom:.333em;padding:.5em 1em;border:1px solid rgba(0, 0, 0, 0.3);border-radius:2px;cursor:pointer;font-size:.88em;line-height:1.6em;color:black;white-space:nowrap;overflow:hidden;background-color:rgba(0, 0, 0, 0.1);background:-webkit-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-moz-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-ms-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-o-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:linear-gradient(to bottom, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(230, 230, 230, 0.1)", EndColorStr="rgba(0, 0, 0, 0.1)");-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}button.dt-button.disabled,div.dt-button.disabled,a.dt-button.disabled,input.dt-button.disabled{cursor:default;opacity:.4}button.dt-button:active:not(.disabled),button.dt-button.active:not(.disabled),div.dt-button:active:not(.disabled),div.dt-button.active:not(.disabled),a.dt-button:active:not(.disabled),a.dt-button.active:not(.disabled),input.dt-button:active:not(.disabled),input.dt-button.active:not(.disabled){background-color:rgba(0, 0, 0, 0.1);background:-webkit-linear-gradient(top, rgba(179, 179, 179, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-moz-linear-gradient(top, rgba(179, 179, 179, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-ms-linear-gradient(top, rgba(179, 179, 179, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-o-linear-gradient(top, rgba(179, 179, 179, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:linear-gradient(to bottom, rgba(179, 179, 179, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(179, 179, 179, 0.1)", EndColorStr="rgba(0, 0, 0, 0.1)");box-shadow:inset 1px 1px 3px #999}button.dt-button:active:not(.disabled):hover:not(.disabled),button.dt-button.active:not(.disabled):hover:not(.disabled),div.dt-button:active:not(.disabled):hover:not(.disabled),div.dt-button.active:not(.disabled):hover:not(.disabled),a.dt-button:active:not(.disabled):hover:not(.disabled),a.dt-button.active:not(.disabled):hover:not(.disabled),input.dt-button:active:not(.disabled):hover:not(.disabled),input.dt-button.active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999;background-color:rgba(0, 0, 0, 0.1);background:-webkit-linear-gradient(top, rgba(128, 128, 128, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-moz-linear-gradient(top, rgba(128, 128, 128, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-ms-linear-gradient(top, rgba(128, 128, 128, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-o-linear-gradient(top, rgba(128, 128, 128, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:linear-gradient(to bottom, rgba(128, 128, 128, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(128, 128, 128, 0.1)", EndColorStr="rgba(0, 0, 0, 0.1)")}button.dt-button:hover,div.dt-button:hover,a.dt-button:hover,input.dt-button:hover{text-decoration:none}button.dt-button:hover:not(.disabled),div.dt-button:hover:not(.disabled),a.dt-button:hover:not(.disabled),input.dt-button:hover:not(.disabled){border:1px solid #666;background-color:rgba(0, 0, 0, 0.1);background:-webkit-linear-gradient(top, rgba(153, 153, 153, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-moz-linear-gradient(top, rgba(153, 153, 153, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-ms-linear-gradient(top, rgba(153, 153, 153, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-o-linear-gradient(top, rgba(153, 153, 153, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:linear-gradient(to bottom, rgba(153, 153, 153, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(153, 153, 153, 0.1)", EndColorStr="rgba(0, 0, 0, 0.1)")}button.dt-button:focus:not(.disabled),div.dt-button:focus:not(.disabled),a.dt-button:focus:not(.disabled),input.dt-button:focus:not(.disabled){border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;outline:none;background-color:#79ace9;background:-webkit-linear-gradient(top, #d1e2f7 0%, #79ace9 100%);background:-moz-linear-gradient(top, #d1e2f7 0%, #79ace9 100%);background:-ms-linear-gradient(top, #d1e2f7 0%, #79ace9 100%);background:-o-linear-gradient(top, #d1e2f7 0%, #79ace9 100%);background:linear-gradient(to bottom, #d1e2f7 0%, #79ace9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="#d1e2f7", EndColorStr="#79ace9")}button.dt-button span.dt-down-arrow,div.dt-button span.dt-down-arrow,a.dt-button span.dt-down-arrow,input.dt-button span.dt-down-arrow{position:relative;top:-2px;color:rgba(70, 70, 70, 0.75);font-size:8px;padding-left:10px}.dt-button embed{outline:none}div.dt-buttons{position:relative;float:left}div.dt-buttons.buttons-right{float:right}div.dataTables_layout_cell div.dt-buttons{float:none}div.dataTables_layout_cell div.dt-buttons.buttons-right{float:none}div.dt-button-collection{position:absolute;top:0;left:0;width:200px;margin-top:3px;padding:4px 4px 0 4px;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.4);background-color:white;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 3px 5px rgba(0, 0, 0, 0.3);box-sizing:border-box}div.dt-button-collection button.dt-button,div.dt-button-collection div.dt-button,div.dt-button-collection a.dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;margin-bottom:4px;margin-right:0}div.dt-button-collection button.dt-button:active:not(.disabled),div.dt-button-collection button.dt-button.active:not(.disabled),div.dt-button-collection div.dt-button:active:not(.disabled),div.dt-button-collection div.dt-button.active:not(.disabled),div.dt-button-collection a.dt-button:active:not(.disabled),div.dt-button-collection a.dt-button.active:not(.disabled){background-color:#dadada;background:-webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background:-moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background:-ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background:-o-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background:linear-gradient(to bottom, #f0f0f0 0%, #dadada 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="#f0f0f0", EndColorStr="#dadada");box-shadow:inset 1px 1px 3px #666}div.dt-button-collection button.dt-button:first-child,div.dt-button-collection div.dt-button:first-child,div.dt-button-collection a.dt-button:first-child{border-top-left-radius:3px;border-top-right-radius:3px}div.dt-button-collection button.dt-button:last-child,div.dt-button-collection div.dt-button:last-child,div.dt-button-collection a.dt-button:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}div.dt-button-collection div.dt-btn-split-wrapper{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:flex-start}div.dt-button-collection div.dt-btn-split-wrapper button.dt-button{margin-right:0px;display:inline-block;width:0;flex-grow:1;flex-shrink:0;flex-basis:50px}div.dt-button-collection div.dt-btn-split-wrapper button.dt-btn-split-drop{min-width:20px;margin-left:-1px;flex-grow:0;flex-shrink:0;flex-basis:0}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-200px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>:last-child{display:block !important;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection>:last-child>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:400px}div.dt-button-collection.two-column>:last-child{padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px}div.dt-button-collection.three-column>:last-child{padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px}div.dt-button-collection.four-column>:last-child{padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0, 0, 0, 0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0, 0, 0, 0.3)), color-stop(1, rgba(0, 0, 0, 0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);z-index:2001}@media screen and (max-width: 640px){div.dt-buttons{float:none !important;text-align:center}}button.dt-button.processing,div.dt-button.processing,a.dt-button.processing{color:rgba(0, 0, 0, 0.2)}button.dt-button.processing:after,div.dt-button.processing:after,a.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:" ";border:2px solid #282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear}button.dt-btn-split-drop{margin-left:calc(-1px - 0.333em);padding-left:.333em;padding-right:.333em;padding-bottom:calc(0.5em - 1px);border-radius:0px 1px 1px 0px;color:rgba(70, 70, 70, 0.9)}button.dt-btn-split-drop span.dt-btn-split-drop-arrow{font-size:10px}button.dt-btn-split-drop:hover{z-index:2}div.dt-btn-split-wrapper{display:inline-block}button.buttons-split{border-right:1px solid rgba(70, 70, 70, 0);border-radius:1px 0px 0px 1px}button.dt-btn-split-drop-button{background-color:white}button.dt-btn-split-drop-button:hover{background-color:white} diff --git a/main/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.colVis.min.js b/main/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.colVis.min.js deleted file mode 100644 index 16dc2088..00000000 --- a/main/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.colVis.min.js +++ /dev/null @@ -1,10 +0,0 @@ -/*! - Column visibility buttons for Buttons and DataTables. - 2016 SpryMedia Ltd - datatables.net/license -*/ -(function(h){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(e){return h(e,window,document)}):"object"===typeof exports?module.exports=function(e,g){e||(e=window);g&&g.fn.dataTable||(g=require("datatables.net")(e,g).$);g.fn.dataTable.Buttons||require("datatables.net-buttons")(e,g);return h(g,e,e.document)}:h(jQuery,window,document)})(function(h,e,g,l){e=h.fn.dataTable;h.extend(e.ext.buttons,{colvis:function(b,a){var c=null,d={extend:"collection", -init:function(f,k){c=k},text:function(f){return f.i18n("buttons.colvis","Column visibility")},className:"buttons-colvis",buttons:[{extend:"columnsToggle",columns:a.columns,columnText:a.columnText}]};b.on("column-reorder.dt"+a.namespace,function(f,k,m){b.button(null,b.button(null,c).node()).collectionRebuild([{extend:"columnsToggle",columns:a.columns,columnText:a.columnText}])});return d},columnsToggle:function(b,a){return b.columns(a.columns).indexes().map(function(c){return{extend:"columnToggle", -columns:c,columnText:a.columnText}}).toArray()},columnToggle:function(b,a){return{extend:"columnVisibility",columns:a.columns,columnText:a.columnText}},columnsVisibility:function(b,a){return b.columns(a.columns).indexes().map(function(c){return{extend:"columnVisibility",columns:c,visibility:a.visibility,columnText:a.columnText}}).toArray()},columnVisibility:{columns:l,text:function(b,a,c){return c._columnText(b,c)},className:"buttons-columnVisibility",action:function(b,a,c,d){b=a.columns(d.columns); -a=b.visible();b.visible(d.visibility!==l?d.visibility:!(a.length&&a[0]))},init:function(b,a,c){var d=this;a.attr("data-cv-idx",c.columns);b.on("column-visibility.dt"+c.namespace,function(f,k){k.bDestroying||k.nTable!=b.settings()[0].nTable||d.active(b.column(c.columns).visible())}).on("column-reorder.dt"+c.namespace,function(f,k,m){c.destroying||1!==b.columns(c.columns).count()||(d.text(c._columnText(b,c)),d.active(b.column(c.columns).visible()))});this.active(b.column(c.columns).visible())},destroy:function(b, -a,c){b.off("column-visibility.dt"+c.namespace).off("column-reorder.dt"+c.namespace)},_columnText:function(b,a){var c=b.column(a.columns).index(),d=b.settings()[0].aoColumns[c].sTitle;d||(d=b.column(c).header().innerHTML);d=d.replace(/\n/g," ").replace(//gi," ").replace(//g,"").replace(//g,"").replace(/<.*?>/g,"").replace(/^\s+|\s+$/g,"");return a.columnText?a.columnText(b,c,d):d}},colvisRestore:{className:"buttons-colvisRestore",text:function(b){return b.i18n("buttons.colvisRestore", -"Restore visibility")},init:function(b,a,c){c._visOriginal=b.columns().indexes().map(function(d){return b.column(d).visible()}).toArray()},action:function(b,a,c,d){a.columns().every(function(f){f=a.colReorder&&a.colReorder.transpose?a.colReorder.transpose(f,"toOriginal"):f;this.visible(d._visOriginal[f])})}},colvisGroup:{className:"buttons-colvisGroup",action:function(b,a,c,d){a.columns(d.show).visible(!0,!1);a.columns(d.hide).visible(!1,!1);a.columns.adjust()},show:[],hide:[]}});return e.Buttons}); diff --git a/main/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.html5.min.js b/main/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.html5.min.js deleted file mode 100644 index f617f960..00000000 --- a/main/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.html5.min.js +++ /dev/null @@ -1,36 +0,0 @@ -/*! - HTML5 export buttons for Buttons and DataTables. - 2016 SpryMedia Ltd - datatables.net/license - - FileSaver.js (1.3.3) - MIT license - Copyright © 2016 Eli Grey - http://eligrey.com -*/ -(function(n){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(u){return n(u,window,document)}):"object"===typeof exports?module.exports=function(u,x,E,F){u||(u=window);x&&x.fn.dataTable||(x=require("datatables.net")(u,x).$);x.fn.dataTable.Buttons||require("datatables.net-buttons")(u,x);return n(x,u,u.document,E,F)}:n(jQuery,window,document)})(function(n,u,x,E,F,B){function I(a){for(var c="";0<=a;)c=String.fromCharCode(a%26+65)+c,a=Math.floor(a/ -26)-1;return c}function O(a,c){J===B&&(J=-1===M.serializeToString((new u.DOMParser).parseFromString(P["xl/worksheets/sheet1.xml"],"text/xml")).indexOf("xmlns:r"));n.each(c,function(d,b){if(n.isPlainObject(b))d=a.folder(d),O(d,b);else{if(J){var m=b.childNodes[0],e,f=[];for(e=m.attributes.length-1;0<=e;e--){var g=m.attributes[e].nodeName;var p=m.attributes[e].nodeValue;-1!==g.indexOf(":")&&(f.push({name:g,value:p}),m.removeAttribute(g))}e=0;for(g=f.length;e'+b),b=b.replace(/_dt_b_namespace_token_/g,":"),b=b.replace(/xmlns:NS[\d]+="" NS[\d]+:/g,""));b=b.replace(/<([^<>]*?) xmlns=""([^<>]*?)>/g,"<$1 $2>");a.file(d,b)}})}function y(a,c,d){var b=a.createElement(c);d&&(d.attr&&n(b).attr(d.attr),d.children&&n.each(d.children,function(m,e){b.appendChild(e)}),null!==d.text&&d.text!== -B&&b.appendChild(a.createTextNode(d.text)));return b}function V(a,c){var d=a.header[c].length;a.footer&&a.footer[c].length>d&&(d=a.footer[c].length);for(var b=0,m=a.body.length;bd&&(d=e);if(401*a[1]?!0:!1};try{var M=new XMLSerializer,J}catch(a){}var P={"_rels/.rels":'', -"xl/_rels/workbook.xml.rels":'',"[Content_Types].xml":'', -"xl/workbook.xml":'', -"xl/worksheets/sheet1.xml":'',"xl/styles.xml":''}, -U=[{match:/^\-?\d+\.\d%$/,style:60,fmt:function(a){return a/100}},{match:/^\-?\d+\.?\d*%$/,style:56,fmt:function(a){return a/100}},{match:/^\-?\$[\d,]+.?\d*$/,style:57},{match:/^\-?£[\d,]+.?\d*$/,style:58},{match:/^\-?€[\d,]+.?\d*$/,style:59},{match:/^\-?\d+$/,style:65},{match:/^\-?\d+\.\d{2}$/,style:66},{match:/^\([\d,]+\)$/,style:61,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^\([\d,]+\.\d{2}\)$/,style:62,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^\-?[\d,]+$/,style:63}, -{match:/^\-?[\d,]+\.\d{2}$/,style:64},{match:/^[\d]{4}\-[\d]{2}\-[\d]{2}$/,style:67,fmt:function(a){return Math.round(25569+Date.parse(a)/864E5)}}];D.ext.buttons.copyHtml5={className:"buttons-copy buttons-html5",text:function(a){return a.i18n("buttons.copy","Copy")},action:function(a,c,d,b){this.processing(!0);var m=this;a=S(c,b);var e=c.buttons.exportInfo(b),f=R(b),g=a.str;d=n("
").css({height:1,width:1,overflow:"hidden",position:"fixed",top:0,left:0});e.title&&(g=e.title+f+f+g);e.messageTop&& -(g=e.messageTop+f+f+g);e.messageBottom&&(g=g+f+f+e.messageBottom);b.customize&&(g=b.customize(g,b,c));b=n(""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - - // Support: Chrome 86+ - // In Chrome, if an element having a focusout handler is blurred by - // clicking outside of it, it invokes the handler synchronously. If - // that handler calls `.remove()` on the element, the data is cleared, - // leaving `result` undefined. We need to guard against this. - return result && result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - which: true -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - // Suppress native focus or blur as it's already being fired - // in leverageNative. - _default: function() { - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - // - // Support: Firefox 70+ - // Only Firefox includes border widths - // in computed dimensions. (gh-4529) - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; - tr.style.cssText = "border:1px solid"; - - // Support: Chrome 86+ - // Height set through cssText does not get applied. - // Computed height then comes back as 0. - tr.style.height = "1px"; - trChild.style.height = "9px"; - - // Support: Android 8 Chrome 86+ - // In our bodyBackground.html iframe, - // display for all div elements is set to "inline", - // which causes a problem only in Android 8 Chrome 86. - // Ensuring the div is display: block - // gets around this issue. - trChild.style.display = "block"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + - parseInt( trStyle.borderTopWidth, 10 ) + - parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml, parserErrorElem; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) {} - - parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; - if ( !xml || parserErrorElem ) { - jQuery.error( "Invalid XML: " + ( - parserErrorElem ? - jQuery.map( parserErrorElem.childNodes, function( el ) { - return el.textContent; - } ).join( "\n" ) : - data - ) ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ).filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ).map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - -originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - 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" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script but not if jsonp - if ( !isSuccess && - jQuery.inArray( "script", s.dataTypes ) > -1 && - jQuery.inArray( "json", s.dataTypes ) < 0 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - -
Skip to contents - - -
-
-
- - - - -
-

Purpose -

-

To provide a complementary (to admiral) toolbox that enables users to develop ophthalmology disease area datasets and endpoints.

-
-
-

Installation -

-

To install the latest development version of the package directly from GitHub use the following code:

-
if (!requireNamespace("remotes", quietly = TRUE)) {
-  install.packages("remotes")
-}
-remotes::install_github("pharmaverse/admiralophtha", ref = "devel")
-
-
-

Scope -

-
    -
  • Build a toolbox of re-usable functions and utilities to create Ophthalmology-specific ADaM datasets in R in a modular manner.
  • -
  • All functions are created based upon the ADaM Implementation Guide and aim to facilitate the programming of ADaM dataset standards.
  • -
-
-
-

References and Documentation -

- -
-
-

R Versions -

-

Here’s a summary of our strategy for this package related to R versions:

-
    -
  • R versions for developers and users will follow the same as admiral core package.
  • -
  • For development the devel branch of admiral core is used as a dependency. For releasing a new admiralophtha version it must run using the latest released admiral core version, i.e., main branch of admiral core.
  • -
-
-
-

Contact -

-

We use the following for support and communications between user and developer community:

-
    -
  • -Slack - for informal discussions, Q&A and building our user community. If you don’t have access, use this link to join the pharmaverse Slack workspace
  • -
  • -GitHub Issues - for direct feedback, enhancement requests or raising bugs
  • -
-
-
-

Release Schedule -

-
    -
  • The first release (v. 0.1.0) came out on 13th March 2023.
  • -
  • The second release (v. 0.2.0) came out on 12th June 2023.
  • -
  • The third release (v. 0.3.0) came out on 18th September 2023.
  • -
  • We are planning for a fourth release (v.1.0) on December 11th 2023. The objective of the 1.0 release of admiralophtha is to provide a package that is mature enough to be used as it is as part of the ADaM work on any ophthalmology study.
  • -
-
-
-
-
- - -
- - - -
-
- - - - - - - diff --git a/main/link.svg b/main/link.svg deleted file mode 100644 index 88ad8276..00000000 --- a/main/link.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/main/logo.png b/main/logo.png deleted file mode 100644 index 67594d94b5ed8bc27d9963d7f6c4bd84eae8d1d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59553 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 diff --git a/main/pkgdown.js b/main/pkgdown.js deleted file mode 100644 index 5fccd9c0..00000000 --- a/main/pkgdown.js +++ /dev/null @@ -1,156 +0,0 @@ -/* http://gregfranko.com/blog/jquery-best-practices/ */ -(function($) { - $(function() { - - $('nav.navbar').headroom(); - - Toc.init({ - $nav: $("#toc"), - $scope: $("main h2, main h3, main h4, main h5, main h6") - }); - - if ($('#toc').length) { - $('body').scrollspy({ - target: '#toc', - offset: $("nav.navbar").outerHeight() + 1 - }); - } - - // Activate popovers - $('[data-bs-toggle="popover"]').popover({ - container: 'body', - html: true, - trigger: 'focus', - placement: "top", - sanitize: false, - }); - - $('[data-bs-toggle="tooltip"]').tooltip(); - - /* Clipboard --------------------------*/ - - function changeTooltipMessage(element, msg) { - var tooltipOriginalTitle=element.getAttribute('data-original-title'); - element.setAttribute('data-original-title', msg); - $(element).tooltip('show'); - element.setAttribute('data-original-title', tooltipOriginalTitle); - } - - if(ClipboardJS.isSupported()) { - $(document).ready(function() { - var copyButton = ""; - - $("div.sourceCode").addClass("hasCopyButton"); - - // Insert copy buttons: - $(copyButton).prependTo(".hasCopyButton"); - - // Initialize tooltips: - $('.btn-copy-ex').tooltip({container: 'body'}); - - // Initialize clipboard: - var clipboard = new ClipboardJS('[data-clipboard-copy]', { - text: function(trigger) { - return trigger.parentNode.textContent.replace(/\n#>[^\n]*/g, ""); - } - }); - - clipboard.on('success', function(e) { - changeTooltipMessage(e.trigger, 'Copied!'); - e.clearSelection(); - }); - - clipboard.on('error', function() { - changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy'); - }); - - }); - } - - /* Search marking --------------------------*/ - var url = new URL(window.location.href); - var toMark = url.searchParams.get("q"); - var mark = new Mark("main#main"); - if (toMark) { - mark.mark(toMark, { - accuracy: { - value: "complementary", - limiters: [",", ".", ":", "/"], - } - }); - } - - /* Search --------------------------*/ - /* Adapted from https://github.com/rstudio/bookdown/blob/2d692ba4b61f1e466c92e78fd712b0ab08c11d31/inst/resources/bs4_book/bs4_book.js#L25 */ - // Initialise search index on focus - var fuse; - $("#search-input").focus(async function(e) { - if (fuse) { - return; - } - - $(e.target).addClass("loading"); - var response = await fetch($("#search-input").data("search-index")); - var data = await response.json(); - - var options = { - keys: ["what", "text", "code"], - ignoreLocation: true, - threshold: 0.1, - includeMatches: true, - includeScore: true, - }; - fuse = new Fuse(data, options); - - $(e.target).removeClass("loading"); - }); - - // Use algolia autocomplete - var options = { - autoselect: true, - debug: true, - hint: false, - minLength: 2, - }; - var q; -async function searchFuse(query, callback) { - await fuse; - - var items; - if (!fuse) { - items = []; - } else { - q = query; - var results = fuse.search(query, { limit: 20 }); - items = results - .filter((x) => x.score <= 0.75) - .map((x) => x.item); - if (items.length === 0) { - items = [{dir:"Sorry 😿",previous_headings:"",title:"No results found.",what:"No results found.",path:window.location.href}]; - } - } - callback(items); -} - $("#search-input").autocomplete(options, [ - { - name: "content", - source: searchFuse, - templates: { - suggestion: (s) => { - if (s.title == s.what) { - return `${s.dir} >
${s.title}
`; - } else if (s.previous_headings == "") { - return `${s.dir} >
${s.title}
> ${s.what}`; - } else { - return `${s.dir} >
${s.title}
> ${s.previous_headings} > ${s.what}`; - } - }, - }, - }, - ]).on('autocomplete:selected', function(event, s) { - window.location.href = s.path + "?q=" + q + "#" + s.id; - }); - }); -})(window.jQuery || window.$) - - diff --git a/main/pkgdown.yml b/main/pkgdown.yml deleted file mode 100644 index 5d438b3c..00000000 --- a/main/pkgdown.yml +++ /dev/null @@ -1,14 +0,0 @@ -pandoc: 2.17.1.1 -pkgdown: 2.0.7 -pkgdown_sha: ~ -articles: - adbcva: adbcva.html - admiralophtha: admiralophtha.html - adoe: adoe.html - advfq: advfq.html - standards: standards.html -last_built: 2023-11-06T16:23Z -urls: - reference: https://pharmaverse.github.io/admiralophtha/main/reference - article: https://pharmaverse.github.io/admiralophtha/main/articles - diff --git a/main/reference/Rplot001.png b/main/reference/Rplot001.png deleted file mode 100644 index 17a358060aed2a86950757bbd25c6f92c08c458f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmeAS@N?(olHy`uVBq!ia0y~yV0-|=9Be?5+AI5}0x7m6Z+90U4Fo@(ch>_c&H|6f zVg?3oArNM~bhqvg0|WD9PZ!6KiaBo&GBN^{G%5UFpXcEKVvd5*5Eu=C0SJK)8A6*F U7`aXvEC5;V>FVdQ&MBb@00SN#Z2$lO diff --git a/main/reference/figures/logo.png b/main/reference/figures/logo.png deleted file mode 100644 index 67594d94b5ed8bc27d9963d7f6c4bd84eae8d1d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59553 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 diff --git a/main/search.json b/main/search.json deleted file mode 100644 index 4932268c..00000000 --- a/main/search.json +++ /dev/null @@ -1 +0,0 @@ -[{"path":"https://pharmaverse.github.io/admiralophtha/main/LICENSE.html","id":null,"dir":"","previous_headings":"","what":"Apache License","title":"Apache License","text":"Version 2.0, January 2004 ","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/main/LICENSE.html","id":"1-definitions","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"1. Definitions","title":"Apache License","text":"“License” shall mean terms conditions use, reproduction, distribution defined Sections 1 9 document. “Licensor” shall mean copyright owner entity authorized copyright owner granting License. “Legal Entity” shall mean union acting entity entities control, controlled , common control entity. purposes definition, “control” means () power, direct indirect, cause direction management entity, whether contract otherwise, (ii) ownership fifty percent (50%) outstanding shares, (iii) beneficial ownership entity. “” (“”) shall mean individual Legal Entity exercising permissions granted License. “Source” form shall mean preferred form making modifications, including limited software source code, documentation source, configuration files. “Object” form shall mean form resulting mechanical transformation translation Source form, including limited compiled object code, generated documentation, conversions media types. “Work” shall mean work authorship, whether Source Object form, made available License, indicated copyright notice included attached work (example provided Appendix ). “Derivative Works” shall mean work, whether Source Object form, based (derived ) Work editorial revisions, annotations, elaborations, modifications represent, whole, original work authorship. purposes License, Derivative Works shall include works remain separable , merely link (bind name) interfaces , Work Derivative Works thereof. “Contribution” shall mean work authorship, including original version Work modifications additions Work Derivative Works thereof, intentionally submitted Licensor inclusion Work copyright owner individual Legal Entity authorized submit behalf copyright owner. purposes definition, “submitted” means form electronic, verbal, written communication sent Licensor representatives, including limited communication electronic mailing lists, source code control systems, issue tracking systems managed , behalf , Licensor purpose discussing improving Work, excluding communication conspicuously marked otherwise designated writing copyright owner “Contribution.” “Contributor” shall mean Licensor individual Legal Entity behalf Contribution received Licensor subsequently incorporated within Work.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/LICENSE.html","id":"2-grant-of-copyright-license","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"2. Grant of Copyright License","title":"Apache License","text":"Subject terms conditions License, Contributor hereby grants perpetual, worldwide, non-exclusive, -charge, royalty-free, irrevocable copyright license reproduce, prepare Derivative Works , publicly display, publicly perform, sublicense, distribute Work Derivative Works Source Object form.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/LICENSE.html","id":"3-grant-of-patent-license","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"3. Grant of Patent License","title":"Apache License","text":"Subject terms conditions License, Contributor hereby grants perpetual, worldwide, non-exclusive, -charge, royalty-free, irrevocable (except stated section) patent license make, made, use, offer sell, sell, import, otherwise transfer Work, license applies patent claims licensable Contributor necessarily infringed Contribution(s) alone combination Contribution(s) Work Contribution(s) submitted. institute patent litigation entity (including cross-claim counterclaim lawsuit) alleging Work Contribution incorporated within Work constitutes direct contributory patent infringement, patent licenses granted License Work shall terminate date litigation filed.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/LICENSE.html","id":"4-redistribution","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"4. Redistribution","title":"Apache License","text":"may reproduce distribute copies Work Derivative Works thereof medium, without modifications, Source Object form, provided meet following conditions: () must give recipients Work Derivative Works copy License; (b) must cause modified files carry prominent notices stating changed files; (c) must retain, Source form Derivative Works distribute, copyright, patent, trademark, attribution notices Source form Work, excluding notices pertain part Derivative Works; (d) Work includes “NOTICE” text file part distribution, Derivative Works distribute must include readable copy attribution notices contained within NOTICE file, excluding notices pertain part Derivative Works, least one following places: within NOTICE text file distributed part Derivative Works; within Source form documentation, provided along Derivative Works; , within display generated Derivative Works, wherever third-party notices normally appear. contents NOTICE file informational purposes modify License. may add attribution notices within Derivative Works distribute, alongside addendum NOTICE text Work, provided additional attribution notices construed modifying License. may add copyright statement modifications may provide additional different license terms conditions use, reproduction, distribution modifications, Derivative Works whole, provided use, reproduction, distribution Work otherwise complies conditions stated License.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/LICENSE.html","id":"5-submission-of-contributions","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"5. Submission of Contributions","title":"Apache License","text":"Unless explicitly state otherwise, Contribution intentionally submitted inclusion Work Licensor shall terms conditions License, without additional terms conditions. Notwithstanding , nothing herein shall supersede modify terms separate license agreement may executed Licensor regarding Contributions.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/LICENSE.html","id":"6-trademarks","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"6. Trademarks","title":"Apache License","text":"License grant permission use trade names, trademarks, service marks, product names Licensor, except required reasonable customary use describing origin Work reproducing content NOTICE file.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/LICENSE.html","id":"7-disclaimer-of-warranty","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"7. Disclaimer of Warranty","title":"Apache License","text":"Unless required applicable law agreed writing, Licensor provides Work (Contributor provides Contributions) “” BASIS, WITHOUT WARRANTIES CONDITIONS KIND, either express implied, including, without limitation, warranties conditions TITLE, NON-INFRINGEMENT, MERCHANTABILITY, FITNESS PARTICULAR PURPOSE. solely responsible determining appropriateness using redistributing Work assume risks associated exercise permissions License.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/LICENSE.html","id":"8-limitation-of-liability","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"8. Limitation of Liability","title":"Apache License","text":"event legal theory, whether tort (including negligence), contract, otherwise, unless required applicable law (deliberate grossly negligent acts) agreed writing, shall Contributor liable damages, including direct, indirect, special, incidental, consequential damages character arising result License use inability use Work (including limited damages loss goodwill, work stoppage, computer failure malfunction, commercial damages losses), even Contributor advised possibility damages.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/LICENSE.html","id":"9-accepting-warranty-or-additional-liability","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"9. Accepting Warranty or Additional Liability","title":"Apache License","text":"redistributing Work Derivative Works thereof, may choose offer, charge fee , acceptance support, warranty, indemnity, liability obligations /rights consistent License. However, accepting obligations, may act behalf sole responsibility, behalf Contributor, agree indemnify, defend, hold Contributor harmless liability incurred , claims asserted , Contributor reason accepting warranty additional liability. END TERMS CONDITIONS","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/LICENSE.html","id":"appendix-how-to-apply-the-apache-license-to-your-work","dir":"","previous_headings":"","what":"APPENDIX: How to apply the Apache License to your work","title":"Apache License","text":"apply Apache License work, attach following boilerplate notice, fields enclosed brackets [] replaced identifying information. (Don’t include brackets!) text enclosed appropriate comment syntax file format. also recommend file class name description purpose included “printed page” copyright notice easier identification within third-party archives.","code":"Copyright 2021 F. Hoffmann-La Roche AG and GlaxoSmithKline LLC Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License."},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adbcva.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Creating ADBCVA","text":"article describes creating ADBCVA ADaM Best-Corrected Visual Acuity (BCVA) data ophthalmology endpoints. used conjunction article creating BDS dataset SDTM. , derivations processes specific ADBCVA absent, user invited consult aforementioned article guidance. Note: examples assume CDISC SDTM /ADaM format input unless otherwise specified.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adbcva.html","id":"dataset-contents","dir":"Articles","previous_headings":"Introduction","what":"Dataset Contents","title":"Creating ADBCVA","text":"name ADBCVA implies, admiralophtha suggests populate ADBCVA solely BCVA records OE SDTM.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adbcva.html","id":"required-packages","dir":"Articles","previous_headings":"Introduction","what":"Required Packages","title":"Creating ADBCVA","text":"examples vignette require following packages.","code":"library(dplyr) library(admiral) library(pharmaversesdtm) library(admiraldev) library(admiralophtha)"},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adbcva.html","id":"programming-workflow","dir":"Articles","previous_headings":"","what":"Programming Workflow","title":"Creating ADBCVA","text":"Initial Set ADBCVA Deriving LogMAR Score Parameters Derivations Standard BDS Variables Deriving Analysis Value Categories Snellen Scores Deriving Criterion Flags BCVA Change Additional Notes Example Script","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adbcva.html","id":"setup","dir":"Articles","previous_headings":"Programming Workflow","what":"Initial set up of ADBCVA","title":"Creating ADBCVA","text":"BDS ADaM datasets, one start OE SDTM, BCVA records interest. purposes next two sections, shall using admiral OE ADSL test data. also require lookup table mapping parameter codes. Note: simulate ophthalmology study, add randomly generated STUDYEYE variable ADSL, practice STUDYEYE already derived using derive_var_studyeye(). Following setup, programmer can start constructing ADBCVA. first step subset OE BCVA parameters merge ADSL. required two reasons: firstly, STUDYEYE crucial mapping AFEYE PARAMCD’s. Secondly, treatment start date (TRTSDT) also prerequisite derivation variables Analysis Day (ADY). next item business derive AVAL, AVALU, DTYPE. example, due small number parameters derivation trivial. AFEYE also created step using function derive_var_afeye(). Moving forwards, PARAM PARAMCD can assigned using derive_vars_merged() admiral lookup table param_lookup generated .","code":"data(\"oe_ophtha\") data(\"admiral_adsl\") # Add STUDYEYE to ADSL to simulate an ophtha dataset adsl <- admiral_adsl %>% as.data.frame() %>% mutate(STUDYEYE = sample(c(\"LEFT\", \"RIGHT\"), n(), replace = TRUE)) %>% convert_blanks_to_na() oe <- convert_blanks_to_na(oe_ophtha) %>% ungroup() # ---- Lookup table ---- param_lookup <- tibble::tribble( ~OETESTCD, ~OECAT, ~OESCAT, ~AFEYE, ~PARAMCD, ~PARAM, ~PARAMN, \"VACSCORE\", \"BEST CORRECTED VISUAL ACUITY\", \"OVERALL EVALUATION\", \"Study Eye\", \"SBCVA\", \"Study Eye Visual Acuity Score (letters)\", 1, # nolint \"VACSCORE\", \"BEST CORRECTED VISUAL ACUITY\", \"OVERALL EVALUATION\", \"Fellow Eye\", \"FBCVA\", \"Fellow Eye Visual Acuity Score (letters)\", 2, # nolint ) adsl_vars <- exprs(TRTSDT, TRTEDT, TRT01A, TRT01P, STUDYEYE) adbcva <- oe %>% filter( OETESTCD %in% c(\"VACSCORE\") ) %>% derive_vars_merged( dataset_add = adsl, new_vars = adsl_vars, by_vars = exprs(STUDYID, USUBJID) ) adbcva <- adbcva %>% mutate( AVAL = OESTRESN, AVALU = \"letters\", DTYPE = NA_character_ ) %>% derive_var_afeye(OELOC, OELAT) adbcva <- adbcva %>% derive_vars_merged( dataset_add = param_lookup, new_vars = exprs(PARAM, PARAMCD), by_vars = exprs(OETESTCD, AFEYE), filter_add = PARAMCD %in% c(\"SBCVA\", \"FBCVA\") )"},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adbcva.html","id":"logmar","dir":"Articles","previous_headings":"Programming Workflow","what":"Deriving LogMAR Score Parameters","title":"Creating ADBCVA","text":"Often ADBCVA datasets contain derived records BCVA LogMAR units. can easily achieved follows using derive_param_computed(). conversion units done using convert_etdrs_to_logmar(). Two separate calls required due parameters split study fellow eye. extra parameters added, records end dataset now present, AVALC day/date variables ADY ADT can derived. Importantly, calls derive_param_computed() list SDTM variables VISIT, VISITNUM, OEDY OEDTC by_vars function. necessary derive ADaM variables AVISIT ADY successive steps. ADaM variables require derived, SDTM variables set missing derived records, per ADaM standards:","code":"adbcva <- adbcva %>% derive_param_computed( by_vars = c(exprs(STUDYID, USUBJID, VISIT, VISITNUM, OEDY, OEDTC, AFEYE), adsl_vars), parameters = c(\"SBCVA\"), set_values_to = exprs( AVAL = convert_etdrs_to_logmar(AVAL.SBCVA), PARAMCD = \"SBCVALOG\", PARAM = \"Study Eye Visual Acuity LogMAR Score\", DTYPE = NA_character_, AVALU = \"LogMAR\" ) ) %>% derive_param_computed( by_vars = c(exprs(STUDYID, USUBJID, VISIT, OEDY, OEDTC, AFEYE), adsl_vars), parameters = c(\"FBCVA\"), set_values_to = exprs( AVAL = convert_etdrs_to_logmar(AVAL.FBCVA), PARAMCD = \"FBCVALOG\", PARAM = \"Fellow Eye Visual Acuity LogMAR Score\", DTYPE = NA_character_, AVALU = \"LogMAR\" ) ) %>% mutate(AVALC = as.character(AVAL)) %>% derive_vars_dt( new_vars_prefix = \"A\", dtc = OEDTC, flag_imputation = \"none\" ) %>% derive_vars_dy(reference_date = TRTSDT, source_vars = exprs(ADT)) adbcva <- adbcva %>% mutate( VISIT = ifelse(PARAMCD %in% c(\"SBCVALOG\", \"FBCVALOG\"), NA_character_, VISIT), VISITNUM = ifelse(PARAMCD %in% c(\"SBCVALOG\", \"FBCVALOG\"), NA, VISITNUM), OEDY = ifelse(PARAMCD %in% c(\"SBCVALOG\", \"FBCVALOG\"), NA, OEDY), OEDTC = ifelse(PARAMCD %in% c(\"SBCVALOG\", \"FBCVALOG\"), NA_character_, OEDTC) )"},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adbcva.html","id":"further","dir":"Articles","previous_headings":"Programming Workflow","what":"Further Derivations of Standard BDS Variables","title":"Creating ADBCVA","text":"user invited consult article creating BDS dataset SDTM learn add standard BDS variables ADBCVA. Henceforth, purposes article, following sections use ADBCVA dataset generated corresponding admiralophtha template program starting point. Note: dataset already comes criterion flags analysis value categorisation variables, illustration purposes removed.","code":"data(\"admiralophtha_adbcva\") adbcva <- admiralophtha_adbcva %>% select(-starts_with(\"CRIT\"), -starts_with(\"AVALCA\"))"},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adbcva.html","id":"avalcats","dir":"Articles","previous_headings":"Programming Workflow","what":"Deriving Analysis Value Categories for Snellen Scores","title":"Creating ADBCVA","text":"ophthalmology studies may desire subdivide BCVA records according Snellen category fall (eg, 20/320, 20/100, 20/20 etc). best done use AVALCATx/AVALCAxN variable pairs. Currently, admiralophtha provide specific functionality create AVALCATx/AVALCAxN pairs, although may included future releases package. current toolset, suggested approach derive variables : Create lookup table assigns numeric equivalents (.e. AVALCAxN) Snellen categories. Create format function map AVAL numeric category. Add AVALCAxN mutate statement using format function. Add AVALCATx using derive_vars_merged combination lookup table. resulting output shown (limited first patient ):","code":"avalcat_lookup <- tibble::tribble( ~PARAMCD, ~AVALCA1N, ~AVALCAT1, \"SBCVA\", 1000, \"< 20/800\", \"SBCVA\", 800, \"20/800\", \"SBCVA\", 640, \"20/640\", \"SBCVA\", 500, \"20/500\", \"SBCVA\", 400, \"20/400\", \"SBCVA\", 320, \"20/320\", \"SBCVA\", 250, \"20/250\", \"SBCVA\", 200, \"20/200\", \"SBCVA\", 160, \"20/160\", \"SBCVA\", 125, \"20/125\", \"SBCVA\", 100, \"20/100\", \"SBCVA\", 80, \"20/80\", \"SBCVA\", 63, \"20/63\", \"SBCVA\", 50, \"20/50\", \"SBCVA\", 40, \"20/40\", \"SBCVA\", 32, \"20/32\", \"SBCVA\", 25, \"20/25\", \"SBCVA\", 20, \"20/20\", \"SBCVA\", 16, \"20/16\", \"SBCVA\", 12, \"20/12\", \"SBCVA\", 1, \"> 20/12\", ) avalcat_lookup <- avalcat_lookup %>% mutate(PARAMCD = \"FBCVA\") %>% rbind(avalcat_lookup) format_avalcat1n <- function(param, aval) { case_when( param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 0 & aval <= 3 ~ 1000, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 4 & aval <= 8 ~ 800, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 9 & aval <= 13 ~ 640, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 14 & aval <= 18 ~ 500, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 19 & aval <= 23 ~ 400, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 24 & aval <= 28 ~ 320, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 29 & aval <= 33 ~ 250, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 34 & aval <= 38 ~ 200, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 39 & aval <= 43 ~ 160, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 44 & aval <= 48 ~ 125, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 49 & aval <= 53 ~ 100, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 54 & aval <= 58 ~ 80, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 59 & aval <= 63 ~ 63, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 64 & aval <= 68 ~ 50, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 69 & aval <= 73 ~ 40, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 74 & aval <= 78 ~ 32, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 79 & aval <= 83 ~ 25, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 84 & aval <= 88 ~ 20, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 89 & aval <= 93 ~ 16, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 94 & aval <= 97 ~ 12, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 98 ~ 1 ) } adbcva <- adbcva %>% mutate(AVALCA1N = format_avalcat1n(param = PARAMCD, aval = AVAL)) %>% derive_vars_merged( avalcat_lookup, by = exprs(PARAMCD, AVALCA1N) )"},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adbcva.html","id":"critflags","dir":"Articles","previous_headings":"Programming Workflow","what":"Deriving Criterion Flags for BCVA Change","title":"Creating ADBCVA","text":"admiralophtha suggests use criterion flag variable pairs (CRITx/CRITxFL) program BCVA endpoints Avoiding loss x letters Gain y letters Gain x y letters (relative baseline basetypes). package provides function derive_var_bcvacritxfl() program endpoints efficiently consistently. terms logic apply variable CHG, endpoints fall three classes, can represented inequalities: Class 1: CHG value lying inside range, <= CHG <= b. Class 2: CHG value upper limit, CHG <= . Class 3: CHG value lower limit, CHG => b. using derive_var_bcvacritxfl(), ADaM programmer can implement three types endpoint . achieved feeding appropriate ranges, upper limits lower limits bcva_ranges, bcva_uplims bcva_lowlims arguments function. instance, let’s suppose endpoints interest : Gain 5 10 letters relative baseline (Class 1: 5 <= CHG <= 10) Gain 25 letters fewer relative baseline (Class 2: CHG <= 25) Loss 5 letters relative baseline (Class 2: CHG <= -5) Gain 15 letters relative baseline (Class 3: CHG >= 15) Loss 10 letters fewer relative baseline (Class 3: CHG >= -10). , following call implement criterion variable/flag pairs endpoints . CRITx variables automatically encode correct inequality. Note restrict_derivation() wrapped around call derive variables relevant parameters. way, filter argument can altered restrict derivation relevant records. Note also argument crit_var = exprs(CHG) specified criterion flags derived respect correct variable. resulting output shown (limited first patient ): also possible assign significance “x” CRITxFL. instance, one designate criterion flags Class 1 CRIT1yFL, Class 2 CRIT2yFL, Class 3 CRIT3yFL. argument critxfl_index allows simple implementation conjunction three separate calls derive_var_bcvacritxfl():","code":"adbcva <- adbcva %>% restrict_derivation( derivation = derive_var_bcvacritxfl, args = params( crit_var = exprs(CHG), bcva_ranges = list(c(5, 10)), bcva_uplims = list(25, -5), bcva_lowlims = list(15, -10) ), filter = PARAMCD %in% c(\"SBCVA\", \"FBCVA\") ) adbcva <- adbcva %>% restrict_derivation( derivation = derive_var_bcvacritxfl, args = params( crit_var = exprs(CHG), bcva_ranges = list(c(5, 10)), critxfl_index = 10 ), filter = PARAMCD %in% c(\"SBCVA\", \"FBCVA\") ) %>% restrict_derivation( derivation = derive_var_bcvacritxfl, args = params( crit_var = exprs(CHG), bcva_uplims = list(25, -5), critxfl_index = 20 ), filter = PARAMCD %in% c(\"SBCVA\", \"FBCVA\") ) %>% restrict_derivation( derivation = derive_var_bcvacritxfl, args = params( crit_var = exprs(CHG), bcva_lowlims = list(15, -10), critxfl_index = 30 ), filter = PARAMCD %in% c(\"SBCVA\", \"FBCVA\") )"},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adbcva.html","id":"additional-notes","dir":"Articles","previous_headings":"Programming Workflow","what":"Additional Notes","title":"Creating ADBCVA","text":"interpreting endpoints Loss 5 letters fewer relative baseline, implicitly assumed article also includes case letters gained, inequality reads CHG >= -5. One use bcva_lowlims = list(-5) argument derive_var_bcvacritxfl() program endpoint. case, .e. one wishes exclude cases letter gains, inequality interest instead -5 <= CHG <= -1. Importantly, derive_var_bcvacritxfl() still used, argument bcva_ranges = list(c(-5, -1)). vignette extensively showcases use derive_var_bcvacritxfl() applied variable CHG, argument crit_var function can also used create criterion flag relative variables (e.g. crit_var = exprs(AVAL) AVAL).","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/admiralophtha.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Get Started","text":"package extension, new admiral best place first start reading Get Started guide. extension package follows main idea conventions, re-uses many functions admiral, important thoroughly understand able use admiralophtha.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/admiralophtha.html","id":"derivations","dir":"Articles","previous_headings":"","what":"Derivations","title":"Get Started","text":"important functions admiralophtha derivations. follow conventions admiral focused ophthalmology-specific needs.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/admiralophtha.html","id":"starting-a-script","dir":"Articles","previous_headings":"","what":"Starting a Script","title":"Get Started","text":"ophthalmology ADaM data structures, overview flow example function calls common steps provided following vignettes: Creating ADBCVA Creating ADOE Creating ADVFQ","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/admiralophtha.html","id":"support","dir":"Articles","previous_headings":"","what":"Support","title":"Get Started","text":"Support provided via admiral Slack channel.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adoe.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Creating ADOE","text":"article describes creating ADOE ADaM Ophthalmology Exam Analysis data ophthalmology endpoints. used conjunction article creating BDS dataset SDTM. , derivations processes specific ADOE absent, user invited consult aforementioned article guidance. current release admiralophtha contain functionality specific ADOE, article showcases map parameters OE order set basic structure ADOE. following steps, user invited consult -linked article BDS datasets. article updated future releases showcase explain admiralophtha-specific functionality. Note: examples assume CDISC SDTM /ADaM format input unless otherwise specified.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adoe.html","id":"dataset-contents","dir":"Articles","previous_headings":"Introduction","what":"Dataset Contents","title":"Creating ADOE","text":"admiralophtha suggests populate ADOE general miscellaneous ophthalmology parameters. efficacy endpoint-related parameters (eg. BCVA tests) placed separate datasets (eg. ADBCVA).","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adoe.html","id":"required-packages","dir":"Articles","previous_headings":"Introduction","what":"Required Packages","title":"Creating ADOE","text":"examples vignette require following packages.","code":"library(dplyr) library(admiral) library(pharmaversesdtm) library(admiraldev) library(admiralophtha)"},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adoe.html","id":"programming-workflow","dir":"Articles","previous_headings":"","what":"Programming Workflow","title":"Creating ADOE","text":"Initial Set ADOE Derivations Standard BDS Variables Example Script","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adoe.html","id":"setup","dir":"Articles","previous_headings":"Programming Workflow","what":"Initial set up of ADOE","title":"Creating ADOE","text":"BDS ADaM datasets, one start OE SDTM, general ophthalmology records interest. purposes next two sections, shall using admiral OE ADSL test data. also require lookup table mapping parameter codes. Note: simulate ophthalmology study, add randomly generated STUDYEYE variable ADSL, practice STUDYEYE already derived using derive_var_studyeye(). Following setup, programmer can start constructing ADOE. first step subset OE general ophthalmology parameters. , one can merge resulting dataset ADSL. required two reasons: firstly, STUDYEYE crucial mapping AFEYE PARAMCD’s. Secondly, treatment start date (TRTSDT) also prerequisite derivation variables Analysis Day (ADY). next item business derive AVAL, AVALU, DTYPE. example, due small number parameters derivation trivial. AFEYE also created step using function derive_var_afeye(). determine affected eye, function compares OELAT STUDYEYE variable created previous step.","code":"data(\"oe_ophtha\") data(\"admiral_adsl\") # Add STUDYEYE to ADSL to simulate an ophtha dataset adsl <- admiral_adsl %>% as.data.frame() %>% mutate(STUDYEYE = sample(c(\"LEFT\", \"RIGHT\"), n(), replace = TRUE)) %>% convert_blanks_to_na() oe <- convert_blanks_to_na(oe_ophtha) %>% ungroup() # ---- Lookup table ---- # Assign PARAMCD, PARAM, and PARAMN param_lookup <- tibble::tribble( ~OETESTCD, ~OECAT, ~OESCAT, ~AFEYE, ~PARAMCD, ~PARAM, ~PARAMN, \"CSUBTH\", \"OPHTHALMIC ASSESSMENTS\", \"SD-OCT CST SINGLE FORM\", \"Study Eye\", \"SCSUBTH\", \"Study Eye Center Subfield Thickness (um)\", 1, # nolint \"CSUBTH\", \"OPHTHALMIC ASSESSMENTS\", \"SD-OCT CST SINGLE FORM\", \"Fellow Eye\", \"FCSUBTH\", \"Fellow Eye Center Subfield Thickness (um)\", 2, # nolint \"DRSSR\", \"OPHTHALMIC ASSESSMENTS\", \"SD-OCT CST SINGLE FORM\", \"Study Eye\", \"SDRSSR\", \"Study Eye Diabetic Retinopathy Severity\", 3, # nolint \"DRSSR\", \"OPHTHALMIC ASSESSMENTS\", \"SD-OCT CST SINGLE FORM\", \"Fellow Eye\", \"FDRSSR\", \"Fellow Eye Diabetic Retinopathy Severity\", 4, # nolint ) adsl_vars <- exprs(TRTSDT, TRTEDT, TRT01A, TRT01P, STUDYEYE) adoe <- oe %>% filter( OETESTCD %in% c(\"CSUBTH\", \"DRSSR\") ) %>% derive_vars_merged( dataset_add = adsl, new_vars = adsl_vars, by_vars = exprs(STUDYID, USUBJID) ) adoe <- adoe %>% # Calculate AVAL, AVALC, AVALU and DTYPE mutate( AVAL = OESTRESN, AVALC = OESTRESC, AVALU = OESTRESU, DTYPE = NA_character_ ) %>% # Derive AFEYE needed for PARAMCD derivation derive_var_afeye(OELOC, OELAT, loc_vals = c(\"EYE\", \"RETINA\"))"},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/adoe.html","id":"further","dir":"Articles","previous_headings":"Programming Workflow","what":"Further Derivations of Standard BDS Variables","title":"Creating ADOE","text":"user invited consult article creating BDS dataset SDTM learn add standard BDS variables ADOE.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/advfq.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Creating ADVFQ","text":"article describes creating ADVFQ ADaM Visual Functioning Questionnaire data ophthalmology endpoints. used conjunction article creating BDS dataset SDTM. , derivations processes specific ADVFQ absent, user invited consult aforementioned article guidance. Note: examples assume CDISC SDTM /ADaM format input unless otherwise specified.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/advfq.html","id":"dataset-contents","dir":"Articles","previous_headings":"Introduction","what":"Dataset Contents","title":"Creating ADVFQ","text":"admiralophtha suggests populate ADVFQ solely VFQ records QS SDTM. questionnaire data placed separate datasets (e.g. ADQS).","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/advfq.html","id":"required-packages","dir":"Articles","previous_headings":"Introduction","what":"Required Packages","title":"Creating ADVFQ","text":"examples vignette require following packages.","code":"library(dplyr) library(admiral) library(pharmaversesdtm) library(admiraldev) library(admiralophtha)"},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/advfq.html","id":"programming-workflow","dir":"Articles","previous_headings":"","what":"Programming Workflow","title":"Creating ADVFQ","text":"Initial set ADVFQ Derive Analysis Value existing questions (AVAL) Derive Parameters recoded items summary scores Derive Analysis Variables (ANL01FL ASEQ) Add ADSL Variables Example Script","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/advfq.html","id":"setup","dir":"Articles","previous_headings":"Programming Workflow","what":"Initial set up of ADVFQ","title":"Creating ADVFQ","text":"start, datasets needed creation questionnaire dataset read environment. purpose demonstration shall use admiral QS ADSL test data. QS dataset filtered VFQ parameters interest. Next, programmer create parameter lookup table includes QSTESTCD, PARAMCD, PARAM, PARCAT1 PARCAT2 variables. include parameters needed final ADVFQ used later merge parameter information. Now ADVFQ dataset can constructed, merging filtered QS dataset ADSL. necessary treatment start date TRTSDT prerequisite derivation variables Analysis Day ADY can programmed following article creating BDS dataset SDTM.","code":"data(\"admiral_adsl\") data(\"qs_ophtha\") adsl <- admiral_adsl qs <- qs_ophtha qs <- qs %>% filter(QSTESTCD %in% c(\"VFQ1\", \"VFQ2\", \"VFQ3\", \"VFQ4\")) param_lookup <- tibble::tribble( ~QSTESTCD, ~PARAMCD, ~PARAM, ~PARCAT1, ~PARCAT2, \"VFQ1\", \"VFQ1\", \"Overall Health\", \"NEI VFQ-25\", \"Original Response\", \"VFQ2\", \"VFQ2\", \"Eyesight in Both Eyes\", \"NEI VFQ-25\", \"Original Response\", \"VFQ3\", \"VFQ3\", \"Worry About Eyesight\", \"NEI VFQ-25\", \"Original Response\", \"VFQ4\", \"VFQ4\", \"Pain in and Around Eyes\", \"NEI VFQ-25\", \"Original Response\", \"QR01\", \"QR01\", \"Recoded Item - 01\", \"NEI VFQ-25\", \"General 01\", \"QR02\", \"QR02\", \"Recoded Item - 02\", \"NEI VFQ-25\", \"General 01\", \"QR03\", \"QR03\", \"Recoded Item - 03\", \"NEI VFQ-25\", \"General 02\", \"QR04\", \"QR04\", \"Recoded Item - 04\", \"NEI VFQ-25\", \"General 02\", \"QSG01\", \"QSG01\", \"General Score 01\", \"NEI VFQ-25\", \"Averaged Result\", \"QSG02\", \"QSG02\", \"General Score 02\", \"NEI VFQ-25\", \"Averaged Result\", \"QBCSCORE\", \"QBCSCORE\", \"Composite Score\", \"NEI VFQ-25\", \"Averaged Result\" ) adsl_vars <- exprs(TRTSDT, TRTEDT, TRT01A, TRT01P) advfq <- derive_vars_merged( qs, dataset_add = adsl, new_vars = adsl_vars, by_vars = exprs(STUDYID, USUBJID) )"},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/advfq.html","id":"aval","dir":"Articles","previous_headings":"Programming Workflow","what":"Derive Analysis Value for Existing Questions","title":"Creating ADVFQ","text":"derive analysis values use function admiral::derive_vars_merged_lookup() merges PARAMCD parameter lookup table. merges parameter QSTESTCD assigns AVAL AVALC.","code":"advfq <- advfq %>% ## Add PARAMCD only - add PARAM etc later ---- derive_vars_merged_lookup( dataset_add = param_lookup, new_vars = exprs(PARAMCD), by_vars = exprs(QSTESTCD) ) %>% ## Calculate AVAL and AVALC ---- mutate( AVAL = QSSTRESN, AVALC = QSORRES )"},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/advfq.html","id":"parameters","dir":"Articles","previous_headings":"Programming Workflow","what":"Derive Parameters for Recoded Items and Summary Scores","title":"Creating ADVFQ","text":"included initial records QS, programmer next program new records parameters recode original questions. Run section code every question need recoding. gives example recoding one question. Next, programmer create summary records average recoded questions using admiral::derive_summary_records. example uses two recoded questions create average record.","code":"## QR01 Recoded Item 01 # set to 100 if [advfq.AVAL] = 1 # else set to 75 if [advfq.AVAL] = 2 # else set to 50 if [advfq.AVAL] = 3 # else set to 25 if [advfq.AVAL] = 4 # else set to 0 if [advfq.AVAL] = 5 advfq <- advfq %>% derive_summary_records( by_vars = exprs(STUDYID, USUBJID, !!!adsl_vars, PARAMCD, VISITNUM, VISIT), filter = QSTESTCD == \"VFQ1\" & !is.na(AVAL), analysis_var = AVAL, summary_fun = identity, set_values_to = exprs(PARAMCD = \"QR01\") ) %>% mutate(AVAL = ifelse(PARAMCD == \"QR01\", case_when( AVAL == 1 ~ 100, AVAL == 2 ~ 75, AVAL == 3 ~ 50, AVAL == 4 ~ 25, AVAL >= 5 ~ 0 ), AVAL )) ## Derive a new record as a summary record ---- ## QSG01 General Score 01 # Average of QR01 and QR02 records advfq <- advfq %>% derive_summary_records( by_vars = exprs(STUDYID, USUBJID, !!!adsl_vars, VISITNUM, VISIT, ADT, ADY), filter = PARAMCD %in% c(\"QR01\", \"QR02\") & !is.na(AVAL), analysis_var = AVAL, summary_fun = mean, set_values_to = exprs(PARAMCD = \"QSG01\") )"},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/advfq.html","id":"analysis","dir":"Articles","previous_headings":"Programming Workflow","what":"Derive Analysis Variables","title":"Creating ADVFQ","text":"finding ADaMs, analysis flag derived identify appropriate observation(s) use particular analysis subject multiple observations within particular timing period. situation, analysis flag (e.g. ANLxxFL) may used choose appropriate record analysis. flag may derived using admiral function admiral::derive_var_extreme_flag(). example, assume like choose latest value USUBJID, PARAMCD AVISIT. derive ASEQ using admiral::derive_var_obs_number() based observation number within dataset, additionally merge PARAM, PARCAT1 PARCAT2 using earlier lookup table.","code":"## ANL01FL: Flag last result within an AVISIT for post-baseline records ---- advfq <- advfq %>% restrict_derivation( derivation = derive_var_extreme_flag, args = params( new_var = ANL01FL, by_vars = exprs(USUBJID, PARAMCD, AVISIT), order = exprs(ADT, AVAL), mode = \"last\" ), filter = !is.na(AVISITN) & ONTRTFL == \"Y\" ) ## Get ASEQ and PARAM ---- advfq <- advfq %>% # Calculate ASEQ derive_var_obs_number( new_var = ASEQ, by_vars = exprs(STUDYID, USUBJID), order = exprs(PARAMCD, ADT, AVISITN, VISITNUM), check_type = \"error\" ) %>% # Derive PARAM derive_vars_merged(dataset_add = select(param_lookup, -QSTESTCD), by_vars = exprs(PARAMCD))"},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/advfq.html","id":"adslvars","dir":"Articles","previous_headings":"Programming Workflow","what":"Add ADSL Variables","title":"Creating ADVFQ","text":"analysis variables programmed, variables ADSL required merged dataset using admiral::derive_vars_merged.","code":"# Add all ADSL variables advfq <- advfq %>% derive_vars_merged( dataset_add = select(adsl, !!!negate_vars(adsl_vars)), by_vars = exprs(STUDYID, USUBJID) )"},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/standards.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Ophthalmology Standards","text":"Ophthalmology hugely diverse therapeutic area, endpoints conventions can differ study study - let alone across companies. Notwithstanding , exist cases alignment possible; page indexes occurrences admiralophtha suggests adoption certain standard way things. Applying standards means mandatory, help leveraging tools (templates, functions, etc.) provided admiralophtha well lower barrier entry programming study. Additionally, page can function guidance programmers starting dip feet ophthalmology ADaM programming.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/standards.html","id":"dataset-subdivision","dir":"Articles","previous_headings":"Introduction","what":"Dataset Subdivision","title":"Ophthalmology Standards","text":"Due aforementioned high complexity diversity ophthalmology data, discouraged funnel records OE SDTM dataset single ADOE dataset, result overly complicated program/dataset pair. admiralophtha instead suggests following partition: ADOE general miscellaneous ophthalmology tests used efficacy programming. ADBCVA BCVA data - almost always constitute primary secondary endpoint require endpoint-related programming criterion flags. endpoints specific efficacy programming may required ADaM dataset (e.g. intraocular pressure data, ADIOP). ADVFQ Visual Functioning Questionnaire data. Subdividing ADaM datasets study ensure wherever custom efficacy programming required, automatically limited data interest. instance, study various endpoints form Gain x y letters relative baseline (similar) likely require criterion variable/flag pair (see Criterion Flag section detail). BCVA data stored ADOE, criterion variable/flag pairs blank irrelevant data dataset, save BCVA records. Conversely, collecting BCVA data ADBCVA ensures criterion variable/flag pairs relevant, resulting dataset readable.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/standards.html","id":"criterion","dir":"Articles","previous_headings":"Introduction","what":"Criterion Flags","title":"Ophthalmology Standards","text":"admiralophtha suggests use criterion variable/flag pairs CRITx/CRITxFL possible endpoint programming. implemented correctly, transparent approach condition CRITxFL can clearly encoded CRITx, without view documentation. appropriate, condition CRITx represented programmatically rather words reduce possibility confusion. instance, endpoint Gain x y letters relative baseline, one set CRIT1 = \"x <= CHG <= y\". Note: Though allowable according ADaM standards, generally discouraged use criterion flag/variable pair one criterion across multiple parameters ADaM dataset, renders dataset confusing scrutinise. BCVA change endpoints, provides function derive_var_bcvacritxfl add en masse. Additionally, function automatically populates CRITx programmatic manner described .","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/articles/standards.html","id":"affected-eye-derivation","dir":"Articles","previous_headings":"Introduction","what":"Affected Eye Derivation","title":"Ophthalmology Standards","text":"admiralophtha function derive_var_afeye follows standard derivation: Set “EYES” Study Eye Selection [ADSL.STUDYEYE] missing, Laterality [xxLAT] equal “BILATERAL”. Else set “STUDY EYE” Study Eye Selection [ADSL.STUDYEYE] either “RIGHT” “LEFT”, matches Laterality [xxLAT] observation record. Else set “STUDY EYE” Study Eye Selection [ADSL.STUDYEYE] “BILATERAL”, Laterality [xxLAT] missing observation record. Else set “FELLOW EYE” Study Eye Selection [ADSL.STUDYEYE] either “RIGHT” “LEFT”, [xxLAT] missing match Laterality [xxLAT] observation record. Else set null. standard values Location [xxLOC] = “EYE” Laterality [xxLAT] = “LEFT”, “RIGHT”, “BILATERAL” study can updated inputs function, otherwise also expected AFEYE derived, warning returned values found.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Edoardo Mancini. Author, maintainer. Ritika Aggarwal. Author. Jane Gao. Author. William Holmes. Author. Josie Jackson. Author. Sonali Jain. Author. Yuki Matsunaga. Author. Gordon Miller. Author. Rachel Linacre. Author. Lucy Palmen. Author. Nandini R Thampi. Author. Aldrich Salva. Author.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Mancini E, Aggarwal R, Gao J, Holmes W, Jackson J, Jain S, Matsunaga Y, Miller G, Linacre R, Palmen L, R Thampi N, Salva (2023). admiralophtha: ADaM R Asset Library - Ophthalmology. https://pharmaverse.github.io/admiralophtha/main/, https://github.com/pharmaverse/admiralophtha/.","code":"@Manual{, title = {admiralophtha: ADaM in R Asset Library - Ophthalmology}, author = {Edoardo Mancini and Ritika Aggarwal and Jane Gao and William Holmes and Josie Jackson and Sonali Jain and Yuki Matsunaga and Gordon Miller and Rachel Linacre and Lucy Palmen and Nandini {R Thampi} and Aldrich Salva}, year = {2023}, note = {https://pharmaverse.github.io/admiralophtha/main/, https://github.com/pharmaverse/admiralophtha/}, }"},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/main/index.html","id":"purpose","dir":"","previous_headings":"","what":"Purpose","title":"ADaM in R Asset Library - Ophthalmology","text":"provide complementary (admiral) toolbox enables users develop ophthalmology disease area datasets endpoints.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"ADaM in R Asset Library - Ophthalmology","text":"install latest development version package directly GitHub use following code:","code":"if (!requireNamespace(\"remotes\", quietly = TRUE)) { install.packages(\"remotes\") } remotes::install_github(\"pharmaverse/admiralophtha\", ref = \"devel\")"},{"path":"https://pharmaverse.github.io/admiralophtha/main/index.html","id":"scope","dir":"","previous_headings":"","what":"Scope","title":"ADaM in R Asset Library - Ophthalmology","text":"Build toolbox re-usable functions utilities create Ophthalmology-specific ADaM datasets R modular manner. functions created based upon ADaM Implementation Guide aim facilitate programming ADaM dataset standards.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/index.html","id":"references-and-documentation","dir":"","previous_headings":"","what":"References and Documentation","title":"ADaM in R Asset Library - Ophthalmology","text":"Please refer {admiral} References Documentation.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/index.html","id":"r-versions","dir":"","previous_headings":"","what":"R Versions","title":"ADaM in R Asset Library - Ophthalmology","text":"’s summary strategy package related R versions: R versions developers users follow admiral core package. development devel branch admiral core used dependency. releasing new admiralophtha version must run using latest released admiral core version, .e., main branch admiral core.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/index.html","id":"contact","dir":"","previous_headings":"","what":"Contact","title":"ADaM in R Asset Library - Ophthalmology","text":"use following support communications user developer community: Slack - informal discussions, Q&building user community. don’t access, use link join pharmaverse Slack workspace GitHub Issues - direct feedback, enhancement requests raising bugs","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/index.html","id":"release-schedule","dir":"","previous_headings":"","what":"Release Schedule","title":"ADaM in R Asset Library - Ophthalmology","text":"first release (v. 0.1.0) came 13th March 2023. second release (v. 0.2.0) came 12th June 2023. third release (v. 0.3.0) came 18th September 2023. planning fourth release (v.1.0) December 11th 2023. objective 1.0 release admiralophtha provide package mature enough used part ADaM work ophthalmology study.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha-package.html","id":null,"dir":"Reference","previous_headings":"","what":"admiralophtha: ADaM in R Asset Library - Ophthalmology — admiralophtha-package","title":"admiralophtha: ADaM in R Asset Library - Ophthalmology — admiralophtha-package","text":"Aids programming Clinical Data Standards Interchange Consortium (CDISC) compliant Ophthalmology Analysis Data Model (ADaM) datasets R. ADaM datasets mandatory part New Drug Biologics License Application submitted United States Food Drug Administration (FDA). Analysis derivations implemented accordance \"Analysis Data Model Implementation Guide\" (CDISC Analysis Data Model Team, 2021, https://www.cdisc.org/standards/foundational/adam/adamig-v1-3-release-package).","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha-package.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"admiralophtha: ADaM in R Asset Library - Ophthalmology — admiralophtha-package","text":"Maintainer: Edoardo Mancini edoardo.mancini@roche.com Authors: Ritika Aggarwal ritika.aggarwal@novartis.com Jane Gao jane.gao@roche.com William Holmes william.holmes@roche.com Josie Jackson josie.jackson@roche.com Sonali Jain sonali.jain@novartis.com Yuki Matsunaga yuki.matsunaga@novartis.com Gordon Miller gordon.miller@roche.com Rachel Linacre rachel.linacre@roche.com Lucy Palmen lucy.palmen@roche.com Nandini R Thampi nandini.rajendhiran@novartis.com Aldrich Salva salva.aldrich@gene.com","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_adbcva.html","id":null,"dir":"Reference","previous_headings":"","what":"Best Corrected Visual Acuity Analysis Dataset — admiralophtha_adbcva","title":"Best Corrected Visual Acuity Analysis Dataset — admiralophtha_adbcva","text":"example Best Corrected Visual Acuity (BCVA) analysis dataset","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_adbcva.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Best Corrected Visual Acuity Analysis Dataset — admiralophtha_adbcva","text":"","code":"admiralophtha_adbcva"},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_adbcva.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Best Corrected Visual Acuity Analysis Dataset — admiralophtha_adbcva","text":"object class tbl_df (inherits tbl, data.frame) 7672 rows 116 columns.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_adbcva.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Best Corrected Visual Acuity Analysis Dataset — admiralophtha_adbcva","text":"Derived OE ADSL datasets using {admiral}, {admiralophtha} (https://github.com/pharmaverse/admiralophtha/blob/main/inst/templates/ad_adbcva.R)","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_adoe.html","id":null,"dir":"Reference","previous_headings":"","what":"Ophthalmology Exam Analysis Dataset — admiralophtha_adoe","title":"Ophthalmology Exam Analysis Dataset — admiralophtha_adoe","text":"example Ophthalmology Exam Analysis dataset","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_adoe.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Ophthalmology Exam Analysis Dataset — admiralophtha_adoe","text":"","code":"admiralophtha_adoe"},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_adoe.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Ophthalmology Exam Analysis Dataset — admiralophtha_adoe","text":"object class tbl_df (inherits tbl, data.frame) 7672 rows 98 columns.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_adoe.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Ophthalmology Exam Analysis Dataset — admiralophtha_adoe","text":"Derived OE ADSL datasets using {admiral}, {admiralophtha} (https://github.com/pharmaverse/admiralophtha/blob/main/inst/templates/ad_adoe.R)","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_advfq.html","id":null,"dir":"Reference","previous_headings":"","what":"Visual Function Questionnaire Analysis Dataset — admiralophtha_advfq","title":"Visual Function Questionnaire Analysis Dataset — admiralophtha_advfq","text":"example Visual Function Questionnaire (VFQ) analysis dataset","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_advfq.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visual Function Questionnaire Analysis Dataset — admiralophtha_advfq","text":"","code":"admiralophtha_advfq"},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_advfq.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Visual Function Questionnaire Analysis Dataset — admiralophtha_advfq","text":"object class tbl_df (inherits tbl, data.frame) 28798 rows 41 columns.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_advfq.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Visual Function Questionnaire Analysis Dataset — admiralophtha_advfq","text":"Derived ADSL QS datasets using {admiral}, {admiralophtha} (https://github.com/pharmaverse/admiralophtha/blob/main/inst/templates/ad_advfq.R)","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/convert_etdrs_to_logmar.html","id":null,"dir":"Reference","previous_headings":"","what":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","title":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","text":"Convert ETDRS score LogMAR units","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/convert_etdrs_to_logmar.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","text":"","code":"convert_etdrs_to_logmar(value)"},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/convert_etdrs_to_logmar.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","text":"value object containing ETDRS score convert logMAR","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/convert_etdrs_to_logmar.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","text":"input value converted converted logMAR units","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/convert_etdrs_to_logmar.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","text":"ETDRS value converted logMAR logMAR = -0.02 * ETDRS + 1.7 Source conversion formula: Beck, R.W., et al. computerized method visual acuity testing. American Journal Ophthalmology, 135(2), pp.194–205. doi:https://doi.org/10.1016/s0002-9394(02)01825-1.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/convert_etdrs_to_logmar.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","text":"Rachel Linacre","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/convert_etdrs_to_logmar.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","text":"","code":"library(tibble) library(dplyr) #> #> Attaching package: ‘dplyr’ #> The following objects are masked from ‘package:stats’: #> #> filter, lag #> The following objects are masked from ‘package:base’: #> #> intersect, setdiff, setequal, union library(admiral) library(admiraldev) #> #> Attaching package: ‘admiraldev’ #> The following objects are masked from ‘package:dplyr’: #> #> anti_join, filter_if, inner_join, left_join adbcva <- tribble( ~STUDYID, ~USUBJID, ~AVAL, \"XXX001\", \"P01\", 5, \"XXX001\", \"P02\", 10, \"XXX001\", \"P03\", 15, \"XXX001\", \"P04\", 20, \"XXX001\", \"P05\", 25 ) adbcva <- adbcva %>% mutate(AVAL = convert_etdrs_to_logmar(AVAL))"},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/convert_logmar_to_etdrs.html","id":null,"dir":"Reference","previous_headings":"","what":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","title":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","text":"Convert LogMAR score ETDRS units","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/convert_logmar_to_etdrs.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","text":"","code":"convert_logmar_to_etdrs(value)"},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/convert_logmar_to_etdrs.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","text":"value object containing logMAR score convert ETDRS","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/convert_logmar_to_etdrs.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","text":"input value converted ETDRS units","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/convert_logmar_to_etdrs.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","text":"logMAR value converted ETDRS ETDRS = -(logMAR - 1.7) / 0.02 Source conversion formula: Beck, R.W., et al. computerized method visual acuity testing. American Journal Ophthalmology, 135(2), pp.194–205. doi:https://doi.org/10.1016/s0002-9394(02)01825-1.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/convert_logmar_to_etdrs.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","text":"Nandini R Thampi","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/convert_logmar_to_etdrs.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","text":"","code":"library(tibble) library(dplyr) library(admiral) oe <- tribble( ~STUDYID, ~USUBJID, ~OETESTCD, ~OEMETHOD, ~OESTRESN, \"XXX001\", \"P01\", \"VACSCORE\", \"logMAR EYE CHART\", 1.08, \"XXX001\", \"P02\", \"VACSCORE\", \"logMAR EYE CHART\", 1.66, \"XXX001\", \"P03\", \"VACSCORE\", \"logMAR EYE CHART\", 1.60, \"XXX001\", \"P04\", \"VACSCORE\", \"ETDRS EYE CHART\", 57, \"XXX001\", \"P05\", \"VACSCORE\", \"ETDRS EYE CHART\", 1 ) adbcva <- oe %>% filter(OETESTCD == \"VACSCORE\" & toupper(OEMETHOD) == \"LOGMAR EYE CHART\") %>% mutate(OESTRESN = convert_logmar_to_etdrs(OESTRESN))"},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_afeye.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive Affected Eye — derive_var_afeye","title":"Derive Affected Eye — derive_var_afeye","text":"Derive Affected Eye (AFEYE) occurrence datasets","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_afeye.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive Affected Eye — derive_var_afeye","text":"","code":"derive_var_afeye( dataset_occ, loc_var, lat_var, loc_vals = \"EYE\", lat_vals = c(\"LEFT\", \"RIGHT\", \"BILATERAL\") )"},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_afeye.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive Affected Eye — derive_var_afeye","text":"dataset_occ Input Occurence dataset loc_var Location variable lat_var Laterality variable loc_vals xxLOCvalues AFEYE derived lat_vals xxLATvalues AFEYE derived","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_afeye.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive Affected Eye — derive_var_afeye","text":"input occurrence dataset Affected Eye (AFEYE) added.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_afeye.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Derive Affected Eye — derive_var_afeye","text":"Affected Eye derived occurrence dataset using laterality Study Eye. assumes Study Eye already added ADSL.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_afeye.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Derive Affected Eye — derive_var_afeye","text":"Lucy Palmen","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_afeye.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Derive Affected Eye — derive_var_afeye","text":"","code":"library(tibble) library(admiral) adae <- tribble( ~STUDYID, ~USUBJID, ~STUDYEYE, ~AELOC, ~AELAT, \"XXX001\", \"P01\", \"RIGHT\", \"EYE\", \"RIGHT\", \"XXX001\", \"P01\", \"RIGHT\", \"EYE\", \"LEFT\", \"XXX001\", \"P01\", \"RIGHT\", \"EYE\", \"\", \"XXX001\", \"P01\", \"RIGHT\", \"\", \"RIGHT\", \"XXX001\", \"P02\", \"LEFT\", \"\", \"\", \"XXX001\", \"P02\", \"LEFT\", \"EYE\", \"LEFT\", \"XXX001\", \"P04\", \"BILATERAL\", \"EYE\", \"RIGHT\", \"XXX001\", \"P05\", \"RIGHT\", \"EYE\", \"RIGHT\", \"XXX001\", \"P05\", \"RIGHT\", \"EYE\", \"BILATERAL\", \"XXX001\", \"P06\", \"BILATERAL\", \"\", \"\", \"XXX001\", \"P06\", \"BILATERAL\", \"\", \"RIGHT\", \"XXX001\", \"P07\", \"BILATERAL\", \"EYE\", \"BILATERAL\", \"XXX001\", \"P08\", \"\", \"EYE\", \"BILATERAL\", \"XXX001\", \"P09\", \"NONSENSE\", \"EYE\", \"BILATERAL\", \"XXX001\", \"P09\", \"BILATERAL\", \"EYE\", \"NONSENSE\", \"XXX001\", \"P09\", \"BILATERAL\", \"NONSENSE\", \"BILATERAL\", \"XXX001\", \"P10\", \"RIGHT\", \"EYE\", \"BOTH\" ) adae <- derive_var_afeye(adae, AELOC, AELAT) #> Warning: Warning: value not in lat_vals #> Warning: Warning: value not in loc_vals #> Warning: Warning: STUDYEYE is expected to be 'LEFT', 'RIGHT' or 'BILATERAL'"},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl.html","id":null,"dir":"Reference","previous_headings":"","what":"Adds CRITx/CRITxFL pairs to BCVA dataset — derive_var_bcvacritxfl","title":"Adds CRITx/CRITxFL pairs to BCVA dataset — derive_var_bcvacritxfl","text":"Adds criterion variables CRITx corresponding flags CRITxFL dataset containing BCVA records","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Adds CRITx/CRITxFL pairs to BCVA dataset — derive_var_bcvacritxfl","text":"","code":"derive_var_bcvacritxfl( dataset, crit_var, bcva_ranges = NULL, bcva_uplims = NULL, bcva_lowlims = NULL, additional_text = \"\", critxfl_index = NULL )"},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Adds CRITx/CRITxFL pairs to BCVA dataset — derive_var_bcvacritxfl","text":"dataset Input dataset containing BCVA data (usually ADBCVA). crit_var Variable respect CRITx/CRITxFL derived (usually CHG AVAL). bcva_ranges List containing one numeric vectors length 2. vector c(,b) bcva_ranges, pair variables CRITx, CRITxFL created condition: <= crit_var <= b. criterion flags type required, leave NULL. bcva_uplims List containing one numeric elements. element bcva_uplims, pair variables CRITx, CRITxFL created condition: crit_var <= . criterion flags type required, leave NULL. bcva_lowlims List containing one numeric elements. element b bcva_lowlims, pair variables CRITx, CRITxFL created condition: crit_var >= b. criterion flags type required, leave NULL. additional_text string containing additional text append CRITx critxfl_index positive integer detailing first value x use CRITxFL. supplied, function takes first available value x, counting x = 1.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Adds CRITx/CRITxFL pairs to BCVA dataset — derive_var_bcvacritxfl","text":"input BCVA dataset additional column pairsCRITx, CRITxFL.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Adds CRITx/CRITxFL pairs to BCVA dataset — derive_var_bcvacritxfl","text":"function works calling derive_var_bcvacritxfl() elements bcva_ranges, bcva_uplims bcva_lowlims. NOTE: crit_var equal NA, resulting criterion flag also marked NA.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Adds CRITx/CRITxFL pairs to BCVA dataset — derive_var_bcvacritxfl","text":"Edoardo Mancini","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Adds CRITx/CRITxFL pairs to BCVA dataset — derive_var_bcvacritxfl","text":"","code":"library(tibble) library(admiral) library(admiraldev) adbcva1 <- tribble( ~STUDYID, ~USUBJID, ~AVISIT, ~BASETYPE, ~PARAMCD, ~CHG, \"XXX001\", \"P01\", \"BASELINE\", \"LAST\", \"SBCVA\", 0, \"XXX001\", \"P01\", \"WEEK 2\", \"LAST\", \"FBCVA\", 2, \"XXX001\", \"P02\", \"BASELINE\", \"LAST\", \"SBCVA\", -13, \"XXX001\", \"P02\", \"WEEK 2\", \"LAST\", \"FBCVA\", 5, \"XXX001\", \"P03\", \"BASELINE\", \"LAST\", \"SBCVA\", NA, \"XXX001\", \"P03\", \"WEEK 2\", \"LAST\", \"FBCVA\", 17 ) derive_var_bcvacritxfl( dataset = adbcva1, crit_var = exprs(CHG), bcva_ranges = list(c(0, 5), c(-5, -1), c(10, 15)), bcva_uplims = list(5, 10), bcva_lowlims = list(8), additional_text = \"\" ) #> # A tibble: 6 × 18 #> STUDYID USUBJID AVISIT BASETYPE PARAMCD CHG CRIT1 CRIT1FL CRIT2 CRIT2FL #> #> 1 XXX001 P01 BASELINE LAST SBCVA 0 0 <= CH… Y -5 <… N #> 2 XXX001 P01 WEEK 2 LAST FBCVA 2 0 <= CH… Y -5 <… N #> 3 XXX001 P02 BASELINE LAST SBCVA -13 0 <= CH… N -5 <… N #> 4 XXX001 P02 WEEK 2 LAST FBCVA 5 0 <= CH… Y -5 <… N #> 5 XXX001 P03 BASELINE LAST SBCVA NA 0 <= CH… NA -5 <… NA #> 6 XXX001 P03 WEEK 2 LAST FBCVA 17 0 <= CH… N -5 <… N #> # ℹ 8 more variables: CRIT3 , CRIT3FL , CRIT4 , CRIT4FL , #> # CRIT5 , CRIT5FL , CRIT6 , CRIT6FL adbcva2 <- tribble( ~STUDYID, ~USUBJID, ~AVISIT, ~BASETYPE, ~PARAMCD, ~AVAL, ~CHG, \"XXX001\", \"P01\", \"BASELINE\", \"LAST\", \"SBCVA\", 4, NA, \"XXX001\", \"P01\", \"BASELINE\", \"LAST\", \"SBCVA\", 6, NA, \"XXX001\", \"P01\", \"AVERAGE BASELINE\", \"AVERAGE\", \"SBCVA\", 5, NA, \"XXX001\", \"P01\", \"WEEK 2\", \"LAST\", \"SBCVA\", -3, NA, \"XXX001\", \"P01\", \"WEEK 4\", \"LAST\", \"SBCVA\", -10, NA, \"XXX001\", \"P01\", \"WEEK 6\", \"LAST\", \"SBCVA\", 12, NA, \"XXX001\", \"P01\", \"WEEK 2\", \"AVERAGE\", \"SBCVA\", -2, -7, \"XXX001\", \"P01\", \"WEEK 4\", \"AVERAGE\", \"SBCVA\", 6, 1, \"XXX001\", \"P01\", \"WEEK 6\", \"AVERAGE\", \"SBCVA\", 3, -2 ) restrict_derivation( adbcva2, derivation = derive_var_bcvacritxfl, args = params( crit_var = exprs(CHG), bcva_ranges = list(c(0, 5), c(-10, 0)), bcva_lowlims = list(5), additional_text = \" (AVERAGE)\" ), filter = PARAMCD %in% c(\"SBCVA\", \"FBCVA\") & BASETYPE == \"AVERAGE\" ) #> # A tibble: 9 × 13 #> STUDYID USUBJID AVISIT BASETYPE PARAMCD AVAL CHG CRIT1 CRIT1FL CRIT2 #> #> 1 XXX001 P01 AVERAGE BASE… AVERAGE SBCVA 5 NA 0 <=… NA -10 … #> 2 XXX001 P01 WEEK 2 AVERAGE SBCVA -2 -7 0 <=… N -10 … #> 3 XXX001 P01 WEEK 4 AVERAGE SBCVA 6 1 0 <=… Y -10 … #> 4 XXX001 P01 WEEK 6 AVERAGE SBCVA 3 -2 0 <=… N -10 … #> 5 XXX001 P01 BASELINE LAST SBCVA 4 NA NA NA NA #> 6 XXX001 P01 BASELINE LAST SBCVA 6 NA NA NA NA #> 7 XXX001 P01 WEEK 2 LAST SBCVA -3 NA NA NA NA #> 8 XXX001 P01 WEEK 4 LAST SBCVA -10 NA NA NA NA #> 9 XXX001 P01 WEEK 6 LAST SBCVA 12 NA NA NA NA #> # ℹ 3 more variables: CRIT2FL , CRIT3 , CRIT3FL "},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl_util.html","id":null,"dir":"Reference","previous_headings":"","what":"Add CRITx/CRITxFL pair to BCVA dataset — derive_var_bcvacritxfl_util","title":"Add CRITx/CRITxFL pair to BCVA dataset — derive_var_bcvacritxfl_util","text":"Helper function derive_var_bcvacritxfl() adds criterion variable CRITx corresponding flag CRITxFL dataset containing BCVA records","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl_util.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add CRITx/CRITxFL pair to BCVA dataset — derive_var_bcvacritxfl_util","text":"","code":"derive_var_bcvacritxfl_util( dataset, crit_var, critx_text, critxfl_cond, counter, bcva_range = NULL, bcva_uplim = NULL, bcva_lowlim = NULL )"},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl_util.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add CRITx/CRITxFL pair to BCVA dataset — derive_var_bcvacritxfl_util","text":"dataset Input dataset (usually ADBCVA). crit_var Variable respect CRITx/CRITxFL derived (usually CHG AVAL). critx_text String containing text CRITx variable. critxfl_cond String containing R code detailing criterion satisfied CRITxFL variable equal \"Y\". counter Integer detailing value x use CRITxFL. bcva_range Numeric vector length two detailing lower upper change BCVA limits (bcva_range called critxfl_cond criterion stipulates change BCVA lie inside range). bcva_uplim Numeric value detailing highest change BCVA limit (bcva_uplim called critxfl_cond criterion stipulates change BCVA lie upper limit). bcva_lowlim Numeric value detailing lowest change BCVA limit (bcva_lowlim called critxfl_cond criterion stipulates change BCVA lie lower limit).","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl_util.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add CRITx/CRITxFL pair to BCVA dataset — derive_var_bcvacritxfl_util","text":"input BCVA dataset additional columns CRITx, CRITxFL.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl_util.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add CRITx/CRITxFL pair to BCVA dataset — derive_var_bcvacritxfl_util","text":"criterion change BCVA CRITxFL can three types: (1) value lies within range; <= crit_var <= b; (2) value upper limit; crit_var <= ; (3) value lower limit; b <= crit_var. (1), bcva_range must specified function; (2), bcva_uplim; (3) bcva_lowlim. necessary supply least one three arguments. NOTE: crit_var equal NA, resulting criterion flag also marked NA.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl_util.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Add CRITx/CRITxFL pair to BCVA dataset — derive_var_bcvacritxfl_util","text":"Edoardo Mancini","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_studyeye.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive Study Eye — derive_var_studyeye","title":"Derive Study Eye — derive_var_studyeye","text":"Derive Study Eye (STUDYEYE) ADSL dataset","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_studyeye.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive Study Eye — derive_var_studyeye","text":"","code":"derive_var_studyeye(dataset_adsl, dataset_sc, sctestcd_value = \"FOCID\")"},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_studyeye.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive Study Eye — derive_var_studyeye","text":"dataset_adsl ADSL input dataset dataset_sc SC input dataset sctestcd_value SCTESTCD value flagging Study Eye selection records. Default: \"FOCID\".","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_studyeye.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive Study Eye — derive_var_studyeye","text":"input ADSL dataset additional column named STUDYEYE","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_studyeye.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Derive Study Eye — derive_var_studyeye","text":"Study Eye derived ADSL using \"Study Eye selection\" records SC SDTM dataset.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_studyeye.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Derive Study Eye — derive_var_studyeye","text":"Edoardo Mancini","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_studyeye.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Derive Study Eye — derive_var_studyeye","text":"","code":"library(tibble) library(admiral) adsl <- tribble( ~STUDYID, ~USUBJID, \"XXX001\", \"P01\", \"XXX001\", \"P02\", \"XXX001\", \"P03\", \"XXX001\", \"P04\", \"XXX001\", \"P05\" ) sc <- tribble( ~STUDYID, ~USUBJID, ~SCTESTCD, ~SCSTRESC, \"XXX001\", \"P01\", \"FOCID\", \"OS\", \"XXX001\", \"P01\", \"ACOHORT\", \"COHORT1\", \"XXX001\", \"P02\", \"FOCID\", \"OD\", \"XXX001\", \"P02\", \"ACOHORT\", \"COHORT3\", \"XXX001\", \"P04\", \"FOCID\", \"OU\", \"XXX001\", \"P05\", \"FOCID\", \"OD\", \"XXX001\", \"P06\", \"FOCID\", \"OS\" ) derive_var_studyeye(adsl, sc) #> # A tibble: 5 × 3 #> STUDYID USUBJID STUDYEYE #> #> 1 XXX001 P01 \"LEFT\" #> 2 XXX001 P02 \"RIGHT\" #> 3 XXX001 P03 \"\" #> 4 XXX001 P04 \"BILATERAL\" #> 5 XXX001 P05 \"RIGHT\""}] diff --git a/main/sitemap.xml b/main/sitemap.xml deleted file mode 100644 index 130616d3..00000000 --- a/main/sitemap.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - https://pharmaverse.github.io/admiralophtha/main/404.html - - - https://pharmaverse.github.io/admiralophtha/main/LICENSE.html - - - https://pharmaverse.github.io/admiralophtha/main/articles/adbcva.html - - - https://pharmaverse.github.io/admiralophtha/main/articles/admiralophtha.html - - - https://pharmaverse.github.io/admiralophtha/main/articles/adoe.html - - - https://pharmaverse.github.io/admiralophtha/main/articles/advfq.html - - - https://pharmaverse.github.io/admiralophtha/main/articles/index.html - - - https://pharmaverse.github.io/admiralophtha/main/articles/standards.html - - - https://pharmaverse.github.io/admiralophtha/main/authors.html - - - https://pharmaverse.github.io/admiralophtha/main/index.html - - - https://pharmaverse.github.io/admiralophtha/main/news/index.html - - - https://pharmaverse.github.io/admiralophtha/main/pull_request_template.html - - - https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha-package.html - - - https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_adbcva.html - - - https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_adoe.html - - - https://pharmaverse.github.io/admiralophtha/main/reference/admiralophtha_advfq.html - - - https://pharmaverse.github.io/admiralophtha/main/reference/convert_etdrs_to_logmar.html - - - https://pharmaverse.github.io/admiralophtha/main/reference/convert_logmar_to_etdrs.html - - - https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_afeye.html - - - https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl.html - - - https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_bcvacritxfl_util.html - - - https://pharmaverse.github.io/admiralophtha/main/reference/derive_var_studyeye.html - - - https://pharmaverse.github.io/admiralophtha/main/reference/index.html - - diff --git a/main/news/index.html b/news/index.html similarity index 88% rename from main/news/index.html rename to news/index.html index d3d508e5..fe8eb17f 100644 --- a/main/news/index.html +++ b/news/index.html @@ -1,5 +1,5 @@ -Changelog • admiralophthaChangelog • admiralophtha @@ -36,14 +36,6 @@ - - @@ -84,7 +76,7 @@

Updates to Templates

Updates to Documentation

-
  • Added release date for admiralophtha 1.0 to the front page (#203).
  • +
    • Added release date for admiralophtha 1.0 to the front page (#203).
    • Removed analysis_value argument in the calls to derive_param_computed() in ADBCVA vignette in line with the deprecation of this argument in the new version of admiral. Variable values for parameters of interest are now all populated through the set_values_to argument (#207).

@@ -103,7 +95,7 @@

Updates to FunctionsUpdates to Templates

@@ -135,7 +127,7 @@

Updates to Templates

Updates to Site

-
  • Added a “Report a bug” link to admiralophtha website (issue #127).
  • +
    • Added a “Report a bug” link to admiralophtha website (issue #127).
    • Fixed bug where the search bar didn’t work for some searches (issue #141).
@@ -148,7 +140,7 @@

New FeaturesAdded a function to derive the criterion flags in ADBCVA (issue #49).
  • Added a function to convert LogMAR scores to ETDRS scores (issue #50).
  • Added a function to convert ETDRS scores to LogMAR scores (issue #50).
  • -
  • Created ophthalmology-specific test data for the EX SDTM domain, stored in admiralophtha package and accessible by calling data(admiralophtha_ex) (issue #36).
  • +
  • Created ophthalmology-specific test data for the EX SDTM domain, stored in admiralophtha package and accessible by calling data(admiralophtha_ex) (issue #36).
  • Created ophthalmology-specific test data for the SC and OE SDTM domains, stored in admiral package and accessible by calling data(admiral_sc) or data(admiral_oe) (issues #11 and #13).
  • Updated AE and QS test datasets in admiral to include ophthalmology-specific variables and records, such as laterality variables in AE and VFQ records in QS (issues #12 and #52).
  • diff --git a/devel/pkgdown.js b/pkgdown.js similarity index 100% rename from devel/pkgdown.js rename to pkgdown.js diff --git a/pkgdown.yml b/pkgdown.yml new file mode 100644 index 00000000..038a54f4 --- /dev/null +++ b/pkgdown.yml @@ -0,0 +1,14 @@ +pandoc: 2.19.2 +pkgdown: 2.0.7 +pkgdown_sha: ~ +articles: + adbcva: adbcva.html + admiralophtha: admiralophtha.html + adoe: adoe.html + advfq: advfq.html + standards: standards.html +last_built: 2023-11-09T16:08Z +urls: + reference: https://pharmaverse.github.io/admiralophtha/reference + article: https://pharmaverse.github.io/admiralophtha/articles + diff --git a/pre-release/.nojekyll b/pre-release/.nojekyll deleted file mode 100644 index 8b137891..00000000 --- a/pre-release/.nojekyll +++ /dev/null @@ -1 +0,0 @@ - diff --git a/pre-release/404.html b/pre-release/404.html deleted file mode 100644 index 71ce2ab1..00000000 --- a/pre-release/404.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - -Page not found (404) • admiralophtha - - - - - - - - - - - - - - - - Skip to contents - - -
    -
    -
    - -Content not found. Please use links in the navbar. - -
    -
    - - -
    - - - -
    -
    - - - - - - - diff --git a/pre-release/LICENSE.html b/pre-release/LICENSE.html deleted file mode 100644 index 9992950f..00000000 --- a/pre-release/LICENSE.html +++ /dev/null @@ -1,166 +0,0 @@ - -Apache License • admiralophtha - Skip to contents - - -
    -
    -
    - -
    - -

    Version 2.0, January 2004 <http://www.apache.org/licenses/>

    -
    -

    Terms and Conditions for use, reproduction, and distribution

    -
    -

    1. Definitions

    -

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    -

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    -

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    -

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    -

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    -

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    -

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    -

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    -

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    -

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

    -
    -
    - -

    Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

    -
    -
    -

    3. Grant of Patent License

    -

    Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

    -
    -
    -

    4. Redistribution

    -

    You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    -
    • -(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
    • -
    • -(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
    • -
    • -(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
    • -
    • -(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
    • -

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

    -
    -
    -

    5. Submission of Contributions

    -

    Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

    -
    -
    -

    6. Trademarks

    -

    This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

    -
    -
    -

    7. Disclaimer of Warranty

    -

    Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

    -
    -
    -

    8. Limitation of Liability

    -

    In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

    -
    -
    -

    9. Accepting Warranty or Additional Liability

    -

    While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

    -

    END OF TERMS AND CONDITIONS

    -
    -
    -
    -

    APPENDIX: How to apply the Apache License to your work

    -

    To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets [] replaced with your own identifying information. (Don’t include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page” as the copyright notice for easier identification within third-party archives.

    -
    Copyright 2021 F. Hoffmann-La Roche AG and GlaxoSmithKline LLC
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -  http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -
    -
    - -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/apple-touch-icon-120x120.png b/pre-release/apple-touch-icon-120x120.png deleted file mode 100644 index 3fa2c4b622a99ef2710d4d9ed1ccc09dbfcbaf81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8580 zcma)iXEa=I^zJBO^xjL1-ic@#B@EGf7ewz}MsK5cqKoLF3lhC%gy;;>jT#A~ljwr~ z{O(=%!~JmAy6dcS-gU~}`#sOuXP@&v&zqp5rA&lRj}HIw|=LGQEJs_1C~070Ap04y2+xJ4g=p#T71VE|y?3IG7-0RS{! z1zoz*=o2_L>dK0M$N!d+-l|OW5nQOM<}2JC9DH&-zEqUYA=)26RZ-p`VCASV@SXX5 z_D=YfK&P=$POTop3QbG-6ICDx8~8cuS=(O!@ueDa=qN8QVJ|P?eNp`Tg!g;iSJPX0 zsN;U|C8B`#XAUNVtkfVmg0g5i7QEv`=Be?P2u`#*HtsF_w|RfjhB#pCll zx9saV3A-wIi|D*6;Jc=fx3y)18HVjOn0NYgd=Oc@jGMg?eD@R}WPeo4IHaS>c zQmZoSW9KG_MO483BZL4%#b>P!n`v-uSUZL%KbZ_Cu%W40KcW$H1KYt+wpb5;R+I|1 z8wiOPOlyD*z@y+ouZt|-(qS!Zb&0vUtf{;8i_jG zcF;_NEIms6C-2oN=JsZ*h=#qp)StsuH?QE@5%(}gcf~aNNWQr)!c%w2dTQCDb_V+T6iiG^Wr?9V@L)Iswt-m;N9iKVBhg5TIf?x< zc4}ojeQB%)ie@2C7_k$nAy0_5HZ^K2n)J2E)~d4S%_i?OpE^A;jUaz*u@Psq!Bigc zi%iq&y$OR!3g@K}%bUOyy+kWv?t_B^!_d%PGD4iY3ytqKx~(lOBRM(Ly8P5Bye{2L zG8o+?OHU-(-lND=y_W0Av`hmro8DY=+Hc@=_+C(x7Zbwo#tAVdOYax zM2o(4%e&j~#_5K6kWzIhvo5yr(()OcCc+adw;Ay`&<`2&9Rm+LiBvz;c))l>Fbo-Sd%U>Z_G!#72mOf7 zkBxC~Vj%KuEiKbOey}nQ*DUx8z_;OP5i-dz`%!DQ4%Qw?rfd3BA}bujZ%GM?5OhDw zW>BzYbU%4siGRqhF-U}h1*XU@rSYY)|1n<2TN4Ho2YMPVEqgmT_u`t!x1W}gLcZHP z6ASwn;Nt3vJ2`bprKdK(uuz$wpO1zN!ec0Kc*FTR|0(WkYt+%-cYd$Gi>zm(PJjAB zEr;|Ib=dhC=rdf*EefrXm+`D^QjEj8pQ^OScXqP4fBnI6bj{;Gl?ET)@GA81zhEyk z{+!%S%k-v)B5(R0JRmyX5vn{NfM9`+8^%^QGJQ!!kr=2m#Auq?kLk4t=7XdcKP@yC zW2Ti16rG4Dj%P%vdBuSHfY$^q+ETfRr>rniNDKr-m!kCQaL$?S@{qXR9AmrEH(pE~ zM2T7>A)&(On49Vi(EbW}=CmF5;DWC|G!6xS`m$VKnzg_FmHZlTP18bh|BSF$VnT#BxZ5BpUNz}h|gNDtckNnw- z7n_CC4Aq%DbCt&48$oHSKTRnY8|6}yuoA6U;_ZE>sJt1KeWB2i%S*p4Nv+nIWen*Q z&LA%Ex=e{832i^s*7rboJ4~qD@GT8(>`YCnJ5u(bR0^pAiB#}a`It@-+1MfPyy8Vq3 z!>c<&tEJ`*Y-5!p#q*UzOUxvcgChnNx>oU1vylR6e=-ug(?o{SVyX!atw$|=@VEKE z`7`Gto{E6Q>UlNyi)slHmg1lon;Mnl{A|f2$0&DS@`G)2Y%J~y1Hs%(G>jp#;evNP zBrvi@Q=3zW1dK)jyUHTIu`Tpp$u@*WqgYOd7fF03qu^Nj^*R!@s|Ycx37kSi;S zpH1o=iV2+j_m$xeEXb!B!E1a}_5Iw6_M<6(1H^v ztMWe=Z6w^U>rRXd%CCAo5oNz!C9{|=P?BjUavVnf+SMranyeVX`;Ds6+x_=i8+f@T znd;{0Y1|juP&TcFrCox>k%EG&Hga?sV;e`)IF>3TSz=WhzS(ZPy!I0(1)jU?-@V87 zZ!?Ew(c-@R7Um#jq)fa$#7F9y3z0lu-e`;s!DzjA?{R!nPKx(#BY^I>fX9kx$EgK02ey2qM+L+-;HTE_ zw>mBGy9_}+>z5_OxM6kJ4m-?UhpP>ewOhoPNHXv@J6?Io%sr5_f<06-&At*keh)F= z_R{h-C+g)`QeOU);qLDKU#-(eGJ_emxlnG&4ygB{#knwi8#cJ1Q@f+WjW3N!&ivjb zIwKw9S{JeJv_aS{ZMN>t>`ixooo~zWW(xyZXS;0(wf+Roxynyj>oSUAdyM$Tg39yr zC`8bdz_fp4Xh#E|6c}t^W`^ustz`rgY|C1?-dqGG9OLzSZ@w(IC~p3OO*nvRY0j~~ zkRqSqij*p@JTzjGin(9)JKWZ!JrH_j9!xjqhtx&p$oF1@j~66Hv}>!pj$EX}h0o=f zj1|K1E_Hdc?aa(R?4wYm4F^Weh)Jj1eb0!?2XbkOUivQ|T`d!}+K1bYWNWrvP&EGm zmYQ^S9EVPIE7ch9al`m*0t}s$yL4^$iV|s`#ri=DNecct#NaJ0ccgr`;Z4Y!%30^J z4}k8g6Dibu2iq=NhxVt>?#QI?Hd$8;X+87IHE_}N@m<{lDJsw5H;2ka10lW=fQq!2 z9R4@tYIQUqTkB|pdrtonP&8?}${=A3gg0|^1Pa#tY;w5u@h4%BW)mr7Xxlro->Na( zZ3IN6$kxHIxG7MmyvY>~_qO=5(TQd1SEDGzsXKr%Agn0OEFm!dN2^Ghry{HOuUgPu z6a=XBajuBKe$;?sKmBdh7Pb1wneXQ4mWOGh6>X?~4x3$|1F*#4`-Yc<1M0L&;k1}r zkW_leJ7V)$Dgkzyw>e8d@-}9_Eh7z(dAmdIly>+@Y2+uZV#lu++FQQt#4Uz__%`I?H|9xY8ZT zNuF@Nw15w4a_??FO5HyHd=xtTjw~ccO)3QQW?VCVK8Z}C{(fQt8-yJpSE7G$u`;9@ z)9gW40Vy>$vz8|r^O9WM#oP4CFOcUl0hZ2ti$dVCg z5F4i1-E1)cN?zS4-lf;Ba)IMpo&LJ`pf19(2M@a%7a!;>4pEd^le?*6nJy%PMQId6 zp=dc-FnWqsm@w-Aq?W36-e9n(CSO`D#lm>V`n%GZ96!$c`3p5Ivc^As4Fnv<8`{7T znsZNIby|uWa_$O=4u-Pk@>Uljlsp}wUm=^MU=||~r`EInN}4<8r38_e%spY-lYTf| zrmd-D45n5v4nh=4zQ&?*0i&qT`u4^B+pD-~whx~*C>UvO9>_YJFn=OEA|_t4Q=cG7XqmFH^@*b0?i_EZU3bOQT2$aEPLj@HwH!fj}uRr2>{$@2`kG|MvHjswwsWa%#ap0mMUb!_WMW z6sCHB5R7_vPmln`nXy0l%9jr)1?@di9hO_-&B-oF^DcPA|Lv0UwCuYbI&j<^MLQ|ewlVyxc)7A)~`)5@3w zC>=CnYbbQDWU+^}Y~0MFLN|qXNWv2+@V4sTgbYO|vqy$5f@ld@qvdYs#L?g2hr25f zwfz0$%WogR)ly_lb#cLvx2D`AsYGq7Wjw^ex}vRn#fTQI6Jx; zDpkSpwn-M85V{FWx7DPz>|pjiBb+-pk=qw#l#Kw-M0+o4HeIoVK*_xkg=elw2}F<`!9vCX^rc zow;*#wEGB!4(I$j#AA6;CuL(%furWt39O7XzO&%#i`kK{H_B_c2RUri6VV2Itd_7N z&(ce#AAVAdn2Q6{n0$<3{|v&1 zMXlF-+|?eg%fuNDjNpUp(UB{D>wz*h%ONAbNSCGg^GrRme&`*#(u^yj^F2?B$-9=W z)t=^`3x&&;TYU7zN7rq7_spbMl551z1%K$RPjWzIP8bm@ShYcSPjsR2J@*(18OoZ{ zVPQT*3U!?uFXMvjp7*rj3euOA? zemQ&%RhQ7M4M8+C#*kw3*Uhrw<6=hZJ8LRR|d&Nx~S+ zo^Z;G&BrJb+5Mk9=&zD6CF^R@!1_INnaRFbe{YVJ0uR}$KdtKlbH^6GNjD+uu4>06 z`~GK|(pJs7hQ@V#eNH)bdQJ|qGoJ-ZI7Gt@rbxs}9g&h-9(K#U|CBj)S>I~L4PB%z z8DUN)#>fOC%JNo$yrmMuUeepX%+_B#18~=B1x^=XHtV_A`D!fX&EoKKE*S#Ha$=?^ zCQny}zB7@46Ci(KT;5A{lEZ8Q-S991>AqJ;Cq&eE?tXtQbO)O#K}(fFOm}WDDB!34 z9P;Eq{)@F({p;jBVdCQl%>6AcoyW6B7@yeQ+baK~?gFE2={x%5I@j&@vJBsMlLMoabBexZAz6%b>1h|9 zi;ASpRq~pOcSBsV^W?HM@~#a&AO1TNEkF*LD5`Z_F2No7tiK{dxDs!w-`{w+8&n+{ z2Zh}3iTfA}aJ4(-xQ#+L1B)7cgR?A_BqF)AIcbR*TH37L*HZ3>!s?$iL%&_j;jN^G zWk5n7Jxc{s&$J(F>RN~}r1#RtX+|8I!P7#~sgc=^H?%n4gqsACVD80l`)yT9DH$Ir zJNKvxLgPjRKB#-Ii5OTgRvBb`5)eS6deZE~gZ34CHy^;aWBan5;x3LPm!e^jW&h{t zeK(8K!B@~e%X~ql6~t)YcUiE|*txkvQB`%+*PAI0#`jrWunhFG1L$!Ut2S5>ldiEH|~*x39_iO~(4=b_{kp6jvQCrwlJo~vmczP&{yOA3k}t_=G( zg_7M@>7Cmy1@AM1&8>$rGk$Ds(|$!JcZOj6>=IkaA$g)kyq^*Z1~I7~FZgy4IG~oH zzu8;TX!GRaioJRdZ4%#B{ybh%-%Ov(L#{(s!-#CA=AQdGm!yv$j7cKg%V}Fi*E*Ea z{=G>KD5dndWyf!~ME}ea*RS0PH(1v3T`J;?wx}e4p^O*T)M~@p8D_zF-{+H9=xa}f zZ_^@DUa3Es5ndk}=jJa=y7+gn^!SfqLY;=yqYHCr@#;|`L{f17C~8F0jHk`_-B%yF zsXu|$UQLVR5nWswzcO9~!NiY;*L#>;@66&qEVAXisppEtim9ZYdye#456J!3<4oE2 zH_%RjspNLy@~_MSY@KMT`skNrLAM9|{uKN2IkM^TK|c9FP`TcW__NB!i4e#B07Z3G zn;tl%;9uem<>H$-wZWVh+LA$@Rd zv+MLyzK6@QaxR@CcoM&$g63d!mt_%`?jIAAo;-Z0I|Oe%^1Vr8Ps06QuFpGK3afr% z*HmVRxJ$zQ-%6_j-Q3A_pzuZCfM!AZx%7>i1Wpd`J|BwpIIbq~6L{a1d~%&JsNqcw zn{}~onr+oP?VjYfr@&72U48Rlyf5OFu2F>Yq3=qOnH*GeLtdV})yQ zx~Sq)TuTJQF8vcZWClWRsql-GA7aP7sHf;N(l-*maAweGmy3pyA4|nG6>lW8z7-mp zG-fpt_>pwC=H10~@l9*h*e|nKHsYUz=fH=#64wGk>#f|;_z5duYzl;j>c`W`o%|i_M>l2t#$0YS4+(E{IC6eJd>r=f;;UO4* zTP0dY-@nvX{)7K&uE9V3!<$kod>?=F7%9)LH_Ao|qTGDK(nyDF%z^3Vg=Kv&|GudE zYjqQ;E7k^+)Sz9g0{@pRUjwLP5T6w07e#2FPso-Y@^mb|iEW26?~JD`T|LU@YMG1B zw7Qdg*Ouk*|E{OTM+0G(gsxQL$4WHI^8#_t#OuGAi5TOm9*4gBSMhf={5~fvmzq)Z zI=>nearfQz%t+{4*dMBi;HT{VN4)qOeOQg9M(T&cBx76JA9Yb$Dhpfd&?m>|s=pd7 zQlxrAs;^Yo+SQTciii&2)lh54EN8|>2mSIpZes+)F-|IWWazbGj=v$kSR#J*jl0<7 zpOr_TRas0mBW)>E9=wjtt|As5` zVnzVcRX#SejCmRM?h$;<5-CQgBmUz2HYpTz+~cWGL=V&7BX;fG-9MS>>)W26+s$mr zT|w+i^xwqQ?Q43LWM!Z^RR<9|H2b2usFCI3$XFCpL|UNy)TpQ9&rXHjsGEmJ&a#^k zCpjJ+aoi*V%n$&Ss%+j=MLQAZ#s5^JSM$qWgf8)WS!q@+r(D(aY5|Q5=vsfX5ltHV zV^Z*fe~dUZE0yZJ`)o3SX6MCjgZ5E!^1zvLv^_9p;g;lgSHpxuGrHd&igpd9+E4X2 z$u=YYJR*|*lACL}WTd2|1V=mqq!VQK?!f1x8$i%IJ^G`gBi7vU(E#aV^eFzV5W4x-+(cs$F)<(bVwxG^VE<&9|l(2G%c9~h-S0Yju#!XPlTVe3o;(N}s`J9iQ6F(+$es1og$ou46 z6?S0Uz>Zv<``21+^pKlArO4j#E)mp%81rTn${f|xQ|cKfs7j*e-FHR4dB5<(=BzKXN8T3g-AJq;qaG@EM@vQI+8cHE z+=qQ_TmzN2)S9PSn@Mp0X)276go`y^OZRan(G|YC)n2D-owAJ>ozmH<90cI_VU-zd z`xv&VTT=5S{4NS(uLi&D!?erqSDOrQ;|QKGE(|m~W`Yind zhAW^zhh@pJ-LYw=VyS(1i>_=_caK5p2qq_+;wRvLvJ6>%#D2oMX(sC;TOMYB{7LWzhwv{ambl)+x?Jc49CPEZ3#t=sVMT&5KNf{*u=Lx|q1I zaEvg55X>m$`ZUmNuzi`PXs3VqXpzZ(auAxF&lqLDxVXT^j7TrfMMUY6V1{W!V3ysh! ziJQ3DC!y!?w`gIGh?|(|vux}u2=AO9W(U#H%SLSQfbK)0jx@9Js9gqH7uhl&Kw(x; zqE#>6Y_*y7bwO#wfoz1&G-&N<>GqW~Z3vnI9ayoYQq)%HHrN0-%=+HbA=~KCnw^W2 z6Y0Q&|E^X>iWN|mCCU^inI0XnoZF!H@du^P(&cBM`%B4$yh zXKB;Tzhs5BiKvvM`=?*I55o>-6dSR?>XUbuo&QIt>p<=Klx1b0m5^+;3KR-e?chiN zcXhInD8EONRi)Nh8;~BBN1_toUm?na)VgGs25RV}{@>~uYx>BGqh`HCbHOUT8p=KB z>y8Fwp$Xohf^tb%T&hY6zD;N{Z)9jzf;j93wRC9#f0ez+T>-?2np<3~yS)uUtCQWU zV`cg zadr?X<$@bxb+wz)@XLfSA22_4?M_e1V$B~Og3d+Og=T64=O_+rC(w7yde}+ZD{+`) zU}p;*s6xr;Tw$GvK)#`4JX02irtb(hF}oK_=uHi6YUH3LMq}>X>trz>>tyo(!16|g zA~yuTh5>p{I*d&*%gJo>t)5bO%(wh88>X%B(Dpog#0c%D;E!v_q20%2>gE=4C}0L zqYdc(i=gl60QI-_u?NW8dD_^ssJdG_+Uwa{+XZ@$+W$9i!8pjk1gdB4&*J6d>EP^U z&jJnfvS)Gjg4&`dM-*)TAq09GadVGpk58!n)&pR%5eV86P_R*`XHsHOuqeVr2kfxe snhjXSm*z$WCk7b@amQgQC2E3zeHt?8ABb2sIs`!Vm6l=y#47TC0Ag-4o&W#< diff --git a/pre-release/apple-touch-icon-152x152.png b/pre-release/apple-touch-icon-152x152.png deleted file mode 100644 index be5629a469eaa0bde3f0eabc364c689985f88a02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11298 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 diff --git a/pre-release/apple-touch-icon-60x60.png b/pre-release/apple-touch-icon-60x60.png deleted file mode 100644 index 2aa90edc0dcad6e0d4c7ead7cddb93ce0079c6fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3705 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 diff --git a/pre-release/apple-touch-icon.png b/pre-release/apple-touch-icon.png deleted file mode 100644 index ad35366384366ec8dcc06e62db41b8d39a7d85f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14103 zcmb`uWl$W=7x25dLvVM31P#vOi<98)9^BpCJ-EBe1}C@$2?Td15FmJP=g#x5x*zU` zTlIc;i&|!PcBXf_kM!wtejTl>D1(7Yf(inGFyv$Rzj--JVGX8ujdJlgn7dCN;Y1%1A>w$XPm7LF^c zAu2IVPZIi*IDcZ-}l=Bb3N6Rs<_$J*f-{$q)TNDH+{FhANZYr-@1Bv znG{flph&^<%px#q&Mz$?_3HLDpPV0n2#x>zOrtdzDwd3%mIz|W!Z3!t09{DlD)qt` zBK9CY<5Zy~;uN7p-0gvm$PgwrjW*CWJv4;aux;aZ7yW z;0Uid)(&D1CY%<&rS4-&?%-g=ek4hzWp{vmrFr6_R5Tr$(-}EU33(gGn5OBjf!YIM` z21!QG!^uQX!-=Jj66mTvgS^PtQS)M6ck|x03zD`|Bi*(0n86;aV7vSpJw6(lk zsalmvP4j{+2y+4oK(K?$E-ZyUL87O-fi|G<0bvyP@fC?+Tx>{Dl97hS`<9lLA=8f~ zf@V^ZU_rr`;bCcAU0rqhl#h?pEugJJq_`>Ao78J}C?j?Usf*j?uRhOUN4O?XQ=6+K z{2cd7OblvOO-)H{?F5HH(^SWekP;XSevXJhTwPsFJ@9_PUV~GF353swOHi9#(khZX zWO3R1Vcx9xO8pHl>e@q5)9_v5NOwmE_yaR@n*Ew|uTeVOi1YK}qNcT#6;-nA9<79G zUu2(X$<2*7<5&`CiM7ZTnXC}D9m9Tb16BRT6$K@7FhD^8gNKLb0~zMs(%@|XHTLY^ z=B@d8It2xV(mCtU*R^uu<>=OjO@vjKH?MA-^^V(5ao%Aw!vB#HVot(f>Q+bN*o_^txVN-=0A4OxTQ~^R!Vddh{9;j^(v-ov+OS|E~;v1ltGH7 zgWN8SlgG@T)6)s8?d(dMnz)SoUqm|EHc`1jF2c!=9aL_LQ2k&`tv4d_`ue}8xyF5j zn2~VaMKsA#0@`^(+EK_=>OXDm>{5XiX!8_F#aAB1aKUk}+~BxP#3dO=gZZ#Y>P8F} z#2zdm#P#JRZ<-Jbod64qG9x{`nx8*^#@Q~6Eun7Rl>u7n2s8soXwZGb53$HHSQM@o zA)%1#IVO8q>eC@hmIAjorG)LDaIwlZSC_#BcXxMnb#jBNGu9ipGIhu)a1E01vH_J*$ zzTJ8ma4WP_BImt#O&te6I9!9iO+7W+uR-hUZ*6UDHMmL0J^t76G4t8~ zI=;WZ&z1v)s!hZF;A^jiru>jRYM60(p^`D2kf?AEAk9=1<;}IwQB_gdK>&MK+O-!+ zzmxv2tF5iPb3j+^dYTS79-+Zzc+u#@DHudlBM~|9LLrLB`Vh*w0@ysV#E}=fcAxpb zfVABWtnKY@LOFaW9#>&7OXk!Ikk~ke?R!41Bng1OlPt$!YB|FG^c7@~Vfdt=5I;XZ zU#ZNgbvXgECQ;5`cwd+6(>}6~$4$!N%EGQs zXU5si5nwv_u|J066e(CF!zL#cp+!aFm&hfdi%S{PO)~}JQ_@QDJgSLVn!n_Zb3+$L zw-CO}E!AR|aio2{ymaZUuXm6gTqwa8C+aRL3ckJd7{pci@RW21OL&iGfAxaRKSm_4 zMt&2Y1Ncy}$eO?~Osz;?K^YKNUUEBgz|BccC5cgm-5kjR@4E8fKmFc6If&Me*W7vK zoLy0M>RZ1Gq$6hvq#|e72M#l+OVXz|G^slf><8`3-&Ph(S6k=(9?Rkacl~LbJ(!O2 zG2|6$5q80Un$KyCcxa&KU$1*;xi>o(9kYdX1pYP`2V!y;uNSJWgNE#ynTFLKqS z)(u%4!z#i(e=;vMAqt?w`Dga8J*LHt$O3w*al1)NgnOinwH47}A&~k*`tde`@HB6< zUSbq&&54~iNv93@Jel=tHPhXiuHJjV+2Bgw&ETRKO5#3ol(@B2s7M{=t}M*WFuxNH zRy;m&#iuDt4I4BOC5TN{Xx56b#v%BYkoRM=1NV6EpfbEkC2{;or>{n2pS(kgG=){|t}sn!0eK|4;CuK4rZ$x%PXAQf4(F%e>OtJ&!r@^P9$ zraj8MeU0+nMoh=Qh~FvHJ&Aq+*ej0|ji>&c7Ajvop|njd6ai9Xa~#N#gB^yAP6kWo zhlfdk33Fz}Wy$awG3Xk-;dsTX;7L=eKn~ssBp6B`TOK;OD+C^7m;aS1Q31M)5S+|> z_G8qZzpU?0#fZnWyNS|v4Q9d%-Tkf3Y3+l$eVWJ@772K3yWmr#q>QaW>vJmiV;9vN zt?fkUB33=-2LmZ9{|;IDlw?55db_(foDBF17`jo&rQhEB2sFXRu{6k(;=4wXK_Y8< zvHXx&c^>uYsiw#NdFijT+FuiVJZ#uWg&q09?~ZAE%vOt~XgrY}9cA!QQf4H#WE;;eFQU$GW<@*_9RRy^o{@)3du+ zhujNhhv>c7)VJSo!7>a=Qbl9@lj*cZv*E)S$|wB?tyj2w9H%VRXgN--<*q z#fi{`owe>uy{pG87yVUS@CUb%HG!%HZJ31C;aLaq2Oy|s`rF6b z8o`gf*8R&}I27w~*&@UfCh64qiMhg9?DivD0YRVb5ym=lZDTz|7;JT4>E zUpk##`s)U!G_9DijexhVHsX@xEG-N>!!){!>bq)Y8IP4N!HJhnv(WMW zyVv7XhrvKYWW;A`FB;Wy>i>CsmUkj}0cI_JTF*3;AkP>WSvF~AkeY<|15Rvx` zF6yk4eDJY}-z~zTZD+&g8@$;g-F%5>p(cA+QR4%S++N?vXu;;Nplkm8<@eGv{ZK(O zPSY$PP@#rqkVQoSy4u^)vY~oQ<|F6BVtXFQ_yhY-$nx_*B zxID7hAIRa5FGU$Bj8=n82xEBrJ1N@GlOeD#c8d$lQPHo;?_5;+R5|RYR1A|;><%NM z7ay~#cI7s^F)e3U=tw5@7_juZ_W(QjdvbCO1P6eJcorPY^UVYYN*`ZMkEkYawNB%NUaJffqUgWo}<+If9fiqIM@0;zzkV?)YtMJ+|do zBJRj#{v~HS9ltU==J}=td3GN0oLtgyC3tOJ-sTrXwGBFu!(Gp;FHC>*CuR+2%$zg$ zmt}kX+E%9Q^jy!T*qX7dFcstv`r{Y4!0^_c@);RjONVxF5@Go4n7_#=sUp)T zzfO)L!#;y0$G+my>rIUJ%bMR9x62{XvKNC`_-|R4(y!p)<$$-|Rz*2lg@ApM=qpmzY|KOi^N^!+Kz(z~xsHgRwB4Cehy<@U!MFoX&MQxdaf`cO&o_C=V}~DetaIt><~Mj~ z{Rb%HmUg&xwloly$4HmVZf>5nwzMFmc=+yy#qTc%32-eVOobapFh!VniR)I_uPqv* z^6V$w7`>phjFzmWWTNm+_9SO210r(kwN~udA6>v=i#<<~ z&`u{B;vh$zZXw4{Mv*SQRT%-ALEfxJxaU)le(5yY@nJg+e6cT;#uBXOqw$Qi&i+6U zn{|46Y6#9FK)t4CKW*StAH~u9@H45J({DuTr`b|yGtoQLjXV6rV~%WUgSS+UAz=9y zRt&5H-{axShp`n^D$}^3NQL7RePaBOifjN;0aj)>F{tk$8OrMaXO~LJSuwqzxr;G{ z<`mPqd62(@6unEgaQFAbeI3WM|4(- zY^I}uCH92#2T?@uaR+ezzY;1jE2{~L^;U8(cX!V_e=dkdFnu`{pUHB)g^l;_Evk(vHI6r?VoJCi6%q_ z!X9EL4chExG1K3{0wnP`(UOn$-_8yY2C<6NZSn(HM0J0>U z%n%+dfQMQnnS{0_MuX6RYy)9MH`PnucF$R3#@CNv4DU1*QKW}MSTChwG!xr{uqUs* z1Y<=BulgRVC>*W_|H8*e|4ggYjeJwk7xQodrI1-rH=MhJe*{|zOXB$ApgYPaQnI+ZIJ64)9_=Z z8ziXFvFWlPsgQ7q?sL83>8E@zkVmyQ$FTlEmYx6ZznS5>Da^1e6tH9k+&o>EppzWJI?Wr+(u)nfs8^ zn;T>u#?FFreDT=?!!@wE(WW)k{rXiOx5`e<@hGf zIxX*798iYX97o?9@eOPaIz6K|zb_PuSogzSZzR*uD#N-&5bz^Q$d7Pd;IM$TnKG$$ zCH&}^9pbws-K8{Dq?jx9Vf^B_nnP45*m(zsvmViN&ZU$kqU8!MZqA4%`9Bvk8k6Hr z4Ep1(UBUkDahret;S=N1U`^eSj!^8x@0D$zFf8(suKBn)Xn%(VLUQ$o&x3%G(%YkQekmad2;W}*XokyTnD&r2%L^_gXVb1-bmVCYJyOK$f(=OC9(|N=FhBy}SLqBx@-zNYcP~w5vw+cGRhy!*#EQs#p-& z>x=jXf%D2Y^nCc$eF5!_^ts^Wz}Q=t+7o@oY+a(QYCeMzro@l!Yhd+J*3qeN)AIEd zy_~S zl-+CR`kJYAE3>_8;5|3}M94>nuZc-&@w*K;tQ zuMmtgYTKD)5ZNfXe;LTmBcVffGx((J30>;!%zu-{ZThZYbk!|!v1ll!oVbzjPxM*) zZaX@a{%xe-4}r4L>o_!7NwI(LABShhrd5;BrhDAXGGa2v8Li&Mz9Q1nT=&gCu69r8 z;6^(-$_i0|(U6cE`kxM>I+S9^vq2FbL`PNfXoj=*|4N=N7#2Zs0?dCqW2Nnz*M)~p()%?4(Xv@idG8nMGD+jbDLAkGVk#2U184~ zD{^EK-!0YKE0fi!*e!+lMvKUSaWl)kV?dB@H*$|d-}#}W$9xGJkGL<=yn0`*^~Jq# zr5F6ohHp_ls;SCzqKFhvi%r!mxqQ*tMwHKQkviJ(T`e#^zH?lGXiTp)!t1%w2){qY zAMf_II=ZW+t^WIyPc#)hVtKt`Ha2s*YrJw$!zd$yK^>u-`SL%EBR{&P#jXe5pOkAt z5(+h0Ar9FgWJ1+{en_-g>$p9$xLlIi9Kmb1fF=#XLPxHdUpM0~E(nA-GnLUs6lobm zBK>8QZ3!$!NLIi#HINsrM6+7MQqMox%5dj_wIi_q7;RRB=7mX(PffLZ;prEF_3P4I zz#g5;GkSF^&doA;rQqVxBl5~0WzgpmWjS$|Jl*Rka8Jp2iyTEbj~<0P-NTcKq80cD zs}Ci=P>Smzt#^>Q&*7QN2y?gE{Jj}t+7o?MjLmeD?)|H;^{LJL@v@FdId;F07aCIQ z2?b?=v40j%uO>Vnh|+Y52CeWF?<>mu%B@bk@!Px3(4AFJr3M0e5s|Xvk}?C)cVl=* z1MltnVx*xLH<6*s5{ids0WOAoslKw@wMM;8WhF_z-}at2)u3DRG0*>4z09y&05@bu z3;Xl<$0z*j;Vgf9MX1YbiFzv$>RjUmEHm4kVN>rK!xXl!Gg1+d+MrXbw1WR?U4PNd zg4<$4-PKIa#zTuFvM7ArU-HP>WKzYZXNluXmU>JRsWdRdl>w!N#XW8gz!ciuX8vim zarAD(+3(J9{?l4=Y{vEp0`lox=)uh=mA6OVN+w*YF<}nvoF!eUgnQyv$gn!G!Dzx{3th<;ohz-hY0J?`05}AHjvjj z*Xea>>f0I=kM0J0Qd*qhmipW2_;e4`K(Cy`RyYoKnj=Ba{@*K);=ZqW%n2G-U#PCW z^!-32$BviUZenjfGvL;v#6$fHZumTZ*Bh=Y#84qtjO5|IP}#VQ-|eQ9-%$NQ=H&$Y z<;(rO+Wj*PnP_M(f2@x!`$Q*7z8?r5g;u`*o&>Np)D#B&bQ78mp_CD$9k=ULJ}&jg zj_oi_F@79+f?w=)SJf%xT3Y+rKRQ$u{V)rRriFp~He7EXQjO$j|9+;vDWE#dtNhWV zA{vP2zDu{akQa4+T+%&oO#(~AXlG%(%KH`fS|uWQV_y3H(0W5}s}(ihPi$*x?WxmT zZmC-%tz?n?$JQJ6(e6~zr(dh0M&Ci@pQlGYQzTZ`2SG_&61zP<{^YzdzCZO}g)8uo zc;n4R1{5M!084?j($`UZL4%r-EVB0jA@>nh;4OaB{CZeURwzQgyr=`x%L;n<&Ac1{ zqK}vPQLN>?v~l%?Y-Hwv6@lKPAGt1-#_#CU2a*Kb%|^tUMxX8PX!7FV(C1qXE1Pg_ zcyC`(?q;fgjKe<>bVKOA3gFMwLFks7RO;L7VeiXPy#28N8)H8gYk7aobbbF{mlJ(-wsOUICV6P3&RmjIQxbcxba%VL(=Zo3?NdS@<<@NdaPI@m^N%ox zDepG$m7kY4(&e$%yD5o{R>Vct2ri?eey>qTe9a=(@K=G#tdy3ahhH@va4|A1Xg7-@ z-L_}FFBuu#FBD#;IRyLRpE3oH8f;7}NvoOgP?scP89P~vAkfp{>k(VGy=Y;%3}W$BF$vKDU(-U)OfL{k#2r@V+FQlY2sF)}7Es^)Jp;P%VJ-lfK} z4p{m{>+be*j?d(Yx*|~K1+~Zp-@@jf5gQ7$BO>a?U)p#z1@cW><3zx}M=;z+SASGy zv<~){0JD(w*UyzwAAV;GK~Kb3v(V-kioSf7PTxSU=$$rd@w!b5o&U*sx~kt^3cc~1 zf-FZ&rlxC=W(*vKXBEow0?MIFS@VuzfLULCxmHZs*Ia%Gz8zaz{Ycp*^|3)-rLf<02T%}x=6$)N z;i@phjqn?#K*;IqJBk(9*n>kV>A-ivvhcf4TM!bxoeA$#AC|n>jyKJAYEolloyuP| z$|($ewN*aGY4$`dF2Re(xHd(NpZNyzY+-^uZ*4P-FD2*Ocp;Xkh8tBI;k835;||io z&IJj0i<$;HB6IVbHOJ!a-Wi|zu1Pt1Tr*x1bkwk^a2uQ*^rBfZgL|zAKmqf^e!mS* zsyX9mE1FYU-Pr65qgUTPs=hU_-PKk-b|iBg_2{{6cvIMEBc}b)(tK+4zUX~M6IQ(6 z;}YJC8sSKv2=?VW%BP?L=59~s>IQ`Li3OO<_2b%HthZyMqRrLFT>cs;E@sjG)cmc* z1yxr0?bC5}b6enJS2~0TpXfNfkK7jef!6BpNOH>P)!Id3K8^d8+t;nm*m;Zv2w3A= zJRg!<^5dh=G**8v%&X@$;;w;3eQovS(QrIh{A4QUU0_(ZJK;W`LS_883YOjMt&)<@ z;Pwr!&yN7frY(5nSIB$qL9(?v>kNiX735MDm6eV zVz7e&ccvcY5Ro@-bE+co_zAWr61lxchBJ>o?elK|OytaTDSm>5BHJvWDde`;%Ddb%K) zd=fM|rP*O`a9ivfVhvHcvAdnsjtJ4_1JYO<7Z15xOIsM>3^D3pDbB1R=iG4%^huN+ zRrrs1S>NJqvzL1!Pf3Y%+J1jvOjFQ5LP|%`Z1${CNj6FdxAT1GzYuRY8|8!Z;Q|hP_BU-PUF_JMO$k?UtEYNc?q`Q8;9^Gb2aeM6h?e(5u_zX)0 z%Tc_}sJO&&WmR+G4_FKbQ(Oqkn^S)KN#w6vwmIht4;H&o?5wMS-_+ohklh+Z>+?Rf zj4$kpE0MPe>E;7euC6_6kKESD^7E`2M&RMTHm1GtduEj9mATQ+#EETRs23LvwBPQ1 z<7#^}(Y_pM?L}As-taoe_VS*Zb&*E`K3mrrC(kWiN=_iFo|p}e+T6+Rom>-osInUA z7nbUq2W?u<;h6{aDaS!UzpvNvxN9nc(OI6a!4%FOGPfS_ zpcE+G;#NqpQhcR$N&GpHTQbSjsDJV9VrwN57bC^*gm>1K;5QJKNpd4azzk-KR7(QM zrQFV?UDo{gyW1!2H7w)BKv*ohkY6?R)(+ds5Kc_87j$oH!Pov0bNYp3{Z7>AFjP(< zEl@JY+r_Kfdm?(1hpFdw%;2?m&R3t;Y##N4Po=IyTj9Oej*=8diJ3okcF@wo@p+R*!DK= zoCkQvBKcBun%+S>x;PBgf|9}kNxYs^W%^>8^|q4kIw}^n)-DpP$Mfk^SS4`KWkpEH zB#ZWjdj3ZL8_p&7dZ^dlR8G^HcA6I1t53^k_Ws!X9_`E5ED@CR?T;r~n}g456)MN+ z1ED$1MQ{ej7nuzM!`jgZ4Z*RnqjN%`R9+)4Ih+iTNj4d;By1wr$o<;$!j` z06a>(@s)^YACy_3H&RwLZK)V-9c9Ui8rmV^~#^e&Y)F^CI*1 zM%o-H_?jgUzSrxAZrL9o{O+c&uCj~|>!q)u zOaUmlI*xQ-U{qFu9xZYgHB1LwBb;w{51(U*Q45s4yoj)}b6>jPpJQZRq)r z=QT^^hb_=|NaF??RM|0q%?Fc1j35=~KIh7gkUxDq(30-!hJN^3chu3bk`{pa74aa*} z4Sasj`X72iNXOk0+K%TVLif>=MeVlaHmev*XGTvw`3p@q!q2Bjqw2$Q0e5ViHTyeS zsTglLHXx$But|tT1z5nd_B)w$;2mhVzht#@v$6W14C7MV46U(*Vxv)!YooTF)&r=7-5lAUail%(ac z?M5$WZ>ac~ZqdHt7Cv(wbQh+gU?rBAoiZmmGE{x@fYZb|A~1FLe~%>HI|jh<>DX4fhP#VatR0Tv1{H7|=G&BLiRMHk67S%1&b8e|{&xH5*wjv$=f7L>8JLn@KO)N+yJu~$ ziG}e@YBvzV>b_nt{M$Zp<~jM0j~V+Sl1|QfKE~=knp^1swI%yu-)QR#|3Bn08F%9$ zC>xUWn=SXb4^!-py?%`78~wyaWP{OG=s&(*v5i)ep0r=_n6O;^%{6=;yMSXEQ7t{| zm0EK$Yd0JwD+;cMiJsT|Ez(Zxxbn-(@dSVa)Q(3Z9p*&rKZM#rM*{r`9X===En561 zR;*bq1nCOpo?)M=s_F4`z**R?J!zkl5BR;&zI<~uL`Y7$T`}?_yi?_>TDX$i=pk|Z zc|U%98$aVioD+tbl(%xCR3N#}fc3jhH>ex18ur&HAA7#iS+6Z_3pm;uCrd@~iG~s+ zBqMfnIIdmioD>rE zkV@aBZ^eoFe%MTq2+Q|@X>0vD)a#WwF`xsEwyH(HM-4aL=66JVy_WNeRKj^&_%yn5 zMHg_-I!l_qo$({4+At<$8YUH4J$0wvD5RyE!t#=z^V30)1-?QkMzx_|Ue7UWL8Mk7 zUUUSI1PL;tSmKI{L6&OcaaqcSm7etLZFr?%MTVE03db89Wpmf^yHO1bD<9elQ0c-~ z&kbYS>5%%rSj+%8Kez~+rFm1aqPA^Dq9Q4}C--z%bJ-;#{go&aP{ zaID&#vx4-AUrr&YO)MkmWUlYFVE4MZ!LQJRbT}XK6mzawJ&_EE zL#dmQauIsqzuak)Z178SW^n`0ogquN{`03ie!R58VEZDElMG>qp#V-akkkdByKB!_ zadwC7FB$0ngd9s9Eh@JK6L#O@pvcjul%GF+p};!Nuu8yaS4EVtf-yw;+LzLIDwb%w z`l0L{b`!vm$(E@G=;&mrsi>Gl4DJ-qEEOqN#*S)=2=;i?P_DIhnn&&O|Dclq^2$(v zl{r2+Y1UujNtHG_;D$Q~O@Rc7hOVz+TExB`xcK|~3x30|L^_ke_2rq~UDS|g`qNRr zvbsugXj{?MwcgCaTu|XYPn|^g9sHnsHpmgj#z2>`Y}Vk=c(eOHMUFjLmT|-xLNiO5 zJlFSRMdOIjgJ@3W>xV>?8ZjA=4DhOfX{H=ptlS-DA2~n z+1QcYbn9$0=?M5s8iH7C)NoX3aM`@Z zGN#O4hr);=@xtN@=T)Q*02&COH^AT<7D6S8rYjpBU~yJj6@Xe9PBgkU0~Udqq*3ho zQ-CG|Y5lQo$Du#35$QLydxmX;LWKIfQ5e)ku)vT5Oume5u}m-}Ol&YkMv|61(};5| zz!d@&d^cuh=I+MEM(nl+fQV}+>|Sw_h}ZWgA5EGmgh~x5m8m+=Br9iq9xe~8VTB_D zK;BpM+{giJ0kQth95T}aq*v_agvG@~7`~ar9tSI{3!LaMJr$KA(}qle^+#Pv4)l`P z(IRE5(LJdi`o0O|v3H^=V_rZ#|EprfRl|T46BC+^lyZ+nE1(X=-;U(Fv(K-c(-Y{F`Cg= zK&dxwike1x0P^$oGktgMFUv4UQOMJhxans{0A!33i*RGOeV453w{_RJbL8jlg0%YJ zL$Hx-5Hc_xo6o_*nn5eU1~XNJl$Zz-1rgk8CWsmF@$n&1H=F#p`lG%_*@B)LbrX1qh$ zUh7l$Nu~};mM@F@OuuVsF9M)l25LmYT843md48;SAK^{hww%e>Z3qACGN4@`T*z$m z9r87BA{f=;K^TcW7GK0T@#JWX1P;%?o& zsDJq5?&e06u)BP%w1>Bv{elnH7q$ZspSb(OikzMRf|t}lz9+7V3Qoi!53&&(8=E84 z62M`PH`giBXVdhHLO-~0&~R*rXH$4b*83t0LPw(+;Ex2b4Lfrcxo-Ga#c$-`#g zavZso7v==CN~_A}46~r?&Q0Y+GsJ4YWZm&K`E$>g2;ZlwhS`xa6ATszhL%=!-Kx)? zJAM7>dR?0wFuERsnIs(BYNThf_eU!64m^u+h<0;xBTnon#vt_aPFtMax*8Nx=$G8y z*cGitpM}3WY?3)#*)z2ha_&8Qs{m(|*Sr0Gi0cWT5L|afbuo1)SsaVbS?Ai$aYPFK zWCJ3ttD>BGohXJ{3$3Q7RR5H>v9*nsE-86`V7*LD130Yz0Ohilw9oV%=JX6iqam)tlrr*$^gy|CLlsljrI66m&%omBJq=f0XaTCzIHm# z{+U0O)BhM_tN-ESl|qnR^26pyqhfa#+&FR?B%-GH>=I~2A=g7bJV9aEmA zbeI54835rm>?R}6pWHk=*GmvT5x0xhy;(XY3%n;0DReTpEW|WbU@#(+)003!i_P!U$T>Qsb1AxiG z=4O7Pq9W*N=JK}&cSCH*C`?Sue^1Xly|`%x0L?-^GfRch0Pa{?T^*C1P4fHSePtRo z4TL5+sl1#X*bFdg&iRtIAU=iXjmi2^@ng)uLio_3T>~ujr;~Tz@Psi=RIaHS+cb)H3KDwzoN;?r(QIM3Nn*&p=t zwK8j<_G=U~9WG=CsCl^~k}H~SA`^2~f)4W$HE7Yr41i7KIKl$RTScF|PgXo;#*I6` z{md^csAy`IN9Y;(=F0$cD>pay^x|TAqT*zsR10_zf}ma9OVNPfVz zJ2wd+RB6CxL`>|Dn{&?2&r1RkmppyS%daDXZBn+#nyrdacNe2}2NVpgzsG{pO%@JC z84LNajAe|#l;TAs%%{IGGgEY#d9jLkA~{9kopUV7a2I}@Jq^z{Tw1cC)H$fT8I{qsLk)U(mahfRtD18scutF+)(8l*@$ zqlZG4NElfQ2`rE@cI{c5n16}4>?DQ#ziZDT989j=51;>I=_s(R*0ovafz2N38X8r~ zjPnO~=A6WUa7!B+k|!r8{pP?%5)5nSWl?~1fz3GGRFTW>R$GrFR+NH^fSLZvsDUcX zbrmNFPjx~V4on8!i~aX1W_ny^!T~Aa6g`PyR$**Qvq8(j1%~@(x9R1m=-hR4QlDas zTPCMwzLrStivY+G#UU?-9ZW~tBy$`EW@J@;JwXs)A!+}cvU?;C^o2qvH7IcB3Z&uW z!ze&5Q3es|l%f(-*;T-X2K~$ZqLiHJCaHkvbYj{L)ERByIYY(TxEGLs-9GZyek1)< z(U@AI7+n*LI)M0#B@b=I6tj=)uFK^TODxORybTA$rz&5CedcnNm}Z+NcK{p;K`edQ z_&WreR zSjJ*u0cHx8mLX1rIPc<`uHyi416MRukq)fHq;KGqiYzQSic&Hqbr2ae*~u@?q%UmF zi0y-%Oe+z>?}aFTY0CKT4Q`F?!^Z%#(Oh81)_XT8Z8vihHw&%G$}z34Ki~A`B4-S_~GKhQ79FDe0ooak}espMJh-?UH fJV>@so(*(Fi0yU>;YkC20wgD;C|M6N4*7ooid>h! diff --git a/pre-release/articles/adbcva.html b/pre-release/articles/adbcva.html deleted file mode 100644 index bf06afd0..00000000 --- a/pre-release/articles/adbcva.html +++ /dev/null @@ -1,540 +0,0 @@ - - - - - - - - -Creating ADBCVA • admiralophtha - - - - - - - - - - - - - - - - - Skip to contents - - -
    - - - - - - - - - - - - - - -
    -
    - - - -
    -

    Introduction -

    -

    This article describes creating an ADBCVA ADaM with Best-Corrected -Visual Acuity (BCVA) data for ophthalmology endpoints. It is to be used -in conjunction with the article on creating -a BDS dataset from SDTM. As such, derivations and processes that are -not specific to ADBCVA are absent, and the user is invited to consult -the aforementioned article for guidance.

    -

    Note: All examples assume CDISC SDTM and/or ADaM -format as input unless otherwise specified.

    -
    -

    Dataset Contents -

    -

    As the name ADBCVA implies, admiralophtha suggests to -populate ADBCVA solely with BCVA records from the OE SDTM.

    -
    -
    -

    Required Packages -

    -

    The examples of this vignette require the following packages.

    - -
    -
    -
    -

    Programming Workflow -

    - -
    -

    Initial set up of ADBCVA -

    -

    As with all BDS ADaM datasets, one should start from the OE SDTM, -where only the BCVA records are of interest. For the purposes of the -next two sections, we shall be using the admiral OE and -ADSL test data. We will also require a lookup table for the mapping of -parameter codes.

    -

    Note: to simulate an ophthalmology study, we add a -randomly generated STUDYEYE variable to ADSL, but in -practice STUDYEYE will already have been derived using -derive_var_studyeye().

    -
    -data("admiral_oe")
    -data("admiral_adsl")
    -
    -# Add STUDYEYE to ADSL to simulate an ophtha dataset
    -adsl <- admiral_adsl %>%
    -  as.data.frame() %>%
    -  mutate(STUDYEYE = sample(c("LEFT", "RIGHT"), n(), replace = TRUE)) %>%
    -  convert_blanks_to_na()
    -
    -oe <- convert_blanks_to_na(admiral_oe) %>%
    -  ungroup()
    -
    -# ---- Lookup table ----
    -param_lookup <- tibble::tribble(
    -  ~OETESTCD, ~AFEYE, ~PARAMCD, ~PARAM, ~PARAMN,
    -  "VACSCORE", "Study Eye", "SBCVA", "Study Eye Visual Acuity Score (letters)", 1,
    -  "VACSCORE", "Fellow Eye", "FBCVA", "Fellow Eye Visual Acuity Score (letters)", 2,
    -)
    -

    Following this setup, the programmer can start constructing ADBCVA. -The first step is to subset OE to only BCVA parameters and merge with -ADSL. This is required for two reasons: firstly, STUDYEYE -is crucial in the mapping of AFEYE and -PARAMCD’s. Secondly, the treatment start date -(TRTSDT) is also a prerequisite for the derivation of -variables such as Analysis Day (ADY).

    -
    -adsl_vars <- exprs(TRTSDT, TRTEDT, TRT01A, TRT01P, STUDYEYE)
    -
    -adbcva <- oe %>%
    -  filter(
    -    OETESTCD %in% c("VACSCORE")
    -  ) %>%
    -  derive_vars_merged(
    -    dataset_add = adsl,
    -    new_vars = adsl_vars,
    -    by_vars = exprs(STUDYID, USUBJID)
    -  )
    -

    The next item of business is to derive AVAL, -AVALU, and DTYPE. In this example, due to the -small number of parameters their derivation is trivial. -AFEYE is also created in this step using the function -derive_var_afeye().

    -
    -adbcva <- adbcva %>%
    -  mutate(
    -    AVAL = OESTRESN,
    -    AVALU = "letters",
    -    DTYPE = NA_character_
    -  ) %>%
    -  derive_var_afeye(OELOC, OELAT)
    -

    Moving forwards, PARAM and PARAMCD can be -assigned using derive_vars_merged() from -admiral and the lookup table param_lookup -generated above.

    -
    -adbcva <- adbcva %>%
    -  derive_vars_merged(
    -    dataset_add = param_lookup,
    -    new_vars = exprs(PARAM, PARAMCD),
    -    by_vars = exprs(OETESTCD, AFEYE),
    -    filter_add = PARAMCD %in% c("SBCVA", "FBCVA")
    -  )
    -
    -
    -

    Deriving LogMAR Score Parameters -

    -

    Often ADBCVA datasets contain derived records for BCVA in LogMAR -units. This can easily be achieved as follows using -derive_param_computed(). The conversion of units is done -using convert_etdrs_to_logmar(). Two separate calls are -required due to the parameters being split by study and fellow eye. Once -these extra parameters are added, all the records that will be in the -end dataset are now present, so AVALC and day/date -variables such as ADY and ADT can be -derived.

    -
    -adbcva <- adbcva %>%
    -  derive_param_computed(
    -    by_vars = c(exprs(STUDYID, USUBJID, VISIT, VISITNUM, OEDY, OEDTC), adsl_vars),
    -    parameters = c("SBCVA"),
    -    analysis_value = convert_etdrs_to_logmar(AVAL.SBCVA),
    -    set_values_to = exprs(
    -      PARAMCD = "SBCVALOG",
    -      PARAM = "Study Eye Visual Acuity LogMAR Score",
    -      DTYPE = "DERIVED",
    -      AVALU = "LogMAR"
    -    )
    -  ) %>%
    -  derive_param_computed(
    -    by_vars = c(exprs(STUDYID, USUBJID, VISIT, OEDY, OEDTC), adsl_vars),
    -    parameters = c("FBCVA"),
    -    analysis_value = convert_etdrs_to_logmar(AVAL.FBCVA),
    -    set_values_to = exprs(
    -      PARAMCD = "FBCVALOG",
    -      PARAM = "Fellow Eye Visual Acuity LogMAR Score",
    -      DTYPE = "DERIVED",
    -      AVALU = "LogMAR"
    -    )
    -  ) %>%
    -  mutate(AVALC = as.character(AVAL)) %>%
    -  derive_vars_dt(
    -    new_vars_prefix = "A",
    -    dtc = OEDTC,
    -    flag_imputation = "none"
    -  ) %>%
    -  derive_vars_dy(reference_date = TRTSDT, source_vars = exprs(ADT))
    -

    Importantly, the above calls to derive_param_computed() -list the SDTM variables VISIT, VISITNUM, -OEDY and OEDTC as by_vars for the -function. This is because they will be necessary to derive ADaM -variables such as AVISIT and ADY in successive -steps. Once all the ADaM variables which require them are derived, the -SDTM variables should be set to missing for the derived records, as per -ADaM standards:

    -
    -adbcva <- adbcva %>%
    -  mutate(
    -    VISIT = ifelse(PARAMCD %in% c("SBCVALOG", "FBCVALOG"), NA_character_, VISIT),
    -    VISITNUM = ifelse(PARAMCD %in% c("SBCVALOG", "FBCVALOG"), NA, VISITNUM),
    -    OEDY = ifelse(PARAMCD %in% c("SBCVALOG", "FBCVALOG"), NA, OEDY),
    -    OEDTC = ifelse(PARAMCD %in% c("SBCVALOG", "FBCVALOG"), NA_character_, OEDTC)
    -  )
    -
    -
    -

    Further Derivations of Standard BDS Variables -

    -

    The user is invited to consult the article on creating -a BDS dataset from SDTM to learn how to add standard BDS variables -to ADBCVA. Henceforth, for the purposes of this article, the following -sections use the ADBCVA dataset generated by the corresponding -admiralophtha template program as a starting point.

    -

    Note: This dataset already comes with some criterion -flags and analysis value categorisation variables, so for illustration -purposes these are removed.

    -
    -data("admiralophtha_adbcva")
    -
    -adbcva <- admiralophtha_adbcva %>%
    -  select(-starts_with("CRIT"), -starts_with("AVALCA"))
    -
    -
    -

    Deriving Analysis Value Categories for Snellen Scores -

    -

    Some ophthalmology studies may desire to subdivide BCVA records -according to which Snellen category they fall into (eg, 20/320, 20/100, -20/20 etc). This is best done through the use of -AVALCATx/AVALCAxN variable pairs. Currently, -admiralophtha does not provide specific functionality to -create AVALCATx/AVALCAxN pairs, although this -may be included in future releases of the package. With the current -toolset, the suggested approach to derive such variables is to:

    -
      -
    • Create a lookup table which assigns numeric equivalents -(i.e. AVALCAxN) to Snellen categories.
    • -
    • Create a format function to map each AVAL to a numeric -category.
    • -
    • Add AVALCAxN through a mutate statement using the -format function.
    • -
    • Add AVALCATx using derive_vars_merged in combination -with the lookup table.
    • -
    -
    -avalcat_lookup <- tibble::tribble(
    -  ~PARAMCD, ~AVALCA1N, ~AVALCAT1,
    -  "SBCVA", 1000, "< 20/800",
    -  "SBCVA", 800, "20/800",
    -  "SBCVA", 640, "20/640",
    -  "SBCVA", 500, "20/500",
    -  "SBCVA", 400, "20/400",
    -  "SBCVA", 320, "20/320",
    -  "SBCVA", 250, "20/250",
    -  "SBCVA", 200, "20/200",
    -  "SBCVA", 160, "20/160",
    -  "SBCVA", 125, "20/125",
    -  "SBCVA", 100, "20/100",
    -  "SBCVA", 80, "20/80",
    -  "SBCVA", 63, "20/63",
    -  "SBCVA", 50, "20/50",
    -  "SBCVA", 40, "20/40",
    -  "SBCVA", 32, "20/32",
    -  "SBCVA", 25, "20/25",
    -  "SBCVA", 20, "20/20",
    -  "SBCVA", 16, "20/16",
    -  "SBCVA", 12, "20/12",
    -  "SBCVA", 1, "> 20/12",
    -)
    -
    -avalcat_lookup <- avalcat_lookup %>%
    -  mutate(PARAMCD = "FBCVA") %>%
    -  rbind(avalcat_lookup)
    -
    -format_avalcat1n <- function(param, aval) {
    -  case_when(
    -    param %in% c("SBCVA", "FBCVA") & aval >= 0 & aval <= 3 ~ 1000,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 4 & aval <= 8 ~ 800,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 9 & aval <= 13 ~ 640,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 14 & aval <= 18 ~ 500,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 19 & aval <= 23 ~ 400,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 24 & aval <= 28 ~ 320,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 29 & aval <= 33 ~ 250,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 34 & aval <= 38 ~ 200,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 39 & aval <= 43 ~ 160,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 44 & aval <= 48 ~ 125,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 49 & aval <= 53 ~ 100,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 54 & aval <= 58 ~ 80,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 59 & aval <= 63 ~ 63,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 64 & aval <= 68 ~ 50,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 69 & aval <= 73 ~ 40,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 74 & aval <= 78 ~ 32,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 79 & aval <= 83 ~ 25,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 84 & aval <= 88 ~ 20,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 89 & aval <= 93 ~ 16,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 94 & aval <= 97 ~ 12,
    -    param %in% c("SBCVA", "FBCVA") & aval >= 98 ~ 1
    -  )
    -}
    -
    -adbcva <- adbcva %>%
    -  mutate(AVALCA1N = format_avalcat1n(param = PARAMCD, aval = AVAL)) %>%
    -  derive_vars_merged(
    -    avalcat_lookup,
    -    by = exprs(PARAMCD, AVALCA1N)
    -  )
    -

    The resulting output is shown below (limited to the first patient -only):

    -
    - -
    -
    -

    Deriving Criterion Flags for BCVA Change -

    -

    admiralophtha suggests the use of criterion flag -variable pairs (CRITx/CRITxFL) to program BCVA -endpoints such as Avoiding a loss of x letters or Gain of y -letters or Gain of between x and y letters (relative to -baseline or other basetypes). The package provides the function -derive_var_bcvacritxfl() to program these endpoints -efficiently and consistently. In terms of the logic to apply to the -variable CHG, the endpoints fall into three classes, which -can be represented by inequalities:

    -
      -
    • Class 1: CHG value lying inside a range, -a <= CHG <= b.
    • -
    • Class 2: CHG value below an upper limit, -CHG <= a.
    • -
    • Class 3: CHG value above a lower limit, -CHG => b.
    • -
    -

    By using derive_var_bcvacritxfl(), the ADaM programmer -can implement all three types of endpoint at once. This is achieved by -feeding the appropriate ranges, upper limits and lower limits to the -bcva_ranges, bcva_uplims and -bcva_lowlims arguments of the function. For instance, let’s -suppose that the endpoints of interest are:

    -
      -
    • -Gain of between 5 and 10 letters relative to baseline -(Class 1: 5 <= CHG <= 10)
    • -
    • -Gain of 25 letters or fewer relative to baseline (Class 2: -CHG <= 25)
    • -
    • -Loss of 5 letters or more relative to baseline (Class 2: -CHG <= -5)
    • -
    • -Gain of 15 letters or more relative to baseline (Class 3: -CHG >= 15)
    • -
    • -Loss of 10 letters or fewer relative to baseline (Class 3: -CHG >= -10).
    • -
    -

    Then, the following call will implement criterion variable/flag pairs -for the endpoints above. The CRITx variables will -automatically encode the correct inequality.

    -
    -adbcva <- adbcva %>% derive_var_bcvacritxfl(
    -  paramcds = c("SBCVA", "FBCVA"),
    -  bcva_ranges = list(c(5, 10)),
    -  bcva_uplims = list(25, -5),
    -  bcva_lowlims = list(15, -10)
    -)
    -

    The resulting output is shown below (limited to the first patient -only):

    -
    -

    It is also possible to assign significance to the “x” in -CRITxFL. For instance, one could designate all criterion -flags of Class 1 as CRIT1yFL, Class 2 as -CRIT2yFL, and Class 3 as CRIT3yFL. The -argument critxfl_index allows a simple implementation of -this in conjunction with three separate calls to -derive_var_bcvacritxfl():

    -
    -adbcva <- adbcva %>%
    -  derive_var_bcvacritxfl(
    -    paramcds = c("SBCVA", "FBCVA"),
    -    bcva_ranges = list(c(5, 10)),
    -    critxfl_index = 10
    -  ) %>%
    -  derive_var_bcvacritxfl(
    -    paramcds = c("SBCVA", "FBCVA"),
    -    bcva_uplims = list(25, -5),
    -    critxfl_index = 20
    -  ) %>%
    -  derive_var_bcvacritxfl(
    -    paramcds = c("SBCVA", "FBCVA"),
    -    bcva_lowlims = list(15, -10),
    -    critxfl_index = 30
    -  )
    -
    -
    -

    Additional Notes -

    -
      -
    • When interpreting endpoints such as Loss of 5 letters or fewer -relative to baseline, it is implicitly assumed in this article that -this also includes the case where letters are gained, so that -the inequality reads CHG >= -5. One would then use the -bcva_lowlims = list(-5) argument of -derive_var_bcvacritxfl() to program such an endpoint. If -this is not the case, i.e. one wishes to exclude cases of letter gains, -then the inequality of interest would instead be --5 <= CHG <= -1. Importantly, -derive_var_bcvacritxfl() could still be used, but with the -argument bcva_ranges = list(c(-5, -1)).
    • -
    -
    -
    -

    Example Script -

    - ---- - - - - - - - - -
    ADaMSample Code
    ADBCVAad_adbcva.R
    -
    -
    -
    -
    - - - -
    - - - -
    -
    - - - - - - - diff --git a/pre-release/articles/adbcva_files/crosstalk-1.2.0/css/crosstalk.min.css b/pre-release/articles/adbcva_files/crosstalk-1.2.0/css/crosstalk.min.css deleted file mode 100644 index 6b453828..00000000 --- a/pre-release/articles/adbcva_files/crosstalk-1.2.0/css/crosstalk.min.css +++ /dev/null @@ -1 +0,0 @@ -.container-fluid.crosstalk-bscols{margin-left:-30px;margin-right:-30px;white-space:normal}body>.container-fluid.crosstalk-bscols{margin-left:auto;margin-right:auto}.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column{display:inline-block;padding-right:12px;vertical-align:top}@media only screen and (max-width: 480px){.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column{display:block;padding-right:inherit}}.crosstalk-input{margin-bottom:15px}.crosstalk-input .control-label{margin-bottom:0;vertical-align:middle}.crosstalk-input input[type="checkbox"]{margin:4px 0 0;margin-top:1px;line-height:normal}.crosstalk-input .checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.crosstalk-input .checkbox>label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.crosstalk-input .checkbox input[type="checkbox"],.crosstalk-input .checkbox-inline input[type="checkbox"]{position:absolute;margin-top:2px;margin-left:-20px}.crosstalk-input .checkbox+.checkbox{margin-top:-5px}.crosstalk-input .checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.crosstalk-input .checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px} diff --git a/pre-release/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js b/pre-release/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js deleted file mode 100644 index fd9eb53d..00000000 --- a/pre-release/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js +++ /dev/null @@ -1,1474 +0,0 @@ -(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o b) { - return 1; - } -} - -/** - * @private - */ - -var FilterSet = function () { - function FilterSet() { - _classCallCheck(this, FilterSet); - - this.reset(); - } - - _createClass(FilterSet, [{ - key: "reset", - value: function reset() { - // Key: handle ID, Value: array of selected keys, or null - this._handles = {}; - // Key: key string, Value: count of handles that include it - this._keys = {}; - this._value = null; - this._activeHandles = 0; - } - }, { - key: "update", - value: function update(handleId, keys) { - if (keys !== null) { - keys = keys.slice(0); // clone before sorting - keys.sort(naturalComparator); - } - - var _diffSortedLists = (0, _util.diffSortedLists)(this._handles[handleId], keys), - added = _diffSortedLists.added, - removed = _diffSortedLists.removed; - - this._handles[handleId] = keys; - - for (var i = 0; i < added.length; i++) { - this._keys[added[i]] = (this._keys[added[i]] || 0) + 1; - } - for (var _i = 0; _i < removed.length; _i++) { - this._keys[removed[_i]]--; - } - - this._updateValue(keys); - } - - /** - * @param {string[]} keys Sorted array of strings that indicate - * a superset of possible keys. - * @private - */ - - }, { - key: "_updateValue", - value: function _updateValue() { - var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._allKeys; - - var handleCount = Object.keys(this._handles).length; - if (handleCount === 0) { - this._value = null; - } else { - this._value = []; - for (var i = 0; i < keys.length; i++) { - var count = this._keys[keys[i]]; - if (count === handleCount) { - this._value.push(keys[i]); - } - } - } - } - }, { - key: "clear", - value: function clear(handleId) { - if (typeof this._handles[handleId] === "undefined") { - return; - } - - var keys = this._handles[handleId]; - if (!keys) { - keys = []; - } - - for (var i = 0; i < keys.length; i++) { - this._keys[keys[i]]--; - } - delete this._handles[handleId]; - - this._updateValue(); - } - }, { - key: "value", - get: function get() { - return this._value; - } - }, { - key: "_allKeys", - get: function get() { - var allKeys = Object.keys(this._keys); - allKeys.sort(naturalComparator); - return allKeys; - } - }]); - - return FilterSet; -}(); - -exports.default = FilterSet; - -},{"./util":11}],4:[function(require,module,exports){ -(function (global){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -exports.default = group; - -var _var2 = require("./var"); - -var _var3 = _interopRequireDefault(_var2); - -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"); } } - -// Use a global so that multiple copies of crosstalk.js can be loaded and still -// have groups behave as singletons across all copies. -global.__crosstalk_groups = global.__crosstalk_groups || {}; -var groups = global.__crosstalk_groups; - -function group(groupName) { - if (groupName && typeof groupName === "string") { - if (!groups.hasOwnProperty(groupName)) { - groups[groupName] = new Group(groupName); - } - return groups[groupName]; - } else if ((typeof groupName === "undefined" ? "undefined" : _typeof(groupName)) === "object" && groupName._vars && groupName.var) { - // Appears to already be a group object - return groupName; - } else if (Array.isArray(groupName) && groupName.length == 1 && typeof groupName[0] === "string") { - return group(groupName[0]); - } else { - throw new Error("Invalid groupName argument"); - } -} - -var Group = function () { - function Group(name) { - _classCallCheck(this, Group); - - this.name = name; - this._vars = {}; - } - - _createClass(Group, [{ - key: "var", - value: function _var(name) { - if (!name || typeof name !== "string") { - throw new Error("Invalid var name"); - } - - if (!this._vars.hasOwnProperty(name)) this._vars[name] = new _var3.default(this, name); - return this._vars[name]; - } - }, { - key: "has", - value: function has(name) { - if (!name || typeof name !== "string") { - throw new Error("Invalid var name"); - } - - return this._vars.hasOwnProperty(name); - } - }]); - - return Group; -}(); - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./var":12}],5:[function(require,module,exports){ -(function (global){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _group = require("./group"); - -var _group2 = _interopRequireDefault(_group); - -var _selection = require("./selection"); - -var _filter = require("./filter"); - -var _input = require("./input"); - -require("./input_selectize"); - -require("./input_checkboxgroup"); - -require("./input_slider"); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var defaultGroup = (0, _group2.default)("default"); - -function var_(name) { - return defaultGroup.var(name); -} - -function has(name) { - return defaultGroup.has(name); -} - -if (global.Shiny) { - global.Shiny.addCustomMessageHandler("update-client-value", function (message) { - if (typeof message.group === "string") { - (0, _group2.default)(message.group).var(message.name).set(message.value); - } else { - var_(message.name).set(message.value); - } - }); -} - -var crosstalk = { - group: _group2.default, - var: var_, - has: has, - SelectionHandle: _selection.SelectionHandle, - FilterHandle: _filter.FilterHandle, - bind: _input.bind -}; - -/** - * @namespace crosstalk - */ -exports.default = crosstalk; - -global.crosstalk = crosstalk; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./filter":2,"./group":4,"./input":6,"./input_checkboxgroup":7,"./input_selectize":8,"./input_slider":9,"./selection":10}],6:[function(require,module,exports){ -(function (global){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.register = register; -exports.bind = bind; -var $ = global.jQuery; - -var bindings = {}; - -function register(reg) { - bindings[reg.className] = reg; - if (global.document && global.document.readyState !== "complete") { - $(function () { - bind(); - }); - } else if (global.document) { - setTimeout(bind, 100); - } -} - -function bind() { - Object.keys(bindings).forEach(function (className) { - var binding = bindings[className]; - $("." + binding.className).not(".crosstalk-input-bound").each(function (i, el) { - bindInstance(binding, el); - }); - }); -} - -// Escape jQuery identifier -function $escape(val) { - return val.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); -} - -function bindEl(el) { - var $el = $(el); - Object.keys(bindings).forEach(function (className) { - if ($el.hasClass(className) && !$el.hasClass("crosstalk-input-bound")) { - var binding = bindings[className]; - bindInstance(binding, el); - } - }); -} - -function bindInstance(binding, el) { - var jsonEl = $(el).find("script[type='application/json'][data-for='" + $escape(el.id) + "']"); - var data = JSON.parse(jsonEl[0].innerText); - - var instance = binding.factory(el, data); - $(el).data("crosstalk-instance", instance); - $(el).addClass("crosstalk-input-bound"); -} - -if (global.Shiny) { - var inputBinding = new global.Shiny.InputBinding(); - var _$ = global.jQuery; - _$.extend(inputBinding, { - find: function find(scope) { - return _$(scope).find(".crosstalk-input"); - }, - initialize: function initialize(el) { - if (!_$(el).hasClass("crosstalk-input-bound")) { - bindEl(el); - } - }, - getId: function getId(el) { - return el.id; - }, - getValue: function getValue(el) {}, - setValue: function setValue(el, value) {}, - receiveMessage: function receiveMessage(el, data) {}, - subscribe: function subscribe(el, callback) { - _$(el).data("crosstalk-instance").resume(); - }, - unsubscribe: function unsubscribe(el) { - _$(el).data("crosstalk-instance").suspend(); - } - }); - global.Shiny.inputBindings.register(inputBinding, "crosstalk.inputBinding"); -} - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],7:[function(require,module,exports){ -(function (global){ -"use strict"; - -var _input = require("./input"); - -var input = _interopRequireWildcard(_input); - -var _filter = require("./filter"); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -var $ = global.jQuery; - -input.register({ - className: "crosstalk-input-checkboxgroup", - - factory: function factory(el, data) { - /* - * map: {"groupA": ["keyA", "keyB", ...], ...} - * group: "ct-groupname" - */ - var ctHandle = new _filter.FilterHandle(data.group); - - var lastKnownKeys = void 0; - var $el = $(el); - $el.on("change", "input[type='checkbox']", function () { - var checked = $el.find("input[type='checkbox']:checked"); - if (checked.length === 0) { - lastKnownKeys = null; - ctHandle.clear(); - } else { - var keys = {}; - checked.each(function () { - data.map[this.value].forEach(function (key) { - keys[key] = true; - }); - }); - var keyArray = Object.keys(keys); - keyArray.sort(); - lastKnownKeys = keyArray; - ctHandle.set(keyArray); - } - }); - - return { - suspend: function suspend() { - ctHandle.clear(); - }, - resume: function resume() { - if (lastKnownKeys) ctHandle.set(lastKnownKeys); - } - }; - } -}); - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./filter":2,"./input":6}],8:[function(require,module,exports){ -(function (global){ -"use strict"; - -var _input = require("./input"); - -var input = _interopRequireWildcard(_input); - -var _util = require("./util"); - -var util = _interopRequireWildcard(_util); - -var _filter = require("./filter"); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -var $ = global.jQuery; - -input.register({ - className: "crosstalk-input-select", - - factory: function factory(el, data) { - /* - * items: {value: [...], label: [...]} - * map: {"groupA": ["keyA", "keyB", ...], ...} - * group: "ct-groupname" - */ - - var first = [{ value: "", label: "(All)" }]; - var items = util.dataframeToD3(data.items); - var opts = { - options: first.concat(items), - valueField: "value", - labelField: "label", - searchField: "label" - }; - - var select = $(el).find("select")[0]; - - var selectize = $(select).selectize(opts)[0].selectize; - - var ctHandle = new _filter.FilterHandle(data.group); - - var lastKnownKeys = void 0; - selectize.on("change", function () { - if (selectize.items.length === 0) { - lastKnownKeys = null; - ctHandle.clear(); - } else { - var keys = {}; - selectize.items.forEach(function (group) { - data.map[group].forEach(function (key) { - keys[key] = true; - }); - }); - var keyArray = Object.keys(keys); - keyArray.sort(); - lastKnownKeys = keyArray; - ctHandle.set(keyArray); - } - }); - - return { - suspend: function suspend() { - ctHandle.clear(); - }, - resume: function resume() { - if (lastKnownKeys) ctHandle.set(lastKnownKeys); - } - }; - } -}); - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./filter":2,"./input":6,"./util":11}],9:[function(require,module,exports){ -(function (global){ -"use strict"; - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var _input = require("./input"); - -var input = _interopRequireWildcard(_input); - -var _filter = require("./filter"); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -var $ = global.jQuery; -var strftime = global.strftime; - -input.register({ - className: "crosstalk-input-slider", - - factory: function factory(el, data) { - /* - * map: {"groupA": ["keyA", "keyB", ...], ...} - * group: "ct-groupname" - */ - var ctHandle = new _filter.FilterHandle(data.group); - - var opts = {}; - var $el = $(el).find("input"); - var dataType = $el.data("data-type"); - var timeFormat = $el.data("time-format"); - var round = $el.data("round"); - var timeFormatter = void 0; - - // Set up formatting functions - if (dataType === "date") { - timeFormatter = strftime.utc(); - opts.prettify = function (num) { - return timeFormatter(timeFormat, new Date(num)); - }; - } else if (dataType === "datetime") { - var timezone = $el.data("timezone"); - if (timezone) timeFormatter = strftime.timezone(timezone);else timeFormatter = strftime; - - opts.prettify = function (num) { - return timeFormatter(timeFormat, new Date(num)); - }; - } else if (dataType === "number") { - if (typeof round !== "undefined") opts.prettify = function (num) { - var factor = Math.pow(10, round); - return Math.round(num * factor) / factor; - }; - } - - $el.ionRangeSlider(opts); - - function getValue() { - var result = $el.data("ionRangeSlider").result; - - // Function for converting numeric value from slider to appropriate type. - var convert = void 0; - var dataType = $el.data("data-type"); - if (dataType === "date") { - convert = function convert(val) { - return formatDateUTC(new Date(+val)); - }; - } else if (dataType === "datetime") { - convert = function convert(val) { - // Convert ms to s - return +val / 1000; - }; - } else { - convert = function convert(val) { - return +val; - }; - } - - if ($el.data("ionRangeSlider").options.type === "double") { - return [convert(result.from), convert(result.to)]; - } else { - return convert(result.from); - } - } - - var lastKnownKeys = null; - - $el.on("change.crosstalkSliderInput", function (event) { - if (!$el.data("updating") && !$el.data("animating")) { - var _getValue = getValue(), - _getValue2 = _slicedToArray(_getValue, 2), - from = _getValue2[0], - to = _getValue2[1]; - - var keys = []; - for (var i = 0; i < data.values.length; i++) { - var val = data.values[i]; - if (val >= from && val <= to) { - keys.push(data.keys[i]); - } - } - keys.sort(); - ctHandle.set(keys); - lastKnownKeys = keys; - } - }); - - // let $el = $(el); - // $el.on("change", "input[type="checkbox"]", function() { - // let checked = $el.find("input[type="checkbox"]:checked"); - // if (checked.length === 0) { - // ctHandle.clear(); - // } else { - // let keys = {}; - // checked.each(function() { - // data.map[this.value].forEach(function(key) { - // keys[key] = true; - // }); - // }); - // let keyArray = Object.keys(keys); - // keyArray.sort(); - // ctHandle.set(keyArray); - // } - // }); - - return { - suspend: function suspend() { - ctHandle.clear(); - }, - resume: function resume() { - if (lastKnownKeys) ctHandle.set(lastKnownKeys); - } - }; - } -}); - -// Convert a number to a string with leading zeros -function padZeros(n, digits) { - var str = n.toString(); - while (str.length < digits) { - str = "0" + str; - }return str; -} - -// Given a Date object, return a string in yyyy-mm-dd format, using the -// UTC date. This may be a day off from the date in the local time zone. -function formatDateUTC(date) { - if (date instanceof Date) { - return date.getUTCFullYear() + "-" + padZeros(date.getUTCMonth() + 1, 2) + "-" + padZeros(date.getUTCDate(), 2); - } else { - return null; - } -} - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./filter":2,"./input":6}],10:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.SelectionHandle = undefined; - -var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _events = require("./events"); - -var _events2 = _interopRequireDefault(_events); - -var _group = require("./group"); - -var _group2 = _interopRequireDefault(_group); - -var _util = require("./util"); - -var util = _interopRequireWildcard(_util); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -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"); } } - -/** - * Use this class to read and write (and listen for changes to) the selection - * for a Crosstalk group. This is intended to be used for linked brushing. - * - * If two (or more) `SelectionHandle` instances in the same webpage share the - * same group name, they will share the same state. Setting the selection using - * one `SelectionHandle` instance will result in the `value` property instantly - * changing across the others, and `"change"` event listeners on all instances - * (including the one that initiated the sending) will fire. - * - * @param {string} [group] - The name of the Crosstalk group, or if none, - * null or undefined (or any other falsy value). This can be changed later - * via the [SelectionHandle#setGroup](#setGroup) method. - * @param {Object} [extraInfo] - An object whose properties will be copied to - * the event object whenever an event is emitted. - */ -var SelectionHandle = exports.SelectionHandle = function () { - function SelectionHandle() { - var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; - var extraInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - - _classCallCheck(this, SelectionHandle); - - this._eventRelay = new _events2.default(); - this._emitter = new util.SubscriptionTracker(this._eventRelay); - - // Name of the group we're currently tracking, if any. Can change over time. - this._group = null; - // The Var we're currently tracking, if any. Can change over time. - this._var = null; - // The event handler subscription we currently have on var.on("change"). - this._varOnChangeSub = null; - - this._extraInfo = util.extend({ sender: this }, extraInfo); - - this.setGroup(group); - } - - /** - * Changes the Crosstalk group membership of this SelectionHandle. The group - * being switched away from (if any) will not have its selection value - * modified as a result of calling `setGroup`, even if this handle was the - * most recent handle to set the selection of the group. - * - * The group being switched to (if any) will also not have its selection value - * modified as a result of calling `setGroup`. If you want to set the - * selection value of the new group, call `set` explicitly. - * - * @param {string} group - The name of the Crosstalk group, or null (or - * undefined) to clear the group. - */ - - - _createClass(SelectionHandle, [{ - key: "setGroup", - value: function setGroup(group) { - var _this = this; - - // If group is unchanged, do nothing - if (this._group === group) return; - // Treat null, undefined, and other falsy values the same - if (!this._group && !group) return; - - if (this._var) { - this._var.off("change", this._varOnChangeSub); - this._var = null; - this._varOnChangeSub = null; - } - - this._group = group; - - if (group) { - this._var = (0, _group2.default)(group).var("selection"); - var sub = this._var.on("change", function (e) { - _this._eventRelay.trigger("change", e, _this); - }); - this._varOnChangeSub = sub; - } - } - - /** - * Retrieves the current selection for the group represented by this - * `SelectionHandle`. - * - * - If no selection is active, then this value will be falsy. - * - If a selection is active, but no data points are selected, then this - * value will be an empty array. - * - If a selection is active, and data points are selected, then the keys - * of the selected data points will be present in the array. - */ - - }, { - key: "_mergeExtraInfo", - - - /** - * Combines the given `extraInfo` (if any) with the handle's default - * `_extraInfo` (if any). - * @private - */ - value: function _mergeExtraInfo(extraInfo) { - // Important incidental effect: shallow clone is returned - return util.extend({}, this._extraInfo ? this._extraInfo : null, extraInfo ? extraInfo : null); - } - - /** - * Overwrites the current selection for the group, and raises the `"change"` - * event among all of the group's '`SelectionHandle` instances (including - * this one). - * - * @fires SelectionHandle#change - * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see - * {@link SelectionHandle#value}). - * @param {Object} [extraInfo] - Extra properties to be included on the event - * object that's passed to listeners (in addition to any options that were - * passed into the `SelectionHandle` constructor). - */ - - }, { - key: "set", - value: function set(selectedKeys, extraInfo) { - if (this._var) this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo)); - } - - /** - * Overwrites the current selection for the group, and raises the `"change"` - * event among all of the group's '`SelectionHandle` instances (including - * this one). - * - * @fires SelectionHandle#change - * @param {Object} [extraInfo] - Extra properties to be included on the event - * object that's passed to listeners (in addition to any that were passed - * into the `SelectionHandle` constructor). - */ - - }, { - key: "clear", - value: function clear(extraInfo) { - if (this._var) this.set(void 0, this._mergeExtraInfo(extraInfo)); - } - - /** - * Subscribes to events on this `SelectionHandle`. - * - * @param {string} eventType - Indicates the type of events to listen to. - * Currently, only `"change"` is supported. - * @param {SelectionHandle~listener} listener - The callback function that - * will be invoked when the event occurs. - * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel - * this subscription. - */ - - }, { - key: "on", - value: function on(eventType, listener) { - return this._emitter.on(eventType, listener); - } - - /** - * Cancels event subscriptions created by {@link SelectionHandle#on}. - * - * @param {string} eventType - The type of event to unsubscribe. - * @param {string|SelectionHandle~listener} listener - Either the callback - * function previously passed into {@link SelectionHandle#on}, or the - * string that was returned from {@link SelectionHandle#on}. - */ - - }, { - key: "off", - value: function off(eventType, listener) { - return this._emitter.off(eventType, listener); - } - - /** - * Shuts down the `SelectionHandle` object. - * - * Removes all event listeners that were added through this handle. - */ - - }, { - key: "close", - value: function close() { - this._emitter.removeAllListeners(); - this.setGroup(null); - } - }, { - key: "value", - get: function get() { - return this._var ? this._var.get() : null; - } - }]); - - return SelectionHandle; -}(); - -/** - * @callback SelectionHandle~listener - * @param {Object} event - An object containing details of the event. For - * `"change"` events, this includes the properties `value` (the new - * value of the selection, or `undefined` if no selection is active), - * `oldValue` (the previous value of the selection), and `sender` (the - * `SelectionHandle` instance that made the change). - */ - -/** - * @event SelectionHandle#change - * @type {object} - * @property {object} value - The new value of the selection, or `undefined` - * if no selection is active. - * @property {object} oldValue - The previous value of the selection. - * @property {SelectionHandle} sender - The `SelectionHandle` instance that - * changed the value. - */ - -},{"./events":1,"./group":4,"./util":11}],11:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -exports.extend = extend; -exports.checkSorted = checkSorted; -exports.diffSortedLists = diffSortedLists; -exports.dataframeToD3 = dataframeToD3; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function extend(target) { - for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - sources[_key - 1] = arguments[_key]; - } - - for (var i = 0; i < sources.length; i++) { - var src = sources[i]; - if (typeof src === "undefined" || src === null) continue; - - for (var key in src) { - if (src.hasOwnProperty(key)) { - target[key] = src[key]; - } - } - } - return target; -} - -function checkSorted(list) { - for (var i = 1; i < list.length; i++) { - if (list[i] <= list[i - 1]) { - throw new Error("List is not sorted or contains duplicate"); - } - } -} - -function diffSortedLists(a, b) { - var i_a = 0; - var i_b = 0; - - if (!a) a = []; - if (!b) b = []; - - var a_only = []; - var b_only = []; - - checkSorted(a); - checkSorted(b); - - while (i_a < a.length && i_b < b.length) { - if (a[i_a] === b[i_b]) { - i_a++; - i_b++; - } else if (a[i_a] < b[i_b]) { - a_only.push(a[i_a++]); - } else { - b_only.push(b[i_b++]); - } - } - - if (i_a < a.length) a_only = a_only.concat(a.slice(i_a)); - if (i_b < b.length) b_only = b_only.concat(b.slice(i_b)); - return { - removed: a_only, - added: b_only - }; -} - -// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... } -// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ] -function dataframeToD3(df) { - var names = []; - var length = void 0; - for (var name in df) { - if (df.hasOwnProperty(name)) names.push(name); - if (_typeof(df[name]) !== "object" || typeof df[name].length === "undefined") { - throw new Error("All fields must be arrays"); - } else if (typeof length !== "undefined" && length !== df[name].length) { - throw new Error("All fields must be arrays of the same length"); - } - length = df[name].length; - } - var results = []; - var item = void 0; - for (var row = 0; row < length; row++) { - item = {}; - for (var col = 0; col < names.length; col++) { - item[names[col]] = df[names[col]][row]; - } - results.push(item); - } - return results; -} - -/** - * Keeps track of all event listener additions/removals and lets all active - * listeners be removed with a single operation. - * - * @private - */ - -var SubscriptionTracker = exports.SubscriptionTracker = function () { - function SubscriptionTracker(emitter) { - _classCallCheck(this, SubscriptionTracker); - - this._emitter = emitter; - this._subs = {}; - } - - _createClass(SubscriptionTracker, [{ - key: "on", - value: function on(eventType, listener) { - var sub = this._emitter.on(eventType, listener); - this._subs[sub] = eventType; - return sub; - } - }, { - key: "off", - value: function off(eventType, listener) { - var sub = this._emitter.off(eventType, listener); - if (sub) { - delete this._subs[sub]; - } - return sub; - } - }, { - key: "removeAllListeners", - value: function removeAllListeners() { - var _this = this; - - var current_subs = this._subs; - this._subs = {}; - Object.keys(current_subs).forEach(function (sub) { - _this._emitter.off(current_subs[sub], sub); - }); - } - }]); - - return SubscriptionTracker; -}(); - -},{}],12:[function(require,module,exports){ -(function (global){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _events = require("./events"); - -var _events2 = _interopRequireDefault(_events); - -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"); } } - -var Var = function () { - function Var(group, name, /*optional*/value) { - _classCallCheck(this, Var); - - this._group = group; - this._name = name; - this._value = value; - this._events = new _events2.default(); - } - - _createClass(Var, [{ - key: "get", - value: function get() { - return this._value; - } - }, { - key: "set", - value: function set(value, /*optional*/event) { - if (this._value === value) { - // Do nothing; the value hasn't changed - return; - } - var oldValue = this._value; - this._value = value; - // Alert JavaScript listeners that the value has changed - var evt = {}; - if (event && (typeof event === "undefined" ? "undefined" : _typeof(event)) === "object") { - for (var k in event) { - if (event.hasOwnProperty(k)) evt[k] = event[k]; - } - } - evt.oldValue = oldValue; - evt.value = value; - this._events.trigger("change", evt, this); - - // TODO: Make this extensible, to let arbitrary back-ends know that - // something has changed - if (global.Shiny && global.Shiny.onInputChange) { - global.Shiny.onInputChange(".clientValue-" + (this._group.name !== null ? this._group.name + "-" : "") + this._name, typeof value === "undefined" ? null : value); - } - } - }, { - key: "on", - value: function on(eventType, listener) { - return this._events.on(eventType, listener); - } - }, { - key: "off", - value: function off(eventType, listener) { - return this._events.off(eventType, listener); - } - }]); - - return Var; -}(); - -exports.default = Var; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./events":1}]},{},[5]) -//# sourceMappingURL=crosstalk.js.map diff --git a/pre-release/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js.map b/pre-release/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js.map deleted file mode 100644 index cff94f08..00000000 --- a/pre-release/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.js.map +++ /dev/null @@ -1,37 +0,0 @@ -{ - "version": 3, - "sources": [ - "node_modules/browser-pack/_prelude.js", - "javascript/src/events.js", - "javascript/src/filter.js", - "javascript/src/filterset.js", - "javascript/src/group.js", - "javascript/src/index.js", - "javascript/src/input.js", - "javascript/src/input_checkboxgroup.js", - "javascript/src/input_selectize.js", - "javascript/src/input_slider.js", - "javascript/src/selection.js", - "javascript/src/util.js", - "javascript/src/var.js" - ], - "names": [], - "mappings": "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", - "file": "generated.js", - "sourceRoot": "", - "sourcesContent": [ - "(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n", - "import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n", - "import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n", - "import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n", - "let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n", - "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n", - "import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n", - "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n", - "import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n", - "export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n", - "import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n" - ] -} \ No newline at end of file diff --git a/pre-release/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js b/pre-release/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js deleted file mode 100644 index b7ec0ac9..00000000 --- a/pre-release/articles/adbcva_files/crosstalk-1.2.0/js/crosstalk.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function o(u,a,l){function s(n,e){if(!a[n]){if(!u[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(f)return f(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var i=a[n]={exports:{}};u[n][0].call(i.exports,function(e){var t=u[n][1][e];return s(t||e)},i,i.exports,o,u,a,l)}return a[n].exports}for(var f="function"==typeof require&&require,e=0;e?@[\\\]^`{|}~])/g,"\\$1")+"']"),r=JSON.parse(n[0].innerText),i=e.factory(t,r);o(t).data("crosstalk-instance",i),o(t).addClass("crosstalk-input-bound")}if(t.Shiny){var e=new t.Shiny.InputBinding,u=t.jQuery;u.extend(e,{find:function(e){return u(e).find(".crosstalk-input")},initialize:function(e){var t,n;u(e).hasClass("crosstalk-input-bound")||(n=o(t=e),Object.keys(r).forEach(function(e){n.hasClass(e)&&!n.hasClass("crosstalk-input-bound")&&i(r[e],t)}))},getId:function(e){return e.id},getValue:function(e){},setValue:function(e,t){},receiveMessage:function(e,t){},subscribe:function(e,t){u(e).data("crosstalk-instance").resume()},unsubscribe:function(e){u(e).data("crosstalk-instance").suspend()}}),t.Shiny.inputBindings.register(e,"crosstalk.inputBinding")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],7:[function(r,e,t){(function(e){"use strict";var t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(r("./input")),n=r("./filter");var a=e.jQuery;t.register({className:"crosstalk-input-checkboxgroup",factory:function(e,r){var i=new n.FilterHandle(r.group),o=void 0,u=a(e);return u.on("change","input[type='checkbox']",function(){var e=u.find("input[type='checkbox']:checked");if(0===e.length)o=null,i.clear();else{var t={};e.each(function(){r.map[this.value].forEach(function(e){t[e]=!0})});var n=Object.keys(t);n.sort(),o=n,i.set(n)}}),{suspend:function(){i.clear()},resume:function(){o&&i.set(o)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6}],8:[function(r,e,t){(function(e){"use strict";var t=n(r("./input")),l=n(r("./util")),s=r("./filter");function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}var f=e.jQuery;t.register({className:"crosstalk-input-select",factory:function(e,n){var t=l.dataframeToD3(n.items),r={options:[{value:"",label:"(All)"}].concat(t),valueField:"value",labelField:"label",searchField:"label"},i=f(e).find("select")[0],o=f(i).selectize(r)[0].selectize,u=new s.FilterHandle(n.group),a=void 0;return o.on("change",function(){if(0===o.items.length)a=null,u.clear();else{var t={};o.items.forEach(function(e){n.map[e].forEach(function(e){t[e]=!0})});var e=Object.keys(t);e.sort(),a=e,u.set(e)}}),{suspend:function(){u.clear()},resume:function(){a&&u.set(a)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6,"./util":11}],9:[function(n,e,t){(function(e){"use strict";var d=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var u,a=e[Symbol.iterator]();!(r=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{!r&&a.return&&a.return()}finally{if(i)throw o}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")},t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(n("./input")),a=n("./filter");var v=e.jQuery,p=e.strftime;function y(e,t){for(var n=e.toString();n.length {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n","import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n","import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n","import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n","let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n","import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n","export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n","import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n"]} \ No newline at end of file diff --git a/pre-release/articles/adbcva_files/crosstalk-1.2.0/scss/crosstalk.scss b/pre-release/articles/adbcva_files/crosstalk-1.2.0/scss/crosstalk.scss deleted file mode 100644 index 35665616..00000000 --- a/pre-release/articles/adbcva_files/crosstalk-1.2.0/scss/crosstalk.scss +++ /dev/null @@ -1,75 +0,0 @@ -/* Adjust margins outwards, so column contents line up with the edges of the - parent of container-fluid. */ -.container-fluid.crosstalk-bscols { - margin-left: -30px; - margin-right: -30px; - white-space: normal; -} - -/* But don't adjust the margins outwards if we're directly under the body, - i.e. we were the top-level of something at the console. */ -body > .container-fluid.crosstalk-bscols { - margin-left: auto; - margin-right: auto; -} - -.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { - display: inline-block; - padding-right: 12px; - vertical-align: top; -} - -@media only screen and (max-width:480px) { - .crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { - display: block; - padding-right: inherit; - } -} - -/* Relevant BS3 styles to make filter_checkbox() look reasonable without Bootstrap */ -.crosstalk-input { - margin-bottom: 15px; /* a la .form-group */ - .control-label { - margin-bottom: 0; - vertical-align: middle; - } - input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px; - line-height: normal; - } - .checkbox { - position: relative; - display: block; - margin-top: 10px; - margin-bottom: 10px; - } - .checkbox > label{ - padding-left: 20px; - margin-bottom: 0; - font-weight: 400; - cursor: pointer; - } - .checkbox input[type="checkbox"], - .checkbox-inline input[type="checkbox"] { - position: absolute; - margin-top: 2px; - margin-left: -20px; - } - .checkbox + .checkbox { - margin-top: -5px; - } - .checkbox-inline { - position: relative; - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: 400; - vertical-align: middle; - cursor: pointer; - } - .checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; - } -} diff --git a/pre-release/articles/adbcva_files/datatables-binding-0.21/datatables.js b/pre-release/articles/adbcva_files/datatables-binding-0.21/datatables.js deleted file mode 100644 index 27ed7eaf..00000000 --- a/pre-release/articles/adbcva_files/datatables-binding-0.21/datatables.js +++ /dev/null @@ -1,1494 +0,0 @@ -(function() { - -// some helper functions: using a global object DTWidget so that it can be used -// in JS() code, e.g. datatable(options = list(foo = JS('code'))); unlike R's -// dynamic scoping, when 'code' is eval()'ed, JavaScript does not know objects -// from the "parent frame", e.g. JS('DTWidget') will not work unless it was made -// a global object -var DTWidget = {}; - -// 123456666.7890 -> 123,456,666.7890 -var markInterval = function(d, digits, interval, mark, decMark, precision) { - x = precision ? d.toPrecision(digits) : d.toFixed(digits); - if (!/^-?[\d.]+$/.test(x)) return x; - var xv = x.split('.'); - if (xv.length > 2) return x; // should have at most one decimal point - xv[0] = xv[0].replace(new RegExp('\\B(?=(\\d{' + interval + '})+(?!\\d))', 'g'), mark); - return xv.join(decMark); -}; - -DTWidget.formatCurrency = function(data, currency, digits, interval, mark, decMark, before, zeroPrint) { - var d = parseFloat(data); - if (isNaN(d)) return ''; - if (zeroPrint !== null && d === 0.0) return zeroPrint; - var res = markInterval(d, digits, interval, mark, decMark); - res = before ? (/^-/.test(res) ? '-' + currency + res.replace(/^-/, '') : currency + res) : - res + currency; - return res; -}; - -DTWidget.formatString = function(data, prefix, suffix) { - var d = data; - if (d === null) return ''; - return prefix + d + suffix; -}; - -DTWidget.formatPercentage = function(data, digits, interval, mark, decMark, zeroPrint) { - var d = parseFloat(data); - if (isNaN(d)) return ''; - if (zeroPrint !== null && d === 0.0) return zeroPrint; - return markInterval(d * 100, digits, interval, mark, decMark) + '%'; -}; - -DTWidget.formatRound = function(data, digits, interval, mark, decMark, zeroPrint) { - var d = parseFloat(data); - if (isNaN(d)) return ''; - if (zeroPrint !== null && d === 0.0) return zeroPrint; - return markInterval(d, digits, interval, mark, decMark); -}; - -DTWidget.formatSignif = function(data, digits, interval, mark, decMark, zeroPrint) { - var d = parseFloat(data); - if (isNaN(d)) return ''; - if (zeroPrint !== null && d === 0.0) return zeroPrint; - return markInterval(d, digits, interval, mark, decMark, true); -}; - -DTWidget.formatDate = function(data, method, params) { - var d = data; - if (d === null) return ''; - // (new Date('2015-10-28')).toDateString() may return 2015-10-27 because the - // actual time created could be like 'Tue Oct 27 2015 19:00:00 GMT-0500 (CDT)', - // i.e. the date-only string is treated as UTC time instead of local time - if ((method === 'toDateString' || method === 'toLocaleDateString') && /^\d{4,}\D\d{2}\D\d{2}$/.test(d)) { - d = d.split(/\D/); - d = new Date(d[0], d[1] - 1, d[2]); - } else { - d = new Date(d); - } - return d[method].apply(d, params); -}; - -window.DTWidget = DTWidget; - -// A helper function to update the lims of the existing filters -var set_filter_lims = function(td, new_vals) { - // Based on the filter type, set its new values - if (['factor', 'logical'].includes(td.getAttribute('data-type'))) { - // Reformat the new dropdown options for use with selectize - new_vals = new_vals.map(function(item) {return {text: item, value: item}}); - - // Find the selectize object - var dropdown = $(td).find('.selectized').eq(0)[0].selectize; - - // Note the current values - var old_vals = dropdown.getValue(); - - // Remove the existing values - dropdown.clearOptions(); - - // Add the new options - dropdown.addOption(new_vals); - - // Preserve the existing values - dropdown.setValue(old_vals); - - } else if (['number', 'integer', 'date', 'time'].includes(td.getAttribute('data-type'))) { - // Note what the new limits will be just for this filter - var new_lims = [...new_vals]; - - // Determine the current values and limits - var slider = $(td).find('.noUi-target').eq(0); - var old_vals = slider.val().map(Number); - var old_lims = slider.noUiSlider('options').range; - old_lims = [old_lims.min, old_lims.max]; - - // Preserve the current values if filters have been applied; otherwise, apply no filtering - if (old_vals[0] != old_lims[0]) { - new_vals[0] = Math.max(old_vals[0], new_vals[0]); - } - - if (old_vals[1] != old_lims[1]) { - new_vals[1] = Math.min(old_vals[1], new_vals[1]); - } - - // Update the endpoints of the slider - slider.noUiSlider({ - start: new_vals, - range: {'min': new_lims[0], 'max': new_lims[1]} - }, true); - } -}; - -var transposeArray2D = function(a) { - return a.length === 0 ? a : HTMLWidgets.transposeArray2D(a); -}; - -var crosstalkPluginsInstalled = false; - -function maybeInstallCrosstalkPlugins() { - if (crosstalkPluginsInstalled) - return; - crosstalkPluginsInstalled = true; - - $.fn.dataTable.ext.afnFiltering.push( - function(oSettings, aData, iDataIndex) { - var ctfilter = oSettings.nTable.ctfilter; - if (ctfilter && !ctfilter[iDataIndex]) - return false; - - var ctselect = oSettings.nTable.ctselect; - if (ctselect && !ctselect[iDataIndex]) - return false; - - return true; - } - ); -} - -HTMLWidgets.widget({ - name: "datatables", - type: "output", - renderOnNullValue: true, - initialize: function(el, width, height) { - $(el).html(' '); - return { - data: null, - ctfilterHandle: new crosstalk.FilterHandle(), - ctfilterSubscription: null, - ctselectHandle: new crosstalk.SelectionHandle(), - ctselectSubscription: null - }; - }, - renderValue: function(el, data, instance) { - if (el.offsetWidth === 0 || el.offsetHeight === 0) { - instance.data = data; - return; - } - instance.data = null; - var $el = $(el); - $el.empty(); - - if (data === null) { - $el.append(' '); - // clear previous Shiny inputs (if any) - for (var i in instance.clearInputs) instance.clearInputs[i](); - instance.clearInputs = {}; - return; - } - - var crosstalkOptions = data.crosstalkOptions; - if (!crosstalkOptions) crosstalkOptions = { - 'key': null, 'group': null - }; - if (crosstalkOptions.group) { - maybeInstallCrosstalkPlugins(); - instance.ctfilterHandle.setGroup(crosstalkOptions.group); - instance.ctselectHandle.setGroup(crosstalkOptions.group); - } - - // if we are in the viewer then we always want to fillContainer and - // and autoHideNavigation (unless the user has explicitly set these) - if (window.HTMLWidgets.viewerMode) { - if (!data.hasOwnProperty("fillContainer")) - data.fillContainer = true; - if (!data.hasOwnProperty("autoHideNavigation")) - data.autoHideNavigation = true; - } - - // propagate fillContainer to instance (so we have it in resize) - instance.fillContainer = data.fillContainer; - - var cells = data.data; - - if (cells instanceof Array) cells = transposeArray2D(cells); - - $el.append(data.container); - var $table = $el.find('table'); - if (data.class) $table.addClass(data.class); - if (data.caption) $table.prepend(data.caption); - - if (!data.selection) data.selection = { - mode: 'none', selected: null, target: 'row', selectable: null - }; - if (HTMLWidgets.shinyMode && data.selection.mode !== 'none' && - data.selection.target === 'row+column') { - if ($table.children('tfoot').length === 0) { - $table.append($('')); - $table.find('thead tr').clone().appendTo($table.find('tfoot')); - } - } - - // column filters - var filterRow; - switch (data.filter) { - case 'top': - $table.children('thead').append(data.filterHTML); - filterRow = $table.find('thead tr:last td'); - break; - case 'bottom': - if ($table.children('tfoot').length === 0) { - $table.append($('')); - } - $table.children('tfoot').prepend(data.filterHTML); - filterRow = $table.find('tfoot tr:first td'); - break; - } - - var options = { searchDelay: 1000 }; - if (cells !== null) $.extend(options, { - data: cells - }); - - // options for fillContainer - var bootstrapActive = typeof($.fn.popover) != 'undefined'; - if (instance.fillContainer) { - - // force scrollX/scrollY and turn off autoWidth - options.scrollX = true; - options.scrollY = "100px"; // can be any value, we'll adjust below - - // if we aren't paginating then move around the info/filter controls - // to save space at the bottom and rephrase the info callback - if (data.options.paging === false) { - - // we know how to do this cleanly for bootstrap, not so much - // for other themes/layouts - if (bootstrapActive) { - options.dom = "<'row'<'col-sm-4'i><'col-sm-8'f>>" + - "<'row'<'col-sm-12'tr>>"; - } - - options.fnInfoCallback = function(oSettings, iStart, iEnd, - iMax, iTotal, sPre) { - return Number(iTotal).toLocaleString() + " records"; - }; - } - } - - // auto hide navigation if requested - // Note, this only works on client-side processing mode as on server-side, - // cells (data.data) is null; In addition, we require the pageLength option - // being provided explicitly to enable this. Despite we may be able to deduce - // the default value of pageLength, it may complicate things so we'd rather - // put this responsiblity to users and warn them on the R side. - if (data.autoHideNavigation === true && data.options.paging !== false) { - // strip all nav if length >= cells - if ((cells instanceof Array) && data.options.pageLength >= cells.length) - options.dom = bootstrapActive ? "<'row'<'col-sm-12'tr>>" : "t"; - // alternatively lean things out for flexdashboard mobile portrait - else if (bootstrapActive && window.FlexDashboard && window.FlexDashboard.isMobilePhone()) - options.dom = "<'row'<'col-sm-12'f>>" + - "<'row'<'col-sm-12'tr>>" + - "<'row'<'col-sm-12'p>>"; - } - - $.extend(true, options, data.options || {}); - - var searchCols = options.searchCols; - if (searchCols) { - searchCols = searchCols.map(function(x) { - return x === null ? '' : x.search; - }); - // FIXME: this means I don't respect the escapeRegex setting - delete options.searchCols; - } - - // server-side processing? - var server = options.serverSide === true; - - // use the dataSrc function to pre-process JSON data returned from R - var DT_rows_all = [], DT_rows_current = []; - if (server && HTMLWidgets.shinyMode && typeof options.ajax === 'object' && - /^session\/[\da-z]+\/dataobj/.test(options.ajax.url) && !options.ajax.dataSrc) { - options.ajax.dataSrc = function(json) { - DT_rows_all = $.makeArray(json.DT_rows_all); - DT_rows_current = $.makeArray(json.DT_rows_current); - var data = json.data; - if (!colReorderEnabled()) return data; - var table = $table.DataTable(), order = table.colReorder.order(), flag = true, i, j, row; - for (i = 0; i < order.length; ++i) if (order[i] !== i) flag = false; - if (flag) return data; - for (i = 0; i < data.length; ++i) { - row = data[i].slice(); - for (j = 0; j < order.length; ++j) data[i][j] = row[order[j]]; - } - return data; - }; - } - - var thiz = this; - if (instance.fillContainer) $table.on('init.dt', function(e) { - thiz.fillAvailableHeight(el, $(el).innerHeight()); - }); - // If the page contains serveral datatables and one of which enables colReorder, - // the table.colReorder.order() function will exist but throws error when called. - // So it seems like the only way to know if colReorder is enabled or not is to - // check the options. - var colReorderEnabled = function() { return "colReorder" in options; }; - var table = $table.DataTable(options); - $el.data('datatable', table); - - // Unregister previous Crosstalk event subscriptions, if they exist - if (instance.ctfilterSubscription) { - instance.ctfilterHandle.off("change", instance.ctfilterSubscription); - instance.ctfilterSubscription = null; - } - if (instance.ctselectSubscription) { - instance.ctselectHandle.off("change", instance.ctselectSubscription); - instance.ctselectSubscription = null; - } - - if (!crosstalkOptions.group) { - $table[0].ctfilter = null; - $table[0].ctselect = null; - } else { - var key = crosstalkOptions.key; - function keysToMatches(keys) { - if (!keys) { - return null; - } else { - var selectedKeys = {}; - for (var i = 0; i < keys.length; i++) { - selectedKeys[keys[i]] = true; - } - var matches = {}; - for (var j = 0; j < key.length; j++) { - if (selectedKeys[key[j]]) - matches[j] = true; - } - return matches; - } - } - - function applyCrosstalkFilter(e) { - $table[0].ctfilter = keysToMatches(e.value); - table.draw(); - } - instance.ctfilterSubscription = instance.ctfilterHandle.on("change", applyCrosstalkFilter); - applyCrosstalkFilter({value: instance.ctfilterHandle.filteredKeys}); - - function applyCrosstalkSelection(e) { - if (e.sender !== instance.ctselectHandle) { - table - .rows('.' + selClass, {search: 'applied'}) - .nodes() - .to$() - .removeClass(selClass); - if (selectedRows) - changeInput('rows_selected', selectedRows(), void 0, true); - } - - if (e.sender !== instance.ctselectHandle && e.value && e.value.length) { - var matches = keysToMatches(e.value); - - // persistent selection with plotly (& leaflet) - var ctOpts = crosstalk.var("plotlyCrosstalkOpts").get() || {}; - if (ctOpts.persistent === true) { - var matches = $.extend(matches, $table[0].ctselect); - } - - $table[0].ctselect = matches; - table.draw(); - } else { - if ($table[0].ctselect) { - $table[0].ctselect = null; - table.draw(); - } - } - } - instance.ctselectSubscription = instance.ctselectHandle.on("change", applyCrosstalkSelection); - // TODO: This next line doesn't seem to work when renderDataTable is used - applyCrosstalkSelection({value: instance.ctselectHandle.value}); - } - - var inArray = function(val, array) { - return $.inArray(val, $.makeArray(array)) > -1; - }; - - // encode + to %2B when searching in the table on server side, because - // shiny::parseQueryString() treats + as spaces, and DataTables does not - // encode + to %2B (or % to %25) when sending the request - var encode_plus = function(x) { - return server ? x.replace(/%/g, '%25').replace(/\+/g, '%2B') : x; - }; - - // search the i-th column - var searchColumn = function(i, value) { - var regex = false, ci = true; - if (options.search) { - regex = options.search.regex, - ci = options.search.caseInsensitive !== false; - } - return table.column(i).search(encode_plus(value), regex, !regex, ci); - }; - - if (data.filter !== 'none') { - - filterRow.each(function(i, td) { - - var $td = $(td), type = $td.data('type'), filter; - var $input = $td.children('div').first().children('input'); - $input.prop('disabled', !table.settings()[0].aoColumns[i].bSearchable || type === 'disabled'); - $input.on('input blur', function() { - $input.next('span').toggle(Boolean($input.val())); - }); - // Bootstrap sets pointer-events to none and we won't be able to click - // the clear button - $input.next('span').css('pointer-events', 'auto').hide().click(function() { - $(this).hide().prev('input').val('').trigger('input').focus(); - }); - var searchCol; // search string for this column - if (searchCols && searchCols[i]) { - searchCol = searchCols[i]; - $input.val(searchCol).trigger('input'); - } - var $x = $td.children('div').last(); - - // remove the overflow: hidden attribute of the scrollHead - // (otherwise the scrolling table body obscures the filters) - // The workaround and the discussion from - // https://github.com/rstudio/DT/issues/554#issuecomment-518007347 - // Otherwise the filter selection will not be anchored to the values - // when the columns number is many and scrollX is enabled. - var scrollHead = $(el).find('.dataTables_scrollHead,.dataTables_scrollFoot'); - var cssOverflowHead = scrollHead.css('overflow'); - var scrollBody = $(el).find('.dataTables_scrollBody'); - var cssOverflowBody = scrollBody.css('overflow'); - var scrollTable = $(el).find('.dataTables_scroll'); - var cssOverflowTable = scrollTable.css('overflow'); - if (cssOverflowHead === 'hidden') { - $x.on('show hide', function(e) { - if (e.type === 'show') { - scrollHead.css('overflow', 'visible'); - scrollBody.css('overflow', 'visible'); - scrollTable.css('overflow-x', 'scroll'); - } else { - scrollHead.css('overflow', cssOverflowHead); - scrollBody.css('overflow', cssOverflowBody); - scrollTable.css('overflow-x', cssOverflowTable); - } - }); - $x.css('z-index', 25); - } - - if (inArray(type, ['factor', 'logical'])) { - $input.on({ - click: function() { - $input.parent().hide(); $x.show().trigger('show'); filter[0].selectize.focus(); - }, - input: function() { - if ($input.val() === '') filter[0].selectize.setValue([]); - } - }); - var $input2 = $x.children('select'); - filter = $input2.selectize({ - options: $input2.data('options').map(function(v, i) { - return ({text: v, value: v}); - }), - plugins: ['remove_button'], - hideSelected: true, - onChange: function(value) { - if (value === null) value = []; // compatibility with jQuery 3.0 - $input.val(value.length ? JSON.stringify(value) : ''); - if (value.length) $input.trigger('input'); - $input.attr('title', $input.val()); - if (server) { - table.column(i).search(value.length ? encode_plus(JSON.stringify(value)) : '').draw(); - return; - } - // turn off filter if nothing selected - $td.data('filter', value.length > 0); - table.draw(); // redraw table, and filters will be applied - } - }); - if (searchCol) filter[0].selectize.setValue(JSON.parse(searchCol)); - filter[0].selectize.on('blur', function() { - $x.hide().trigger('hide'); $input.parent().show(); $input.trigger('blur'); - }); - filter.next('div').css('margin-bottom', 'auto'); - } else if (type === 'character') { - var fun = function() { - searchColumn(i, $input.val()).draw(); - }; - if (server) { - fun = $.fn.dataTable.util.throttle(fun, options.searchDelay); - } - $input.on('input', fun); - } else if (inArray(type, ['number', 'integer', 'date', 'time'])) { - var $x0 = $x; - $x = $x0.children('div').first(); - $x0.css({ - 'background-color': '#fff', - 'border': '1px #ddd solid', - 'border-radius': '4px', - 'padding': data.vertical ? '35px 20px': '20px 20px 10px 20px' - }); - var $spans = $x0.children('span').css({ - 'margin-top': data.vertical ? '0' : '10px', - 'white-space': 'nowrap' - }); - var $span1 = $spans.first(), $span2 = $spans.last(); - var r1 = +$x.data('min'), r2 = +$x.data('max'); - // when the numbers are too small or have many decimal places, the - // slider may have numeric precision problems (#150) - var scale = Math.pow(10, Math.max(0, +$x.data('scale') || 0)); - r1 = Math.round(r1 * scale); r2 = Math.round(r2 * scale); - var scaleBack = function(x, scale) { - if (scale === 1) return x; - var d = Math.round(Math.log(scale) / Math.log(10)); - // to avoid problems like 3.423/100 -> 0.034230000000000003 - return (x / scale).toFixed(d); - }; - var slider_min = function() { - return filter.noUiSlider('options').range.min; - }; - var slider_max = function() { - return filter.noUiSlider('options').range.max; - }; - $input.on({ - focus: function() { - $x0.show().trigger('show'); - // first, make sure the slider div leaves at least 20px between - // the two (slider value) span's - $x0.width(Math.max(160, $span1.outerWidth() + $span2.outerWidth() + 20)); - // then, if the input is really wide or slider is vertical, - // make the slider the same width as the input - if ($x0.outerWidth() < $input.outerWidth() || data.vertical) { - $x0.outerWidth($input.outerWidth()); - } - // make sure the slider div does not reach beyond the right margin - if ($(window).width() < $x0.offset().left + $x0.width()) { - $x0.offset({ - 'left': $input.offset().left + $input.outerWidth() - $x0.outerWidth() - }); - } - }, - blur: function() { - $x0.hide().trigger('hide'); - }, - input: function() { - if ($input.val() === '') filter.val([slider_min(), slider_max()]); - }, - change: function() { - var v = $input.val().replace(/\s/g, ''); - if (v === '') return; - v = v.split('...'); - if (v.length !== 2) { - $input.parent().addClass('has-error'); - return; - } - if (v[0] === '') v[0] = slider_min(); - if (v[1] === '') v[1] = slider_max(); - $input.parent().removeClass('has-error'); - // treat date as UTC time at midnight - var strTime = function(x) { - var s = type === 'date' ? 'T00:00:00Z' : ''; - var t = new Date(x + s).getTime(); - // add 10 minutes to date since it does not hurt the date, and - // it helps avoid the tricky floating point arithmetic problems, - // e.g. sometimes the date may be a few milliseconds earlier - // than the midnight due to precision problems in noUiSlider - return type === 'date' ? t + 3600000 : t; - }; - if (inArray(type, ['date', 'time'])) { - v[0] = strTime(v[0]); - v[1] = strTime(v[1]); - } - if (v[0] != slider_min()) v[0] *= scale; - if (v[1] != slider_max()) v[1] *= scale; - filter.val(v); - } - }); - var formatDate = function(d, isoFmt) { - d = scaleBack(d, scale); - if (type === 'number') return d; - if (type === 'integer') return parseInt(d); - var x = new Date(+d); - var fmt = ('filterDateFmt' in data) ? data.filterDateFmt[i] : undefined; - if (fmt !== undefined && isoFmt === false) return x[fmt.method].apply(x, fmt.params); - if (type === 'date') { - var pad0 = function(x) { - return ('0' + x).substr(-2, 2); - }; - return x.getUTCFullYear() + '-' + pad0(1 + x.getUTCMonth()) - + '-' + pad0(x.getUTCDate()); - } else { - return x.toISOString(); - } - }; - var opts = type === 'date' ? { step: 60 * 60 * 1000 } : - type === 'integer' ? { step: 1 } : {}; - - opts.orientation = data.vertical ? 'vertical': 'horizontal'; - opts.direction = data.vertical ? 'rtl': 'ltr'; - - filter = $x.noUiSlider($.extend({ - start: [r1, r2], - range: {min: r1, max: r2}, - connect: true - }, opts)); - if (scale > 1) (function() { - var t1 = r1, t2 = r2; - var val = filter.val(); - while (val[0] > r1 || val[1] < r2) { - if (val[0] > r1) { - t1 -= val[0] - r1; - } - if (val[1] < r2) { - t2 += r2 - val[1]; - } - filter = $x.noUiSlider($.extend({ - start: [t1, t2], - range: {min: t1, max: t2}, - connect: true - }, opts), true); - val = filter.val(); - } - r1 = t1; r2 = t2; - })(); - var updateSliderText = function(v1, v2) { - $span1.text(formatDate(v1, false)); $span2.text(formatDate(v2, false)); - }; - updateSliderText(r1, r2); - var updateSlider = function(e) { - var val = filter.val(); - // turn off filter if in full range - $td.data('filter', val[0] > slider_min() || val[1] < slider_max()); - var v1 = formatDate(val[0]), v2 = formatDate(val[1]), ival; - if ($td.data('filter')) { - ival = v1 + ' ... ' + v2; - $input.attr('title', ival).val(ival).trigger('input'); - } else { - $input.attr('title', '').val(''); - } - updateSliderText(val[0], val[1]); - if (e.type === 'slide') return; // no searching when sliding only - if (server) { - table.column(i).search($td.data('filter') ? ival : '').draw(); - return; - } - table.draw(); - }; - filter.on({ - set: updateSlider, - slide: updateSlider - }); - } - - // server-side processing will be handled by R (or whatever server - // language you use); the following code is only needed for client-side - // processing - if (server) { - // if a search string has been pre-set, search now - if (searchCol) searchColumn(i, searchCol).draw(); - return; - } - - var customFilter = function(settings, data, dataIndex) { - // there is no way to attach a search function to a specific table, - // and we need to make sure a global search function is not applied to - // all tables (i.e. a range filter in a previous table should not be - // applied to the current table); we use the settings object to - // determine if we want to perform searching on the current table, - // since settings.sTableId will be different to different tables - if (table.settings()[0] !== settings) return true; - // no filter on this column or no need to filter this column - if (typeof filter === 'undefined' || !$td.data('filter')) return true; - - var r = filter.val(), v, r0, r1; - var i_data = function(i) { - if (!colReorderEnabled()) return i; - var order = table.colReorder.order(), k; - for (k = 0; k < order.length; ++k) if (order[k] === i) return k; - return i; // in theory it will never be here... - } - v = data[i_data(i)]; - if (type === 'number' || type === 'integer') { - v = parseFloat(v); - // how to handle NaN? currently exclude these rows - if (isNaN(v)) return(false); - r0 = parseFloat(scaleBack(r[0], scale)) - r1 = parseFloat(scaleBack(r[1], scale)); - if (v >= r0 && v <= r1) return true; - } else if (type === 'date' || type === 'time') { - v = new Date(v); - r0 = new Date(r[0] / scale); r1 = new Date(r[1] / scale); - if (v >= r0 && v <= r1) return true; - } else if (type === 'factor') { - if (r.length === 0 || inArray(v, r)) return true; - } else if (type === 'logical') { - if (r.length === 0) return true; - if (inArray(v === '' ? 'na' : v, r)) return true; - } - return false; - }; - - $.fn.dataTable.ext.search.push(customFilter); - - // search for the preset search strings if it is non-empty - if (searchCol) { - if (inArray(type, ['factor', 'logical'])) { - filter[0].selectize.setValue(JSON.parse(searchCol)); - } else if (type === 'character') { - $input.trigger('input'); - } else if (inArray(type, ['number', 'integer', 'date', 'time'])) { - $input.trigger('change'); - } - } - - }); - - } - - // highlight search keywords - var highlight = function() { - var body = $(table.table().body()); - // removing the old highlighting first - body.unhighlight(); - - // don't highlight the "not found" row, so we get the rows using the api - if (table.rows({ filter: 'applied' }).data().length === 0) return; - // highlight global search keywords - body.highlight($.trim(table.search()).split(/\s+/)); - // then highlight keywords from individual column filters - if (filterRow) filterRow.each(function(i, td) { - var $td = $(td), type = $td.data('type'); - if (type !== 'character') return; - var $input = $td.children('div').first().children('input'); - var column = table.column(i).nodes().to$(), - val = $.trim($input.val()); - if (type !== 'character' || val === '') return; - column.highlight(val.split(/\s+/)); - }); - }; - - if (options.searchHighlight) { - table - .on('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth', highlight) - .on('destroy', function() { - // remove event handler - table.off('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth'); - }); - - // Set the option for escaping regex characters in our search string. This will be used - // for all future matching. - jQuery.fn.highlight.options.escapeRegex = (!options.search || !options.search.regex); - - // initial highlight for state saved conditions and initial states - highlight(); - } - - // run the callback function on the table instance - if (typeof data.callback === 'function') data.callback(table); - - // double click to edit the cell, row, column, or all cells - if (data.editable) table.on('dblclick.dt', 'tbody td', function(e) { - // only bring up the editor when the cell itself is dbclicked, and ignore - // other dbclick events bubbled up (e.g. from the ) - if (e.target !== this) return; - var target = [], immediate = false; - switch (data.editable.target) { - case 'cell': - target = [this]; - immediate = true; // edit will take effect immediately - break; - case 'row': - target = table.cells(table.cell(this).index().row, '*').nodes(); - break; - case 'column': - target = table.cells('*', table.cell(this).index().column).nodes(); - break; - case 'all': - target = table.cells().nodes(); - break; - default: - throw 'The editable parameter must be "cell", "row", "column", or "all"'; - } - var disableCols = data.editable.disable ? data.editable.disable.columns : null; - var numericCols = data.editable.numeric; - var areaCols = data.editable.area; - for (var i = 0; i < target.length; i++) { - (function(cell, current) { - var $cell = $(cell), html = $cell.html(); - var _cell = table.cell(cell), value = _cell.data(), index = _cell.index().column; - var $input; - if (inArray(index, numericCols)) { - $input = $(''); - } else if (inArray(index, areaCols)) { - $input = $(''); - } else { - $input = $(''); - } - if (!immediate) { - $cell.data('input', $input).data('html', html); - $input.attr('title', 'Hit Ctrl+Enter to finish editing, or Esc to cancel'); - } - $input.val(value); - if (inArray(index, disableCols)) { - $input.attr('readonly', '').css('filter', 'invert(25%)'); - } - $cell.empty().append($input); - if (cell === current) $input.focus(); - $input.css('width', '100%'); - - if (immediate) $input.on('blur', function(e) { - var valueNew = $input.val(); - if (valueNew != value) { - _cell.data(valueNew); - if (HTMLWidgets.shinyMode) { - changeInput('cell_edit', [cellInfo(cell)], 'DT.cellInfo', null, {priority: 'event'}); - } - // for server-side processing, users have to call replaceData() to update the table - if (!server) table.draw(false); - } else { - $cell.html(html); - } - }).on('keyup', function(e) { - // hit Escape to cancel editing - if (e.keyCode === 27) $input.trigger('blur'); - }); - - // bulk edit (row, column, or all) - if (!immediate) $input.on('keyup', function(e) { - var removeInput = function($cell, restore) { - $cell.data('input').remove(); - if (restore) $cell.html($cell.data('html')); - } - if (e.keyCode === 27) { - for (var i = 0; i < target.length; i++) { - removeInput($(target[i]), true); - } - } else if (e.keyCode === 13 && e.ctrlKey) { - // Ctrl + Enter - var cell, $cell, _cell, cellData = []; - for (var i = 0; i < target.length; i++) { - cell = target[i]; $cell = $(cell); _cell = table.cell(cell); - _cell.data($cell.data('input').val()); - HTMLWidgets.shinyMode && cellData.push(cellInfo(cell)); - removeInput($cell, false); - } - if (HTMLWidgets.shinyMode) { - changeInput('cell_edit', cellData, 'DT.cellInfo', null, {priority: "event"}); - } - if (!server) table.draw(false); - } - }); - })(target[i], this); - } - }); - - // interaction with shiny - if (!HTMLWidgets.shinyMode && !crosstalkOptions.group) return; - - var methods = {}; - var shinyData = {}; - - methods.updateCaption = function(caption) { - if (!caption) return; - $table.children('caption').replaceWith(caption); - } - - // register clear functions to remove input values when the table is removed - instance.clearInputs = {}; - - var changeInput = function(id, value, type, noCrosstalk, opts) { - var event = id; - id = el.id + '_' + id; - if (type) id = id + ':' + type; - // do not update if the new value is the same as old value - if (event !== 'cell_edit' && !/_clicked$/.test(event) && shinyData.hasOwnProperty(id) && shinyData[id] === JSON.stringify(value)) - return; - shinyData[id] = JSON.stringify(value); - if (HTMLWidgets.shinyMode && Shiny.setInputValue) { - Shiny.setInputValue(id, value, opts); - if (!instance.clearInputs[id]) instance.clearInputs[id] = function() { - Shiny.setInputValue(id, null); - } - } - - // HACK - if (event === "rows_selected" && !noCrosstalk) { - if (crosstalkOptions.group) { - var keys = crosstalkOptions.key; - var selectedKeys = null; - if (value) { - selectedKeys = []; - for (var i = 0; i < value.length; i++) { - // The value array's contents use 1-based row numbers, so we must - // convert to 0-based before indexing into the keys array. - selectedKeys.push(keys[value[i] - 1]); - } - } - instance.ctselectHandle.set(selectedKeys); - } - } - }; - - var addOne = function(x) { - return x.map(function(i) { return 1 + i; }); - }; - - var unique = function(x) { - var ux = []; - $.each(x, function(i, el){ - if ($.inArray(el, ux) === -1) ux.push(el); - }); - return ux; - } - - // change the row index of a cell - var tweakCellIndex = function(cell) { - var info = cell.index(); - // some cell may not be valid. e.g, #759 - // when using the RowGroup extension, datatables will - // generate the row label and the cells are not part of - // the data thus contain no row/col info - if (info === undefined) - return {row: null, col: null}; - if (server) { - info.row = DT_rows_current[info.row]; - } else { - info.row += 1; - } - return {row: info.row, col: info.column}; - } - - var cleanSelectedValues = function() { - changeInput('rows_selected', []); - changeInput('columns_selected', []); - changeInput('cells_selected', transposeArray2D([]), 'shiny.matrix'); - } - // #828 we should clean the selection on the server-side when the table reloads - cleanSelectedValues(); - - // a flag to indicates if select extension is initialized or not - var flagSelectExt = table.settings()[0]._select !== undefined; - // the Select extension should only be used in the client mode and - // when the selection.mode is set to none - if (data.selection.mode === 'none' && !server && flagSelectExt) { - var updateRowsSelected = function() { - var rows = table.rows({selected: true}); - var selected = []; - $.each(rows.indexes().toArray(), function(i, v) { - selected.push(v + 1); - }); - changeInput('rows_selected', selected); - } - var updateColsSelected = function() { - var columns = table.columns({selected: true}); - changeInput('columns_selected', columns.indexes().toArray()); - } - var updateCellsSelected = function() { - var cells = table.cells({selected: true}); - var selected = []; - cells.every(function() { - var row = this.index().row; - var col = this.index().column; - selected = selected.concat([[row + 1, col]]); - }); - changeInput('cells_selected', transposeArray2D(selected), 'shiny.matrix'); - } - table.on('select deselect', function(e, dt, type, indexes) { - updateRowsSelected(); - updateColsSelected(); - updateCellsSelected(); - }) - } - - var selMode = data.selection.mode, selTarget = data.selection.target; - var selDisable = data.selection.selectable === false; - if (inArray(selMode, ['single', 'multiple'])) { - var selClass = inArray(data.style, ['bootstrap', 'bootstrap4']) ? 'active' : 'selected'; - // selected1: row indices; selected2: column indices - var initSel = function(x) { - if (x === null || typeof x === 'boolean' || selTarget === 'cell') { - return {rows: [], cols: []}; - } else if (selTarget === 'row') { - return {rows: $.makeArray(x), cols: []}; - } else if (selTarget === 'column') { - return {rows: [], cols: $.makeArray(x)}; - } else if (selTarget === 'row+column') { - return {rows: $.makeArray(x.rows), cols: $.makeArray(x.cols)}; - } - } - var selected = data.selection.selected; - var selected1 = initSel(selected).rows, selected2 = initSel(selected).cols; - // selectable should contain either all positive or all non-positive values, not both - // positive values indicate "selectable" while non-positive values means "nonselectable" - // the assertion is performed on R side. (only column indicides could be zero which indicates - // the row name) - var selectable = data.selection.selectable; - var selectable1 = initSel(selectable).rows, selectable2 = initSel(selectable).cols; - - // After users reorder the rows or filter the table, we cannot use the table index - // directly. Instead, we need this function to find out the rows between the two clicks. - // If user filter the table again between the start click and the end click, the behavior - // would be undefined, but it should not be a problem. - var shiftSelRowsIndex = function(start, end) { - var indexes = server ? DT_rows_all : table.rows({ search: 'applied' }).indexes().toArray(); - start = indexes.indexOf(start); end = indexes.indexOf(end); - // if start is larger than end, we need to swap - if (start > end) { - var tmp = end; end = start; start = tmp; - } - return indexes.slice(start, end + 1); - } - - var serverRowIndex = function(clientRowIndex) { - return server ? DT_rows_current[clientRowIndex] : clientRowIndex + 1; - } - - // row, column, or cell selection - var lastClickedRow; - if (inArray(selTarget, ['row', 'row+column'])) { - // Get the current selected rows. It will also - // update the selected1's value based on the current row selection state - // Note we can't put this function inside selectRows() directly, - // the reason is method.selectRows() will override selected1's value but this - // function will add rows to selected1 (keep the existing selection), which is - // inconsistent with column and cell selection. - var selectedRows = function() { - var rows = table.rows('.' + selClass); - var idx = rows.indexes().toArray(); - if (!server) { - selected1 = addOne(idx); - return selected1; - } - idx = idx.map(function(i) { - return DT_rows_current[i]; - }); - selected1 = selMode === 'multiple' ? unique(selected1.concat(idx)) : idx; - return selected1; - } - // Change selected1's value based on selectable1, then refresh the row state - var onlyKeepSelectableRows = function() { - if (selDisable) { // users can't select; useful when only want backend select - selected1 = []; - return; - } - if (selectable1.length === 0) return; - var nonselectable = selectable1[0] <= 0; - if (nonselectable) { - // should make selectable1 positive - selected1 = $(selected1).not(selectable1.map(function(i) { return -i; })).get(); - } else { - selected1 = $(selected1).filter(selectable1).get(); - } - } - // Change selected1's value based on selectable1, then - // refresh the row selection state according to values in selected1 - var selectRows = function(ignoreSelectable) { - if (!ignoreSelectable) onlyKeepSelectableRows(); - table.$('tr.' + selClass).removeClass(selClass); - if (selected1.length === 0) return; - if (server) { - table.rows({page: 'current'}).every(function() { - if (inArray(DT_rows_current[this.index()], selected1)) { - $(this.node()).addClass(selClass); - } - }); - } else { - var selected0 = selected1.map(function(i) { return i - 1; }); - $(table.rows(selected0).nodes()).addClass(selClass); - } - } - table.on('mousedown.dt', 'tbody tr', function(e) { - var $this = $(this), thisRow = table.row(this); - if (selMode === 'multiple') { - if (e.shiftKey && lastClickedRow !== undefined) { - // select or de-select depends on the last clicked row's status - var flagSel = !$this.hasClass(selClass); - var crtClickedRow = serverRowIndex(thisRow.index()); - if (server) { - var rowsIndex = shiftSelRowsIndex(lastClickedRow, crtClickedRow); - // update current page's selClass - rowsIndex.map(function(i) { - var rowIndex = DT_rows_current.indexOf(i); - if (rowIndex >= 0) { - var row = table.row(rowIndex).nodes().to$(); - var flagRowSel = !row.hasClass(selClass); - if (flagSel === flagRowSel) row.toggleClass(selClass); - } - }); - // update selected1 - if (flagSel) { - selected1 = unique(selected1.concat(rowsIndex)); - } else { - selected1 = selected1.filter(function(index) { - return !inArray(index, rowsIndex); - }); - } - } else { - // js starts from 0 - shiftSelRowsIndex(lastClickedRow - 1, crtClickedRow - 1).map(function(value) { - var row = table.row(value).nodes().to$(); - var flagRowSel = !row.hasClass(selClass); - if (flagSel === flagRowSel) row.toggleClass(selClass); - }); - } - e.preventDefault(); - } else { - $this.toggleClass(selClass); - } - } else { - if ($this.hasClass(selClass)) { - $this.removeClass(selClass); - } else { - table.$('tr.' + selClass).removeClass(selClass); - $this.addClass(selClass); - } - } - if (server && !$this.hasClass(selClass)) { - var id = DT_rows_current[thisRow.index()]; - // remove id from selected1 since its class .selected has been removed - if (inArray(id, selected1)) selected1.splice($.inArray(id, selected1), 1); - } - selectedRows(); // update selected1's value based on selClass - selectRows(false); // only keep the selectable rows - changeInput('rows_selected', selected1); - changeInput('row_last_clicked', serverRowIndex(thisRow.index()), null, null, {priority: 'event'}); - lastClickedRow = serverRowIndex(thisRow.index()); - }); - selectRows(false); // in case users have specified pre-selected rows - // restore selected rows after the table is redrawn (e.g. sort/search/page); - // client-side tables will preserve the selections automatically; for - // server-side tables, we have to *real* row indices are in `selected1` - changeInput('rows_selected', selected1); - if (server) table.on('draw.dt', function(e) { selectRows(false); }); - methods.selectRows = function(selected, ignoreSelectable) { - selected1 = $.makeArray(selected); - selectRows(ignoreSelectable); - changeInput('rows_selected', selected1); - } - } - - if (inArray(selTarget, ['column', 'row+column'])) { - if (selTarget === 'row+column') { - $(table.columns().footer()).css('cursor', 'pointer'); - } - // update selected2's value based on selectable2 - var onlyKeepSelectableCols = function() { - if (selDisable) { // users can't select; useful when only want backend select - selected2 = []; - return; - } - if (selectable2.length === 0) return; - var nonselectable = selectable2[0] <= 0; - if (nonselectable) { - // need to make selectable2 positive - selected2 = $(selected2).not(selectable2.map(function(i) { return -i; })).get(); - } else { - selected2 = $(selected2).filter(selectable2).get(); - } - } - // update selected2 and then - // refresh the col selection state according to values in selected2 - var selectCols = function(ignoreSelectable) { - if (!ignoreSelectable) onlyKeepSelectableCols(); - // if selected2 is not a valide index (e.g., larger than the column number) - // table.columns(selected2) will fail and result in a blank table - // this is different from the table.rows(), where the out-of-range indexes - // doesn't affect at all - selected2 = $(selected2).filter(table.columns().indexes()).get(); - table.columns().nodes().flatten().to$().removeClass(selClass); - if (selected2.length > 0) - table.columns(selected2).nodes().flatten().to$().addClass(selClass); - } - var callback = function() { - var colIdx = selTarget === 'column' ? table.cell(this).index().column : - $.inArray(this, table.columns().footer()), - thisCol = $(table.column(colIdx).nodes()); - if (colIdx === -1) return; - if (thisCol.hasClass(selClass)) { - thisCol.removeClass(selClass); - selected2.splice($.inArray(colIdx, selected2), 1); - } else { - if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass); - thisCol.addClass(selClass); - selected2 = selMode === 'single' ? [colIdx] : unique(selected2.concat([colIdx])); - } - selectCols(false); // update selected2 based on selectable - changeInput('columns_selected', selected2); - } - if (selTarget === 'column') { - $(table.table().body()).on('click.dt', 'td', callback); - } else { - $(table.table().footer()).on('click.dt', 'tr th', callback); - } - selectCols(false); // in case users have specified pre-selected columns - changeInput('columns_selected', selected2); - if (server) table.on('draw.dt', function(e) { selectCols(false); }); - methods.selectColumns = function(selected, ignoreSelectable) { - selected2 = $.makeArray(selected); - selectCols(ignoreSelectable); - changeInput('columns_selected', selected2); - } - } - - if (selTarget === 'cell') { - var selected3 = [], selectable3 = []; - if (selected !== null) selected3 = selected; - if (selectable !== null && typeof selectable !== 'boolean') selectable3 = selectable; - var findIndex = function(ij, sel) { - for (var i = 0; i < sel.length; i++) { - if (ij[0] === sel[i][0] && ij[1] === sel[i][1]) return i; - } - return -1; - } - // Change selected3's value based on selectable3, then refresh the cell state - var onlyKeepSelectableCells = function() { - if (selDisable) { // users can't select; useful when only want backend select - selected3 = []; - return; - } - if (selectable3.length === 0) return; - var nonselectable = selectable3[0][0] <= 0; - var out = []; - if (nonselectable) { - selected3.map(function(ij) { - // should make selectable3 positive - if (findIndex([-ij[0], -ij[1]], selectable3) === -1) { out.push(ij); } - }); - } else { - selected3.map(function(ij) { - if (findIndex(ij, selectable3) > -1) { out.push(ij); } - }); - } - selected3 = out; - } - // Change selected3's value based on selectable3, then - // refresh the cell selection state according to values in selected3 - var selectCells = function(ignoreSelectable) { - if (!ignoreSelectable) onlyKeepSelectableCells(); - table.$('td.' + selClass).removeClass(selClass); - if (selected3.length === 0) return; - if (server) { - table.cells({page: 'current'}).every(function() { - var info = tweakCellIndex(this); - if (findIndex([info.row, info.col], selected3) > -1) - $(this.node()).addClass(selClass); - }); - } else { - selected3.map(function(ij) { - $(table.cell(ij[0] - 1, ij[1]).node()).addClass(selClass); - }); - } - }; - table.on('click.dt', 'tbody td', function() { - var $this = $(this), info = tweakCellIndex(table.cell(this)); - if ($this.hasClass(selClass)) { - $this.removeClass(selClass); - selected3.splice(findIndex([info.row, info.col], selected3), 1); - } else { - if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass); - $this.addClass(selClass); - selected3 = selMode === 'single' ? [[info.row, info.col]] : - unique(selected3.concat([[info.row, info.col]])); - } - selectCells(false); // must call this to update selected3 based on selectable3 - changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); - }); - selectCells(false); // in case users have specified pre-selected columns - changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); - - if (server) table.on('draw.dt', function(e) { selectCells(false); }); - methods.selectCells = function(selected, ignoreSelectable) { - selected3 = selected ? selected : []; - selectCells(ignoreSelectable); - changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); - } - } - } - - // expose some table info to Shiny - var updateTableInfo = function(e, settings) { - // TODO: is anyone interested in the page info? - // changeInput('page_info', table.page.info()); - var updateRowInfo = function(id, modifier) { - var idx; - if (server) { - idx = modifier.page === 'current' ? DT_rows_current : DT_rows_all; - } else { - var rows = table.rows($.extend({ - search: 'applied', - page: 'all' - }, modifier)); - idx = addOne(rows.indexes().toArray()); - } - changeInput('rows' + '_' + id, idx); - }; - updateRowInfo('current', {page: 'current'}); - updateRowInfo('all', {}); - } - table.on('draw.dt', updateTableInfo); - updateTableInfo(); - - // state info - table.on('draw.dt column-visibility.dt', function() { - changeInput('state', table.state()); - }); - changeInput('state', table.state()); - - // search info - var updateSearchInfo = function() { - changeInput('search', table.search()); - if (filterRow) changeInput('search_columns', filterRow.toArray().map(function(td) { - return $(td).find('input').first().val(); - })); - } - table.on('draw.dt', updateSearchInfo); - updateSearchInfo(); - - var cellInfo = function(thiz) { - var info = tweakCellIndex(table.cell(thiz)); - info.value = table.cell(thiz).data(); - return info; - } - // the current cell clicked on - table.on('click.dt', 'tbody td', function() { - changeInput('cell_clicked', cellInfo(this), null, null, {priority: 'event'}); - }) - changeInput('cell_clicked', {}); - - // do not trigger table selection when clicking on links unless they have classes - table.on('click.dt', 'tbody td a', function(e) { - if (this.className === '') e.stopPropagation(); - }); - - methods.addRow = function(data, rowname, resetPaging) { - var n = table.columns().indexes().length, d = n - data.length; - if (d === 1) { - data = rowname.concat(data) - } else if (d !== 0) { - console.log(data); - console.log(table.columns().indexes()); - throw 'New data must be of the same length as current data (' + n + ')'; - }; - table.row.add(data).draw(resetPaging); - } - - methods.updateSearch = function(keywords) { - if (keywords.global !== null) - $(table.table().container()).find('input[type=search]').first() - .val(keywords.global).trigger('input'); - var columns = keywords.columns; - if (!filterRow || columns === null) return; - filterRow.toArray().map(function(td, i) { - var v = typeof columns === 'string' ? columns : columns[i]; - if (typeof v === 'undefined') { - console.log('The search keyword for column ' + i + ' is undefined') - return; - } - $(td).find('input').first().val(v); - searchColumn(i, v); - }); - table.draw(); - } - - methods.hideCols = function(hide, reset) { - if (reset) table.columns().visible(true, false); - table.columns(hide).visible(false); - } - - methods.showCols = function(show, reset) { - if (reset) table.columns().visible(false, false); - table.columns(show).visible(true); - } - - methods.colReorder = function(order, origOrder) { - table.colReorder.order(order, origOrder); - } - - methods.selectPage = function(page) { - if (table.page.info().pages < page || page < 1) { - throw 'Selected page is out of range'; - }; - table.page(page - 1).draw(false); - } - - methods.reloadData = function(resetPaging, clearSelection) { - // empty selections first if necessary - if (methods.selectRows && inArray('row', clearSelection)) methods.selectRows([]); - if (methods.selectColumns && inArray('column', clearSelection)) methods.selectColumns([]); - if (methods.selectCells && inArray('cell', clearSelection)) methods.selectCells([]); - table.ajax.reload(null, resetPaging); - } - - // update table filters (set new limits of sliders) - methods.updateFilters = function(newLims) { - // loop through each filter in the filter row - filterRow.each(function(i, td) { - var k = i; - if (filterRow.length > newLims.length) { - if (i === 0) return; // first column is row names - k = i - 1; - } - // Update the filters to reflect the updated data - set_filter_lims(td, newLims[k]); - }); - }; - - table.shinyMethods = methods; - }, - resize: function(el, width, height, instance) { - if (instance.data) this.renderValue(el, instance.data, instance); - - // dynamically adjust height if fillContainer = TRUE - if (instance.fillContainer) - this.fillAvailableHeight(el, height); - - this.adjustWidth(el); - }, - - // dynamically set the scroll body to fill available height - // (used with fillContainer = TRUE) - fillAvailableHeight: function(el, availableHeight) { - - // see how much of the table is occupied by header/footer elements - // and use that to compute a target scroll body height - var dtWrapper = $(el).find('div.dataTables_wrapper'); - var dtScrollBody = $(el).find($('div.dataTables_scrollBody')); - var framingHeight = dtWrapper.innerHeight() - dtScrollBody.innerHeight(); - var scrollBodyHeight = availableHeight - framingHeight; - - // we need to set `max-height` to none as datatables library now sets this - // to a fixed height, disabling the ability to resize to fill the window, - // as it will be set to a fixed 100px under such circumstances, e.g., RStudio IDE, - // or FlexDashboard - // see https://github.com/rstudio/DT/issues/951#issuecomment-1026464509 - dtScrollBody.css('max-height', 'none'); - // set the height - dtScrollBody.height(scrollBodyHeight + 'px'); - }, - - // adjust the width of columns; remove the hard-coded widths on table and the - // scroll header when scrollX/Y are enabled - adjustWidth: function(el) { - var $el = $(el), table = $el.data('datatable'); - if (table) table.columns.adjust(); - $el.find('.dataTables_scrollHeadInner').css('width', '') - .children('table').css('margin-left', ''); - } -}); - - if (!HTMLWidgets.shinyMode) return; - - Shiny.addCustomMessageHandler('datatable-calls', function(data) { - var id = data.id; - var el = document.getElementById(id); - var table = el ? $(el).data('datatable') : null; - if (!table) { - console.log("Couldn't find table with id " + id); - return; - } - - var methods = table.shinyMethods, call = data.call; - if (methods[call.method]) { - methods[call.method].apply(table, call.args); - } else { - console.log("Unknown method " + call.method); - } - }); - -})(); diff --git a/pre-release/articles/adbcva_files/datatables-css-0.0.0/datatables-crosstalk.css b/pre-release/articles/adbcva_files/datatables-css-0.0.0/datatables-crosstalk.css deleted file mode 100644 index fb5bae84..00000000 --- a/pre-release/articles/adbcva_files/datatables-css-0.0.0/datatables-crosstalk.css +++ /dev/null @@ -1,23 +0,0 @@ -.dt-crosstalk-fade { - opacity: 0.2; -} - -html body div.DTS div.dataTables_scrollBody { - background: none; -} - - -/* -Fix https://github.com/rstudio/DT/issues/563 -If the `table.display` is set to "block" (e.g., pkgdown), the browser will display -datatable objects strangely. The search panel and the page buttons will still be -in full-width but the table body will be "compact" and shorter. -In therory, having this attributes will affect `dom="t"` -with `display: block` users. But in reality, there should be no one. -We may remove the below lines in the future if the upstream agree to have this there. -See https://github.com/DataTables/DataTablesSrc/issues/160 -*/ - -table.dataTable { - display: table; -} diff --git a/pre-release/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.extra.css b/pre-release/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.extra.css deleted file mode 100644 index b2dd141f..00000000 --- a/pre-release/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.extra.css +++ /dev/null @@ -1,28 +0,0 @@ -/* Selected rows/cells */ -table.dataTable tr.selected td, table.dataTable td.selected { - background-color: #b0bed9 !important; -} -/* In case of scrollX/Y or FixedHeader */ -.dataTables_scrollBody .dataTables_sizing { - visibility: hidden; -} - -/* The datatables' theme CSS file doesn't define -the color but with white background. It leads to an issue that -when the HTML's body color is set to 'white', the user can't -see the text since the background is white. One case happens in the -RStudio's IDE when inline viewing the DT table inside an Rmd file, -if the IDE theme is set to "Cobalt". - -See https://github.com/rstudio/DT/issues/447 for more info - -This fixes should have little side-effects because all the other elements -of the default theme use the #333 font color. - -TODO: The upstream may use relative colors for both the table background -and the color. It means the table can display well without this patch -then. At that time, we need to remove the below CSS attributes. -*/ -div.datatables { - color: #333; -} diff --git a/pre-release/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.min.css b/pre-release/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.min.css deleted file mode 100644 index f1db0e82..00000000 --- a/pre-release/articles/adbcva_files/dt-core-1.11.3/css/jquery.dataTables.min.css +++ /dev/null @@ -1 +0,0 @@ -td.dt-control{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAACjElEQVR4Aa2V30uTURjHnVBUgglCaXVTJJVLMdhQm7+1JEvJiKAggmgSQiKJl0V0E13UVf0HQZmBLcvlpqa55tqV0YoMzIhY6js0yDH11X17vuO8Sq5Zgl/48DznPD/G63nOMSmBkoUNwhYhTUgn9NUeY8z5p0wqOVXYKRwQLMJhhYV7Kpaqck2rNdskbBPMdrv9osfjcQaDwW/RaHSR0OceY8xhrqox/a3ZZmGHkO9wOB7ouj6PBGKMOcxlzcqmdDYKGZmZmSWjo6PvIYosRuDWXGj50IwTb4+hxleN5sAVvJh4jvBCGBRzWSO121UPk3EAaUKuz+d7ycTp+Wnc/nwL1d4qHBVidmjZv/npBkJzGiiv19vFWmGrcVDsvKupqeky/056VMf1j9dQOViBKo9Aa/ixdbnYcrQGWsBc1jQ2NtrZQ/VKShHM8kvdEPVN9qJsoBRl/aUoHyiJ+UpcCxJTtmfCDYoHJT2yYyOlPtcaCoUmGGwdbkVRbxGK+2y0gg2GisUvNmJCy/BVUJqm/eBIxXqpgbUtiBise12HQlc+ClwFSKRCiZH6wXpQs7OzETWn6XENa/trYemywuK0IpGsTotgRU3fcVBzouWG6pOnpqY0BhuGGpDXeUjIW7JKcfuX3tjjP9k4FBkZN4PtY+042JGzzNMcGDJ35C7tmcU++tJmjE63OpSUuLEJ62GcfXUO+59kr8rJnlOY0WfAGtYaY/PHYPv9fhdEY7++4nz/BWS17UPWY0Es2avWp3vOYOTnCCheBtaqHskJr95kZBL3AvdR2XkEex5mYbdQ+qwCd97dRTAcXHn1Moyrt16PA2tN//V8jY+Pf4cS/VWerzU9sDay1gd2Xf4F/AZqlpeB9836LwAAAABJRU5ErkJggg==) no-repeat center center;cursor:pointer}tr.dt-hasChild td.dt-control{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAACdUlEQVR4Aa2V30tTYRjHVSgsoQKhXPUPlKZMlImiIIg/pggiiDeCBAdqyC4Kf9zVhVdeelX33QnCbtYvxZsxxkoqKxiz1SzdFudMb5xO5/bt+fa+sPCw3IVf+PA+532e5ytn53lfK0qoSrggXBauCbUKxtxjjjVnq1IXXxFuCXeEFqGdMOYec6zRtZX/M6sWrgv1hmHcDwQCLxOJxM9CoZAnjLnHHGt0bbXdVG1cEm4KLp/P9yKXyx2jhJhjDWvZc9qUwUWhzuFwdMVisc8QFQ4PcbCygvT0NJLDw0gNDSH96DEyfj8KmQwo1rJHem8oD2VapX/sxlAo9Aqi/N4e9hYWsDMwgARxD2DH7ZZYren5eZxYFqhgMOhnr3BVeSnn216v98Hf3yqXg/X0CX719YFs9/WquJfPGtkzZ2fBWvZ4PB6DHtqrokaol7/0GqLM2hq2enpsxMmpvf3VVVD8UOJxV42Uet1Wy7J+M5mam8P37u6ySM7MgDJNM8mRUl5qYDtOREz+GB3FZlcXNjs7UUrMk/jYGKhsNnuo57TWZhgTw0hHO0EpRdpV/tvICKgjUdFQv/Lu7q7JZHxqCl9dLqGtSJtL4VJ80Wvc8xD2V9YfRUbmLZPp5WVstLTYaSWt+lmt1tISKH5Q/VFqbGOTl6GNTk7iQ3Oz4FSrU8UfuTqdBJHxceQz+2APe/8Zm+Jgh8PhNxBlt7YQNQysNzVivbEJ7wXGiiZEJiZwEI2C4mFgr/aoKnn0jk0TiWfPsTE4iHcN9xBuaMCn/n5sLy7iKJk8ffTqikfvfC4H9laWdX2lUqltaDEu9/o664LtIOVfsOf4L+APb5yaiwyN8+8AAAAASUVORK5CYII=) no-repeat center center}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand;background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC)}table.dataTable thead .sorting_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==) !important}table.dataTable thead .sorting_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=) !important}table.dataTable thead .sorting_asc_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAWUlEQVQoz2NgGAWDCtyJvPPzznc4/HknEbsy9js77vyHw313eHGZZ3PnE1TRuzuOuK1lvDMRqmzuHUZ87lO+cxuo6PEdLUIeyb7z604pYf+y3Zlwh4u2YQoAc7ZCBHH4jigAAAAASUVORK5CYII=)}table.dataTable thead .sorting_desc_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAW0lEQVQoz2NgoCm4w3Vnwh02wspK7/y6k01Ikdadx3f+37l9RxmfIsY7c4GKQHDiHUbcyhzvvIMq+3THBpci3jv7oIpAcMcdduzKEu/8vPMdDn/eiWQYBYMKAAC3ykIEuYQJUgAAAABJRU5ErkJggg==)}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, white 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, white 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, white 0%, #dcdcdc 100%);background:-o-linear-gradient(top, white 0%, #dcdcdc 100%);background:linear-gradient(to bottom, white 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));background:-webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}} diff --git a/pre-release/articles/adbcva_files/dt-core-1.11.3/js/jquery.dataTables.min.js b/pre-release/articles/adbcva_files/dt-core-1.11.3/js/jquery.dataTables.min.js deleted file mode 100644 index ff23e914..00000000 --- a/pre-release/articles/adbcva_files/dt-core-1.11.3/js/jquery.dataTables.min.js +++ /dev/null @@ -1,187 +0,0 @@ -/*! - Copyright 2008-2021 SpryMedia Ltd. - - This source file is free software, available under the following license: - MIT license - http://datatables.net/license - - This source file is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. - - For details please refer to: http://www.datatables.net - DataTables 1.11.3 - ©2008-2021 SpryMedia Ltd - datatables.net/license -*/ -var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(l,z,A){l instanceof String&&(l=String(l));for(var q=l.length,E=0;E").css({position:"fixed",top:0,left:-1*l(z).scrollLeft(),height:1, -width:1,overflow:"hidden"}).append(l("
    ").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(l("
    ").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}l.extend(a.oBrowser,u.__browser);a.oScroll.iBarWidth=u.__browser.barWidth} -function Cb(a,b,c,d,e,h){var f=!1;if(c!==q){var g=c;f=!0}for(;d!==e;)a.hasOwnProperty(d)&&(g=f?b(g,a[d],d,a):a[d],f=!0,d+=h);return g}function Xa(a,b){var c=u.defaults.column,d=a.aoColumns.length;c=l.extend({},u.models.oColumn,c,{nTh:b?b:A.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=l.extend({},u.models.oSearch,c[d]);Ga(a,d,l(b).data())}function Ga(a,b,c){b=a.aoColumns[b]; -var d=a.oClasses,e=l(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var h=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);h&&(b.sWidthOrig=h[1])}c!==q&&null!==c&&(Ab(c),P(u.defaults.column,c,!0),c.mDataProp===q||c.mData||(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),l.extend(b,c),X(b,c,"sWidth","sWidthOrig"),c.iDataSort!==q&&(b.aDataSort=[c.iDataSort]),X(b,c,"aDataSort"));var f=b.mData,g=na(f), -k=b.mRender?na(b.mRender):null;c=function(m){return"string"===typeof m&&-1!==m.indexOf("@")};b._bAttrSrc=l.isPlainObject(f)&&(c(f.sort)||c(f.type)||c(f.filter));b._setter=null;b.fnGetData=function(m,n,p){var t=g(m,n,q,p);return k&&n?k(t,n,m,p):t};b.fnSetData=function(m,n,p){return ha(f)(m,n,p)};"number"!==typeof f&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==l.inArray("asc",b.asSorting);c=-1!==l.inArray("desc",b.asSorting);b.bSortable&&(a||c)?a&&!c? -(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI):(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI="")}function ta(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ya(a);for(var c=0,d=b.length;cm[n])d(g.length+m[n],k);else if("string"===typeof m[n]){var p=0;for(f=g.length;pb&&a[e]--; -1!=d&&c===q&&a.splice(d,1)}function wa(a,b,c,d){var e=a.aoData[b],h,f=function(k,m){for(;k.childNodes.length;)k.removeChild(k.firstChild);k.innerHTML=T(a,b,m,"display")};if("dom"!==c&&(c&&"auto"!==c||"dom"!==e.src)){var g=e.anCells;if(g)if(d!==q)f(g[d],d);else for(c=0,h=g.length;c").appendTo(d));var k=0;for(b=g.length;k=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);g=a._iDisplayStart;var n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,V(a,!1);else if(!k)a.iDraw++;else if(!a.bDestroying&&!b){Gb(a);return}if(0!==m.length)for(b=k?a.aoData.length:n,f=k?0:g;f",{"class":h?e[0]:""}).append(l("",{valign:"top",colSpan:oa(a),"class":a.oClasses.sRowEmpty}).html(d))[0];F(a,"aoHeaderCallback","header",[l(a.nTHead).children("tr")[0],cb(a),g,n,m]);F(a,"aoFooterCallback", -"footer",[l(a.nTFoot).children("tr")[0],cb(a),g,n,m]);e=l(a.nTBody);e.children().detach();e.append(l(c));F(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function ka(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&Hb(a);d?za(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;ja(a);a._drawHold=!1}function Ib(a){var b=a.oClasses,c=l(a.nTable);c=l("
    ").insertBefore(c);var d=a.oFeatures,e=l("
    ",{id:a.sTableId+"_wrapper", -"class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var h=a.sDom.split(""),f,g,k,m,n,p,t=0;t")[0];m=h[t+1];if("'"==m||'"'==m){n="";for(p=2;h[t+p]!=m;)n+=h[t+p],p++;"H"==n?n=b.sJUIHeader:"F"==n&&(n=b.sJUIFooter);-1!=n.indexOf(".")?(m=n.split("."),k.id=m[0].substr(1,m[0].length-1),k.className=m[1]):"#"==n.charAt(0)?k.id=n.substr(1,n.length-1):k.className=n;t+=p}e.append(k); -e=l(k)}else if(">"==g)e=e.parent();else if("l"==g&&d.bPaginate&&d.bLengthChange)f=Jb(a);else if("f"==g&&d.bFilter)f=Kb(a);else if("r"==g&&d.bProcessing)f=Lb(a);else if("t"==g)f=Mb(a);else if("i"==g&&d.bInfo)f=Nb(a);else if("p"==g&&d.bPaginate)f=Ob(a);else if(0!==u.ext.feature.length)for(k=u.ext.feature,p=0,m=k.length;p',g=d.sSearch;g=g.match(/_INPUT_/)?g.replace("_INPUT_",f):g+f;b=l("
    ",{id:h.f?null:c+"_filter","class":b.sFilter}).append(l("
    ").addClass(b.sLength);a.aanFeatures.l||(k[0].id=c+"_length");k.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));l("select",k).val(a._iDisplayLength).on("change.DT",function(m){jb(a,l(this).val());ja(a)});l(a.nTable).on("length.dt.DT",function(m,n,p){a===n&&l("select",k).val(p)});return k[0]}function Ob(a){var b=a.sPaginationType,c=u.ext.pager[b],d="function"===typeof c,e=function(f){ja(f)};b=l("
    ").addClass(a.oClasses.sPaging+b)[0]; -var h=a.aanFeatures;d||c.fnInit(a,b,e);h.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(f){if(d){var g=f._iDisplayStart,k=f._iDisplayLength,m=f.fnRecordsDisplay(),n=-1===k;g=n?0:Math.ceil(g/k);k=n?1:Math.ceil(m/k);m=c(g,k);var p;n=0;for(p=h.p.length;nh&& -(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e",{id:a.aanFeatures.r?null:a.sTableId+"_processing","class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function V(a,b){a.oFeatures.bProcessing&&l(a.aanFeatures.r).css("display",b?"block":"none"); -F(a,null,"processing",[a,b])}function Mb(a){var b=l(a.nTable),c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,h=a.oClasses,f=b.children("caption"),g=f.length?f[0]._captionSide:null,k=l(b[0].cloneNode(!1)),m=l(b[0].cloneNode(!1)),n=b.children("tfoot");n.length||(n=null);k=l("
    ",{"class":h.sScrollWrapper}).append(l("
    ",{"class":h.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?d?K(d):null:"100%"}).append(l("
    ",{"class":h.sScrollHeadInner}).css({"box-sizing":"content-box", -width:c.sXInner||"100%"}).append(k.removeAttr("id").css("margin-left",0).append("top"===g?f:null).append(b.children("thead"))))).append(l("
    ",{"class":h.sScrollBody}).css({position:"relative",overflow:"auto",width:d?K(d):null}).append(b));n&&k.append(l("
    ",{"class":h.sScrollFoot}).css({overflow:"hidden",border:0,width:d?d?K(d):null:"100%"}).append(l("
    ",{"class":h.sScrollFootInner}).append(m.removeAttr("id").css("margin-left",0).append("bottom"===g?f:null).append(b.children("tfoot"))))); -b=k.children();var p=b[0];h=b[1];var t=n?b[2]:null;if(d)l(h).on("scroll.DT",function(v){v=this.scrollLeft;p.scrollLeft=v;n&&(t.scrollLeft=v)});l(h).css("max-height",e);c.bCollapse||l(h).css("height",e);a.nScrollHead=p;a.nScrollBody=h;a.nScrollFoot=t;a.aoDrawCallback.push({fn:Ha,sName:"scrolling"});return k[0]}function Ha(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY;b=b.iBarWidth;var h=l(a.nScrollHead),f=h[0].style,g=h.children("div"),k=g[0].style,m=g.children("table");g=a.nScrollBody;var n=l(g),p= -g.style,t=l(a.nScrollFoot).children("div"),v=t.children("table"),x=l(a.nTHead),w=l(a.nTable),r=w[0],C=r.style,G=a.nTFoot?l(a.nTFoot):null,aa=a.oBrowser,L=aa.bScrollOversize;U(a.aoColumns,"nTh");var O=[],I=[],H=[],ea=[],Y,Ca=function(D){D=D.style;D.paddingTop="0";D.paddingBottom="0";D.borderTopWidth="0";D.borderBottomWidth="0";D.height=0};var fa=g.scrollHeight>g.clientHeight;if(a.scrollBarVis!==fa&&a.scrollBarVis!==q)a.scrollBarVis=fa,ta(a);else{a.scrollBarVis=fa;w.children("thead, tfoot").remove(); -if(G){var ba=G.clone().prependTo(w);var la=G.find("tr");ba=ba.find("tr")}var mb=x.clone().prependTo(w);x=x.find("tr");fa=mb.find("tr");mb.find("th, td").removeAttr("tabindex");c||(p.width="100%",h[0].style.width="100%");l.each(Na(a,mb),function(D,W){Y=ua(a,D);W.style.width=a.aoColumns[Y].sWidth});G&&ca(function(D){D.style.width=""},ba);h=w.outerWidth();""===c?(C.width="100%",L&&(w.find("tbody").height()>g.offsetHeight||"scroll"==n.css("overflow-y"))&&(C.width=K(w.outerWidth()-b)),h=w.outerWidth()): -""!==d&&(C.width=K(d),h=w.outerWidth());ca(Ca,fa);ca(function(D){var W=z.getComputedStyle?z.getComputedStyle(D).width:K(l(D).width());H.push(D.innerHTML);O.push(W)},fa);ca(function(D,W){D.style.width=O[W]},x);l(fa).height(0);G&&(ca(Ca,ba),ca(function(D){ea.push(D.innerHTML);I.push(K(l(D).css("width")))},ba),ca(function(D,W){D.style.width=I[W]},la),l(ba).height(0));ca(function(D,W){D.innerHTML='
    '+H[W]+"
    ";D.childNodes[0].style.height="0";D.childNodes[0].style.overflow= -"hidden";D.style.width=O[W]},fa);G&&ca(function(D,W){D.innerHTML='
    '+ea[W]+"
    ";D.childNodes[0].style.height="0";D.childNodes[0].style.overflow="hidden";D.style.width=I[W]},ba);w.outerWidth()g.offsetHeight||"scroll"==n.css("overflow-y")?h+b:h,L&&(g.scrollHeight>g.offsetHeight||"scroll"==n.css("overflow-y"))&&(C.width=K(la-b)),""!==c&&""===d||da(a,1,"Possible column misalignment",6)):la="100%";p.width=K(la);f.width=K(la);G&&(a.nScrollFoot.style.width= -K(la));!e&&L&&(p.height=K(r.offsetHeight+b));c=w.outerWidth();m[0].style.width=K(c);k.width=K(c);d=w.height()>g.clientHeight||"scroll"==n.css("overflow-y");e="padding"+(aa.bScrollbarLeft?"Left":"Right");k[e]=d?b+"px":"0px";G&&(v[0].style.width=K(c),t[0].style.width=K(c),t[0].style[e]=d?b+"px":"0px");w.children("colgroup").insertBefore(w.children("thead"));n.trigger("scroll");!a.bSorted&&!a.bFiltered||a._drawHold||(g.scrollTop=0)}}function ca(a,b,c){for(var d=0,e=0,h=b.length,f,g;e").appendTo(g.find("tbody"));g.find("thead, tfoot").remove();g.append(l(a.nTHead).clone()).append(l(a.nTFoot).clone());g.find("tfoot th, tfoot td").css("width","");m=Na(a,g.find("thead")[0]);for(v=0;v").css({width:w.sWidthOrig, -margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(v=0;v").css(h||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(g).appendTo(p);h&&f?g.width(f):h?(g.css("width","auto"),g.removeAttr("width"),g.width()").css("width",K(a)).appendTo(b||A.body);b=a[0].offsetWidth;a.remove();return b}function $b(a,b){var c=ac(a,b);if(0>c)return null;var d=a.aoData[c];return d.nTr?d.anCells[b]: -l("").html(T(a,c,b,"display"))[0]}function ac(a,b){for(var c,d=-1,e=-1,h=0,f=a.aoData.length;hd&&(d=c.length,e=h);return e}function K(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function pa(a){var b=[],c=a.aoColumns;var d=a.aaSortingFixed;var e=l.isPlainObject(d);var h=[];var f=function(n){n.length&&!Array.isArray(n[0])?h.push(n):l.merge(h,n)};Array.isArray(d)&&f(d); -e&&d.pre&&f(d.pre);f(a.aaSorting);e&&d.post&&f(d.post);for(a=0;aG?1:0;if(0!==C)return"asc"===r.dir?C:-C}C=c[n];G=c[p];return CG?1:0}):f.sort(function(n,p){var t,v=g.length,x=e[n]._aSortData,w=e[p]._aSortData;for(t=0;tG?1:0})}a.bSorted=!0}function cc(a){var b=a.aoColumns,c=pa(a);a=a.oLanguage.oAria;for(var d=0,e=b.length;d/g,"");var k=h.nTh;k.removeAttribute("aria-sort");h.bSortable&&(0e?e+1:3))}e=0;for(h=d.length;ee?e+1:3))}a.aLastSort=d}function bc(a,b){var c=a.aoColumns[b],d=u.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,va(a,b)));for(var h,f=u.ext.type.order[c.sType+"-pre"],g=0,k=a.aoData.length;g=e.length?[0, -m[1]]:m)}));b.search!==q&&l.extend(a.oPreviousSearch,Wb(b.search));if(b.columns){f=0;for(d=b.columns.length;f=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function fb(a,b){a=a.renderer;var c=u.ext.renderer[b];return l.isPlainObject(a)&&a[b]?c[a[b]]||c._:"string"===typeof a?c[a]||c._:c._}function Q(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Da(a,b){var c=ec.numbers_length,d=Math.floor(c/2); -b<=c?a=ra(0,b):a<=d?(a=ra(0,c-2),a.push("ellipsis"),a.push(b-1)):(a>=b-1-d?a=ra(b-(c-2),b):(a=ra(a-d+2,a+d-1),a.push("ellipsis"),a.push(b-1)),a.splice(0,0,"ellipsis"),a.splice(0,0,0));a.DT_el="span";return a}function Wa(a){l.each({num:function(b){return Ta(b,a)},"num-fmt":function(b){return Ta(b,a,rb)},"html-num":function(b){return Ta(b,a,Ua)},"html-num-fmt":function(b){return Ta(b,a,Ua,rb)}},function(b,c){M.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(M.type.search[b+a]=M.type.search.html)})}function fc(a){return function(){var b= -[Sa(this[u.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return u.ext.internal[a].apply(this,b)}}var u=function(a,b){if(this instanceof u)return l(a).DataTable(b);b=a;this.$=function(f,g){return this.api(!0).$(f,g)};this._=function(f,g){return this.api(!0).rows(f,g).data()};this.api=function(f){return f?new B(Sa(this[M.iApiIndex])):new B(this)};this.fnAddData=function(f,g){var k=this.api(!0);f=Array.isArray(f)&&(Array.isArray(f[0])||l.isPlainObject(f[0]))?k.rows.add(f):k.row.add(f); -(g===q||g)&&k.draw();return f.flatten().toArray()};this.fnAdjustColumnSizing=function(f){var g=this.api(!0).columns.adjust(),k=g.settings()[0],m=k.oScroll;f===q||f?g.draw(!1):(""!==m.sX||""!==m.sY)&&Ha(k)};this.fnClearTable=function(f){var g=this.api(!0).clear();(f===q||f)&&g.draw()};this.fnClose=function(f){this.api(!0).row(f).child.hide()};this.fnDeleteRow=function(f,g,k){var m=this.api(!0);f=m.rows(f);var n=f.settings()[0],p=n.aoData[f[0][0]];f.remove();g&&g.call(this,n,p);(k===q||k)&&m.draw(); -return p};this.fnDestroy=function(f){this.api(!0).destroy(f)};this.fnDraw=function(f){this.api(!0).draw(f)};this.fnFilter=function(f,g,k,m,n,p){n=this.api(!0);null===g||g===q?n.search(f,k,m,p):n.column(g).search(f,k,m,p);n.draw()};this.fnGetData=function(f,g){var k=this.api(!0);if(f!==q){var m=f.nodeName?f.nodeName.toLowerCase():"";return g!==q||"td"==m||"th"==m?k.cell(f,g).data():k.row(f).data()||null}return k.data().toArray()};this.fnGetNodes=function(f){var g=this.api(!0);return f!==q?g.row(f).node(): -g.rows().nodes().flatten().toArray()};this.fnGetPosition=function(f){var g=this.api(!0),k=f.nodeName.toUpperCase();return"TR"==k?g.row(f).index():"TD"==k||"TH"==k?(f=g.cell(f).index(),[f.row,f.columnVisible,f.column]):null};this.fnIsOpen=function(f){return this.api(!0).row(f).child.isShown()};this.fnOpen=function(f,g,k){return this.api(!0).row(f).child(g,k).show().child()[0]};this.fnPageChange=function(f,g){f=this.api(!0).page(f);(g===q||g)&&f.draw(!1)};this.fnSetColumnVis=function(f,g,k){f=this.api(!0).column(f).visible(g); -(k===q||k)&&f.columns.adjust().draw()};this.fnSettings=function(){return Sa(this[M.iApiIndex])};this.fnSort=function(f){this.api(!0).order(f).draw()};this.fnSortListener=function(f,g,k){this.api(!0).order.listener(f,g,k)};this.fnUpdate=function(f,g,k,m,n){var p=this.api(!0);k===q||null===k?p.row(g).data(f):p.cell(g,k).data(f);(n===q||n)&&p.columns.adjust();(m===q||m)&&p.draw();return 0};this.fnVersionCheck=M.fnVersionCheck;var c=this,d=b===q,e=this.length;d&&(b={});this.oApi=this.internal=M.internal; -for(var h in u.ext.internal)h&&(this[h]=fc(h));this.each(function(){var f={},g=1").appendTo(t));r.nTHead=H[0];var ea=t.children("tbody");0===ea.length&&(ea=l("").insertAfter(H)); -r.nTBody=ea[0];H=t.children("tfoot");0===H.length&&0").appendTo(t));0===H.length||0===H.children().length?t.addClass(C.sNoFooter):0/g,uc=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,vc=/(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\}|\\|\$|\^|\-)/g,rb=/['\u00A0,$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,Z=function(a){return a&&!0!==a&&"-"!==a?!1:!0},hc=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},ic=function(a,b){sb[b]||(sb[b]=new RegExp(ib(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g, -"").replace(sb[b],"."):a},tb=function(a,b,c){var d="string"===typeof a;if(Z(a))return!0;b&&d&&(a=ic(a,b));c&&d&&(a=a.replace(rb,""));return!isNaN(parseFloat(a))&&isFinite(a)},jc=function(a,b,c){return Z(a)?!0:Z(a)||"string"===typeof a?tb(a.replace(Ua,""),b,c)?!0:null:null},U=function(a,b,c){var d=[],e=0,h=a.length;if(c!==q)for(;ea.length)){var b=a.slice().sort();for(var c=b[0],d=1,e=b.length;d")[0],sc=Qa.textContent!==q,tc=/<.*?>/g,gb=u.util.throttle,nc=[],N=Array.prototype,wc=function(a){var b,c=u.settings,d=l.map(c,function(h,f){return h.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase()){var e=l.inArray(a,d);return-1!==e?[c[e]]:null}if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?b=l(a):a instanceof l&&(b=a)}else return[];if(b)return b.map(function(h){e= -l.inArray(this,d);return-1!==e?c[e]:null}).toArray()};var B=function(a,b){if(!(this instanceof B))return new B(a,b);var c=[],d=function(f){(f=wc(f))&&c.push.apply(c,f)};if(Array.isArray(a))for(var e=0,h=a.length;ea?new B(b[a],this[a]):null},filter:function(a){var b=[];if(N.filter)b=N.filter.call(this,a,this);else for(var c=0,d=this.length;c").addClass(g),l("td",k).addClass(g).html(f)[0].colSpan= -oa(a),e.push(k[0]))};h(c,d);b._details&&b._details.detach();b._details=l(e);b._detailsShow&&b._details.insertAfter(b.nTr)},xb=function(a,b){var c=a.context;c.length&&(a=c[0].aoData[b!==q?b:a[0]])&&a._details&&(a._details.remove(),a._detailsShow=q,a._details=q,l(a.nTr).removeClass("dt-hasChild"),qa(c[0]))},qc=function(a,b){var c=a.context;if(c.length&&a.length){var d=c[0].aoData[a[0]];d._details&&((d._detailsShow=b)?(d._details.insertAfter(d.nTr),l(d.nTr).addClass("dt-hasChild")):(d._details.detach(), -l(d.nTr).removeClass("dt-hasChild")),F(c[0],null,"childRow",[b,a.row(a[0])]),zc(c[0]),qa(c[0]))}},zc=function(a){var b=new B(a),c=a.aoData;b.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0g){var n=l.map(d,function(p,t){return p.bVisible?t:null});return[n[n.length+g]]}return[ua(a,g)];case "name":return l.map(e,function(p,t){return p===m[1]?t:null});default:return[]}if(f.nodeName&&f._DT_CellIndex)return[f._DT_CellIndex.column]; -g=l(h).filter(f).map(function(){return l.inArray(this,h)}).toArray();if(g.length||!f.nodeName)return g;g=l(f).closest("*[data-dt-column]");return g.length?[g.data("dt-column")]:[]},a,c)};y("columns()",function(a,b){a===q?a="":l.isPlainObject(a)&&(b=a,a="");b=vb(b);var c=this.iterator("table",function(d){return Bc(d,a,b)},1);c.selector.cols=a;c.selector.opts=b;return c});J("columns().header()","column().header()",function(a,b){return this.iterator("column",function(c,d){return c.aoColumns[d].nTh}, -1)});J("columns().footer()","column().footer()",function(a,b){return this.iterator("column",function(c,d){return c.aoColumns[d].nTf},1)});J("columns().data()","column().data()",function(){return this.iterator("column-rows",rc,1)});J("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});J("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,h){return Ea(b.aoData,h,"search"=== -a?"_aFilterData":"_aSortData",c)},1)});J("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return Ea(a.aoData,e,"anCells",b)},1)});J("columns().visible()","column().visible()",function(a,b){var c=this,d=this.iterator("column",function(e,h){if(a===q)return e.aoColumns[h].bVisible;var f=e.aoColumns,g=f[h],k=e.aoData,m;if(a!==q&&g.bVisible!==a){if(a){var n=l.inArray(!0,U(f,"bVisible"),h+1);f=0;for(m=k.length;fd;return!0};u.isDataTable=u.fnIsDataTable=function(a){var b= -l(a).get(0),c=!1;if(a instanceof u.Api)return!0;l.each(u.settings,function(d,e){d=e.nScrollHead?l("table",e.nScrollHead)[0]:null;var h=e.nScrollFoot?l("table",e.nScrollFoot)[0]:null;if(e.nTable===b||d===b||h===b)c=!0});return c};u.tables=u.fnTables=function(a){var b=!1;l.isPlainObject(a)&&(b=a.api,a=a.visible);var c=l.map(u.settings,function(d){if(!a||a&&l(d.nTable).is(":visible"))return d.nTable});return b?new B(c):c};u.camelToHungarian=P;y("$()",function(a,b){b=this.rows(b).nodes();b=l(b);return l([].concat(b.filter(a).toArray(), -b.find(a).toArray()))});l.each(["on","one","off"],function(a,b){y(b+"()",function(){var c=Array.prototype.slice.call(arguments);c[0]=l.map(c[0].split(/\s/),function(e){return e.match(/\.dt\b/)?e:e+".dt"}).join(" ");var d=l(this.tables().nodes());d[b].apply(d,c);return this})});y("clear()",function(){return this.iterator("table",function(a){Ka(a)})});y("settings()",function(){return new B(this.context,this.context)});y("init()",function(){var a=this.context;return a.length?a[0].oInit:null});y("data()", -function(){return this.iterator("table",function(a){return U(a.aoData,"_aData")}).flatten()});y("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,h=b.nTBody,f=b.nTHead,g=b.nTFoot,k=l(e);h=l(h);var m=l(b.nTableWrapper),n=l.map(b.aoData,function(t){return t.nTr}),p;b.bDestroying=!0;F(b,"aoDestroyCallback","destroy",[b]);a||(new B(b)).columns().visible(!0);m.off(".DT").find(":not(tbody *)").off(".DT");l(z).off(".DT-"+b.sInstance); -e!=f.parentNode&&(k.children("thead").detach(),k.append(f));g&&e!=g.parentNode&&(k.children("tfoot").detach(),k.append(g));b.aaSorting=[];b.aaSortingFixed=[];Ra(b);l(n).removeClass(b.asStripeClasses.join(" "));l("th, td",f).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);h.children().detach();h.append(n);f=a?"remove":"detach";k[f]();m[f]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),k.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&& -h.children().each(function(t){l(this).addClass(b.asDestroyStripes[t%p])}));c=l.inArray(b,u.settings);-1!==c&&u.settings.splice(c,1)})});l.each(["column","row","cell"],function(a,b){y(b+"s().every()",function(c){var d=this.selector.opts,e=this;return this.iterator(b,function(h,f,g,k,m){c.call(e[b](f,"cell"===b?g:d,"cell"===b?d:q),f,g,k,m)})})});y("i18n()",function(a,b,c){var d=this.context[0];a=na(a)(d.oLanguage);a===q&&(a=b);c!==q&&l.isPlainObject(a)&&(a=a[c]!==q?a[c]:a._);return a.replace("%d",c)}); -u.version="1.11.3";u.settings=[];u.models={};u.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0,"return":!1};u.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};u.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null, -sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};u.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1, -bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){return{}}}, -fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last", -sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:l.extend({},u.models.oSearch),sAjaxDataProp:"data", -sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};E(u.defaults);u.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};E(u.defaults.column);u.models.oSettings= -{oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{}, -aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0, -aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,jqXHR:null,json:q,oAjaxData:q,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==Q(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length}, -fnRecordsDisplay:function(){return"ssp"==Q(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,h=e.bPaginate;return e.bServerSide?!1===h||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!h||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};u.ext=M={buttons:{},classes:{},builder:"-source-", -errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:u.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:u.version};l.extend(M,{afnFiltering:M.search,aTypes:M.type.detect,ofnSearch:M.type.search,oSort:M.type.order,afnSortData:M.order,aoFeatures:M.feature,oApi:M.internal,oStdClasses:M.classes,oPagination:M.pager});l.extend(u.ext.classes, -{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_desc_disabled",sSortableDesc:"sorting_asc_disabled", -sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var ec= -u.ext.pager;l.extend(ec,{simple:function(a,b){return["previous","next"]},full:function(a,b){return["first","previous","next","last"]},numbers:function(a,b){return[Da(a,b)]},simple_numbers:function(a,b){return["previous",Da(a,b),"next"]},full_numbers:function(a,b){return["first","previous",Da(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",Da(a,b),"last"]},_numbers:Da,numbers_length:7});l.extend(!0,u.ext.renderer,{pageButton:{_:function(a,b,c,d,e,h){var f=a.oClasses,g=a.oLanguage.oPaginate, -k=a.oLanguage.oAria.paginate||{},m,n,p=0,t=function(x,w){var r,C=f.sPageButtonDisabled,G=function(I){lb(a,I.data.action,!0)};var aa=0;for(r=w.length;aa").appendTo(x);t(O,L)}else{m=null;n=L;O=a.iTabIndex;switch(L){case "ellipsis":x.append('');break;case "first":m=g.sFirst;0===e&&(O=-1,n+=" "+C);break;case "previous":m=g.sPrevious;0===e&&(O=-1,n+=" "+C);break;case "next":m=g.sNext;if(0=== -h||e===h-1)O=-1,n+=" "+C;break;case "last":m=g.sLast;if(0===h||e===h-1)O=-1,n+=" "+C;break;default:m=a.fnFormatNumber(L+1),n=e===L?f.sPageButtonActive:""}null!==m&&(O=l("",{"class":f.sPageButton+" "+n,"aria-controls":a.sTableId,"aria-label":k[L],"data-dt-idx":p,tabindex:O,id:0===c&&"string"===typeof L?a.sTableId+"_"+L:null}).html(m).appendTo(x),ob(O,{action:L},G),p++)}}};try{var v=l(b).find(A.activeElement).data("dt-idx")}catch(x){}t(l(b).empty(),d);v!==q&&l(b).find("[data-dt-idx="+v+"]").trigger("focus")}}}); -l.extend(u.ext.type.detect,[function(a,b){b=b.oLanguage.sDecimal;return tb(a,b)?"num"+b:null},function(a,b){if(a&&!(a instanceof Date)&&!uc.test(a))return null;b=Date.parse(a);return null!==b&&!isNaN(b)||Z(a)?"date":null},function(a,b){b=b.oLanguage.sDecimal;return tb(a,b,!0)?"num-fmt"+b:null},function(a,b){b=b.oLanguage.sDecimal;return jc(a,b)?"html-num"+b:null},function(a,b){b=b.oLanguage.sDecimal;return jc(a,b,!0)?"html-num-fmt"+b:null},function(a,b){return Z(a)||"string"===typeof a&&-1!==a.indexOf("<")? -"html":null}]);l.extend(u.ext.type.search,{html:function(a){return Z(a)?a:"string"===typeof a?a.replace(gc," ").replace(Ua,""):""},string:function(a){return Z(a)?a:"string"===typeof a?a.replace(gc," "):a}});var Ta=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=ic(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};l.extend(M.type.order,{"date-pre":function(a){a=Date.parse(a);return isNaN(a)?-Infinity:a},"html-pre":function(a){return Z(a)?"":a.replace?a.replace(/<.*?>/g, -"").toLowerCase():a+""},"string-pre":function(a){return Z(a)?"":"string"===typeof a?a.toLowerCase():a.toString?a.toString():""},"string-asc":function(a,b){return ab?1:0},"string-desc":function(a,b){return ab?-1:0}});Wa("");l.extend(!0,u.ext.renderer,{header:{_:function(a,b,c,d){l(a.nTable).on("order.dt.DT",function(e,h,f,g){a===h&&(e=c.idx,b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass("asc"==g[e]?d.sSortAsc:"desc"==g[e]?d.sSortDesc:c.sSortingClass))})},jqueryui:function(a,b,c, -d){l("
    ").addClass(d.sSortJUIWrapper).append(b.contents()).append(l("").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);l(a.nTable).on("order.dt.DT",function(e,h,f,g){a===h&&(e=c.idx,b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass("asc"==g[e]?d.sSortAsc:"desc"==g[e]?d.sSortDesc:c.sSortingClass),b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass("asc"==g[e]?d.sSortJUIAsc:"desc"== -g[e]?d.sSortJUIDesc:c.sSortingClassJUI))})}}});var yb=function(a){Array.isArray(a)&&(a=a.join(","));return"string"===typeof a?a.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""):a};u.render={number:function(a,b,c,d,e){return{display:function(h){if("number"!==typeof h&&"string"!==typeof h)return h;var f=0>h?"-":"",g=parseFloat(h);if(isNaN(g))return yb(h);g=g.toFixed(c);h=Math.abs(g);g=parseInt(h,10);h=c?b+(h-g).toFixed(c).substring(2):"";0===g&&0===parseFloat(h)&& -(f="");return f+(d||"")+g.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+h+(e||"")}}},text:function(){return{display:yb,filter:yb}}};l.extend(u.ext.internal,{_fnExternApiFunc:fc,_fnBuildAjax:Oa,_fnAjaxUpdate:Gb,_fnAjaxParameters:Pb,_fnAjaxUpdateDraw:Qb,_fnAjaxDataSrc:Aa,_fnAddColumn:Xa,_fnColumnOptions:Ga,_fnAdjustColumnSizing:ta,_fnVisibleToColumnIndex:ua,_fnColumnIndexToVisible:va,_fnVisbleColumns:oa,_fnGetColumns:Ia,_fnColumnTypes:Za,_fnApplyColumnDefs:Db,_fnHungarianMap:E,_fnCamelToHungarian:P, -_fnLanguageCompat:ma,_fnBrowserDetect:Bb,_fnAddData:ia,_fnAddTr:Ja,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==q?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return l.inArray(c,a.aoData[b].anCells)},_fnGetCellData:T,_fnSetCellData:Eb,_fnSplitObjNotation:bb,_fnGetObjectDataFn:na,_fnSetObjectDataFn:ha,_fnGetDataMaster:cb,_fnClearTable:Ka,_fnDeleteIndex:La,_fnInvalidate:wa,_fnGetRowElements:ab,_fnCreateTr:$a,_fnBuildHead:Fb,_fnDrawHead:ya,_fnDraw:ja,_fnReDraw:ka,_fnAddOptionsHtml:Ib, -_fnDetectHeader:xa,_fnGetUniqueThs:Na,_fnFeatureHtmlFilter:Kb,_fnFilterComplete:za,_fnFilterCustom:Tb,_fnFilterColumn:Sb,_fnFilter:Rb,_fnFilterCreateSearch:hb,_fnEscapeRegex:ib,_fnFilterData:Ub,_fnFeatureHtmlInfo:Nb,_fnUpdateInfo:Xb,_fnInfoMacros:Yb,_fnInitialise:Ba,_fnInitComplete:Pa,_fnLengthChange:jb,_fnFeatureHtmlLength:Jb,_fnFeatureHtmlPaginate:Ob,_fnPageChange:lb,_fnFeatureHtmlProcessing:Lb,_fnProcessingDisplay:V,_fnFeatureHtmlTable:Mb,_fnScrollDraw:Ha,_fnApplyToChildren:ca,_fnCalculateColumnWidths:Ya, -_fnThrottle:gb,_fnConvertToWidth:Zb,_fnGetWidestNode:$b,_fnGetMaxLenString:ac,_fnStringToCss:K,_fnSortFlatten:pa,_fnSort:Hb,_fnSortAria:cc,_fnSortListener:nb,_fnSortAttachListener:eb,_fnSortingClasses:Ra,_fnSortData:bc,_fnSaveState:qa,_fnLoadState:dc,_fnImplementState:pb,_fnSettingsFromNode:Sa,_fnLog:da,_fnMap:X,_fnBindAction:ob,_fnCallbackReg:R,_fnCallbackFire:F,_fnLengthOverflow:kb,_fnRenderer:fb,_fnDataSource:Q,_fnRowAttributes:db,_fnExtend:qb,_fnCalculateEnd:function(){}});l.fn.dataTable=u;u.$= -l;l.fn.dataTableSettings=u.settings;l.fn.dataTableExt=u.ext;l.fn.DataTable=function(a){return l(this).dataTable(a).api()};l.each(u,function(a,b){l.fn.DataTable[a]=b});return u}); diff --git a/pre-release/articles/adbcva_files/dt-ext-buttons-1.11.3/css/buttons.dataTables.min.css b/pre-release/articles/adbcva_files/dt-ext-buttons-1.11.3/css/buttons.dataTables.min.css deleted file mode 100644 index a3d28f85..00000000 --- a/pre-release/articles/adbcva_files/dt-ext-buttons-1.11.3/css/buttons.dataTables.min.css +++ /dev/null @@ -1 +0,0 @@ -@keyframes dtb-spinner{100%{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0, 0, 0, 0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}button.dtb-hide-drop{display:none !important}div.dt-button-collection-title{text-align:center;padding:.3em 0 .5em;font-size:.9em}div.dt-button-collection-title:empty{display:none}button.dt-button,div.dt-button,a.dt-button,input.dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-right:.333em;margin-bottom:.333em;padding:.5em 1em;border:1px solid rgba(0, 0, 0, 0.3);border-radius:2px;cursor:pointer;font-size:.88em;line-height:1.6em;color:black;white-space:nowrap;overflow:hidden;background-color:rgba(0, 0, 0, 0.1);background:-webkit-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-moz-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-ms-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-o-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:linear-gradient(to bottom, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(230, 230, 230, 0.1)", EndColorStr="rgba(0, 0, 0, 0.1)");-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}button.dt-button.disabled,div.dt-button.disabled,a.dt-button.disabled,input.dt-button.disabled{cursor:default;opacity:.4}button.dt-button:active:not(.disabled),button.dt-button.active:not(.disabled),div.dt-button:active:not(.disabled),div.dt-button.active:not(.disabled),a.dt-button:active:not(.disabled),a.dt-button.active:not(.disabled),input.dt-button:active:not(.disabled),input.dt-button.active:not(.disabled){background-color:rgba(0, 0, 0, 0.1);background:-webkit-linear-gradient(top, rgba(179, 179, 179, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-moz-linear-gradient(top, rgba(179, 179, 179, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-ms-linear-gradient(top, rgba(179, 179, 179, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-o-linear-gradient(top, rgba(179, 179, 179, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:linear-gradient(to bottom, rgba(179, 179, 179, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(179, 179, 179, 0.1)", EndColorStr="rgba(0, 0, 0, 0.1)");box-shadow:inset 1px 1px 3px #999}button.dt-button:active:not(.disabled):hover:not(.disabled),button.dt-button.active:not(.disabled):hover:not(.disabled),div.dt-button:active:not(.disabled):hover:not(.disabled),div.dt-button.active:not(.disabled):hover:not(.disabled),a.dt-button:active:not(.disabled):hover:not(.disabled),a.dt-button.active:not(.disabled):hover:not(.disabled),input.dt-button:active:not(.disabled):hover:not(.disabled),input.dt-button.active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999;background-color:rgba(0, 0, 0, 0.1);background:-webkit-linear-gradient(top, rgba(128, 128, 128, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-moz-linear-gradient(top, rgba(128, 128, 128, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-ms-linear-gradient(top, rgba(128, 128, 128, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-o-linear-gradient(top, rgba(128, 128, 128, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:linear-gradient(to bottom, rgba(128, 128, 128, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(128, 128, 128, 0.1)", EndColorStr="rgba(0, 0, 0, 0.1)")}button.dt-button:hover,div.dt-button:hover,a.dt-button:hover,input.dt-button:hover{text-decoration:none}button.dt-button:hover:not(.disabled),div.dt-button:hover:not(.disabled),a.dt-button:hover:not(.disabled),input.dt-button:hover:not(.disabled){border:1px solid #666;background-color:rgba(0, 0, 0, 0.1);background:-webkit-linear-gradient(top, rgba(153, 153, 153, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-moz-linear-gradient(top, rgba(153, 153, 153, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-ms-linear-gradient(top, rgba(153, 153, 153, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-o-linear-gradient(top, rgba(153, 153, 153, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:linear-gradient(to bottom, rgba(153, 153, 153, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(153, 153, 153, 0.1)", EndColorStr="rgba(0, 0, 0, 0.1)")}button.dt-button:focus:not(.disabled),div.dt-button:focus:not(.disabled),a.dt-button:focus:not(.disabled),input.dt-button:focus:not(.disabled){border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;outline:none;background-color:#79ace9;background:-webkit-linear-gradient(top, #d1e2f7 0%, #79ace9 100%);background:-moz-linear-gradient(top, #d1e2f7 0%, #79ace9 100%);background:-ms-linear-gradient(top, #d1e2f7 0%, #79ace9 100%);background:-o-linear-gradient(top, #d1e2f7 0%, #79ace9 100%);background:linear-gradient(to bottom, #d1e2f7 0%, #79ace9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="#d1e2f7", EndColorStr="#79ace9")}button.dt-button span.dt-down-arrow,div.dt-button span.dt-down-arrow,a.dt-button span.dt-down-arrow,input.dt-button span.dt-down-arrow{position:relative;top:-2px;color:rgba(70, 70, 70, 0.75);font-size:8px;padding-left:10px}.dt-button embed{outline:none}div.dt-buttons{position:relative;float:left}div.dt-buttons.buttons-right{float:right}div.dataTables_layout_cell div.dt-buttons{float:none}div.dataTables_layout_cell div.dt-buttons.buttons-right{float:none}div.dt-button-collection{position:absolute;top:0;left:0;width:200px;margin-top:3px;padding:4px 4px 0 4px;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.4);background-color:white;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 3px 5px rgba(0, 0, 0, 0.3);box-sizing:border-box}div.dt-button-collection button.dt-button,div.dt-button-collection div.dt-button,div.dt-button-collection a.dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;margin-bottom:4px;margin-right:0}div.dt-button-collection button.dt-button:active:not(.disabled),div.dt-button-collection button.dt-button.active:not(.disabled),div.dt-button-collection div.dt-button:active:not(.disabled),div.dt-button-collection div.dt-button.active:not(.disabled),div.dt-button-collection a.dt-button:active:not(.disabled),div.dt-button-collection a.dt-button.active:not(.disabled){background-color:#dadada;background:-webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background:-moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background:-ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background:-o-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background:linear-gradient(to bottom, #f0f0f0 0%, #dadada 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="#f0f0f0", EndColorStr="#dadada");box-shadow:inset 1px 1px 3px #666}div.dt-button-collection button.dt-button:first-child,div.dt-button-collection div.dt-button:first-child,div.dt-button-collection a.dt-button:first-child{border-top-left-radius:3px;border-top-right-radius:3px}div.dt-button-collection button.dt-button:last-child,div.dt-button-collection div.dt-button:last-child,div.dt-button-collection a.dt-button:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}div.dt-button-collection div.dt-btn-split-wrapper{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:flex-start}div.dt-button-collection div.dt-btn-split-wrapper button.dt-button{margin-right:0px;display:inline-block;width:0;flex-grow:1;flex-shrink:0;flex-basis:50px}div.dt-button-collection div.dt-btn-split-wrapper button.dt-btn-split-drop{min-width:20px;margin-left:-1px;flex-grow:0;flex-shrink:0;flex-basis:0}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-200px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>:last-child{display:block !important;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection>:last-child>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:400px}div.dt-button-collection.two-column>:last-child{padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px}div.dt-button-collection.three-column>:last-child{padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px}div.dt-button-collection.four-column>:last-child{padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0, 0, 0, 0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0, 0, 0, 0.3)), color-stop(1, rgba(0, 0, 0, 0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);z-index:2001}@media screen and (max-width: 640px){div.dt-buttons{float:none !important;text-align:center}}button.dt-button.processing,div.dt-button.processing,a.dt-button.processing{color:rgba(0, 0, 0, 0.2)}button.dt-button.processing:after,div.dt-button.processing:after,a.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:" ";border:2px solid #282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear}button.dt-btn-split-drop{margin-left:calc(-1px - 0.333em);padding-left:.333em;padding-right:.333em;padding-bottom:calc(0.5em - 1px);border-radius:0px 1px 1px 0px;color:rgba(70, 70, 70, 0.9)}button.dt-btn-split-drop span.dt-btn-split-drop-arrow{font-size:10px}button.dt-btn-split-drop:hover{z-index:2}div.dt-btn-split-wrapper{display:inline-block}button.buttons-split{border-right:1px solid rgba(70, 70, 70, 0);border-radius:1px 0px 0px 1px}button.dt-btn-split-drop-button{background-color:white}button.dt-btn-split-drop-button:hover{background-color:white} diff --git a/pre-release/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.colVis.min.js b/pre-release/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.colVis.min.js deleted file mode 100644 index 16dc2088..00000000 --- a/pre-release/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.colVis.min.js +++ /dev/null @@ -1,10 +0,0 @@ -/*! - Column visibility buttons for Buttons and DataTables. - 2016 SpryMedia Ltd - datatables.net/license -*/ -(function(h){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(e){return h(e,window,document)}):"object"===typeof exports?module.exports=function(e,g){e||(e=window);g&&g.fn.dataTable||(g=require("datatables.net")(e,g).$);g.fn.dataTable.Buttons||require("datatables.net-buttons")(e,g);return h(g,e,e.document)}:h(jQuery,window,document)})(function(h,e,g,l){e=h.fn.dataTable;h.extend(e.ext.buttons,{colvis:function(b,a){var c=null,d={extend:"collection", -init:function(f,k){c=k},text:function(f){return f.i18n("buttons.colvis","Column visibility")},className:"buttons-colvis",buttons:[{extend:"columnsToggle",columns:a.columns,columnText:a.columnText}]};b.on("column-reorder.dt"+a.namespace,function(f,k,m){b.button(null,b.button(null,c).node()).collectionRebuild([{extend:"columnsToggle",columns:a.columns,columnText:a.columnText}])});return d},columnsToggle:function(b,a){return b.columns(a.columns).indexes().map(function(c){return{extend:"columnToggle", -columns:c,columnText:a.columnText}}).toArray()},columnToggle:function(b,a){return{extend:"columnVisibility",columns:a.columns,columnText:a.columnText}},columnsVisibility:function(b,a){return b.columns(a.columns).indexes().map(function(c){return{extend:"columnVisibility",columns:c,visibility:a.visibility,columnText:a.columnText}}).toArray()},columnVisibility:{columns:l,text:function(b,a,c){return c._columnText(b,c)},className:"buttons-columnVisibility",action:function(b,a,c,d){b=a.columns(d.columns); -a=b.visible();b.visible(d.visibility!==l?d.visibility:!(a.length&&a[0]))},init:function(b,a,c){var d=this;a.attr("data-cv-idx",c.columns);b.on("column-visibility.dt"+c.namespace,function(f,k){k.bDestroying||k.nTable!=b.settings()[0].nTable||d.active(b.column(c.columns).visible())}).on("column-reorder.dt"+c.namespace,function(f,k,m){c.destroying||1!==b.columns(c.columns).count()||(d.text(c._columnText(b,c)),d.active(b.column(c.columns).visible()))});this.active(b.column(c.columns).visible())},destroy:function(b, -a,c){b.off("column-visibility.dt"+c.namespace).off("column-reorder.dt"+c.namespace)},_columnText:function(b,a){var c=b.column(a.columns).index(),d=b.settings()[0].aoColumns[c].sTitle;d||(d=b.column(c).header().innerHTML);d=d.replace(/\n/g," ").replace(//gi," ").replace(//g,"").replace(//g,"").replace(/<.*?>/g,"").replace(/^\s+|\s+$/g,"");return a.columnText?a.columnText(b,c,d):d}},colvisRestore:{className:"buttons-colvisRestore",text:function(b){return b.i18n("buttons.colvisRestore", -"Restore visibility")},init:function(b,a,c){c._visOriginal=b.columns().indexes().map(function(d){return b.column(d).visible()}).toArray()},action:function(b,a,c,d){a.columns().every(function(f){f=a.colReorder&&a.colReorder.transpose?a.colReorder.transpose(f,"toOriginal"):f;this.visible(d._visOriginal[f])})}},colvisGroup:{className:"buttons-colvisGroup",action:function(b,a,c,d){a.columns(d.show).visible(!0,!1);a.columns(d.hide).visible(!1,!1);a.columns.adjust()},show:[],hide:[]}});return e.Buttons}); diff --git a/pre-release/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.html5.min.js b/pre-release/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.html5.min.js deleted file mode 100644 index f617f960..00000000 --- a/pre-release/articles/adbcva_files/dt-ext-buttons-1.11.3/js/buttons.html5.min.js +++ /dev/null @@ -1,36 +0,0 @@ -/*! - HTML5 export buttons for Buttons and DataTables. - 2016 SpryMedia Ltd - datatables.net/license - - FileSaver.js (1.3.3) - MIT license - Copyright © 2016 Eli Grey - http://eligrey.com -*/ -(function(n){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(u){return n(u,window,document)}):"object"===typeof exports?module.exports=function(u,x,E,F){u||(u=window);x&&x.fn.dataTable||(x=require("datatables.net")(u,x).$);x.fn.dataTable.Buttons||require("datatables.net-buttons")(u,x);return n(x,u,u.document,E,F)}:n(jQuery,window,document)})(function(n,u,x,E,F,B){function I(a){for(var c="";0<=a;)c=String.fromCharCode(a%26+65)+c,a=Math.floor(a/ -26)-1;return c}function O(a,c){J===B&&(J=-1===M.serializeToString((new u.DOMParser).parseFromString(P["xl/worksheets/sheet1.xml"],"text/xml")).indexOf("xmlns:r"));n.each(c,function(d,b){if(n.isPlainObject(b))d=a.folder(d),O(d,b);else{if(J){var m=b.childNodes[0],e,f=[];for(e=m.attributes.length-1;0<=e;e--){var g=m.attributes[e].nodeName;var p=m.attributes[e].nodeValue;-1!==g.indexOf(":")&&(f.push({name:g,value:p}),m.removeAttribute(g))}e=0;for(g=f.length;e'+b),b=b.replace(/_dt_b_namespace_token_/g,":"),b=b.replace(/xmlns:NS[\d]+="" NS[\d]+:/g,""));b=b.replace(/<([^<>]*?) xmlns=""([^<>]*?)>/g,"<$1 $2>");a.file(d,b)}})}function y(a,c,d){var b=a.createElement(c);d&&(d.attr&&n(b).attr(d.attr),d.children&&n.each(d.children,function(m,e){b.appendChild(e)}),null!==d.text&&d.text!== -B&&b.appendChild(a.createTextNode(d.text)));return b}function V(a,c){var d=a.header[c].length;a.footer&&a.footer[c].length>d&&(d=a.footer[c].length);for(var b=0,m=a.body.length;bd&&(d=e);if(401*a[1]?!0:!1};try{var M=new XMLSerializer,J}catch(a){}var P={"_rels/.rels":'', -"xl/_rels/workbook.xml.rels":'',"[Content_Types].xml":'', -"xl/workbook.xml":'', -"xl/worksheets/sheet1.xml":'',"xl/styles.xml":''}, -U=[{match:/^\-?\d+\.\d%$/,style:60,fmt:function(a){return a/100}},{match:/^\-?\d+\.?\d*%$/,style:56,fmt:function(a){return a/100}},{match:/^\-?\$[\d,]+.?\d*$/,style:57},{match:/^\-?£[\d,]+.?\d*$/,style:58},{match:/^\-?€[\d,]+.?\d*$/,style:59},{match:/^\-?\d+$/,style:65},{match:/^\-?\d+\.\d{2}$/,style:66},{match:/^\([\d,]+\)$/,style:61,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^\([\d,]+\.\d{2}\)$/,style:62,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^\-?[\d,]+$/,style:63}, -{match:/^\-?[\d,]+\.\d{2}$/,style:64},{match:/^[\d]{4}\-[\d]{2}\-[\d]{2}$/,style:67,fmt:function(a){return Math.round(25569+Date.parse(a)/864E5)}}];D.ext.buttons.copyHtml5={className:"buttons-copy buttons-html5",text:function(a){return a.i18n("buttons.copy","Copy")},action:function(a,c,d,b){this.processing(!0);var m=this;a=S(c,b);var e=c.buttons.exportInfo(b),f=R(b),g=a.str;d=n("
    ").css({height:1,width:1,overflow:"hidden",position:"fixed",top:0,left:0});e.title&&(g=e.title+f+f+g);e.messageTop&& -(g=e.messageTop+f+f+g);e.messageBottom&&(g=g+f+f+e.messageBottom);b.customize&&(g=b.customize(g,b,c));b=n(""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
    " ], - col: [ 2, "", "
    " ], - tr: [ 2, "", "
    " ], - td: [ 3, "", "
    " ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - - // Support: Chrome 86+ - // In Chrome, if an element having a focusout handler is blurred by - // clicking outside of it, it invokes the handler synchronously. If - // that handler calls `.remove()` on the element, the data is cleared, - // leaving `result` undefined. We need to guard against this. - return result && result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - which: true -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - // Suppress native focus or blur as it's already being fired - // in leverageNative. - _default: function() { - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - // - // Support: Firefox 70+ - // Only Firefox includes border widths - // in computed dimensions. (gh-4529) - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; - tr.style.cssText = "border:1px solid"; - - // Support: Chrome 86+ - // Height set through cssText does not get applied. - // Computed height then comes back as 0. - tr.style.height = "1px"; - trChild.style.height = "9px"; - - // Support: Android 8 Chrome 86+ - // In our bodyBackground.html iframe, - // display for all div elements is set to "inline", - // which causes a problem only in Android 8 Chrome 86. - // Ensuring the div is display: block - // gets around this issue. - trChild.style.display = "block"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + - parseInt( trStyle.borderTopWidth, 10 ) + - parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml, parserErrorElem; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) {} - - parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; - if ( !xml || parserErrorElem ) { - jQuery.error( "Invalid XML: " + ( - parserErrorElem ? - jQuery.map( parserErrorElem.childNodes, function( el ) { - return el.textContent; - } ).join( "\n" ) : - data - ) ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ).filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ).map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - -originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - 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" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script but not if jsonp - if ( !isSuccess && - jQuery.inArray( "script", s.dataTypes ) > -1 && - jQuery.inArray( "json", s.dataTypes ) < 0 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - -
    Skip to contents - - -
    -
    -
    - - - - -
    -

    Purpose -

    -

    To provide a complementary (to admiral) toolbox that enables users to develop ophthalmology disease area datasets and endpoints.

    -
    -
    -

    Installation -

    -

    To install the latest development version of the package directly from GitHub use the following code:

    -
    if (!requireNamespace("remotes", quietly = TRUE)) {
    -  install.packages("remotes")
    -}
    -remotes::install_github("pharmaverse/admiralophtha", ref = "devel")
    -
    -
    -

    Scope -

    -
      -
    • Build a toolbox of re-usable functions and utilities to create Ophthalmology-specific ADaM datasets in R in a modular manner.
    • -
    • All functions are created based upon the ADaM Implementation Guide and aim to facilitate the programming of ADaM dataset standards.
    • -
    -
    -
    -

    References and Documentation -

    - -
    -
    -

    R Versions -

    -

    Here’s a summary of our strategy for this package related to R versions:

    -
      -
    • R versions for developers and users will follow the same as admiral core package.
    • -
    • For development the devel branch of admiral core is used as a dependency. For releasing a new admiralophtha version it must run using the latest released admiral core version, i.e., main branch of admiral core.
    • -
    -
    -
    -

    Contact -

    -

    We use the following for support and communications between user and developer community:

    -
      -
    • -Slack - for informal discussions, Q&A and building our user community. If you don’t have access, use this link to join the pharmaverse Slack workspace
    • -
    • -GitHub Issues - for direct feedback, enhancement requests or raising bugs
    • -
    -
    -
    -

    Release Schedule -

    -
      -
    • The first release (v. 0.1.0) came out on 13th March 2023.
    • -
    • The second release will be in Q3 of 2023.
    • -
    -
    -
    -
    -
    - - -
    - - - -
    -
    - - - - - - - diff --git a/pre-release/link.svg b/pre-release/link.svg deleted file mode 100644 index 88ad8276..00000000 --- a/pre-release/link.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/pre-release/logo.png b/pre-release/logo.png deleted file mode 100644 index 67594d94b5ed8bc27d9963d7f6c4bd84eae8d1d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59553 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 diff --git a/pre-release/news/index.html b/pre-release/news/index.html deleted file mode 100644 index aa905e25..00000000 --- a/pre-release/news/index.html +++ /dev/null @@ -1,121 +0,0 @@ - -Changelog • admiralophtha - Skip to contents - - -
    -
    -
    - -
    -

    admiralophtha 0.2.0

    -
    -

    Updates to Functions

    -
    • Added new parameter loc_vals to function derive_var_afeye() to allow users to specify values of xxLOC for which AFEYE is derived (issue #163).
    • -
    • Updated function derive_var_afeye() to resolve bug when STUDYEYE is ‘Bilateral’ (issue #134).
    • -
    -
    -

    Updates to Templates

    -
    • Updated ADOE to refer to OESTRESU for AVALU creation (issue #139).
    • -
    • Updated ADOE and ADBCVA PARAM mapping to include units where applicable (issue #139).
    • -
    • Updated ADOE, ADVFQ and ADBCVA for the unique intermediate dataset name to avoid overwriting, corrected the link for Visit and Period variables Vignette in ADVFQ (issue #128).
    • -
    • Corrected values of DTYPE, VISIT, VISITNUM, OEDY, OEDTC for derived parameters in ADBCVA template (issue #137).
    • -
    • Updated ADBCVA and ADOE templates to include AFEYE (issue #133).
    • -
    -
    -

    Updates to Site

    -
    • Added a “Report a bug” link to admiralophtha website (issue #127).
    • -
    • Fixed bug where the search bar didn’t work for some searches (issue #141).
    • -
    -
    -
    -

    admiralophtha 0.1.0

    -
    -

    New Features

    -
    • Added a function to derive the variable STUDYEYE in ADSL (issue #9).
    • -
    • Added a function to derive the variable AFEYE in Occurrence datasets (issue #10).
    • -
    • Added a function to derive the criterion flags in ADBCVA (issue #49).
    • -
    • Added a function to convert LogMAR scores to ETDRS scores (issue #50).
    • -
    • Added a function to convert ETDRS scores to LogMAR scores (issue #50).
    • -
    • Created ophthalmology-specific test data for the EX SDTM domain, stored in admiralophtha package and accessible by calling data(admiralophtha_ex) (issue #36).
    • -
    • Created ophthalmology-specific test data for the SC and OE SDTM domains, stored in admiral package and accessible by calling data(admiral_sc) or data(admiral_oe) (issues #11 and #13).
    • -
    • Updated AE and QS test datasets in admiral to include ophthalmology-specific variables and records, such as laterality variables in AE and VFQ records in QS (issues #12 and #52).
    • -
    -
    -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/pkgdown.js b/pre-release/pkgdown.js deleted file mode 100644 index 5fccd9c0..00000000 --- a/pre-release/pkgdown.js +++ /dev/null @@ -1,156 +0,0 @@ -/* http://gregfranko.com/blog/jquery-best-practices/ */ -(function($) { - $(function() { - - $('nav.navbar').headroom(); - - Toc.init({ - $nav: $("#toc"), - $scope: $("main h2, main h3, main h4, main h5, main h6") - }); - - if ($('#toc').length) { - $('body').scrollspy({ - target: '#toc', - offset: $("nav.navbar").outerHeight() + 1 - }); - } - - // Activate popovers - $('[data-bs-toggle="popover"]').popover({ - container: 'body', - html: true, - trigger: 'focus', - placement: "top", - sanitize: false, - }); - - $('[data-bs-toggle="tooltip"]').tooltip(); - - /* Clipboard --------------------------*/ - - function changeTooltipMessage(element, msg) { - var tooltipOriginalTitle=element.getAttribute('data-original-title'); - element.setAttribute('data-original-title', msg); - $(element).tooltip('show'); - element.setAttribute('data-original-title', tooltipOriginalTitle); - } - - if(ClipboardJS.isSupported()) { - $(document).ready(function() { - var copyButton = ""; - - $("div.sourceCode").addClass("hasCopyButton"); - - // Insert copy buttons: - $(copyButton).prependTo(".hasCopyButton"); - - // Initialize tooltips: - $('.btn-copy-ex').tooltip({container: 'body'}); - - // Initialize clipboard: - var clipboard = new ClipboardJS('[data-clipboard-copy]', { - text: function(trigger) { - return trigger.parentNode.textContent.replace(/\n#>[^\n]*/g, ""); - } - }); - - clipboard.on('success', function(e) { - changeTooltipMessage(e.trigger, 'Copied!'); - e.clearSelection(); - }); - - clipboard.on('error', function() { - changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy'); - }); - - }); - } - - /* Search marking --------------------------*/ - var url = new URL(window.location.href); - var toMark = url.searchParams.get("q"); - var mark = new Mark("main#main"); - if (toMark) { - mark.mark(toMark, { - accuracy: { - value: "complementary", - limiters: [",", ".", ":", "/"], - } - }); - } - - /* Search --------------------------*/ - /* Adapted from https://github.com/rstudio/bookdown/blob/2d692ba4b61f1e466c92e78fd712b0ab08c11d31/inst/resources/bs4_book/bs4_book.js#L25 */ - // Initialise search index on focus - var fuse; - $("#search-input").focus(async function(e) { - if (fuse) { - return; - } - - $(e.target).addClass("loading"); - var response = await fetch($("#search-input").data("search-index")); - var data = await response.json(); - - var options = { - keys: ["what", "text", "code"], - ignoreLocation: true, - threshold: 0.1, - includeMatches: true, - includeScore: true, - }; - fuse = new Fuse(data, options); - - $(e.target).removeClass("loading"); - }); - - // Use algolia autocomplete - var options = { - autoselect: true, - debug: true, - hint: false, - minLength: 2, - }; - var q; -async function searchFuse(query, callback) { - await fuse; - - var items; - if (!fuse) { - items = []; - } else { - q = query; - var results = fuse.search(query, { limit: 20 }); - items = results - .filter((x) => x.score <= 0.75) - .map((x) => x.item); - if (items.length === 0) { - items = [{dir:"Sorry 😿",previous_headings:"",title:"No results found.",what:"No results found.",path:window.location.href}]; - } - } - callback(items); -} - $("#search-input").autocomplete(options, [ - { - name: "content", - source: searchFuse, - templates: { - suggestion: (s) => { - if (s.title == s.what) { - return `${s.dir} >
    ${s.title}
    `; - } else if (s.previous_headings == "") { - return `${s.dir} >
    ${s.title}
    > ${s.what}`; - } else { - return `${s.dir} >
    ${s.title}
    > ${s.previous_headings} > ${s.what}`; - } - }, - }, - }, - ]).on('autocomplete:selected', function(event, s) { - window.location.href = s.path + "?q=" + q + "#" + s.id; - }); - }); -})(window.jQuery || window.$) - - diff --git a/pre-release/pkgdown.yml b/pre-release/pkgdown.yml deleted file mode 100644 index 09a5d081..00000000 --- a/pre-release/pkgdown.yml +++ /dev/null @@ -1,14 +0,0 @@ -pandoc: 2.17.1.1 -pkgdown: 2.0.7 -pkgdown_sha: ~ -articles: - adbcva: adbcva.html - admiralophtha: admiralophtha.html - adoe: adoe.html - advfq: advfq.html - standards: standards.html -last_built: 2023-06-12T09:27Z -urls: - reference: https://pharmaverse.github.io/admiralophtha/pre-release/reference - article: https://pharmaverse.github.io/admiralophtha/pre-release/articles - diff --git a/pre-release/pull_request_template.html b/pre-release/pull_request_template.html deleted file mode 100644 index 0bd5a575..00000000 --- a/pre-release/pull_request_template.html +++ /dev/null @@ -1,133 +0,0 @@ - -NA • admiralophtha - Skip to contents - - -
    -
    -
    - - -

    Thank you for your Pull Request! We have developed this task checklist from the Development Process Guide to help with the final steps of the process. Completing the below tasks helps to ensure our reviewers can maximize their time on your code as well as making sure the admiral codebase remains robust and consistent.

    -

    Please check off each taskbox as an acknowledgment that you completed the task or check off that it is not relevant to your Pull Request. This checklist is part of the Github Action workflows and the Pull Request will not be merged into the devel branch until you have checked off each task.

    -
    • - -Place Closes # into the beginning of your Pull Request Title (Use Edit button in top-right if you need to update)
    • -
    • - -Code is formatted according to the tidyverse style guide. Run styler::style_file() to style R and Rmd files
    • -
    • - -Updated relevant unit tests or have written new unit tests - See Unit Test Guide -
    • -
    • - -If you removed/replaced any function and/or function parameters, did you fully follow the deprecation guidance?
    • -
    • - -Update to all relevant roxygen headers and examples.
    • -
    • - -Run devtools::document() so all .Rd files in the man folder and the NAMESPACE file in the project root are updated appropriately
    • -
    • - -Address any updates needed for vignettes and/or templates
    • -
    • - -Update NEWS.md if the changes pertain to a user-facing function (i.e. it has an @export tag) or documentation aimed at users (rather than developers)
    • -
    • - -Build admiral site pkgdown::build_site() and check that all affected examples are displayed correctly and that all new functions occur on the “Reference” page.
    • -
    • - -Address or fix all lintr warnings and errors - lintr::lint_package() -
    • -
    • - -Run R CMD check locally and address all errors and warnings - devtools::check() -
    • -
    • - -Link the issue so that it closes after successful merging.
    • -
    • - -Address all merge conflicts and resolve appropriately.
    • -
    • - -Pat yourself on the back for a job well done! Much love to your accomplishment!
    • -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/reference/Rplot001.png b/pre-release/reference/Rplot001.png deleted file mode 100644 index 17a358060aed2a86950757bbd25c6f92c08c458f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmeAS@N?(olHy`uVBq!ia0y~yV0-|=9Be?5+AI5}0x7m6Z+90U4Fo@(ch>_c&H|6f zVg?3oArNM~bhqvg0|WD9PZ!6KiaBo&GBN^{G%5UFpXcEKVvd5*5Eu=C0SJK)8A6*F U7`aXvEC5;V>FVdQ&MBb@00SN#Z2$lO diff --git a/pre-release/reference/admiralophtha-package.html b/pre-release/reference/admiralophtha-package.html deleted file mode 100644 index e62cd26b..00000000 --- a/pre-release/reference/admiralophtha-package.html +++ /dev/null @@ -1,118 +0,0 @@ - -admiralophtha: ADaM in R Asset Library - Ophthalmology — admiralophtha-package • admiralophtha - Skip to contents - - -
    -
    -
    - -
    -

    -

    Aids the programming of Clinical Data Standards Interchange Consortium (CDISC) compliant Ophthalmology Analysis Data Model (ADaM) datasets in R. ADaM datasets are a mandatory part of any New Drug or Biologics License Application submitted to the United States Food and Drug Administration (FDA). Analysis derivations are implemented in accordance with the "Analysis Data Model Implementation Guide" (CDISC Analysis Data Model Team, 2021, https://www.cdisc.org/standards/foundational/adam/adamig-v1-3-release-package).

    -
    - - - -
    -

    Author

    -

    Maintainer: Edoardo Mancini edoardo.mancini@roche.com

    -

    Authors:

    - -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/reference/admiralophtha_adbcva.html b/pre-release/reference/admiralophtha_adbcva.html deleted file mode 100644 index 8af23588..00000000 --- a/pre-release/reference/admiralophtha_adbcva.html +++ /dev/null @@ -1,114 +0,0 @@ - -Best Corrected Visual Acuity Analysis Dataset — admiralophtha_adbcva • admiralophtha - Skip to contents - - -
    -
    -
    - -
    -

    An example Best Corrected Visual Acuity (BCVA) analysis dataset

    -
    - -
    -

    Usage

    -
    admiralophtha_adbcva
    -
    - -
    -

    Format

    -

    An object of class tbl_df (inherits from tbl, data.frame) with 7672 rows and 116 columns.

    -
    -
    -

    Source

    -

    Derived from the oe and ADSL datasets using {admiral}, {admiralophtha} and -(https://github.com/pharmaverse/admiralophtha/blob/main/inst/templates/ad_adbcva.R)

    -
    - - -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/reference/admiralophtha_adoe.html b/pre-release/reference/admiralophtha_adoe.html deleted file mode 100644 index 73d6aa6a..00000000 --- a/pre-release/reference/admiralophtha_adoe.html +++ /dev/null @@ -1,114 +0,0 @@ - -Ophthalmology Exam Analysis Dataset — admiralophtha_adoe • admiralophtha - Skip to contents - - -
    -
    -
    - -
    -

    An example Ophthalmology Exam Analysis dataset

    -
    - -
    -

    Usage

    -
    admiralophtha_adoe
    -
    - -
    -

    Format

    -

    An object of class tbl_df (inherits from tbl, data.frame) with 7672 rows and 98 columns.

    -
    -
    -

    Source

    -

    Derived from the oe and ADSL datasets using {admiral}, {admiralophtha} and -(https://github.com/pharmaverse/admiralophtha/blob/main/inst/templates/ad_adoe.R)

    -
    - - -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/reference/admiralophtha_advfq.html b/pre-release/reference/admiralophtha_advfq.html deleted file mode 100644 index 03711bd7..00000000 --- a/pre-release/reference/admiralophtha_advfq.html +++ /dev/null @@ -1,114 +0,0 @@ - -Visual Function Questionnaire Analysis Dataset — admiralophtha_advfq • admiralophtha - Skip to contents - - -
    -
    -
    - -
    -

    An example Visual Function Questionnaire (VFQ) analysis dataset

    -
    - -
    -

    Usage

    -
    admiralophtha_advfq
    -
    - -
    -

    Format

    -

    An object of class tbl_df (inherits from tbl, data.frame) with 28798 rows and 41 columns.

    -
    -
    -

    Source

    -

    Derived from the ADSL and qs datasets using {admiral}, {admiralophtha} and -(https://github.com/pharmaverse/admiralophtha/blob/main/inst/templates/ad_advfq.R)

    -
    - - -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/reference/admiralophtha_ex.html b/pre-release/reference/admiralophtha_ex.html deleted file mode 100644 index 041819c4..00000000 --- a/pre-release/reference/admiralophtha_ex.html +++ /dev/null @@ -1,113 +0,0 @@ - -Exposure Ophthalmology SDTM Dataset — admiralophtha_ex • admiralophtha - Skip to contents - - -
    -
    -
    - -
    -

    An example Exposure SDTM dataset with ophthalmology-specific variables such as EXLOC and EXLAT

    -
    - -
    -

    Usage

    -
    admiralophtha_ex
    -
    - -
    -

    Format

    -

    An object of class tbl_df (inherits from tbl, data.frame) with 591 rows and 19 columns.

    -
    -
    -

    Source

    -

    Constructed using ex from the {admiral} package

    -
    - - -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/reference/admiralophtha_qs.html b/pre-release/reference/admiralophtha_qs.html deleted file mode 100644 index 161273c5..00000000 --- a/pre-release/reference/admiralophtha_qs.html +++ /dev/null @@ -1,113 +0,0 @@ - -Ophthalmology Questionnaires SDTM Dataset — admiralophtha_qs • admiralophtha - Skip to contents - - -
    -
    -
    - -
    -

    An example Questionnaires SDTM dataset with ophthalmology-specific questionnaire of NEI VFQ-25

    -
    - -
    -

    Usage

    -
    admiralophtha_qs
    -
    - -
    -

    Format

    -

    An object of class tbl_df (inherits from tbl, data.frame) with 197671 rows and 20 columns.

    -
    -
    -

    Source

    -

    Constructed using qs from the {admiral} package

    -
    - - -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/reference/convert_etdrs_to_logmar.html b/pre-release/reference/convert_etdrs_to_logmar.html deleted file mode 100644 index ea986b7c..00000000 --- a/pre-release/reference/convert_etdrs_to_logmar.html +++ /dev/null @@ -1,149 +0,0 @@ - -ETDRS --> LogMAR conversion — convert_etdrs_to_logmar • admiralophtha - Skip to contents - - -
    -
    -
    - -
    -

    Convert ETDRS score to LogMAR units

    -
    - -
    -

    Usage

    -
    convert_etdrs_to_logmar(value)
    -
    - -
    -

    Arguments

    -
    value
    -

    object containing ETDRS score to convert to logMAR

    - -
    -
    -

    Value

    - - -

    The input value converted converted to logMAR units

    -
    -
    -

    Details

    -

    ETDRS value converted to logMAR as logMAR = -0.02 * ETDRS + 1.7

    -
    -
    -

    Author

    -

    Rachel Linacre

    -
    - -
    -

    Examples

    -
    library(tibble)
    -library(dplyr)
    -#> 
    -#> Attaching package: ‘dplyr’
    -#> The following objects are masked from ‘package:stats’:
    -#> 
    -#>     filter, lag
    -#> The following objects are masked from ‘package:base’:
    -#> 
    -#>     intersect, setdiff, setequal, union
    -library(admiral)
    -library(admiraldev)
    -#> 
    -#> Attaching package: ‘admiraldev’
    -#> The following objects are masked from ‘package:dplyr’:
    -#> 
    -#>     anti_join, filter_if, inner_join, left_join
    -
    -adbcva <- tribble(
    -  ~STUDYID, ~USUBJID, ~AVAL,
    -  "XXX001", "P01", 5,
    -  "XXX001", "P02", 10,
    -  "XXX001", "P03", 15,
    -  "XXX001", "P04", 20,
    -  "XXX001", "P05", 25
    -)
    -
    -adbcva <- adbcva %>% mutate(AVAL = convert_etdrs_to_logmar(AVAL))
    -
    -
    -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/reference/convert_logmar_to_etdrs.html b/pre-release/reference/convert_logmar_to_etdrs.html deleted file mode 100644 index 792f1a9f..00000000 --- a/pre-release/reference/convert_logmar_to_etdrs.html +++ /dev/null @@ -1,137 +0,0 @@ - -LogMAR --> ETDRS conversion — convert_logmar_to_etdrs • admiralophtha - Skip to contents - - -
    -
    -
    - -
    -

    Convert LogMAR score to ETDRS units

    -
    - -
    -

    Usage

    -
    convert_logmar_to_etdrs(value)
    -
    - -
    -

    Arguments

    -
    value
    -

    object containing logMAR score to convert to ETDRS

    - -
    -
    -

    Value

    - - -

    The input value converted to ETDRS units

    -
    -
    -

    Details

    -

    logMAR value converted to ETDRS as ETDRS = -(logMAR - 1.7) / 0.02

    -
    -
    -

    Author

    -

    Nandini R Thampi

    -
    - -
    -

    Examples

    -
    library(tibble)
    -library(dplyr)
    -library(admiral)
    -
    -oe <- tribble(
    -  ~STUDYID, ~USUBJID, ~OETESTCD, ~OEMETHOD, ~OESTRESN,
    -  "XXX001", "P01", "VACSCORE", "logMAR EYE CHART", 1.08,
    -  "XXX001", "P02", "VACSCORE", "logMAR EYE CHART", 1.66,
    -  "XXX001", "P03", "VACSCORE", "logMAR EYE CHART", 1.60,
    -  "XXX001", "P04", "VACSCORE", "ETDRS EYE CHART", 57,
    -  "XXX001", "P05", "VACSCORE", "ETDRS EYE CHART", 1
    -)
    -
    -adbcva <- oe %>%
    -  filter(OETESTCD == "VACSCORE" & toupper(OEMETHOD) == "LOGMAR EYE CHART") %>%
    -  mutate(OESTRESN = convert_logmar_to_etdrs(OESTRESN))
    -
    -
    -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/reference/derive_var_afeye.html b/pre-release/reference/derive_var_afeye.html deleted file mode 100644 index 5ae28f0c..00000000 --- a/pre-release/reference/derive_var_afeye.html +++ /dev/null @@ -1,155 +0,0 @@ - -Derive Affected Eye — derive_var_afeye • admiralophtha - Skip to contents - - -
    -
    -
    - -
    -

    Derive Affected Eye (AFEYE) in occurrence datasets

    -
    - -
    -

    Usage

    -
    derive_var_afeye(dataset_occ, loc_var, lat_var, loc_vals = "EYE")
    -
    - -
    -

    Arguments

    -
    dataset_occ
    -

    Input Occurence dataset

    - - -
    loc_var
    -

    Location variable

    - - -
    lat_var
    -

    Laterality variable

    - - -
    loc_vals
    -

    xxLOCvalues for which AFEYE is derived

    - -
    -
    -

    Value

    - - -

    The input occurrence dataset with Affected Eye (AFEYE) added.

    -
    -
    -

    Details

    -

    Affected Eye is derived in the occurrence dataset using laterality and Study -Eye. This assumes Study Eye has already been added from ADSL.

    -
    -
    -

    Author

    -

    Lucy Palmen

    -
    - -
    -

    Examples

    -
    library(tibble)
    -library(admiral)
    -
    -adae <- tribble(
    -  ~STUDYID, ~USUBJID, ~STUDYEYE, ~AELOC, ~AELAT,
    -  "XXX001", "P01", "RIGHT", "EYE", "RIGHT",
    -  "XXX001", "P01", "RIGHT", "EYE", "LEFT",
    -  "XXX001", "P01", "RIGHT", "EYE", "",
    -  "XXX001", "P01", "RIGHT", "", "RIGHT",
    -  "XXX001", "P02", "LEFT", "", "",
    -  "XXX001", "P02", "LEFT", "EYE", "LEFT",
    -  "XXX001", "P04", "BILATERAL", "EYE", "RIGHT",
    -  "XXX001", "P05", "RIGHT", "EYE", "RIGHT",
    -  "XXX001", "P05", "RIGHT", "EYE", "BILATERAL",
    -  "XXX001", "P06", "BILATERAL", "", "",
    -  "XXX001", "P06", "BILATERAL", "", "RIGHT",
    -  "XXX001", "P07", "BILATERAL", "EYE", "BILATERAL",
    -  "XXX001", "P08", "", "EYE", "BILATERAL",
    -)
    -
    -adae <- derive_var_afeye(adae, AELOC, AELAT)
    -
    -
    -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/reference/derive_var_bcvacritxfl.html b/pre-release/reference/derive_var_bcvacritxfl.html deleted file mode 100644 index a8fdfaec..00000000 --- a/pre-release/reference/derive_var_bcvacritxfl.html +++ /dev/null @@ -1,249 +0,0 @@ - -Adds CRITx CRITxFL pairs to ADBCVA dataset — derive_var_bcvacritxfl • admiralophtha - Skip to contents - - -
    -
    -
    - -
    -

    Adds a criterion variables CRITx and their corresponding flags CRITxFL to an -ADBCVA dataset.

    -
    - -
    -

    Usage

    -
    derive_var_bcvacritxfl(
    -  dataset_adbcva,
    -  paramcds = NULL,
    -  basetype = NULL,
    -  bcva_ranges = NULL,
    -  bcva_uplims = NULL,
    -  bcva_lowlims = NULL,
    -  additional_text = "",
    -  critxfl_index = NULL
    -)
    -
    - -
    -

    Arguments

    -
    dataset_adbcva
    -

    Input dataset (ADBCVA).

    - - -
    paramcds
    -

    Vector of PARAMCD values for which to derive CRITx and CRITxFL.

    - - -
    basetype
    -

    BASETYPE value for which to derive CRITx and CRITxFL.

    - - -
    bcva_ranges
    -

    List containing one or more numeric vectors of length 2. For each -vector c(a,b) in bcva_ranges, a pair of variables CRITx, CRITxFL is created -with the condition: a <= CHG <= b. If criterion flags of that type are not -required, then leave as NULL.

    - - -
    bcva_uplims
    -

    List containing one or more numeric elements. For each -element a in bcva_uplims, a pair of variables CRITx, CRITxFL is created -with the condition: CHG <= a. If criterion flags of that type are not -required, then leave as NULL.

    - - -
    bcva_lowlims
    -

    List containing one or more numeric elements. For each -element b in bcva_lowlims, a pair of variables CRITx, CRITxFL is created -with the condition: CHG >= b. If criterion flags of that type are not required, -then leave as NULL.

    - - -
    additional_text
    -

    string containing additional text to append to CRITx

    - - -
    critxfl_index
    -

    positive integer detailing the first value of x to use -in "CRITxFL". If not supplied, the function takes the first available value of -x, counting up from x = 1.

    - -
    -
    -

    Value

    - - -

    The input ADBCVA dataset with additional column pairsCRITx, CRITxFL.

    -
    -
    -

    Details

    -

    This function works by calling derive_var_bcvacritxflonce for each of the -elements in bcva_ranges, bcva_uplims and bcva_lowlims. -NOTE: if CHG is equal to NA, then the resulting criterion flag is also marked -as NA.

    -
    -
    -

    Author

    -

    Edoardo Mancini

    -
    - -
    -

    Examples

    -
    library(tibble)
    -library(admiral)
    -library(admiraldev)
    -
    -adbcva1 <- tribble(
    -  ~STUDYID, ~USUBJID, ~BASETYPE, ~PARAMCD, ~CHG,
    -  "XXX001", "P01", "LAST", "SBCVA", 0,
    -  "XXX001", "P01", "LAST", "FBCVA", 2,
    -  "XXX001", "P01", "LAST", "SBCVALOG", -7,
    -  "XXX001", "P02", "LAST", "SBCVA", -13,
    -  "XXX001", "P02", "LAST", "FBCVA", 5,
    -  "XXX001", "P02", "LAST", "SBCVALOG", 12,
    -  "XXX001", "P03", "LAST", "SBCVA", NA,
    -  "XXX001", "P03", "LAST", "FBCVA", 17
    -)
    -
    -derive_var_bcvacritxfl(
    -  dataset_adbcva = adbcva1,
    -  paramcds = c("SBCVA", "FBCVA"),
    -  basetype = NULL,
    -  bcva_ranges = list(c(0, 5), c(-5, -1), c(10, 15)),
    -  bcva_uplims = list(5, 10),
    -  bcva_lowlims = list(8),
    -  additional_text = ""
    -)
    -#> # A tibble: 8 × 17
    -#>   STUDYID USUBJID BASETYPE PARAMCD    CHG CRIT1      CRIT1FL CRIT2 CRIT2FL CRIT3
    -#>   <chr>   <chr>   <chr>    <chr>    <dbl> <chr>      <chr>   <chr> <chr>   <chr>
    -#> 1 XXX001  P01     LAST     SBCVA        0 0 <= CHG … Y       -5 <… N       10 <…
    -#> 2 XXX001  P01     LAST     FBCVA        2 0 <= CHG … Y       -5 <… N       10 <…
    -#> 3 XXX001  P02     LAST     SBCVA      -13 0 <= CHG … N       -5 <… N       10 <…
    -#> 4 XXX001  P02     LAST     FBCVA        5 0 <= CHG … Y       -5 <… N       10 <…
    -#> 5 XXX001  P03     LAST     SBCVA       NA 0 <= CHG … NA      -5 <… NA      10 <…
    -#> 6 XXX001  P03     LAST     FBCVA       17 0 <= CHG … N       -5 <… N       10 <…
    -#> 7 XXX001  P01     LAST     SBCVALOG    -7 NA         NA      NA    NA      NA   
    -#> 8 XXX001  P02     LAST     SBCVALOG    12 NA         NA      NA    NA      NA   
    -#> # ℹ 7 more variables: CRIT3FL <chr>, CRIT4 <chr>, CRIT4FL <chr>, CRIT5 <chr>,
    -#> #   CRIT5FL <chr>, CRIT6 <chr>, CRIT6FL <chr>
    -
    -adbcva2 <- tribble(
    -  ~STUDYID, ~USUBJID, ~AVISIT, ~BASETYPE, ~PARAMCD, ~AVAL, ~CHG,
    -  "XXX001", "P01", "BASELINE", "LAST", "SBCVA", 4, NA,
    -  "XXX001", "P01", "BASELINE", "LAST", "SBCVA", 6, NA,
    -  "XXX001", "P01", "AVERAGE BASELINE", "AVERAGE", "SBCVA", 5, NA,
    -  "XXX001", "P01", "WEEK 2", "LAST", "SBCVA", -3, NA,
    -  "XXX001", "P01", "WEEK 4", "LAST", "SBCVA", -10, NA,
    -  "XXX001", "P01", "WEEK 6", "LAST", "SBCVA", 12, NA,
    -  "XXX001", "P01", "WEEK 2", "AVERAGE", "SBCVA", -2, -7,
    -  "XXX001", "P01", "WEEK 4", "AVERAGE", "SBCVA", 6, 1,
    -  "XXX001", "P01", "WEEK 6", "AVERAGE", "SBCVA", 3, -2
    -)
    -
    -derive_var_bcvacritxfl(
    -  dataset_adbcva = adbcva2,
    -  paramcds = c("SBCVA", "FBCVA"),
    -  basetype = "AVERAGE",
    -  bcva_ranges = list(c(0, 5), c(-10, 0)),
    -  bcva_lowlims = list(5),
    -  additional_text = " (AVERAGE)"
    -)
    -#> # A tibble: 9 × 13
    -#>   STUDYID USUBJID AVISIT        BASETYPE PARAMCD  AVAL   CHG CRIT1 CRIT1FL CRIT2
    -#>   <chr>   <chr>   <chr>         <chr>    <chr>   <dbl> <dbl> <chr> <chr>   <chr>
    -#> 1 XXX001  P01     AVERAGE BASE… AVERAGE  SBCVA       5    NA 0 <=… NA      -10 …
    -#> 2 XXX001  P01     WEEK 2        AVERAGE  SBCVA      -2    -7 0 <=… N       -10 …
    -#> 3 XXX001  P01     WEEK 4        AVERAGE  SBCVA       6     1 0 <=… Y       -10 …
    -#> 4 XXX001  P01     WEEK 6        AVERAGE  SBCVA       3    -2 0 <=… N       -10 …
    -#> 5 XXX001  P01     BASELINE      LAST     SBCVA       4    NA NA    NA      NA   
    -#> 6 XXX001  P01     BASELINE      LAST     SBCVA       6    NA NA    NA      NA   
    -#> 7 XXX001  P01     WEEK 2        LAST     SBCVA      -3    NA NA    NA      NA   
    -#> 8 XXX001  P01     WEEK 4        LAST     SBCVA     -10    NA NA    NA      NA   
    -#> 9 XXX001  P01     WEEK 6        LAST     SBCVA      12    NA NA    NA      NA   
    -#> # ℹ 3 more variables: CRIT2FL <chr>, CRIT3 <chr>, CRIT3FL <chr>
    -
    -
    -
    -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/reference/derive_var_bcvacritxfl_util.html b/pre-release/reference/derive_var_bcvacritxfl_util.html deleted file mode 100644 index 73a0827a..00000000 --- a/pre-release/reference/derive_var_bcvacritxfl_util.html +++ /dev/null @@ -1,165 +0,0 @@ - -Add CRITx and CRITxFL pair to ADBCVA dataset — derive_var_bcvacritxfl_util • admiralophtha - Skip to contents - - -
    -
    -
    - -
    -

    Helper function for derive_var_bcvacritxfl that adds a criterion variable CRITx and -its corresponding flag CRITxFL to an ADBCVA dataset.

    -
    - -
    -

    Usage

    -
    derive_var_bcvacritxfl_util(
    -  dataset,
    -  critx_text,
    -  critxfl_cond,
    -  counter,
    -  bcva_range = NULL,
    -  bcva_uplim = NULL,
    -  bcva_lowlim = NULL
    -)
    -
    - -
    -

    Arguments

    -
    dataset
    -

    Input dataset (ADBCVA).

    - - -
    critx_text
    -

    String containing the text for CRITx variable.

    - - -
    critxfl_cond
    -

    String containing R code detailing the criterion to be satisfied -for CRITxFL variable to be equal to "Y".

    - - -
    counter
    -

    Integer detailing the value of x to use in "CRITxFL".

    - - -
    bcva_range
    -

    Numeric vector of length two detailing lower and upper change in -BCVA limits (bcva_range will be called in critxfl_cond if the criterion -stipulates that change in BCVA lie inside some range).

    - - -
    bcva_uplim
    -

    Numeric value detailing highest change in BCVA limit (bcva_uplim -will be called in critxfl_cond if the criterion stipulates that change in BCVA -lie below some upper limit).

    - - -
    bcva_lowlim
    -

    Numeric value detailing lowest change in BCVA limit (bcva_lowlim -will be called in critxfl_cond if the criterion stipulates that change in BCVA -lie above some lower limit).

    - -
    -
    -

    Value

    - - -

    The input ADBCVA dataset with additional columns CRITx, CRITxFL.

    -
    -
    -

    Details

    -

    The criterion for change in BCVA in CRITxFL can be of three types: (1) value lies -within some range; a <= CHG <= b; (2) value is below some upper limit; CHG <= a; (3) -value is above some lower limit; b <= CHG. For (1), bcva_range must be specified to -this function; for (2), bcva_uplim; for (3) bcva_lowlim. It is only ever -necessary to supply one of these three arguments. -NOTE: if CHG is equal to NA, then the resulting criterion flag is also marked -as NA.

    -
    -
    -

    Author

    -

    Edoardo Mancini

    -
    - -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/reference/derive_var_studyeye.html b/pre-release/reference/derive_var_studyeye.html deleted file mode 100644 index 1711385a..00000000 --- a/pre-release/reference/derive_var_studyeye.html +++ /dev/null @@ -1,169 +0,0 @@ - -Derive Study Eye — derive_var_studyeye • admiralophtha - Skip to contents - - -
    -
    -
    - -
    -

    Derive Study Eye (STUDYEYE) in the ADSL dataset

    -
    - -
    -

    Usage

    -
    derive_var_studyeye(dataset_adsl, dataset_sc, sctestcd_value = "FOCID")
    -
    - -
    -

    Arguments

    -
    dataset_adsl
    -

    ADSL input dataset

    - - -
    dataset_sc
    -

    SC input dataset

    - - -
    sctestcd_value
    -

    SCTESTCD value flagging Study Eye selection records. Default: "FOCID".

    - -
    -
    -

    Value

    - - -

    The input ADSL dataset with an additional column named STUDYEYE

    - - -
    -
    -

    Details

    -

    Study Eye is derived in ADSL using the "Study Eye selection" records -in the SC SDTM dataset.

    -
    -
    -

    Author

    -

    Edoardo Mancini

    -
    - -
    -

    Examples

    -
    library(tibble)
    -library(admiral)
    -
    -adsl <- tribble(
    -  ~STUDYID, ~USUBJID,
    -  "XXX001", "P01",
    -  "XXX001", "P02",
    -  "XXX001", "P03",
    -  "XXX001", "P04",
    -  "XXX001", "P05"
    -)
    -
    -sc <- tribble(
    -  ~STUDYID, ~USUBJID, ~SCTESTCD, ~SCSTRESC,
    -  "XXX001", "P01", "FOCID", "OS",
    -  "XXX001", "P01", "ACOHORT", "COHORT1",
    -  "XXX001", "P02", "FOCID", "OD",
    -  "XXX001", "P02", "ACOHORT", "COHORT3",
    -  "XXX001", "P04", "FOCID", "OU",
    -  "XXX001", "P05", "FOCID", "OD",
    -  "XXX001", "P06", "FOCID", "OS"
    -)
    -
    -derive_var_studyeye(adsl, sc)
    -#> Warning: `derive_var_merged_cat()` was deprecated in admiral 0.11.0.
    -#>  Please use `derive_vars_merged()` instead.
    -#>  The deprecated feature was likely used in the admiralophtha package.
    -#>   Please report the issue at
    -#>   <https://github.com/pharmaverse/admiralophtha/issues>.
    -#> # A tibble: 5 × 3
    -#>   STUDYID USUBJID STUDYEYE   
    -#>   <chr>   <chr>   <chr>      
    -#> 1 XXX001  P01     "LEFT"     
    -#> 2 XXX001  P02     "RIGHT"    
    -#> 3 XXX001  P03     ""         
    -#> 4 XXX001  P04     "BILATERAL"
    -#> 5 XXX001  P05     "RIGHT"    
    -
    -
    -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/reference/figures/logo.png b/pre-release/reference/figures/logo.png deleted file mode 100644 index 67594d94b5ed8bc27d9963d7f6c4bd84eae8d1d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59553 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 diff --git a/pre-release/reference/index.html b/pre-release/reference/index.html deleted file mode 100644 index 77024ef9..00000000 --- a/pre-release/reference/index.html +++ /dev/null @@ -1,197 +0,0 @@ - -Function reference • admiralophtha - Skip to contents - - -
    -
    -
    - -
    - -

    ADSL-specific

    -

    Derivation Functions helpful for building the ADSL dataset

    - - -
    - - - - -
    - - derive_var_studyeye() -
    -
    Derive Study Eye
    -
    - -

    OCCDS-specific

    -

    Derivation Functions helpful for building the OCCDS datasets (e.g. adae, adcm, admh)

    - - -
    - - - - -
    - - derive_var_afeye() -
    -
    Derive Affected Eye
    -
    - -

    Ophtha-specific

    -

    Derivation Functions helpful for building the Ophtha datasets (e.g. adoe, adbcva)

    - - -
    - - - - -
    - - derive_var_bcvacritxfl() -
    -
    Adds CRITx CRITxFL pairs to ADBCVA dataset
    -
    -

    Utility Functions

    - - - - -
    - -

    Utilities for Formatting Observations

    - - - -
    - - - - -
    - - convert_etdrs_to_logmar() -
    -
    ETDRS --> LogMAR conversion
    -
    - - convert_logmar_to_etdrs() -
    -
    LogMAR --> ETDRS conversion
    -
    -

    Example Datasets

    - -

    You can run admiral::use_ad_template() to produce additional datasets

    - - -
    - - - - -
    - - admiralophtha_adbcva -
    -
    Best Corrected Visual Acuity Analysis Dataset
    -
    - - admiralophtha_adoe -
    -
    Ophthalmology Exam Analysis Dataset
    -
    - - admiralophtha_advfq -
    -
    Visual Function Questionnaire Analysis Dataset
    -
    - - admiralophtha_ex -
    -
    Exposure Ophthalmology SDTM Dataset
    -
    - - admiralophtha_qs -
    -
    Ophthalmology Questionnaires SDTM Dataset
    -
    -
    - - -
    - - - -
    - - - - - - - diff --git a/pre-release/search.json b/pre-release/search.json deleted file mode 100644 index 425200c4..00000000 --- a/pre-release/search.json +++ /dev/null @@ -1 +0,0 @@ -[{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/LICENSE.html","id":null,"dir":"","previous_headings":"","what":"Apache License","title":"Apache License","text":"Version 2.0, January 2004 ","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/LICENSE.html","id":"1-definitions","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"1. Definitions","title":"Apache License","text":"“License” shall mean terms conditions use, reproduction, distribution defined Sections 1 9 document. “Licensor” shall mean copyright owner entity authorized copyright owner granting License. “Legal Entity” shall mean union acting entity entities control, controlled , common control entity. purposes definition, “control” means () power, direct indirect, cause direction management entity, whether contract otherwise, (ii) ownership fifty percent (50%) outstanding shares, (iii) beneficial ownership entity. “” (“”) shall mean individual Legal Entity exercising permissions granted License. “Source” form shall mean preferred form making modifications, including limited software source code, documentation source, configuration files. “Object” form shall mean form resulting mechanical transformation translation Source form, including limited compiled object code, generated documentation, conversions media types. “Work” shall mean work authorship, whether Source Object form, made available License, indicated copyright notice included attached work (example provided Appendix ). “Derivative Works” shall mean work, whether Source Object form, based (derived ) Work editorial revisions, annotations, elaborations, modifications represent, whole, original work authorship. purposes License, Derivative Works shall include works remain separable , merely link (bind name) interfaces , Work Derivative Works thereof. “Contribution” shall mean work authorship, including original version Work modifications additions Work Derivative Works thereof, intentionally submitted Licensor inclusion Work copyright owner individual Legal Entity authorized submit behalf copyright owner. purposes definition, “submitted” means form electronic, verbal, written communication sent Licensor representatives, including limited communication electronic mailing lists, source code control systems, issue tracking systems managed , behalf , Licensor purpose discussing improving Work, excluding communication conspicuously marked otherwise designated writing copyright owner “Contribution.” “Contributor” shall mean Licensor individual Legal Entity behalf Contribution received Licensor subsequently incorporated within Work.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/LICENSE.html","id":"2-grant-of-copyright-license","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"2. Grant of Copyright License","title":"Apache License","text":"Subject terms conditions License, Contributor hereby grants perpetual, worldwide, non-exclusive, -charge, royalty-free, irrevocable copyright license reproduce, prepare Derivative Works , publicly display, publicly perform, sublicense, distribute Work Derivative Works Source Object form.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/LICENSE.html","id":"3-grant-of-patent-license","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"3. Grant of Patent License","title":"Apache License","text":"Subject terms conditions License, Contributor hereby grants perpetual, worldwide, non-exclusive, -charge, royalty-free, irrevocable (except stated section) patent license make, made, use, offer sell, sell, import, otherwise transfer Work, license applies patent claims licensable Contributor necessarily infringed Contribution(s) alone combination Contribution(s) Work Contribution(s) submitted. institute patent litigation entity (including cross-claim counterclaim lawsuit) alleging Work Contribution incorporated within Work constitutes direct contributory patent infringement, patent licenses granted License Work shall terminate date litigation filed.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/LICENSE.html","id":"4-redistribution","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"4. Redistribution","title":"Apache License","text":"may reproduce distribute copies Work Derivative Works thereof medium, without modifications, Source Object form, provided meet following conditions: () must give recipients Work Derivative Works copy License; (b) must cause modified files carry prominent notices stating changed files; (c) must retain, Source form Derivative Works distribute, copyright, patent, trademark, attribution notices Source form Work, excluding notices pertain part Derivative Works; (d) Work includes “NOTICE” text file part distribution, Derivative Works distribute must include readable copy attribution notices contained within NOTICE file, excluding notices pertain part Derivative Works, least one following places: within NOTICE text file distributed part Derivative Works; within Source form documentation, provided along Derivative Works; , within display generated Derivative Works, wherever third-party notices normally appear. contents NOTICE file informational purposes modify License. may add attribution notices within Derivative Works distribute, alongside addendum NOTICE text Work, provided additional attribution notices construed modifying License. may add copyright statement modifications may provide additional different license terms conditions use, reproduction, distribution modifications, Derivative Works whole, provided use, reproduction, distribution Work otherwise complies conditions stated License.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/LICENSE.html","id":"5-submission-of-contributions","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"5. Submission of Contributions","title":"Apache License","text":"Unless explicitly state otherwise, Contribution intentionally submitted inclusion Work Licensor shall terms conditions License, without additional terms conditions. Notwithstanding , nothing herein shall supersede modify terms separate license agreement may executed Licensor regarding Contributions.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/LICENSE.html","id":"6-trademarks","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"6. Trademarks","title":"Apache License","text":"License grant permission use trade names, trademarks, service marks, product names Licensor, except required reasonable customary use describing origin Work reproducing content NOTICE file.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/LICENSE.html","id":"7-disclaimer-of-warranty","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"7. Disclaimer of Warranty","title":"Apache License","text":"Unless required applicable law agreed writing, Licensor provides Work (Contributor provides Contributions) “” BASIS, WITHOUT WARRANTIES CONDITIONS KIND, either express implied, including, without limitation, warranties conditions TITLE, NON-INFRINGEMENT, MERCHANTABILITY, FITNESS PARTICULAR PURPOSE. solely responsible determining appropriateness using redistributing Work assume risks associated exercise permissions License.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/LICENSE.html","id":"8-limitation-of-liability","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"8. Limitation of Liability","title":"Apache License","text":"event legal theory, whether tort (including negligence), contract, otherwise, unless required applicable law (deliberate grossly negligent acts) agreed writing, shall Contributor liable damages, including direct, indirect, special, incidental, consequential damages character arising result License use inability use Work (including limited damages loss goodwill, work stoppage, computer failure malfunction, commercial damages losses), even Contributor advised possibility damages.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/LICENSE.html","id":"9-accepting-warranty-or-additional-liability","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"9. Accepting Warranty or Additional Liability","title":"Apache License","text":"redistributing Work Derivative Works thereof, may choose offer, charge fee , acceptance support, warranty, indemnity, liability obligations /rights consistent License. However, accepting obligations, may act behalf sole responsibility, behalf Contributor, agree indemnify, defend, hold Contributor harmless liability incurred , claims asserted , Contributor reason accepting warranty additional liability. END TERMS CONDITIONS","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/LICENSE.html","id":"appendix-how-to-apply-the-apache-license-to-your-work","dir":"","previous_headings":"","what":"APPENDIX: How to apply the Apache License to your work","title":"Apache License","text":"apply Apache License work, attach following boilerplate notice, fields enclosed brackets [] replaced identifying information. (Don’t include brackets!) text enclosed appropriate comment syntax file format. also recommend file class name description purpose included “printed page” copyright notice easier identification within third-party archives.","code":"Copyright 2021 F. Hoffmann-La Roche AG and GlaxoSmithKline LLC Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License."},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adbcva.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Creating ADBCVA","text":"article describes creating ADBCVA ADaM Best-Corrected Visual Acuity (BCVA) data ophthalmology endpoints. used conjunction article creating BDS dataset SDTM. , derivations processes specific ADBCVA absent, user invited consult aforementioned article guidance. Note: examples assume CDISC SDTM /ADaM format input unless otherwise specified.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adbcva.html","id":"dataset-contents","dir":"Articles","previous_headings":"Introduction","what":"Dataset Contents","title":"Creating ADBCVA","text":"name ADBCVA implies, admiralophtha suggests populate ADBCVA solely BCVA records OE SDTM.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adbcva.html","id":"required-packages","dir":"Articles","previous_headings":"Introduction","what":"Required Packages","title":"Creating ADBCVA","text":"examples vignette require following packages.","code":"library(dplyr) library(admiral) library(admiral.test) library(admiraldev) library(admiralophtha)"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adbcva.html","id":"programming-workflow","dir":"Articles","previous_headings":"","what":"Programming Workflow","title":"Creating ADBCVA","text":"Initial Set ADBCVA Deriving LogMAR Score Parameters Derivations Standard BDS Variables Deriving Analysis Value Categories Snellen Scores Deriving Criterion Flags BCVA Change Additional Notes Example Script","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adbcva.html","id":"setup","dir":"Articles","previous_headings":"Programming Workflow","what":"Initial set up of ADBCVA","title":"Creating ADBCVA","text":"BDS ADaM datasets, one start OE SDTM, BCVA records interest. purposes next two sections, shall using admiral OE ADSL test data. also require lookup table mapping parameter codes. Note: simulate ophthalmology study, add randomly generated STUDYEYE variable ADSL, practice STUDYEYE already derived using derive_var_studyeye(). Following setup, programmer can start constructing ADBCVA. first step subset OE BCVA parameters merge ADSL. required two reasons: firstly, STUDYEYE crucial mapping AFEYE PARAMCD’s. Secondly, treatment start date (TRTSDT) also prerequisite derivation variables Analysis Day (ADY). next item business derive AVAL, AVALU, DTYPE. example, due small number parameters derivation trivial. AFEYE also created step using function derive_var_afeye(). Moving forwards, PARAM PARAMCD can assigned using derive_vars_merged() admiral lookup table param_lookup generated .","code":"data(\"admiral_oe\") data(\"admiral_adsl\") # Add STUDYEYE to ADSL to simulate an ophtha dataset adsl <- admiral_adsl %>% as.data.frame() %>% mutate(STUDYEYE = sample(c(\"LEFT\", \"RIGHT\"), n(), replace = TRUE)) %>% convert_blanks_to_na() oe <- convert_blanks_to_na(admiral_oe) %>% ungroup() # ---- Lookup table ---- param_lookup <- tibble::tribble( ~OETESTCD, ~AFEYE, ~PARAMCD, ~PARAM, ~PARAMN, \"VACSCORE\", \"Study Eye\", \"SBCVA\", \"Study Eye Visual Acuity Score (letters)\", 1, \"VACSCORE\", \"Fellow Eye\", \"FBCVA\", \"Fellow Eye Visual Acuity Score (letters)\", 2, ) adsl_vars <- exprs(TRTSDT, TRTEDT, TRT01A, TRT01P, STUDYEYE) adbcva <- oe %>% filter( OETESTCD %in% c(\"VACSCORE\") ) %>% derive_vars_merged( dataset_add = adsl, new_vars = adsl_vars, by_vars = exprs(STUDYID, USUBJID) ) adbcva <- adbcva %>% mutate( AVAL = OESTRESN, AVALU = \"letters\", DTYPE = NA_character_ ) %>% derive_var_afeye(OELOC, OELAT) adbcva <- adbcva %>% derive_vars_merged( dataset_add = param_lookup, new_vars = exprs(PARAM, PARAMCD), by_vars = exprs(OETESTCD, AFEYE), filter_add = PARAMCD %in% c(\"SBCVA\", \"FBCVA\") )"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adbcva.html","id":"logmar","dir":"Articles","previous_headings":"Programming Workflow","what":"Deriving LogMAR Score Parameters","title":"Creating ADBCVA","text":"Often ADBCVA datasets contain derived records BCVA LogMAR units. can easily achieved follows using derive_param_computed(). conversion units done using convert_etdrs_to_logmar(). Two separate calls required due parameters split study fellow eye. extra parameters added, records end dataset now present, AVALC day/date variables ADY ADT can derived. Importantly, calls derive_param_computed() list SDTM variables VISIT, VISITNUM, OEDY OEDTC by_vars function. necessary derive ADaM variables AVISIT ADY successive steps. ADaM variables require derived, SDTM variables set missing derived records, per ADaM standards:","code":"adbcva <- adbcva %>% derive_param_computed( by_vars = c(exprs(STUDYID, USUBJID, VISIT, VISITNUM, OEDY, OEDTC), adsl_vars), parameters = c(\"SBCVA\"), analysis_value = convert_etdrs_to_logmar(AVAL.SBCVA), set_values_to = exprs( PARAMCD = \"SBCVALOG\", PARAM = \"Study Eye Visual Acuity LogMAR Score\", DTYPE = \"DERIVED\", AVALU = \"LogMAR\" ) ) %>% derive_param_computed( by_vars = c(exprs(STUDYID, USUBJID, VISIT, OEDY, OEDTC), adsl_vars), parameters = c(\"FBCVA\"), analysis_value = convert_etdrs_to_logmar(AVAL.FBCVA), set_values_to = exprs( PARAMCD = \"FBCVALOG\", PARAM = \"Fellow Eye Visual Acuity LogMAR Score\", DTYPE = \"DERIVED\", AVALU = \"LogMAR\" ) ) %>% mutate(AVALC = as.character(AVAL)) %>% derive_vars_dt( new_vars_prefix = \"A\", dtc = OEDTC, flag_imputation = \"none\" ) %>% derive_vars_dy(reference_date = TRTSDT, source_vars = exprs(ADT)) adbcva <- adbcva %>% mutate( VISIT = ifelse(PARAMCD %in% c(\"SBCVALOG\", \"FBCVALOG\"), NA_character_, VISIT), VISITNUM = ifelse(PARAMCD %in% c(\"SBCVALOG\", \"FBCVALOG\"), NA, VISITNUM), OEDY = ifelse(PARAMCD %in% c(\"SBCVALOG\", \"FBCVALOG\"), NA, OEDY), OEDTC = ifelse(PARAMCD %in% c(\"SBCVALOG\", \"FBCVALOG\"), NA_character_, OEDTC) )"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adbcva.html","id":"further","dir":"Articles","previous_headings":"Programming Workflow","what":"Further Derivations of Standard BDS Variables","title":"Creating ADBCVA","text":"user invited consult article creating BDS dataset SDTM learn add standard BDS variables ADBCVA. Henceforth, purposes article, following sections use ADBCVA dataset generated corresponding admiralophtha template program starting point. Note: dataset already comes criterion flags analysis value categorisation variables, illustration purposes removed.","code":"data(\"admiralophtha_adbcva\") adbcva <- admiralophtha_adbcva %>% select(-starts_with(\"CRIT\"), -starts_with(\"AVALCA\"))"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adbcva.html","id":"avalcats","dir":"Articles","previous_headings":"Programming Workflow","what":"Deriving Analysis Value Categories for Snellen Scores","title":"Creating ADBCVA","text":"ophthalmology studies may desire subdivide BCVA records according Snellen category fall (eg, 20/320, 20/100, 20/20 etc). best done use AVALCATx/AVALCAxN variable pairs. Currently, admiralophtha provide specific functionality create AVALCATx/AVALCAxN pairs, although may included future releases package. current toolset, suggested approach derive variables : Create lookup table assigns numeric equivalents (.e. AVALCAxN) Snellen categories. Create format function map AVAL numeric category. Add AVALCAxN mutate statement using format function. Add AVALCATx using derive_vars_merged combination lookup table. resulting output shown (limited first patient ):","code":"avalcat_lookup <- tibble::tribble( ~PARAMCD, ~AVALCA1N, ~AVALCAT1, \"SBCVA\", 1000, \"< 20/800\", \"SBCVA\", 800, \"20/800\", \"SBCVA\", 640, \"20/640\", \"SBCVA\", 500, \"20/500\", \"SBCVA\", 400, \"20/400\", \"SBCVA\", 320, \"20/320\", \"SBCVA\", 250, \"20/250\", \"SBCVA\", 200, \"20/200\", \"SBCVA\", 160, \"20/160\", \"SBCVA\", 125, \"20/125\", \"SBCVA\", 100, \"20/100\", \"SBCVA\", 80, \"20/80\", \"SBCVA\", 63, \"20/63\", \"SBCVA\", 50, \"20/50\", \"SBCVA\", 40, \"20/40\", \"SBCVA\", 32, \"20/32\", \"SBCVA\", 25, \"20/25\", \"SBCVA\", 20, \"20/20\", \"SBCVA\", 16, \"20/16\", \"SBCVA\", 12, \"20/12\", \"SBCVA\", 1, \"> 20/12\", ) avalcat_lookup <- avalcat_lookup %>% mutate(PARAMCD = \"FBCVA\") %>% rbind(avalcat_lookup) format_avalcat1n <- function(param, aval) { case_when( param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 0 & aval <= 3 ~ 1000, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 4 & aval <= 8 ~ 800, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 9 & aval <= 13 ~ 640, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 14 & aval <= 18 ~ 500, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 19 & aval <= 23 ~ 400, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 24 & aval <= 28 ~ 320, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 29 & aval <= 33 ~ 250, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 34 & aval <= 38 ~ 200, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 39 & aval <= 43 ~ 160, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 44 & aval <= 48 ~ 125, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 49 & aval <= 53 ~ 100, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 54 & aval <= 58 ~ 80, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 59 & aval <= 63 ~ 63, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 64 & aval <= 68 ~ 50, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 69 & aval <= 73 ~ 40, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 74 & aval <= 78 ~ 32, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 79 & aval <= 83 ~ 25, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 84 & aval <= 88 ~ 20, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 89 & aval <= 93 ~ 16, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 94 & aval <= 97 ~ 12, param %in% c(\"SBCVA\", \"FBCVA\") & aval >= 98 ~ 1 ) } adbcva <- adbcva %>% mutate(AVALCA1N = format_avalcat1n(param = PARAMCD, aval = AVAL)) %>% derive_vars_merged( avalcat_lookup, by = exprs(PARAMCD, AVALCA1N) )"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adbcva.html","id":"critflags","dir":"Articles","previous_headings":"Programming Workflow","what":"Deriving Criterion Flags for BCVA Change","title":"Creating ADBCVA","text":"admiralophtha suggests use criterion flag variable pairs (CRITx/CRITxFL) program BCVA endpoints Avoiding loss x letters Gain y letters Gain x y letters (relative baseline basetypes). package provides function derive_var_bcvacritxfl() program endpoints efficiently consistently. terms logic apply variable CHG, endpoints fall three classes, can represented inequalities: Class 1: CHG value lying inside range, <= CHG <= b. Class 2: CHG value upper limit, CHG <= . Class 3: CHG value lower limit, CHG => b. using derive_var_bcvacritxfl(), ADaM programmer can implement three types endpoint . achieved feeding appropriate ranges, upper limits lower limits bcva_ranges, bcva_uplims bcva_lowlims arguments function. instance, let’s suppose endpoints interest : Gain 5 10 letters relative baseline (Class 1: 5 <= CHG <= 10) Gain 25 letters fewer relative baseline (Class 2: CHG <= 25) Loss 5 letters relative baseline (Class 2: CHG <= -5) Gain 15 letters relative baseline (Class 3: CHG >= 15) Loss 10 letters fewer relative baseline (Class 3: CHG >= -10). , following call implement criterion variable/flag pairs endpoints . CRITx variables automatically encode correct inequality. resulting output shown (limited first patient ): also possible assign significance “x” CRITxFL. instance, one designate criterion flags Class 1 CRIT1yFL, Class 2 CRIT2yFL, Class 3 CRIT3yFL. argument critxfl_index allows simple implementation conjunction three separate calls derive_var_bcvacritxfl():","code":"adbcva <- adbcva %>% derive_var_bcvacritxfl( paramcds = c(\"SBCVA\", \"FBCVA\"), bcva_ranges = list(c(5, 10)), bcva_uplims = list(25, -5), bcva_lowlims = list(15, -10) ) adbcva <- adbcva %>% derive_var_bcvacritxfl( paramcds = c(\"SBCVA\", \"FBCVA\"), bcva_ranges = list(c(5, 10)), critxfl_index = 10 ) %>% derive_var_bcvacritxfl( paramcds = c(\"SBCVA\", \"FBCVA\"), bcva_uplims = list(25, -5), critxfl_index = 20 ) %>% derive_var_bcvacritxfl( paramcds = c(\"SBCVA\", \"FBCVA\"), bcva_lowlims = list(15, -10), critxfl_index = 30 )"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adbcva.html","id":"additional-notes","dir":"Articles","previous_headings":"Programming Workflow","what":"Additional Notes","title":"Creating ADBCVA","text":"interpreting endpoints Loss 5 letters fewer relative baseline, implicitly assumed article also includes case letters gained, inequality reads CHG >= -5. One use bcva_lowlims = list(-5) argument derive_var_bcvacritxfl() program endpoint. case, .e. one wishes exclude cases letter gains, inequality interest instead -5 <= CHG <= -1. Importantly, derive_var_bcvacritxfl() still used, argument bcva_ranges = list(c(-5, -1)).","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/admiralophtha.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Get Started","text":"package extension, new admiral best place first start reading Get Started guide. extension package follows main idea conventions, re-uses many functions admiral, important thoroughly understand able use admiralophtha.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/admiralophtha.html","id":"derivations","dir":"Articles","previous_headings":"","what":"Derivations","title":"Get Started","text":"important functions admiralophtha derivations. follow conventions admiral focused ophthalmology-specific needs.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/admiralophtha.html","id":"starting-a-script","dir":"Articles","previous_headings":"","what":"Starting a Script","title":"Get Started","text":"ophthalmology ADaM data structures, overview flow example function calls common steps provided following vignettes: Creating ADBCVA Creating ADOE Creating ADVFQ","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/admiralophtha.html","id":"support","dir":"Articles","previous_headings":"","what":"Support","title":"Get Started","text":"Support provided via admiral Slack channel.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adoe.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Creating ADOE","text":"article describes creating ADOE ADaM Ophthalmology Exam Analysis data ophthalmology endpoints. used conjunction article creating BDS dataset SDTM. , derivations processes specific ADOE absent, user invited consult aforementioned article guidance. current release admiralophtha contain functionality specific ADOE, article showcases map parameters OE order set basic structure ADOE. following steps, user invited consult -linked article BDS datasets. article updated future releases showcase explain admiralophtha-specific functionality. Note: examples assume CDISC SDTM /ADaM format input unless otherwise specified.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adoe.html","id":"dataset-contents","dir":"Articles","previous_headings":"Introduction","what":"Dataset Contents","title":"Creating ADOE","text":"admiralophtha suggests populate ADOE general miscellaneous ophthalmology parameters. efficacy endpoint-related parameters (eg. BCVA tests) placed separate datasets (eg. ADBCVA).","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adoe.html","id":"required-packages","dir":"Articles","previous_headings":"Introduction","what":"Required Packages","title":"Creating ADOE","text":"examples vignette require following packages.","code":"library(dplyr) library(admiral) library(admiral.test) library(admiraldev) library(admiralophtha)"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adoe.html","id":"programming-workflow","dir":"Articles","previous_headings":"","what":"Programming Workflow","title":"Creating ADOE","text":"Initial Set ADOE Derivations Standard BDS Variables Example Script","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adoe.html","id":"setup","dir":"Articles","previous_headings":"Programming Workflow","what":"Initial set up of ADOE","title":"Creating ADOE","text":"BDS ADaM datasets, one start OE SDTM, general ophthalmology records interest. purposes next two sections, shall using admiral OE ADSL test data. also require lookup table mapping parameter codes. Note: simulate ophthalmology study, add randomly generated STUDYEYE variable ADSL, practice STUDYEYE already derived using derive_var_studyeye(). Following setup, programmer can start constructing ADOE. first step subset OE general ophthalmology parameters. , one can merge resulting dataset ADSL. required two reasons: firstly, STUDYEYE crucial mapping AFEYE PARAMCD’s. Secondly, treatment start date (TRTSDT) also prerequisite derivation variables Analysis Day (ADY).","code":"data(\"admiral_oe\") data(\"admiral_adsl\") # Add STUDYEYE to ADSL to simulate an ophtha dataset adsl <- admiral_adsl %>% as.data.frame() %>% mutate(STUDYEYE = sample(c(\"LEFT\", \"RIGHT\"), n(), replace = TRUE)) %>% convert_blanks_to_na() oe <- convert_blanks_to_na(admiral_oe) %>% ungroup() # ---- Lookup table ---- # Assign PARAMCD, PARAM, and PARAMN param_lookup <- tibble::tribble( ~OETESTCD, ~AFEYE, ~PARAMCD, ~PARAM, ~PARAMN, \"CSUBTH\", \"Study Eye\", \"SCSUBTH\", \"Study Eye Center Subfield Thickness (um)\", 1, \"CSUBTH\", \"Fellow Eye\", \"FCSUBTH\", \"Fellow Eye Center Subfield Thickness (um)\", 2, \"DRSSR\", \"Study Eye\", \"SDRSSR\", \"Study Eye Diabetic Retinopathy Severity\", 3, \"DRSSR\", \"Fellow Eye\", \"FDRSSR\", \"Fellow Eye Diabetic Retinopathy Severity\", 4, ) adsl_vars <- exprs(TRTSDT, TRTEDT, TRT01A, TRT01P, STUDYEYE) adoe <- oe %>% filter( OETESTCD %in% c(\"CSUBTH\", \"DRSSR\") ) %>% derive_vars_merged( dataset_add = adsl, new_vars = adsl_vars, by_vars = exprs(STUDYID, USUBJID) )"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/adoe.html","id":"further","dir":"Articles","previous_headings":"Programming Workflow","what":"Further Derivations of Standard BDS Variables","title":"Creating ADOE","text":"user invited consult article creating BDS dataset SDTM learn add standard BDS variables ADOE.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/advfq.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Creating ADVFQ","text":"article describes creating ADVFQ ADaM Visual Functioning Questionnaire data ophthalmology endpoints. used conjunction article creating BDS dataset SDTM. , derivations processes specific ADVFQ absent, user invited consult aforementioned article guidance. Note: examples assume CDISC SDTM /ADaM format input unless otherwise specified.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/advfq.html","id":"dataset-contents","dir":"Articles","previous_headings":"Introduction","what":"Dataset Contents","title":"Creating ADVFQ","text":"admiralophtha suggests populate ADVFQ solely VFQ records QS SDTM. questionnaire data placed separate datasets (e.g. ADQS).","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/advfq.html","id":"required-packages","dir":"Articles","previous_headings":"Introduction","what":"Required Packages","title":"Creating ADVFQ","text":"examples vignette require following packages.","code":"library(dplyr) library(admiral) library(admiral.test) library(admiraldev) library(admiralophtha)"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/advfq.html","id":"programming-workflow","dir":"Articles","previous_headings":"","what":"Programming Workflow","title":"Creating ADVFQ","text":"Initial set ADVFQ Derive Analysis Value existing questions (AVAL) Derive Parameters recoded items summary scores Derive Analysis Variables (ANL01FL ASEQ) Add ADSL Variables Example Script","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/advfq.html","id":"setup","dir":"Articles","previous_headings":"Programming Workflow","what":"Initial set up of ADVFQ","title":"Creating ADVFQ","text":"start, datasets needed creation questionnaire dataset read environment. purpose demonstration shall use admiral QS ADSL test data. QS dataset filtered VFQ parameters interest. Next, programmer create parameter lookup table includes QSTESTCD, PARAMCD, PARAM, PARCAT1 PARCAT2 variables. include parameters needed final ADVFQ used later merge parameter information. Now ADVFQ dataset can constructed, merging filtered QS dataset ADSL. necessary treatment start date TRTSDT prerequisite derivation variables Analysis Day ADY can programmed following article creating BDS dataset SDTM.","code":"data(\"admiral_adsl\") data(\"admiral_qs\") adsl <- admiral_adsl qs <- admiral_qs qs <- qs %>% filter(QSTESTCD %in% c(\"VFQ1\", \"VFQ2\", \"VFQ3\", \"VFQ4\")) param_lookup <- tibble::tribble( ~QSTESTCD, ~PARAMCD, ~PARAM, ~PARCAT1, ~PARCAT2, \"VFQ1\", \"VFQ1\", \"Overall Health\", \"NEI VFQ-25\", \"Original Response\", \"VFQ2\", \"VFQ2\", \"Eyesight in Both Eyes\", \"NEI VFQ-25\", \"Original Response\", \"VFQ3\", \"VFQ3\", \"Worry About Eyesight\", \"NEI VFQ-25\", \"Original Response\", \"VFQ4\", \"VFQ4\", \"Pain in and Around Eyes\", \"NEI VFQ-25\", \"Original Response\", \"QR01\", \"QR01\", \"Recoded Item - 01\", \"NEI VFQ-25\", \"General 01\", \"QR02\", \"QR02\", \"Recoded Item - 02\", \"NEI VFQ-25\", \"General 01\", \"QR03\", \"QR03\", \"Recoded Item - 03\", \"NEI VFQ-25\", \"General 02\", \"QR04\", \"QR04\", \"Recoded Item - 04\", \"NEI VFQ-25\", \"General 02\", \"QSG01\", \"QSG01\", \"General Score 01\", \"NEI VFQ-25\", \"Averaged Result\", \"QSG02\", \"QSG02\", \"General Score 02\", \"NEI VFQ-25\", \"Averaged Result\", \"QBCSCORE\", \"QBCSCORE\", \"Composite Score\", \"NEI VFQ-25\", \"Averaged Result\" ) adsl_vars <- exprs(TRTSDT, TRTEDT, TRT01A, TRT01P) advfq <- derive_vars_merged( qs, dataset_add = adsl, new_vars = adsl_vars, by_vars = exprs(STUDYID, USUBJID) )"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/advfq.html","id":"aval","dir":"Articles","previous_headings":"Programming Workflow","what":"Derive Analysis Value for Existing Questions","title":"Creating ADVFQ","text":"derive analysis values use function admiral::derive_vars_merged_lookup() merges PARAMCD parameter lookup table. merges parameter QSTESTCD assigns AVAL AVALC.","code":"advfq <- advfq %>% ## Add PARAMCD only - add PARAM etc later ---- derive_vars_merged_lookup( dataset_add = param_lookup, new_vars = exprs(PARAMCD), by_vars = exprs(QSTESTCD) ) %>% ## Calculate AVAL and AVALC ---- mutate( AVAL = QSSTRESN, AVALC = QSORRES )"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/advfq.html","id":"parameters","dir":"Articles","previous_headings":"Programming Workflow","what":"Derive Parameters for Recoded Items and Summary Scores","title":"Creating ADVFQ","text":"included initial records QS, programmer next program new records parameters recode original questions. Run section code every question need recoding. gives example recoding one question. Next, programmer create summary records average recoded questions using admiral::derive_summary_records. example uses two recoded questions create average record.","code":"## QR01 Recoded Item 01 # set to 100 if [advfq.AVAL] = 1 # else set to 75 if [advfq.AVAL] = 2 # else set to 50 if [advfq.AVAL] = 3 # else set to 25 if [advfq.AVAL] = 4 # else set to 0 if [advfq.AVAL] = 5 advfq <- advfq %>% derive_summary_records( by_vars = exprs(STUDYID, USUBJID, !!!adsl_vars, PARAMCD, VISITNUM, VISIT), filter = QSTESTCD == \"VFQ1\" & !is.na(AVAL), analysis_var = AVAL, summary_fun = identity, set_values_to = exprs(PARAMCD = \"QR01\") ) %>% mutate(AVAL = ifelse(PARAMCD == \"QR01\", case_when( AVAL == 1 ~ 100, AVAL == 2 ~ 75, AVAL == 3 ~ 50, AVAL == 4 ~ 25, AVAL >= 5 ~ 0 ), AVAL )) ## Derive a new record as a summary record ---- ## QSG01 General Score 01 # Average of QR01 and QR02 records advfq <- advfq %>% derive_summary_records( by_vars = exprs(STUDYID, USUBJID, !!!adsl_vars, VISITNUM, VISIT, ADT, ADY), filter = PARAMCD %in% c(\"QR01\", \"QR02\") & !is.na(AVAL), analysis_var = AVAL, summary_fun = mean, set_values_to = exprs(PARAMCD = \"QSG01\") )"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/advfq.html","id":"analysis","dir":"Articles","previous_headings":"Programming Workflow","what":"Derive Analysis Variables","title":"Creating ADVFQ","text":"finding ADaMs, analysis flag derived identify appropriate observation(s) use particular analysis subject multiple observations within particular timing period. situation, analysis flag (e.g. ANLxxFL) may used choose appropriate record analysis. flag may derived using admiral function admiral::derive_var_extreme_flag(). example, assume like choose latest value USUBJID, PARAMCD AVISIT. derive ASEQ using admiral::derive_var_obs_number() based observation number within dataset, additionally merge PARAM, PARCAT1 PARCAT2 using earlier lookup table.","code":"## ANL01FL: Flag last result within an AVISIT for post-baseline records ---- advfq <- advfq %>% restrict_derivation( derivation = derive_var_extreme_flag, args = params( new_var = ANL01FL, by_vars = exprs(USUBJID, PARAMCD, AVISIT), order = exprs(ADT, AVAL), mode = \"last\" ), filter = !is.na(AVISITN) & ONTRTFL == \"Y\" ) ## Get ASEQ and PARAM ---- advfq <- advfq %>% # Calculate ASEQ derive_var_obs_number( new_var = ASEQ, by_vars = exprs(STUDYID, USUBJID), order = exprs(PARAMCD, ADT, AVISITN, VISITNUM), check_type = \"error\" ) %>% # Derive PARAM derive_vars_merged(dataset_add = select(param_lookup, -QSTESTCD), by_vars = exprs(PARAMCD))"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/advfq.html","id":"adslvars","dir":"Articles","previous_headings":"Programming Workflow","what":"Add ADSL Variables","title":"Creating ADVFQ","text":"analysis variables programmed, variables ADSL required merged dataset using admiral::derive_vars_merged.","code":"# Add all ADSL variables advfq <- advfq %>% derive_vars_merged( dataset_add = select(adsl, !!!negate_vars(adsl_vars)), by_vars = exprs(STUDYID, USUBJID) )"},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/standards.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Ophthalmology Standards","text":"Ophthalmology hugely diverse therapeutic area, endpoints conventions can differ study study - let alone across companies. Notwithstanding , exist cases alignment possible; page indexes occurrences admiralophtha suggests adoption certain standard way things. Applying standards means mandatory, help leveraging tools (templates, functions, etc.) provided admiralophtha well lower barrier entry programming study. Additionally, page can function guidance programmers starting dip feet ophthalmology ADaM programming.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/standards.html","id":"dataset-subdivision","dir":"Articles","previous_headings":"Introduction","what":"Dataset Subdivision","title":"Ophthalmology Standards","text":"Due aforementioned high complexity diversity ophthalmology data, discouraged funnel records OE SDTM dataset single ADOE dataset, result overly complicated program/dataset pair. admiralophtha instead suggests following partition: ADOE general miscellaneous ophthalmology tests used efficacy programming. ADBCVA BCVA data - almost always constitute primary secondary endpoint require endpoint-related programming criterion flags. endpoints specific efficacy programming may required ADaM dataset (e.g. intraocular pressure data, ADIOP). ADVFQ Visual Functioning Questionnaire data. Subdividing ADaM datasets study ensure wherever custom efficacy programming required, automatically limited data interest. instance, study various endpoints form Gain x y letters relative baseline (similar) likely require criterion variable/flag pair (see Criterion Flag section detail). BCVA data stored ADOE, criterion variable/flag pairs blank irrelevant data dataset, save BCVA records. Conversely, collecting BCVA data ADBCVA ensures criterion variable/flag pairs relevant, resulting dataset readable.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/articles/standards.html","id":"criterion","dir":"Articles","previous_headings":"Introduction","what":"Criterion Flags","title":"Ophthalmology Standards","text":"admiralophtha suggests use criterion variable/flag pairs CRITx/CRITxFL possible endpoint programming. implemented correctly, transparent approach condition CRITxFL can clearly encoded CRITx, without view documentation. appropriate, condition CRITx represented programmatically rather words reduce possibility confusion. instance, endpoint Gain x y letters relative baseline, one set CRIT1 = \"x <= CHG <= y\". Note: Though allowable according ADaM standards, generally discouraged use criterion flag/variable pair one criterion across multiple parameters ADaM dataset, renders dataset confusing scrutinise. BCVA change endpoints, provides function derive_var_bcvacritxfl add en masse. Additionally, function automatically populates CRITx programmatic manner described .","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Edoardo Mancini. Author, maintainer. Ritika Aggarwal. Author. Jane Gao. Author. William Holmes. Author. Josie Jackson. Author. Sonali Jain. Author. Yuki Matsunaga. Author. Gordon Miller. Author. Rachel Linacre. Author. Lucy Palmen. Author. Nandini R Thampi. Author. Aldrich Salva. Author.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Mancini E, Aggarwal R, Gao J, Holmes W, Jackson J, Jain S, Matsunaga Y, Miller G, Linacre R, Palmen L, R Thampi N, Salva (2023). admiralophtha: ADaM R Asset Library - Ophthalmology. https://pharmaverse.github.io/admiralophtha/pre-release/, https://github.com/pharmaverse/admiralophtha/.","code":"@Manual{, title = {admiralophtha: ADaM in R Asset Library - Ophthalmology}, author = {Edoardo Mancini and Ritika Aggarwal and Jane Gao and William Holmes and Josie Jackson and Sonali Jain and Yuki Matsunaga and Gordon Miller and Rachel Linacre and Lucy Palmen and Nandini {R Thampi} and Aldrich Salva}, year = {2023}, note = {https://pharmaverse.github.io/admiralophtha/pre-release/, https://github.com/pharmaverse/admiralophtha/}, }"},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/index.html","id":"purpose","dir":"","previous_headings":"","what":"Purpose","title":"ADaM in R Asset Library - Ophthalmology","text":"provide complementary (admiral) toolbox enables users develop ophthalmology disease area datasets endpoints.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"ADaM in R Asset Library - Ophthalmology","text":"install latest development version package directly GitHub use following code:","code":"if (!requireNamespace(\"remotes\", quietly = TRUE)) { install.packages(\"remotes\") } remotes::install_github(\"pharmaverse/admiralophtha\", ref = \"devel\")"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/index.html","id":"scope","dir":"","previous_headings":"","what":"Scope","title":"ADaM in R Asset Library - Ophthalmology","text":"Build toolbox re-usable functions utilities create Ophthalmology-specific ADaM datasets R modular manner. functions created based upon ADaM Implementation Guide aim facilitate programming ADaM dataset standards.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/index.html","id":"references-and-documentation","dir":"","previous_headings":"","what":"References and Documentation","title":"ADaM in R Asset Library - Ophthalmology","text":"Please refer {admiral} References Documentation.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/index.html","id":"r-versions","dir":"","previous_headings":"","what":"R Versions","title":"ADaM in R Asset Library - Ophthalmology","text":"’s summary strategy package related R versions: R versions developers users follow admiral core package. development devel branch admiral core used dependency. releasing new admiralophtha version must run using latest released admiral core version, .e., main branch admiral core.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/index.html","id":"contact","dir":"","previous_headings":"","what":"Contact","title":"ADaM in R Asset Library - Ophthalmology","text":"use following support communications user developer community: Slack - informal discussions, Q&building user community. don’t access, use link join pharmaverse Slack workspace GitHub Issues - direct feedback, enhancement requests raising bugs","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/index.html","id":"release-schedule","dir":"","previous_headings":"","what":"Release Schedule","title":"ADaM in R Asset Library - Ophthalmology","text":"first release (v. 0.1.0) came 13th March 2023. second release Q3 2023.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha-package.html","id":null,"dir":"Reference","previous_headings":"","what":"admiralophtha: ADaM in R Asset Library - Ophthalmology — admiralophtha-package","title":"admiralophtha: ADaM in R Asset Library - Ophthalmology — admiralophtha-package","text":"Aids programming Clinical Data Standards Interchange Consortium (CDISC) compliant Ophthalmology Analysis Data Model (ADaM) datasets R. ADaM datasets mandatory part New Drug Biologics License Application submitted United States Food Drug Administration (FDA). Analysis derivations implemented accordance \"Analysis Data Model Implementation Guide\" (CDISC Analysis Data Model Team, 2021, https://www.cdisc.org/standards/foundational/adam/adamig-v1-3-release-package).","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha-package.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"admiralophtha: ADaM in R Asset Library - Ophthalmology — admiralophtha-package","text":"Maintainer: Edoardo Mancini edoardo.mancini@roche.com Authors: Ritika Aggarwal ritika.aggarwal@novartis.com Jane Gao jane.gao@roche.com William Holmes william.holmes@roche.com Josie Jackson josie.jackson@roche.com Sonali Jain sonali.jain@novartis.com Yuki Matsunaga yuki.matsunaga@novartis.com Gordon Miller gordon.miller@roche.com Rachel Linacre rachel.linacre@roche.com Lucy Palmen lucy.palmen@roche.com Nandini R Thampi nandini.rajendhiran@novartis.com Aldrich Salva salva.aldrich@gene.com","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_adbcva.html","id":null,"dir":"Reference","previous_headings":"","what":"Best Corrected Visual Acuity Analysis Dataset — admiralophtha_adbcva","title":"Best Corrected Visual Acuity Analysis Dataset — admiralophtha_adbcva","text":"example Best Corrected Visual Acuity (BCVA) analysis dataset","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_adbcva.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Best Corrected Visual Acuity Analysis Dataset — admiralophtha_adbcva","text":"","code":"admiralophtha_adbcva"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_adbcva.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Best Corrected Visual Acuity Analysis Dataset — admiralophtha_adbcva","text":"object class tbl_df (inherits tbl, data.frame) 7672 rows 116 columns.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_adbcva.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Best Corrected Visual Acuity Analysis Dataset — admiralophtha_adbcva","text":"Derived oe ADSL datasets using {admiral}, {admiralophtha} (https://github.com/pharmaverse/admiralophtha/blob/main/inst/templates/ad_adbcva.R)","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_adoe.html","id":null,"dir":"Reference","previous_headings":"","what":"Ophthalmology Exam Analysis Dataset — admiralophtha_adoe","title":"Ophthalmology Exam Analysis Dataset — admiralophtha_adoe","text":"example Ophthalmology Exam Analysis dataset","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_adoe.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Ophthalmology Exam Analysis Dataset — admiralophtha_adoe","text":"","code":"admiralophtha_adoe"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_adoe.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Ophthalmology Exam Analysis Dataset — admiralophtha_adoe","text":"object class tbl_df (inherits tbl, data.frame) 7672 rows 98 columns.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_adoe.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Ophthalmology Exam Analysis Dataset — admiralophtha_adoe","text":"Derived oe ADSL datasets using {admiral}, {admiralophtha} (https://github.com/pharmaverse/admiralophtha/blob/main/inst/templates/ad_adoe.R)","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_advfq.html","id":null,"dir":"Reference","previous_headings":"","what":"Visual Function Questionnaire Analysis Dataset — admiralophtha_advfq","title":"Visual Function Questionnaire Analysis Dataset — admiralophtha_advfq","text":"example Visual Function Questionnaire (VFQ) analysis dataset","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_advfq.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visual Function Questionnaire Analysis Dataset — admiralophtha_advfq","text":"","code":"admiralophtha_advfq"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_advfq.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Visual Function Questionnaire Analysis Dataset — admiralophtha_advfq","text":"object class tbl_df (inherits tbl, data.frame) 28798 rows 41 columns.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_advfq.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Visual Function Questionnaire Analysis Dataset — admiralophtha_advfq","text":"Derived ADSL qs datasets using {admiral}, {admiralophtha} (https://github.com/pharmaverse/admiralophtha/blob/main/inst/templates/ad_advfq.R)","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_ex.html","id":null,"dir":"Reference","previous_headings":"","what":"Exposure Ophthalmology SDTM Dataset — admiralophtha_ex","title":"Exposure Ophthalmology SDTM Dataset — admiralophtha_ex","text":"example Exposure SDTM dataset ophthalmology-specific variables EXLOC EXLAT","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_ex.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Exposure Ophthalmology SDTM Dataset — admiralophtha_ex","text":"","code":"admiralophtha_ex"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_ex.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Exposure Ophthalmology SDTM Dataset — admiralophtha_ex","text":"object class tbl_df (inherits tbl, data.frame) 591 rows 19 columns.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_ex.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Exposure Ophthalmology SDTM Dataset — admiralophtha_ex","text":"Constructed using ex {admiral} package","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_qs.html","id":null,"dir":"Reference","previous_headings":"","what":"Ophthalmology Questionnaires SDTM Dataset — admiralophtha_qs","title":"Ophthalmology Questionnaires SDTM Dataset — admiralophtha_qs","text":"example Questionnaires SDTM dataset ophthalmology-specific questionnaire NEI VFQ-25","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_qs.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Ophthalmology Questionnaires SDTM Dataset — admiralophtha_qs","text":"","code":"admiralophtha_qs"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_qs.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Ophthalmology Questionnaires SDTM Dataset — admiralophtha_qs","text":"object class tbl_df (inherits tbl, data.frame) 197671 rows 20 columns.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_qs.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Ophthalmology Questionnaires SDTM Dataset — admiralophtha_qs","text":"Constructed using qs {admiral} package","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_etdrs_to_logmar.html","id":null,"dir":"Reference","previous_headings":"","what":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","title":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","text":"Convert ETDRS score LogMAR units","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_etdrs_to_logmar.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","text":"","code":"convert_etdrs_to_logmar(value)"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_etdrs_to_logmar.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","text":"value object containing ETDRS score convert logMAR","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_etdrs_to_logmar.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","text":"input value converted converted logMAR units","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_etdrs_to_logmar.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","text":"ETDRS value converted logMAR logMAR = -0.02 * ETDRS + 1.7","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_etdrs_to_logmar.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","text":"Rachel Linacre","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_etdrs_to_logmar.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"ETDRS --> LogMAR conversion — convert_etdrs_to_logmar","text":"","code":"library(tibble) library(dplyr) #> #> Attaching package: ‘dplyr’ #> The following objects are masked from ‘package:stats’: #> #> filter, lag #> The following objects are masked from ‘package:base’: #> #> intersect, setdiff, setequal, union library(admiral) library(admiraldev) #> #> Attaching package: ‘admiraldev’ #> The following objects are masked from ‘package:dplyr’: #> #> anti_join, filter_if, inner_join, left_join adbcva <- tribble( ~STUDYID, ~USUBJID, ~AVAL, \"XXX001\", \"P01\", 5, \"XXX001\", \"P02\", 10, \"XXX001\", \"P03\", 15, \"XXX001\", \"P04\", 20, \"XXX001\", \"P05\", 25 ) adbcva <- adbcva %>% mutate(AVAL = convert_etdrs_to_logmar(AVAL))"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_logmar_to_etdrs.html","id":null,"dir":"Reference","previous_headings":"","what":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","title":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","text":"Convert LogMAR score ETDRS units","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_logmar_to_etdrs.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","text":"","code":"convert_logmar_to_etdrs(value)"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_logmar_to_etdrs.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","text":"value object containing logMAR score convert ETDRS","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_logmar_to_etdrs.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","text":"input value converted ETDRS units","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_logmar_to_etdrs.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","text":"logMAR value converted ETDRS ETDRS = -(logMAR - 1.7) / 0.02","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_logmar_to_etdrs.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","text":"Nandini R Thampi","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_logmar_to_etdrs.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"LogMAR --> ETDRS conversion — convert_logmar_to_etdrs","text":"","code":"library(tibble) library(dplyr) library(admiral) oe <- tribble( ~STUDYID, ~USUBJID, ~OETESTCD, ~OEMETHOD, ~OESTRESN, \"XXX001\", \"P01\", \"VACSCORE\", \"logMAR EYE CHART\", 1.08, \"XXX001\", \"P02\", \"VACSCORE\", \"logMAR EYE CHART\", 1.66, \"XXX001\", \"P03\", \"VACSCORE\", \"logMAR EYE CHART\", 1.60, \"XXX001\", \"P04\", \"VACSCORE\", \"ETDRS EYE CHART\", 57, \"XXX001\", \"P05\", \"VACSCORE\", \"ETDRS EYE CHART\", 1 ) adbcva <- oe %>% filter(OETESTCD == \"VACSCORE\" & toupper(OEMETHOD) == \"LOGMAR EYE CHART\") %>% mutate(OESTRESN = convert_logmar_to_etdrs(OESTRESN))"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_afeye.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive Affected Eye — derive_var_afeye","title":"Derive Affected Eye — derive_var_afeye","text":"Derive Affected Eye (AFEYE) occurrence datasets","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_afeye.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive Affected Eye — derive_var_afeye","text":"","code":"derive_var_afeye(dataset_occ, loc_var, lat_var, loc_vals = \"EYE\")"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_afeye.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive Affected Eye — derive_var_afeye","text":"dataset_occ Input Occurence dataset loc_var Location variable lat_var Laterality variable loc_vals xxLOCvalues AFEYE derived","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_afeye.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive Affected Eye — derive_var_afeye","text":"input occurrence dataset Affected Eye (AFEYE) added.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_afeye.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Derive Affected Eye — derive_var_afeye","text":"Affected Eye derived occurrence dataset using laterality Study Eye. assumes Study Eye already added ADSL.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_afeye.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Derive Affected Eye — derive_var_afeye","text":"Lucy Palmen","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_afeye.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Derive Affected Eye — derive_var_afeye","text":"","code":"library(tibble) library(admiral) adae <- tribble( ~STUDYID, ~USUBJID, ~STUDYEYE, ~AELOC, ~AELAT, \"XXX001\", \"P01\", \"RIGHT\", \"EYE\", \"RIGHT\", \"XXX001\", \"P01\", \"RIGHT\", \"EYE\", \"LEFT\", \"XXX001\", \"P01\", \"RIGHT\", \"EYE\", \"\", \"XXX001\", \"P01\", \"RIGHT\", \"\", \"RIGHT\", \"XXX001\", \"P02\", \"LEFT\", \"\", \"\", \"XXX001\", \"P02\", \"LEFT\", \"EYE\", \"LEFT\", \"XXX001\", \"P04\", \"BILATERAL\", \"EYE\", \"RIGHT\", \"XXX001\", \"P05\", \"RIGHT\", \"EYE\", \"RIGHT\", \"XXX001\", \"P05\", \"RIGHT\", \"EYE\", \"BILATERAL\", \"XXX001\", \"P06\", \"BILATERAL\", \"\", \"\", \"XXX001\", \"P06\", \"BILATERAL\", \"\", \"RIGHT\", \"XXX001\", \"P07\", \"BILATERAL\", \"EYE\", \"BILATERAL\", \"XXX001\", \"P08\", \"\", \"EYE\", \"BILATERAL\", ) adae <- derive_var_afeye(adae, AELOC, AELAT)"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl.html","id":null,"dir":"Reference","previous_headings":"","what":"Adds CRITx CRITxFL pairs to ADBCVA dataset — derive_var_bcvacritxfl","title":"Adds CRITx CRITxFL pairs to ADBCVA dataset — derive_var_bcvacritxfl","text":"Adds criterion variables CRITx corresponding flags CRITxFL ADBCVA dataset.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Adds CRITx CRITxFL pairs to ADBCVA dataset — derive_var_bcvacritxfl","text":"","code":"derive_var_bcvacritxfl( dataset_adbcva, paramcds = NULL, basetype = NULL, bcva_ranges = NULL, bcva_uplims = NULL, bcva_lowlims = NULL, additional_text = \"\", critxfl_index = NULL )"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Adds CRITx CRITxFL pairs to ADBCVA dataset — derive_var_bcvacritxfl","text":"dataset_adbcva Input dataset (ADBCVA). paramcds Vector PARAMCD values derive CRITx CRITxFL. basetype BASETYPE value derive CRITx CRITxFL. bcva_ranges List containing one numeric vectors length 2. vector c(,b) bcva_ranges, pair variables CRITx, CRITxFL created condition: <= CHG <= b. criterion flags type required, leave NULL. bcva_uplims List containing one numeric elements. element bcva_uplims, pair variables CRITx, CRITxFL created condition: CHG <= . criterion flags type required, leave NULL. bcva_lowlims List containing one numeric elements. element b bcva_lowlims, pair variables CRITx, CRITxFL created condition: CHG >= b. criterion flags type required, leave NULL. additional_text string containing additional text append CRITx critxfl_index positive integer detailing first value x use \"CRITxFL\". supplied, function takes first available value x, counting x = 1.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Adds CRITx CRITxFL pairs to ADBCVA dataset — derive_var_bcvacritxfl","text":"input ADBCVA dataset additional column pairsCRITx, CRITxFL.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Adds CRITx CRITxFL pairs to ADBCVA dataset — derive_var_bcvacritxfl","text":"function works calling derive_var_bcvacritxflonce elements bcva_ranges, bcva_uplims bcva_lowlims. NOTE: CHG equal NA, resulting criterion flag also marked NA.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Adds CRITx CRITxFL pairs to ADBCVA dataset — derive_var_bcvacritxfl","text":"Edoardo Mancini","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Adds CRITx CRITxFL pairs to ADBCVA dataset — derive_var_bcvacritxfl","text":"","code":"library(tibble) library(admiral) library(admiraldev) adbcva1 <- tribble( ~STUDYID, ~USUBJID, ~BASETYPE, ~PARAMCD, ~CHG, \"XXX001\", \"P01\", \"LAST\", \"SBCVA\", 0, \"XXX001\", \"P01\", \"LAST\", \"FBCVA\", 2, \"XXX001\", \"P01\", \"LAST\", \"SBCVALOG\", -7, \"XXX001\", \"P02\", \"LAST\", \"SBCVA\", -13, \"XXX001\", \"P02\", \"LAST\", \"FBCVA\", 5, \"XXX001\", \"P02\", \"LAST\", \"SBCVALOG\", 12, \"XXX001\", \"P03\", \"LAST\", \"SBCVA\", NA, \"XXX001\", \"P03\", \"LAST\", \"FBCVA\", 17 ) derive_var_bcvacritxfl( dataset_adbcva = adbcva1, paramcds = c(\"SBCVA\", \"FBCVA\"), basetype = NULL, bcva_ranges = list(c(0, 5), c(-5, -1), c(10, 15)), bcva_uplims = list(5, 10), bcva_lowlims = list(8), additional_text = \"\" ) #> # A tibble: 8 × 17 #> STUDYID USUBJID BASETYPE PARAMCD CHG CRIT1 CRIT1FL CRIT2 CRIT2FL CRIT3 #> #> 1 XXX001 P01 LAST SBCVA 0 0 <= CHG … Y -5 <… N 10 <… #> 2 XXX001 P01 LAST FBCVA 2 0 <= CHG … Y -5 <… N 10 <… #> 3 XXX001 P02 LAST SBCVA -13 0 <= CHG … N -5 <… N 10 <… #> 4 XXX001 P02 LAST FBCVA 5 0 <= CHG … Y -5 <… N 10 <… #> 5 XXX001 P03 LAST SBCVA NA 0 <= CHG … NA -5 <… NA 10 <… #> 6 XXX001 P03 LAST FBCVA 17 0 <= CHG … N -5 <… N 10 <… #> 7 XXX001 P01 LAST SBCVALOG -7 NA NA NA NA NA #> 8 XXX001 P02 LAST SBCVALOG 12 NA NA NA NA NA #> # ℹ 7 more variables: CRIT3FL , CRIT4 , CRIT4FL , CRIT5 , #> # CRIT5FL , CRIT6 , CRIT6FL adbcva2 <- tribble( ~STUDYID, ~USUBJID, ~AVISIT, ~BASETYPE, ~PARAMCD, ~AVAL, ~CHG, \"XXX001\", \"P01\", \"BASELINE\", \"LAST\", \"SBCVA\", 4, NA, \"XXX001\", \"P01\", \"BASELINE\", \"LAST\", \"SBCVA\", 6, NA, \"XXX001\", \"P01\", \"AVERAGE BASELINE\", \"AVERAGE\", \"SBCVA\", 5, NA, \"XXX001\", \"P01\", \"WEEK 2\", \"LAST\", \"SBCVA\", -3, NA, \"XXX001\", \"P01\", \"WEEK 4\", \"LAST\", \"SBCVA\", -10, NA, \"XXX001\", \"P01\", \"WEEK 6\", \"LAST\", \"SBCVA\", 12, NA, \"XXX001\", \"P01\", \"WEEK 2\", \"AVERAGE\", \"SBCVA\", -2, -7, \"XXX001\", \"P01\", \"WEEK 4\", \"AVERAGE\", \"SBCVA\", 6, 1, \"XXX001\", \"P01\", \"WEEK 6\", \"AVERAGE\", \"SBCVA\", 3, -2 ) derive_var_bcvacritxfl( dataset_adbcva = adbcva2, paramcds = c(\"SBCVA\", \"FBCVA\"), basetype = \"AVERAGE\", bcva_ranges = list(c(0, 5), c(-10, 0)), bcva_lowlims = list(5), additional_text = \" (AVERAGE)\" ) #> # A tibble: 9 × 13 #> STUDYID USUBJID AVISIT BASETYPE PARAMCD AVAL CHG CRIT1 CRIT1FL CRIT2 #> #> 1 XXX001 P01 AVERAGE BASE… AVERAGE SBCVA 5 NA 0 <=… NA -10 … #> 2 XXX001 P01 WEEK 2 AVERAGE SBCVA -2 -7 0 <=… N -10 … #> 3 XXX001 P01 WEEK 4 AVERAGE SBCVA 6 1 0 <=… Y -10 … #> 4 XXX001 P01 WEEK 6 AVERAGE SBCVA 3 -2 0 <=… N -10 … #> 5 XXX001 P01 BASELINE LAST SBCVA 4 NA NA NA NA #> 6 XXX001 P01 BASELINE LAST SBCVA 6 NA NA NA NA #> 7 XXX001 P01 WEEK 2 LAST SBCVA -3 NA NA NA NA #> 8 XXX001 P01 WEEK 4 LAST SBCVA -10 NA NA NA NA #> 9 XXX001 P01 WEEK 6 LAST SBCVA 12 NA NA NA NA #> # ℹ 3 more variables: CRIT2FL , CRIT3 , CRIT3FL "},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl_util.html","id":null,"dir":"Reference","previous_headings":"","what":"Add CRITx and CRITxFL pair to ADBCVA dataset — derive_var_bcvacritxfl_util","title":"Add CRITx and CRITxFL pair to ADBCVA dataset — derive_var_bcvacritxfl_util","text":"Helper function derive_var_bcvacritxfl adds criterion variable CRITx corresponding flag CRITxFL ADBCVA dataset.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl_util.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add CRITx and CRITxFL pair to ADBCVA dataset — derive_var_bcvacritxfl_util","text":"","code":"derive_var_bcvacritxfl_util( dataset, critx_text, critxfl_cond, counter, bcva_range = NULL, bcva_uplim = NULL, bcva_lowlim = NULL )"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl_util.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add CRITx and CRITxFL pair to ADBCVA dataset — derive_var_bcvacritxfl_util","text":"dataset Input dataset (ADBCVA). critx_text String containing text CRITx variable. critxfl_cond String containing R code detailing criterion satisfied CRITxFL variable equal \"Y\". counter Integer detailing value x use \"CRITxFL\". bcva_range Numeric vector length two detailing lower upper change BCVA limits (bcva_range called critxfl_cond criterion stipulates change BCVA lie inside range). bcva_uplim Numeric value detailing highest change BCVA limit (bcva_uplim called critxfl_cond criterion stipulates change BCVA lie upper limit). bcva_lowlim Numeric value detailing lowest change BCVA limit (bcva_lowlim called critxfl_cond criterion stipulates change BCVA lie lower limit).","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl_util.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add CRITx and CRITxFL pair to ADBCVA dataset — derive_var_bcvacritxfl_util","text":"input ADBCVA dataset additional columns CRITx, CRITxFL.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl_util.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add CRITx and CRITxFL pair to ADBCVA dataset — derive_var_bcvacritxfl_util","text":"criterion change BCVA CRITxFL can three types: (1) value lies within range; <= CHG <= b; (2) value upper limit; CHG <= ; (3) value lower limit; b <= CHG. (1), bcva_range must specified function; (2), bcva_uplim; (3) bcva_lowlim. ever necessary supply one three arguments. NOTE: CHG equal NA, resulting criterion flag also marked NA.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl_util.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Add CRITx and CRITxFL pair to ADBCVA dataset — derive_var_bcvacritxfl_util","text":"Edoardo Mancini","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_studyeye.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive Study Eye — derive_var_studyeye","title":"Derive Study Eye — derive_var_studyeye","text":"Derive Study Eye (STUDYEYE) ADSL dataset","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_studyeye.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive Study Eye — derive_var_studyeye","text":"","code":"derive_var_studyeye(dataset_adsl, dataset_sc, sctestcd_value = \"FOCID\")"},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_studyeye.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive Study Eye — derive_var_studyeye","text":"dataset_adsl ADSL input dataset dataset_sc SC input dataset sctestcd_value SCTESTCD value flagging Study Eye selection records. Default: \"FOCID\".","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_studyeye.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive Study Eye — derive_var_studyeye","text":"input ADSL dataset additional column named STUDYEYE","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_studyeye.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Derive Study Eye — derive_var_studyeye","text":"Study Eye derived ADSL using \"Study Eye selection\" records SC SDTM dataset.","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_studyeye.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Derive Study Eye — derive_var_studyeye","text":"Edoardo Mancini","code":""},{"path":"https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_studyeye.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Derive Study Eye — derive_var_studyeye","text":"","code":"library(tibble) library(admiral) adsl <- tribble( ~STUDYID, ~USUBJID, \"XXX001\", \"P01\", \"XXX001\", \"P02\", \"XXX001\", \"P03\", \"XXX001\", \"P04\", \"XXX001\", \"P05\" ) sc <- tribble( ~STUDYID, ~USUBJID, ~SCTESTCD, ~SCSTRESC, \"XXX001\", \"P01\", \"FOCID\", \"OS\", \"XXX001\", \"P01\", \"ACOHORT\", \"COHORT1\", \"XXX001\", \"P02\", \"FOCID\", \"OD\", \"XXX001\", \"P02\", \"ACOHORT\", \"COHORT3\", \"XXX001\", \"P04\", \"FOCID\", \"OU\", \"XXX001\", \"P05\", \"FOCID\", \"OD\", \"XXX001\", \"P06\", \"FOCID\", \"OS\" ) derive_var_studyeye(adsl, sc) #> Warning: `derive_var_merged_cat()` was deprecated in admiral 0.11.0. #> ℹ Please use `derive_vars_merged()` instead. #> ℹ The deprecated feature was likely used in the admiralophtha package. #> Please report the issue at #> . #> # A tibble: 5 × 3 #> STUDYID USUBJID STUDYEYE #> #> 1 XXX001 P01 \"LEFT\" #> 2 XXX001 P02 \"RIGHT\" #> 3 XXX001 P03 \"\" #> 4 XXX001 P04 \"BILATERAL\" #> 5 XXX001 P05 \"RIGHT\""}] diff --git a/pre-release/sitemap.xml b/pre-release/sitemap.xml deleted file mode 100644 index 17809a56..00000000 --- a/pre-release/sitemap.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - https://pharmaverse.github.io/admiralophtha/pre-release/404.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/LICENSE.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/articles/adbcva.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/articles/admiralophtha.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/articles/adoe.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/articles/advfq.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/articles/index.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/articles/standards.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/authors.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/index.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/news/index.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/pull_request_template.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha-package.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_adbcva.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_adoe.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_advfq.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_ex.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/reference/admiralophtha_qs.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_etdrs_to_logmar.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/reference/convert_logmar_to_etdrs.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_afeye.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_bcvacritxfl_util.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/reference/derive_var_studyeye.html - - - https://pharmaverse.github.io/admiralophtha/pre-release/reference/index.html - - diff --git a/main/pull_request_template.html b/pull_request_template.html similarity index 64% rename from main/pull_request_template.html rename to pull_request_template.html index 414dda97..cc0e5247 100644 --- a/main/pull_request_template.html +++ b/pull_request_template.html @@ -1,5 +1,5 @@ -NA • admiralophthaNA • admiralophtha @@ -36,14 +36,6 @@ - - @@ -80,50 +72,36 @@

    Thank you for your Pull Request! We have developed this task checklist from the Development Process Guide to help with the final steps of the process. Completing the below tasks helps to ensure our reviewers can maximize their time on your code as well as making sure the admiral codebase remains robust and consistent.

    Please check off each taskbox as an acknowledgment that you completed the task or check off that it is not relevant to your Pull Request. This checklist is part of the Github Action workflows and the Pull Request will not be merged into the devel branch until you have checked off each task.

    • - -Place Closes # into the beginning of your Pull Request Title (Use Edit button in top-right if you need to update)
    • +Place Closes # into the beginning of your Pull Request Title (Use Edit button in top-right if you need to update)
    • - -Code is formatted according to the tidyverse style guide. Run styler::style_file() to style R and Rmd files
    • +Code is formatted according to the tidyverse style guide. Run styler::style_file() to style R and Rmd files
    • - -Updated relevant unit tests or have written new unit tests - See Unit Test Guide +Updated relevant unit tests or have written new unit tests - See Unit Test Guide
    • - -If you removed/replaced any function and/or function parameters, did you fully follow the deprecation guidance?
    • +If you removed/replaced any function and/or function parameters, did you fully follow the deprecation guidance?
    • - -Update to all relevant roxygen headers and examples.
    • +Update to all relevant roxygen headers and examples.
    • - -Run devtools::document() so all .Rd files in the man folder and the NAMESPACE file in the project root are updated appropriately
    • +Run devtools::document() so all .Rd files in the man folder and the NAMESPACE file in the project root are updated appropriately
    • - -Address any updates needed for vignettes and/or templates
    • +Address any updates needed for vignettes and/or templates
    • - -Update NEWS.md if the changes pertain to a user-facing function (i.e. it has an @export tag) or documentation aimed at users (rather than developers)
    • +Update NEWS.md if the changes pertain to a user-facing function (i.e. it has an @export tag) or documentation aimed at users (rather than developers)
    • - -Build admiral site pkgdown::build_site() and check that all affected examples are displayed correctly and that all new functions occur on the “Reference” page.
    • +Build admiral site pkgdown::build_site() and check that all affected examples are displayed correctly and that all new functions occur on the “Reference” page.
    • - -Address or fix all lintr warnings and errors - lintr::lint_package() +Address or fix all lintr warnings and errors - lintr::lint_package()
    • - -Run R CMD check locally and address all errors and warnings - devtools::check() +Run R CMD check locally and address all errors and warnings - devtools::check()
    • - -Link the issue so that it closes after successful merging.
    • +Link the issue so that it closes after successful merging.
    • - -Address all merge conflicts and resolve appropriately.
    • +Address all merge conflicts and resolve appropriately.
    • - -Pat yourself on the back for a job well done! Much love to your accomplishment!
    • +Pat yourself on the back for a job well done! Much love to your accomplishment!
    diff --git a/devel/reference/Rplot001.png b/reference/Rplot001.png similarity index 100% rename from devel/reference/Rplot001.png rename to reference/Rplot001.png diff --git a/main/reference/admiralophtha-package.html b/reference/admiralophtha-package.html similarity index 88% rename from main/reference/admiralophtha-package.html rename to reference/admiralophtha-package.html index c8454d03..847d5c04 100644 --- a/main/reference/admiralophtha-package.html +++ b/reference/admiralophtha-package.html @@ -1,7 +1,7 @@ admiralophtha: ADaM in R Asset Library - Ophthalmology — admiralophtha-package • admiralophtha @@ -38,14 +38,6 @@ - - @@ -87,7 +79,7 @@

    See also

    -

    Useful links:

    @@ -83,7 +75,7 @@

    Usage

    -
    admiralophtha_adbcva
    +
    admiralophtha_adbcva
    diff --git a/main/reference/admiralophtha_adoe.html b/reference/admiralophtha_adoe.html similarity index 85% rename from main/reference/admiralophtha_adoe.html rename to reference/admiralophtha_adoe.html index a1ef9164..48c679e9 100644 --- a/main/reference/admiralophtha_adoe.html +++ b/reference/admiralophtha_adoe.html @@ -1,5 +1,5 @@ -Ophthalmology Exam Analysis Dataset — admiralophtha_adoe • admiralophthaOphthalmology Exam Analysis Dataset — admiralophtha_adoe • admiralophtha @@ -36,14 +36,6 @@ - - @@ -83,7 +75,7 @@

    Usage

    -
    admiralophtha_adoe
    +
    admiralophtha_adoe
    diff --git a/main/reference/admiralophtha_advfq.html b/reference/admiralophtha_advfq.html similarity index 86% rename from main/reference/admiralophtha_advfq.html rename to reference/admiralophtha_advfq.html index 31a62486..c5ae2e05 100644 --- a/main/reference/admiralophtha_advfq.html +++ b/reference/admiralophtha_advfq.html @@ -1,5 +1,5 @@ -Visual Function Questionnaire Analysis Dataset — admiralophtha_advfq • admiralophthaVisual Function Questionnaire Analysis Dataset — admiralophtha_advfq • admiralophtha @@ -36,14 +36,6 @@ - - @@ -83,7 +75,7 @@

    Usage

    -
    admiralophtha_advfq
    +
    admiralophtha_advfq
    diff --git a/main/reference/convert_etdrs_to_logmar.html b/reference/convert_etdrs_to_logmar.html similarity index 69% rename from main/reference/convert_etdrs_to_logmar.html rename to reference/convert_etdrs_to_logmar.html index 1bb37b8f..f05d550f 100644 --- a/main/reference/convert_etdrs_to_logmar.html +++ b/reference/convert_etdrs_to_logmar.html @@ -1,5 +1,5 @@ -ETDRS --> LogMAR conversion — convert_etdrs_to_logmar • admiralophthaETDRS --> LogMAR conversion — convert_etdrs_to_logmar • admiralophtha @@ -36,14 +36,6 @@ - - @@ -83,7 +75,7 @@

    Usage

    -
    convert_etdrs_to_logmar(value)
    +
    convert_etdrs_to_logmar(value)
    @@ -113,8 +105,8 @@

    Author<

    Examples

    -
    library(tibble)
    -library(dplyr)
    +    
    library(tibble)
    +library(dplyr)
     #> 
     #> Attaching package: ‘dplyr’
     #> The following objects are masked from ‘package:stats’:
    @@ -123,24 +115,24 @@ 

    Examples#> The following objects are masked from ‘package:base’: #> #> intersect, setdiff, setequal, union -library(admiral) -library(admiraldev) +library(admiral) +library(admiraldev) #> #> Attaching package: ‘admiraldev’ #> The following objects are masked from ‘package:dplyr’: #> #> anti_join, filter_if, inner_join, left_join - -adbcva <- tribble( - ~STUDYID, ~USUBJID, ~AVAL, - "XXX001", "P01", 5, - "XXX001", "P02", 10, - "XXX001", "P03", 15, - "XXX001", "P04", 20, - "XXX001", "P05", 25 -) - -adbcva <- adbcva %>% mutate(AVAL = convert_etdrs_to_logmar(AVAL)) + +adbcva <- tribble( + ~STUDYID, ~USUBJID, ~AVAL, + "XXX001", "P01", 5, + "XXX001", "P02", 10, + "XXX001", "P03", 15, + "XXX001", "P04", 20, + "XXX001", "P05", 25 +) + +adbcva <- adbcva %>% mutate(AVAL = convert_etdrs_to_logmar(AVAL))