From 412dadce76ea41660c75aeb7b1acbfe6db5d117b Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 20 Apr 2015 10:12:11 +0800 Subject: [PATCH] version 2.0.0 beta --- .gitignore | 44 +- LICENSE | 339 + README.md | 41 +- connect.py | 387 + docs/AddUserAsset.py | 141 + {webroot => docs}/__init__.py | 0 docs/developer_doc.txt | 36 + docs/install.py | 135 + scripts/requirements.txt => docs/require.txt | 19 +- {webroot/AutoSa/Assets => jasset}/__init__.py | 0 {webroot/AutoSa/Assets => jasset}/admin.py | 0 jasset/models.py | 54 + {webroot/AutoSa/Assets => jasset}/tests.py | 0 jasset/urls.py | 28 + jasset/views.py | 927 + {webroot/AutoSa/AutoSa => jlog}/__init__.py | 0 {webroot/AutoSa/UserManage => jlog}/admin.py | 0 jlog/models.py | 17 + {webroot/AutoSa/UserManage => jlog}/tests.py | 0 jlog/urls.py | 11 + jlog/views.py | 117 + .../AutoSa/templatetags => jperm}/__init__.py | 0 jperm/admin.py | 3 + jperm/models.py | 54 + jperm/tests.py | 3 + jperm/urls.py | 33 + jperm/views.py | 813 + jumpserver.conf | 40 +- jumpserver.py | 311 - .../UserManage => jumpserver}/__init__.py | 0 jumpserver/api.py | 502 + jumpserver/context_processors.py | 35 + .../AutoSa/AutoSa => jumpserver}/settings.py | 69 +- jumpserver/templatetags/__init__.py | 1 + jumpserver/templatetags/mytags.py | 394 + jumpserver/urls.py | 21 + jumpserver/views.py | 313 + {webroot/AutoSa/AutoSa => jumpserver}/wsgi.py | 8 +- keys/test.pub => juser/__init__.py | 0 juser/admin.py | 3 + juser/models.py | 41 + juser/tests.py | 3 + juser/urls.py | 33 + juser/views.py | 1050 + keys/test | 30 - log_handler.py | 84 + logs/test.log | 0 webroot/AutoSa/manage.py => manage.py | 2 +- runserver | 18 - scripts/jumpserver.sh | 13 - service.sh | 24 + ssh | 395 + ssh.py | 395 + static/css/animate.css | 2848 +++ static/css/bootstrap.min.css | 5 + static/css/colorbox.css | 50 + static/css/images/controls.png | Bin 0 -> 503 bytes static/css/images/loading.gif | Bin 0 -> 6244 bytes static/css/magnific/magnific-popup.css | 374 + static/css/patterns/congruent_pentagon.png | Bin 0 -> 28934 bytes static/css/patterns/header-profile-skin-1.png | Bin 0 -> 26278 bytes static/css/patterns/header-profile-skin-2.png | Bin 0 -> 28211 bytes static/css/patterns/header-profile-skin-3.png | Bin 0 -> 33032 bytes static/css/patterns/header-profile.png | Bin 0 -> 5877 bytes static/css/patterns/otis_redding.png | Bin 0 -> 10849 bytes static/css/patterns/shattered.png | Bin 0 -> 137733 bytes static/css/patterns/triangular.png | Bin 0 -> 210 bytes static/css/plugins/dropzone/basic.css | 155 + static/css/plugins/dropzone/dropzone.css | 410 + .../css/plugins/fullcalendar/fullcalendar.css | 977 + .../fullcalendar/fullcalendar.print.css | 202 + static/css/plugins/iCheck/custom.css | 59 + static/css/plugins/iCheck/green.png | Bin 0 -> 5064 bytes static/css/plugins/iCheck/green@2x.png | Bin 0 -> 7708 bytes .../alpha-horizontal.png | Bin 0 -> 3635 bytes .../images/bootstrap-colorpicker/alpha.png | Bin 2836 -> 3271 bytes .../bootstrap-colorpicker/hue-horizontal.png | Bin 0 -> 2837 bytes .../images/bootstrap-colorpicker/hue.png | Bin 2804 -> 2972 bytes .../bootstrap-colorpicker/saturation.png | Bin 0 -> 8817 bytes static/css/plugins/images/sort.png | Bin 0 -> 1060 bytes static/css/plugins/images/sort_asc.png | Bin 0 -> 1022 bytes static/css/plugins/images/sort_desc.png | Bin 0 -> 1017 bytes .../css/plugins/images/sprite-skin-flat.png | Bin 0 -> 3376 bytes .../css/plugins/images/sprite-skin-flat2.png | Bin 0 -> 783 bytes .../css/plugins/images/sprite-skin-nice.png | Bin 0 -> 1022 bytes .../css/plugins/images/sprite-skin-simple.png | Bin 0 -> 385 bytes static/css/plugins/images/spritemap.png | Bin 0 -> 10208 bytes static/css/plugins/images/spritemap@2x.png | Bin 0 -> 35675 bytes static/css/style.css | 4564 ++++ static/css/vaildator/images/loading.gif | Bin 0 -> 457 bytes .../vaildator/images/validator_default.png | Bin 0 -> 424 bytes .../css/vaildator/images/validator_simple.png | Bin 0 -> 1075 bytes static/css/vaildator/jquery.validator.css | 64 + static/font-awesome/css/font-awesome.css | 1672 ++ static/font-awesome/css/font-awesome.min.css | 4 + static/font-awesome/fonts/FontAwesome.otf | Bin 0 -> 85908 bytes .../fonts/fontawesome-webfont.eot | Bin 0 -> 56006 bytes .../fonts/fontawesome-webfont.svg | 520 + .../fonts/fontawesome-webfont.ttf | Bin 0 -> 112160 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 65452 bytes static/font-awesome/less/bordered-pulled.less | 16 + static/font-awesome/less/core.less | 11 + static/font-awesome/less/fixed-width.less | 6 + static/font-awesome/less/font-awesome.less | 17 + static/font-awesome/less/icons.less | 552 + static/font-awesome/less/larger.less | 13 + static/font-awesome/less/list.less | 19 + static/font-awesome/less/mixins.less | 25 + static/font-awesome/less/path.less | 14 + static/font-awesome/less/rotated-flipped.less | 20 + static/font-awesome/less/spinning.less | 29 + static/font-awesome/less/stacked.less | 20 + static/font-awesome/less/variables.less | 561 + .../font-awesome/scss/_bordered-pulled.scss | 16 + static/font-awesome/scss/_core.scss | 11 + static/font-awesome/scss/_fixed-width.scss | 6 + static/font-awesome/scss/_icons.scss | 552 + static/font-awesome/scss/_larger.scss | 13 + static/font-awesome/scss/_list.scss | 19 + static/font-awesome/scss/_mixins.scss | 25 + static/font-awesome/scss/_path.scss | 14 + .../font-awesome/scss/_rotated-flipped.scss | 20 + static/font-awesome/scss/_spinning.scss | 29 + static/font-awesome/scss/_stacked.scss | 20 + static/font-awesome/scss/_variables.scss | 561 + static/font-awesome/scss/font-awesome.scss | 17 + static/fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20335 bytes .../fonts/glyphicons-halflings-regular.svg | 96 +- .../fonts/glyphicons-halflings-regular.ttf | Bin 41236 -> 41280 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23320 bytes static/img/a1.jpg | Bin 0 -> 3497 bytes static/img/a2.jpg | Bin 0 -> 19568 bytes static/img/a3.jpg | Bin 0 -> 6790 bytes static/img/a4.jpg | Bin 0 -> 5916 bytes static/img/a5.jpg | Bin 0 -> 4240 bytes static/img/a6.jpg | Bin 0 -> 3740 bytes static/img/a7.jpg | Bin 0 -> 11361 bytes static/img/a8.jpg | Bin 0 -> 16993 bytes static/img/admin.bak.png | Bin 0 -> 7398 bytes static/img/admin.png | Bin 0 -> 62768 bytes static/img/angular_logo.png | Bin 0 -> 14785 bytes static/img/email_1.jpg | Bin 0 -> 203869 bytes static/img/email_2.jpg | Bin 0 -> 159488 bytes static/img/email_3.jpg | Bin 0 -> 113739 bytes static/img/facio.ico | Bin 0 -> 1628 bytes static/img/html_logo.png | Bin 0 -> 8562 bytes static/img/logo.png | Bin 0 -> 6116 bytes static/img/mvc_logo.png | Bin 0 -> 24068 bytes static/img/p1.jpg | Bin 0 -> 149114 bytes static/img/p2.jpg | Bin 0 -> 151080 bytes static/img/p3.jpg | Bin 0 -> 125697 bytes static/img/p4.jpg | Bin 0 -> 103903 bytes static/img/p5.jpg | Bin 0 -> 156354 bytes static/img/p6.jpg | Bin 0 -> 182164 bytes static/img/p7.jpg | Bin 0 -> 101660 bytes static/img/p8.jpg | Bin 0 -> 72090 bytes static/img/p_big1.jpg | Bin 0 -> 560839 bytes static/img/p_big2.jpg | Bin 0 -> 451228 bytes static/img/p_big3.jpg | Bin 0 -> 521275 bytes static/img/profile.jpg | Bin 0 -> 38520 bytes static/img/profile_big.jpg | Bin 0 -> 252814 bytes static/img/profile_small.jpg | Bin 0 -> 12367 bytes static/img/root.png | Bin 0 -> 107108 bytes static/img/spritemap.png | Bin 0 -> 10208 bytes static/img/user.png | Bin 0 -> 17315 bytes static/img/zender_logo.png | Bin 0 -> 4003 bytes static/js/base.js | 121 + .../static => static}/js/bootstrap-dialog.js | 0 static/js/bootstrap.min.js | 7 + static/js/demo/peity-demo.js | 33 + static/js/dropzone/dropzone.js | 1841 ++ .../adapters/standalone-framework.js | 18 + .../adapters/standalone-framework.src.js | 590 + static/js/highcharts/highcharts-3d.js | 41 + static/js/highcharts/highcharts-3d.src.js | 1248 ++ static/js/highcharts/highcharts-all.js | 453 + static/js/highcharts/highcharts-more.js | 51 + static/js/highcharts/highcharts-more.src.js | 2546 +++ static/js/highcharts/highcharts.js | 305 + static/js/highcharts/highcharts.src.js | 17672 ++++++++++++++++ static/js/highcharts/modules/canvas-tools.js | 133 + .../js/highcharts/modules/canvas-tools.src.js | 3113 +++ static/js/highcharts/modules/data.js | 16 + static/js/highcharts/modules/data.src.js | 607 + static/js/highcharts/modules/drilldown.js | 14 + static/js/highcharts/modules/drilldown.src.js | 585 + static/js/highcharts/modules/exporting.js | 22 + static/js/highcharts/modules/exporting.src.js | 715 + static/js/highcharts/modules/funnel.js | 13 + static/js/highcharts/modules/funnel.src.js | 310 + static/js/highcharts/modules/heatmap.js | 21 + static/js/highcharts/modules/heatmap.src.js | 606 + .../highcharts/modules/no-data-to-display.js | 12 + .../modules/no-data-to-display.src.js | 130 + static/js/highcharts/modules/solid-gauge.js | 13 + .../js/highcharts/modules/solid-gauge.src.js | 224 + static/js/highcharts/themes/dark-blue.js | 254 + static/js/highcharts/themes/dark-green.js | 255 + static/js/highcharts/themes/dark-unica.js | 213 + static/js/highcharts/themes/gray.js | 257 + static/js/highcharts/themes/grid-light.js | 74 + static/js/highcharts/themes/grid.js | 103 + static/js/highcharts/themes/sand-signika.js | 101 + static/js/highcharts/themes/skies.js | 89 + static/js/inspinia.js | 167 + static/js/jquery-2.1.1.js | 4 + static/js/jquery-ui-1.10.4.min.js | 7 + static/js/jquery-ui.custom.min.js | 16 + static/js/jquery.colorbox.js | 1091 + static/js/layer/extend/layer.ext.js | 12 + static/js/layer/layer.min.js | 16 + static/js/layer/skin/default/icon_ext.png | Bin 0 -> 7677 bytes static/js/layer/skin/default/textbg.png | Bin 0 -> 210 bytes static/js/layer/skin/default/xubox_ico0.png | Bin 0 -> 32954 bytes .../js/layer/skin/default/xubox_loading0.gif | Bin 0 -> 5793 bytes .../js/layer/skin/default/xubox_loading1.gif | Bin 0 -> 701 bytes .../js/layer/skin/default/xubox_loading2.gif | Bin 0 -> 1787 bytes .../js/layer/skin/default/xubox_loading3.gif | Bin 0 -> 2364 bytes static/js/layer/skin/default/xubox_title0.png | Bin 0 -> 221 bytes static/js/layer/skin/layer.css | 83 + static/js/layer/skin/layer.ext.css | 45 + .../js/magnific/jquery.magnific-popup.min.js | 4 + static/js/mindmup-editabletable.js | 133 + .../plugins/fullcalendar/fullcalendar.min.js | 8 + static/js/plugins/fullcalendar/moment.min.js | 7 + static/js/plugins/iCheck/icheck.min.js | 11 + .../js/plugins/metisMenu/jquery.metisMenu.js | 120 + static/js/plugins/pace/pace.min.js | 2 + static/js/plugins/peity/jquery.peity.min.js | 13 + .../plugins/slimscroll/jquery.slimscroll.js | 464 + .../slimscroll/jquery.slimscroll.min.js | 16 + static/js/validator/images/loading.gif | Bin 0 -> 457 bytes .../js/validator/images/validator_default.png | Bin 0 -> 424 bytes .../js/validator/images/validator_simple.png | Bin 0 -> 1075 bytes static/js/validator/jquery.validator.js | 5 + static/js/validator/zh_CN.js | 156 + stopserver | 5 - templates/404.html | 43 + templates/500.html | 39 + templates/base.html | 33 + templates/download.html | 39 + templates/error.html | 51 + templates/filter_ajax_api.html | 9 + templates/foot_script.html | 40 + templates/footer.html | 8 + templates/head_script.html | 11 + templates/index.html | 408 + templates/index_cu.html | 162 + templates/jasset/dept_host_ajax.html | 3 + templates/jasset/group_add.html | 206 + templates/jasset/group_detail.html | 203 + templates/jasset/group_edit.html | 174 + templates/jasset/group_list.html | 117 + templates/jasset/host_add.html | 207 + templates/jasset/host_add_multi.html | 68 + templates/jasset/host_detail.html | 221 + templates/jasset/host_edit.html | 228 + templates/jasset/host_list.html | 192 + templates/jasset/host_list_common.html | 172 + templates/jasset/host_list_nop.html | 177 + templates/jasset/host_search.html | 169 + templates/jasset/idc_add.html | 79 + templates/jasset/idc_detail.html | 211 + templates/jasset/idc_edit.html | 109 + templates/jasset/idc_list.html | 125 + templates/jasset/jasset.html | 10 + templates/jasset/jlist_ip.html | 106 + templates/jasset/show_all_ajax.html | 7 + templates/jasset/test.html | 30 + templates/jlog/log_offline.html | 159 + templates/jlog/log_online.html | 218 + templates/jlog/log_search.html | 33 + templates/jlog/user_history.html | 163 + templates/jperm/dept_perm_edit.html | 179 + templates/jperm/dept_perm_list.html | 104 + templates/jperm/perm_add.html | 176 + templates/jperm/perm_apply.html | 187 + templates/jperm/perm_apply_exec.html | 31 + templates/jperm/perm_apply_info.html | 55 + templates/jperm/perm_apply_search.html | 40 + templates/jperm/perm_asset_detail.html | 61 + templates/jperm/perm_detail.html | 118 + templates/jperm/perm_edit.html | 130 + templates/jperm/perm_edit_bak.html | 138 + templates/jperm/perm_list.html | 108 + templates/jperm/perm_list_ajax.html | 132 + templates/jperm/perm_log.html | 93 + templates/jperm/perm_log_offline.html | 127 + templates/jperm/perm_log_online.html | 128 + templates/jperm/perm_user_detail.html | 240 + templates/jperm/sudo_add.html | 226 + templates/jperm/sudo_cmd_add.html | 148 + templates/jperm/sudo_cmd_detail.html | 48 + templates/jperm/sudo_cmd_list.html | 140 + templates/jperm/sudo_detail.html | 170 + templates/jperm/sudo_edit.html | 155 + templates/jperm/sudo_list.html | 129 + templates/juser/chg_info.html | 132 + templates/juser/dept_add.html | 133 + templates/juser/dept_detail.html | 116 + templates/juser/dept_edit.html | 133 + templates/juser/dept_list.html | 126 + templates/juser/dept_user_ajax.html | 3 + templates/juser/group_add.html | 152 + templates/juser/group_add_ajax.html | 4 + templates/juser/group_detail.html | 43 + templates/juser/group_edit.html | 160 + templates/juser/group_list.html | 112 + templates/juser/profile.html | 82 + templates/juser/user_add.html | 212 + templates/juser/user_detail.html | 212 + templates/juser/user_edit.html | 219 + templates/juser/user_list.html | 139 + templates/link_css.html | 11 + templates/login.html | 47 + templates/nav.html | 151 + templates/nav_bar_header.html | 61 + templates/nav_cat_bar.html | 22 + templates/nav_li_profile.html | 47 + templates/paginator.html | 72 + templates/skin_config.html | 209 + templates/success.html | 39 + templates/test.html | 74 + templates/upload.html | 101 + webroot/AutoSa/.idea/.name | 1 - webroot/AutoSa/.idea/AutoSa.iml | 21 - webroot/AutoSa/.idea/dataSources.ids | 6 - webroot/AutoSa/.idea/dataSources.xml | 14 - webroot/AutoSa/.idea/encodings.xml | 5 - webroot/AutoSa/.idea/misc.xml | 5 - webroot/AutoSa/.idea/modules.xml | 9 - .../AutoSa/.idea/scopes/scope_settings.xml | 5 - webroot/AutoSa/.idea/vcs.xml | 7 - webroot/AutoSa/.idea/workspace.xml | 931 - webroot/AutoSa/Assets/models.py | 27 - webroot/AutoSa/Assets/views.py | 3 - webroot/AutoSa/AutoSa/context_processors.py | 7 - webroot/AutoSa/AutoSa/templatetags/mytags.py | 12 - webroot/AutoSa/AutoSa/urls.py | 40 - webroot/AutoSa/AutoSa/views.py | 1134 - webroot/AutoSa/UserManage/forms.py | 48 - webroot/AutoSa/UserManage/models.py | 48 - webroot/AutoSa/UserManage/views.py | 3 - webroot/AutoSa/__init__.py | 1 - webroot/AutoSa/log_handler.py | 96 - .../AutoSa/static/css/bootstrap-dialog.css | 120 - webroot/AutoSa/static/css/bootstrap-theme.css | 397 - .../AutoSa/static/css/bootstrap-theme.min.css | 7 - webroot/AutoSa/static/css/bootstrap.css | 7118 ------- webroot/AutoSa/static/css/bootstrap.min.css | 7 - webroot/AutoSa/static/css/docs.css | 1198 -- webroot/AutoSa/static/css/main.css | 133 - .../fonts/glyphicons-halflings-regular.eot | Bin 20290 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23292 -> 0 bytes webroot/AutoSa/static/images/1234.png | Bin 183 -> 0 bytes webroot/AutoSa/static/images/b.png | Bin 84 -> 0 bytes webroot/AutoSa/static/images/bg-body.gif | Bin 21720 -> 0 bytes .../AutoSa/static/images/bg-button-green.gif | Bin 169 -> 0 bytes .../AutoSa/static/images/bg-content-box.gif | Bin 126 -> 0 bytes .../AutoSa/static/images/bg-form-field.gif | Bin 97 -> 0 bytes webroot/AutoSa/static/images/bg-login.gif | Bin 1825 -> 0 bytes webroot/AutoSa/static/images/bg-login1.gif | Bin 13328 -> 0 bytes .../static/images/bg-menu-item-current.gif | Bin 315 -> 0 bytes .../static/images/bg-menu-item-green.gif | Bin 3349 -> 0 bytes .../static/images/bg-radial-gradient.gif | Bin 17617 -> 0 bytes webroot/AutoSa/static/images/bg-sidebar.gif | Bin 32792 -> 0 bytes webroot/AutoSa/static/images/bl.png | Bin 124 -> 0 bytes webroot/AutoSa/static/images/br.png | Bin 124 -> 0 bytes webroot/AutoSa/static/images/error.png | Bin 721 -> 0 bytes webroot/AutoSa/static/images/favicon.ico | Bin 54977 -> 0 bytes webroot/AutoSa/static/images/hammer.png | Bin 26816 -> 0 bytes .../static/images/icons/bullet_black.png | Bin 211 -> 0 bytes .../AutoSa/static/images/icons/clock_48.png | Bin 6740 -> 0 bytes .../AutoSa/static/images/icons/comment_48.png | Bin 5367 -> 0 bytes webroot/AutoSa/static/images/icons/cross.png | Bin 540 -> 0 bytes .../static/images/icons/cross_circle.png | Bin 721 -> 0 bytes .../static/images/icons/exclamation.png | Bin 622 -> 0 bytes .../images/icons/hammer_screwdriver.png | Bin 780 -> 0 bytes .../static/images/icons/image_add_48.png | Bin 5131 -> 0 bytes .../static/images/icons/information.png | Bin 725 -> 0 bytes .../static/images/icons/jquery.wysiwyg.gif | Bin 4478 -> 0 bytes .../images/icons/paper_content_pencil_48.png | Bin 5509 -> 0 bytes webroot/AutoSa/static/images/icons/pencil.png | Bin 497 -> 0 bytes .../AutoSa/static/images/icons/pencil_48.png | Bin 4334 -> 0 bytes .../static/images/icons/tick_circle.png | Bin 741 -> 0 bytes webroot/AutoSa/static/images/logo.png | Bin 27350 -> 0 bytes webroot/AutoSa/static/images/logo1.png | Bin 11352 -> 0 bytes webroot/AutoSa/static/images/logo13.png | Bin 24562 -> 0 bytes .../static/images/menu-current-arrow.gif | Bin 59 -> 0 bytes webroot/AutoSa/static/images/new_line.png | Bin 1078 -> 0 bytes webroot/AutoSa/static/images/nut.png | Bin 1987 -> 0 bytes webroot/AutoSa/static/images/ok.png | Bin 741 -> 0 bytes .../static/images/shortcut-button-bg.gif | Bin 1341 -> 0 bytes webroot/AutoSa/static/images/tl.png | Bin 132 -> 0 bytes webroot/AutoSa/static/images/tr.png | Bin 125 -> 0 bytes webroot/AutoSa/static/js/bootstrap.js | 2006 -- webroot/AutoSa/static/js/bootstrap.min.js | 7 - webroot/AutoSa/static/js/jquery-1.11.1.min.js | 4 - webroot/AutoSa/static/js/jquery.min.js | 6 - webroot/AutoSa/static/js/main.js | 17 - webroot/AutoSa/templates/addAssets.html | 57 - webroot/AutoSa/templates/addGroup.html | 30 - webroot/AutoSa/templates/addIDC.html | 31 - webroot/AutoSa/templates/addPerm.html | 32 - webroot/AutoSa/templates/addUser.html | 99 - webroot/AutoSa/templates/addUserPerm.html | 40 - webroot/AutoSa/templates/base.html | 152 - webroot/AutoSa/templates/chgGroup.html | 41 - webroot/AutoSa/templates/chgIDC.html | 41 - webroot/AutoSa/templates/chgKey.html | 49 - webroot/AutoSa/templates/chgPass.html | 49 - webroot/AutoSa/templates/chgSudo.html | 64 - webroot/AutoSa/templates/chgUser.html | 76 - webroot/AutoSa/templates/downFile.html | 37 - webroot/AutoSa/templates/error.html | 116 - webroot/AutoSa/templates/index.html | 40 - webroot/AutoSa/templates/info.html | 54 - webroot/AutoSa/templates/logView.html | 125 - webroot/AutoSa/templates/login.html | 69 - webroot/AutoSa/templates/perms.html | 35 - webroot/AutoSa/templates/showAssets.html | 51 - webroot/AutoSa/templates/showGroup.html | 32 - webroot/AutoSa/templates/showIDC.html | 31 - webroot/AutoSa/templates/showPerm.html | 32 - webroot/AutoSa/templates/showSudo.html | 19 - webroot/AutoSa/templates/showUser.html | 67 - webroot/AutoSa/templates/upFile.html | 43 - websocket/.bin/node-tail | 17 + .../AutoSa/websocket => websocket}/index.js | 28 +- websocket/npm-debug.log | 888 + .../websocket => websocket}/package.json | 0 431 files changed, 67291 insertions(+), 15486 deletions(-) create mode 100644 LICENSE create mode 100644 connect.py create mode 100644 docs/AddUserAsset.py rename {webroot => docs}/__init__.py (100%) create mode 100644 docs/developer_doc.txt create mode 100644 docs/install.py rename scripts/requirements.txt => docs/require.txt (81%) rename {webroot/AutoSa/Assets => jasset}/__init__.py (100%) rename {webroot/AutoSa/Assets => jasset}/admin.py (100%) create mode 100644 jasset/models.py rename {webroot/AutoSa/Assets => jasset}/tests.py (100%) create mode 100644 jasset/urls.py create mode 100644 jasset/views.py rename {webroot/AutoSa/AutoSa => jlog}/__init__.py (100%) rename {webroot/AutoSa/UserManage => jlog}/admin.py (100%) create mode 100644 jlog/models.py rename {webroot/AutoSa/UserManage => jlog}/tests.py (100%) create mode 100644 jlog/urls.py create mode 100644 jlog/views.py rename {webroot/AutoSa/AutoSa/templatetags => jperm}/__init__.py (100%) create mode 100644 jperm/admin.py create mode 100644 jperm/models.py create mode 100644 jperm/tests.py create mode 100644 jperm/urls.py create mode 100644 jperm/views.py delete mode 100755 jumpserver.py rename {webroot/AutoSa/UserManage => jumpserver}/__init__.py (100%) create mode 100644 jumpserver/api.py create mode 100644 jumpserver/context_processors.py rename {webroot/AutoSa/AutoSa => jumpserver}/settings.py (58%) create mode 100644 jumpserver/templatetags/__init__.py create mode 100644 jumpserver/templatetags/mytags.py create mode 100644 jumpserver/urls.py create mode 100644 jumpserver/views.py rename {webroot/AutoSa/AutoSa => jumpserver}/wsgi.py (50%) rename keys/test.pub => juser/__init__.py (100%) create mode 100644 juser/admin.py create mode 100644 juser/models.py create mode 100644 juser/tests.py create mode 100644 juser/urls.py create mode 100644 juser/views.py delete mode 100644 keys/test create mode 100644 log_handler.py delete mode 100755 logs/test.log rename webroot/AutoSa/manage.py => manage.py (70%) mode change 100755 => 100644 delete mode 100755 runserver delete mode 100644 scripts/jumpserver.sh create mode 100644 service.sh create mode 100644 ssh create mode 100644 ssh.py create mode 100644 static/css/animate.css create mode 100644 static/css/bootstrap.min.css create mode 100644 static/css/colorbox.css create mode 100644 static/css/images/controls.png create mode 100644 static/css/images/loading.gif create mode 100644 static/css/magnific/magnific-popup.css create mode 100644 static/css/patterns/congruent_pentagon.png create mode 100644 static/css/patterns/header-profile-skin-1.png create mode 100644 static/css/patterns/header-profile-skin-2.png create mode 100644 static/css/patterns/header-profile-skin-3.png create mode 100644 static/css/patterns/header-profile.png create mode 100644 static/css/patterns/otis_redding.png create mode 100644 static/css/patterns/shattered.png create mode 100644 static/css/patterns/triangular.png create mode 100644 static/css/plugins/dropzone/basic.css create mode 100644 static/css/plugins/dropzone/dropzone.css create mode 100644 static/css/plugins/fullcalendar/fullcalendar.css create mode 100644 static/css/plugins/fullcalendar/fullcalendar.print.css create mode 100644 static/css/plugins/iCheck/custom.css create mode 100644 static/css/plugins/iCheck/green.png create mode 100644 static/css/plugins/iCheck/green@2x.png create mode 100644 static/css/plugins/images/bootstrap-colorpicker/alpha-horizontal.png rename webroot/AutoSa/static/images/icons/cross_grey_small.png => static/css/plugins/images/bootstrap-colorpicker/alpha.png (82%) create mode 100644 static/css/plugins/images/bootstrap-colorpicker/hue-horizontal.png rename webroot/AutoSa/static/images/bg-login-top.png => static/css/plugins/images/bootstrap-colorpicker/hue.png (90%) create mode 100644 static/css/plugins/images/bootstrap-colorpicker/saturation.png create mode 100644 static/css/plugins/images/sort.png create mode 100644 static/css/plugins/images/sort_asc.png create mode 100644 static/css/plugins/images/sort_desc.png create mode 100644 static/css/plugins/images/sprite-skin-flat.png create mode 100644 static/css/plugins/images/sprite-skin-flat2.png create mode 100644 static/css/plugins/images/sprite-skin-nice.png create mode 100644 static/css/plugins/images/sprite-skin-simple.png create mode 100644 static/css/plugins/images/spritemap.png create mode 100644 static/css/plugins/images/spritemap@2x.png create mode 100644 static/css/style.css create mode 100644 static/css/vaildator/images/loading.gif create mode 100644 static/css/vaildator/images/validator_default.png create mode 100644 static/css/vaildator/images/validator_simple.png create mode 100644 static/css/vaildator/jquery.validator.css create mode 100644 static/font-awesome/css/font-awesome.css create mode 100644 static/font-awesome/css/font-awesome.min.css create mode 100644 static/font-awesome/fonts/FontAwesome.otf create mode 100644 static/font-awesome/fonts/fontawesome-webfont.eot create mode 100644 static/font-awesome/fonts/fontawesome-webfont.svg create mode 100644 static/font-awesome/fonts/fontawesome-webfont.ttf create mode 100644 static/font-awesome/fonts/fontawesome-webfont.woff create mode 100644 static/font-awesome/less/bordered-pulled.less create mode 100644 static/font-awesome/less/core.less create mode 100644 static/font-awesome/less/fixed-width.less create mode 100644 static/font-awesome/less/font-awesome.less create mode 100644 static/font-awesome/less/icons.less create mode 100644 static/font-awesome/less/larger.less create mode 100644 static/font-awesome/less/list.less create mode 100644 static/font-awesome/less/mixins.less create mode 100644 static/font-awesome/less/path.less create mode 100644 static/font-awesome/less/rotated-flipped.less create mode 100644 static/font-awesome/less/spinning.less create mode 100644 static/font-awesome/less/stacked.less create mode 100644 static/font-awesome/less/variables.less create mode 100644 static/font-awesome/scss/_bordered-pulled.scss create mode 100644 static/font-awesome/scss/_core.scss create mode 100644 static/font-awesome/scss/_fixed-width.scss create mode 100644 static/font-awesome/scss/_icons.scss create mode 100644 static/font-awesome/scss/_larger.scss create mode 100644 static/font-awesome/scss/_list.scss create mode 100644 static/font-awesome/scss/_mixins.scss create mode 100644 static/font-awesome/scss/_path.scss create mode 100644 static/font-awesome/scss/_rotated-flipped.scss create mode 100644 static/font-awesome/scss/_spinning.scss create mode 100644 static/font-awesome/scss/_stacked.scss create mode 100644 static/font-awesome/scss/_variables.scss create mode 100644 static/font-awesome/scss/font-awesome.scss create mode 100644 static/fonts/glyphicons-halflings-regular.eot rename {webroot/AutoSa/static => static}/fonts/glyphicons-halflings-regular.svg (81%) rename {webroot/AutoSa/static => static}/fonts/glyphicons-halflings-regular.ttf (68%) create mode 100644 static/fonts/glyphicons-halflings-regular.woff create mode 100644 static/img/a1.jpg create mode 100644 static/img/a2.jpg create mode 100644 static/img/a3.jpg create mode 100644 static/img/a4.jpg create mode 100644 static/img/a5.jpg create mode 100644 static/img/a6.jpg create mode 100644 static/img/a7.jpg create mode 100644 static/img/a8.jpg create mode 100644 static/img/admin.bak.png create mode 100644 static/img/admin.png create mode 100644 static/img/angular_logo.png create mode 100644 static/img/email_1.jpg create mode 100644 static/img/email_2.jpg create mode 100644 static/img/email_3.jpg create mode 100644 static/img/facio.ico create mode 100644 static/img/html_logo.png create mode 100644 static/img/logo.png create mode 100644 static/img/mvc_logo.png create mode 100644 static/img/p1.jpg create mode 100644 static/img/p2.jpg create mode 100644 static/img/p3.jpg create mode 100644 static/img/p4.jpg create mode 100644 static/img/p5.jpg create mode 100644 static/img/p6.jpg create mode 100644 static/img/p7.jpg create mode 100644 static/img/p8.jpg create mode 100644 static/img/p_big1.jpg create mode 100644 static/img/p_big2.jpg create mode 100644 static/img/p_big3.jpg create mode 100644 static/img/profile.jpg create mode 100644 static/img/profile_big.jpg create mode 100644 static/img/profile_small.jpg create mode 100644 static/img/root.png create mode 100644 static/img/spritemap.png create mode 100644 static/img/user.png create mode 100644 static/img/zender_logo.png create mode 100644 static/js/base.js rename {webroot/AutoSa/static => static}/js/bootstrap-dialog.js (100%) create mode 100644 static/js/bootstrap.min.js create mode 100644 static/js/demo/peity-demo.js create mode 100644 static/js/dropzone/dropzone.js create mode 100644 static/js/highcharts/adapters/standalone-framework.js create mode 100644 static/js/highcharts/adapters/standalone-framework.src.js create mode 100644 static/js/highcharts/highcharts-3d.js create mode 100644 static/js/highcharts/highcharts-3d.src.js create mode 100644 static/js/highcharts/highcharts-all.js create mode 100644 static/js/highcharts/highcharts-more.js create mode 100644 static/js/highcharts/highcharts-more.src.js create mode 100644 static/js/highcharts/highcharts.js create mode 100644 static/js/highcharts/highcharts.src.js create mode 100644 static/js/highcharts/modules/canvas-tools.js create mode 100644 static/js/highcharts/modules/canvas-tools.src.js create mode 100644 static/js/highcharts/modules/data.js create mode 100644 static/js/highcharts/modules/data.src.js create mode 100644 static/js/highcharts/modules/drilldown.js create mode 100644 static/js/highcharts/modules/drilldown.src.js create mode 100644 static/js/highcharts/modules/exporting.js create mode 100644 static/js/highcharts/modules/exporting.src.js create mode 100644 static/js/highcharts/modules/funnel.js create mode 100644 static/js/highcharts/modules/funnel.src.js create mode 100644 static/js/highcharts/modules/heatmap.js create mode 100644 static/js/highcharts/modules/heatmap.src.js create mode 100644 static/js/highcharts/modules/no-data-to-display.js create mode 100644 static/js/highcharts/modules/no-data-to-display.src.js create mode 100644 static/js/highcharts/modules/solid-gauge.js create mode 100644 static/js/highcharts/modules/solid-gauge.src.js create mode 100644 static/js/highcharts/themes/dark-blue.js create mode 100644 static/js/highcharts/themes/dark-green.js create mode 100644 static/js/highcharts/themes/dark-unica.js create mode 100644 static/js/highcharts/themes/gray.js create mode 100644 static/js/highcharts/themes/grid-light.js create mode 100644 static/js/highcharts/themes/grid.js create mode 100644 static/js/highcharts/themes/sand-signika.js create mode 100644 static/js/highcharts/themes/skies.js create mode 100644 static/js/inspinia.js create mode 100644 static/js/jquery-2.1.1.js create mode 100644 static/js/jquery-ui-1.10.4.min.js create mode 100644 static/js/jquery-ui.custom.min.js create mode 100644 static/js/jquery.colorbox.js create mode 100644 static/js/layer/extend/layer.ext.js create mode 100644 static/js/layer/layer.min.js create mode 100644 static/js/layer/skin/default/icon_ext.png create mode 100644 static/js/layer/skin/default/textbg.png create mode 100644 static/js/layer/skin/default/xubox_ico0.png create mode 100644 static/js/layer/skin/default/xubox_loading0.gif create mode 100644 static/js/layer/skin/default/xubox_loading1.gif create mode 100644 static/js/layer/skin/default/xubox_loading2.gif create mode 100644 static/js/layer/skin/default/xubox_loading3.gif create mode 100644 static/js/layer/skin/default/xubox_title0.png create mode 100644 static/js/layer/skin/layer.css create mode 100644 static/js/layer/skin/layer.ext.css create mode 100644 static/js/magnific/jquery.magnific-popup.min.js create mode 100644 static/js/mindmup-editabletable.js create mode 100644 static/js/plugins/fullcalendar/fullcalendar.min.js create mode 100644 static/js/plugins/fullcalendar/moment.min.js create mode 100644 static/js/plugins/iCheck/icheck.min.js create mode 100644 static/js/plugins/metisMenu/jquery.metisMenu.js create mode 100644 static/js/plugins/pace/pace.min.js create mode 100644 static/js/plugins/peity/jquery.peity.min.js create mode 100644 static/js/plugins/slimscroll/jquery.slimscroll.js create mode 100644 static/js/plugins/slimscroll/jquery.slimscroll.min.js create mode 100644 static/js/validator/images/loading.gif create mode 100644 static/js/validator/images/validator_default.png create mode 100644 static/js/validator/images/validator_simple.png create mode 100644 static/js/validator/jquery.validator.js create mode 100644 static/js/validator/zh_CN.js delete mode 100755 stopserver create mode 100644 templates/404.html create mode 100644 templates/500.html create mode 100644 templates/base.html create mode 100644 templates/download.html create mode 100644 templates/error.html create mode 100644 templates/filter_ajax_api.html create mode 100644 templates/foot_script.html create mode 100644 templates/footer.html create mode 100644 templates/head_script.html create mode 100644 templates/index.html create mode 100644 templates/index_cu.html create mode 100644 templates/jasset/dept_host_ajax.html create mode 100644 templates/jasset/group_add.html create mode 100644 templates/jasset/group_detail.html create mode 100644 templates/jasset/group_edit.html create mode 100644 templates/jasset/group_list.html create mode 100644 templates/jasset/host_add.html create mode 100644 templates/jasset/host_add_multi.html create mode 100644 templates/jasset/host_detail.html create mode 100644 templates/jasset/host_edit.html create mode 100644 templates/jasset/host_list.html create mode 100644 templates/jasset/host_list_common.html create mode 100644 templates/jasset/host_list_nop.html create mode 100644 templates/jasset/host_search.html create mode 100644 templates/jasset/idc_add.html create mode 100644 templates/jasset/idc_detail.html create mode 100644 templates/jasset/idc_edit.html create mode 100644 templates/jasset/idc_list.html create mode 100644 templates/jasset/jasset.html create mode 100644 templates/jasset/jlist_ip.html create mode 100644 templates/jasset/show_all_ajax.html create mode 100644 templates/jasset/test.html create mode 100644 templates/jlog/log_offline.html create mode 100644 templates/jlog/log_online.html create mode 100644 templates/jlog/log_search.html create mode 100644 templates/jlog/user_history.html create mode 100644 templates/jperm/dept_perm_edit.html create mode 100644 templates/jperm/dept_perm_list.html create mode 100644 templates/jperm/perm_add.html create mode 100644 templates/jperm/perm_apply.html create mode 100644 templates/jperm/perm_apply_exec.html create mode 100644 templates/jperm/perm_apply_info.html create mode 100644 templates/jperm/perm_apply_search.html create mode 100644 templates/jperm/perm_asset_detail.html create mode 100644 templates/jperm/perm_detail.html create mode 100644 templates/jperm/perm_edit.html create mode 100644 templates/jperm/perm_edit_bak.html create mode 100644 templates/jperm/perm_list.html create mode 100644 templates/jperm/perm_list_ajax.html create mode 100644 templates/jperm/perm_log.html create mode 100644 templates/jperm/perm_log_offline.html create mode 100644 templates/jperm/perm_log_online.html create mode 100644 templates/jperm/perm_user_detail.html create mode 100644 templates/jperm/sudo_add.html create mode 100644 templates/jperm/sudo_cmd_add.html create mode 100644 templates/jperm/sudo_cmd_detail.html create mode 100644 templates/jperm/sudo_cmd_list.html create mode 100644 templates/jperm/sudo_detail.html create mode 100644 templates/jperm/sudo_edit.html create mode 100644 templates/jperm/sudo_list.html create mode 100644 templates/juser/chg_info.html create mode 100644 templates/juser/dept_add.html create mode 100644 templates/juser/dept_detail.html create mode 100644 templates/juser/dept_edit.html create mode 100644 templates/juser/dept_list.html create mode 100644 templates/juser/dept_user_ajax.html create mode 100644 templates/juser/group_add.html create mode 100644 templates/juser/group_add_ajax.html create mode 100644 templates/juser/group_detail.html create mode 100644 templates/juser/group_edit.html create mode 100644 templates/juser/group_list.html create mode 100644 templates/juser/profile.html create mode 100644 templates/juser/user_add.html create mode 100644 templates/juser/user_detail.html create mode 100644 templates/juser/user_edit.html create mode 100644 templates/juser/user_list.html create mode 100644 templates/link_css.html create mode 100644 templates/login.html create mode 100644 templates/nav.html create mode 100644 templates/nav_bar_header.html create mode 100644 templates/nav_cat_bar.html create mode 100644 templates/nav_li_profile.html create mode 100644 templates/paginator.html create mode 100644 templates/skin_config.html create mode 100644 templates/success.html create mode 100644 templates/test.html create mode 100644 templates/upload.html delete mode 100644 webroot/AutoSa/.idea/.name delete mode 100644 webroot/AutoSa/.idea/AutoSa.iml delete mode 100644 webroot/AutoSa/.idea/dataSources.ids delete mode 100644 webroot/AutoSa/.idea/dataSources.xml delete mode 100644 webroot/AutoSa/.idea/encodings.xml delete mode 100644 webroot/AutoSa/.idea/misc.xml delete mode 100644 webroot/AutoSa/.idea/modules.xml delete mode 100644 webroot/AutoSa/.idea/scopes/scope_settings.xml delete mode 100644 webroot/AutoSa/.idea/vcs.xml delete mode 100644 webroot/AutoSa/.idea/workspace.xml delete mode 100644 webroot/AutoSa/Assets/models.py delete mode 100644 webroot/AutoSa/Assets/views.py delete mode 100644 webroot/AutoSa/AutoSa/context_processors.py delete mode 100644 webroot/AutoSa/AutoSa/templatetags/mytags.py delete mode 100644 webroot/AutoSa/AutoSa/urls.py delete mode 100644 webroot/AutoSa/AutoSa/views.py delete mode 100644 webroot/AutoSa/UserManage/forms.py delete mode 100644 webroot/AutoSa/UserManage/models.py delete mode 100644 webroot/AutoSa/UserManage/views.py delete mode 100644 webroot/AutoSa/__init__.py delete mode 100755 webroot/AutoSa/log_handler.py delete mode 100644 webroot/AutoSa/static/css/bootstrap-dialog.css delete mode 100644 webroot/AutoSa/static/css/bootstrap-theme.css delete mode 100644 webroot/AutoSa/static/css/bootstrap-theme.min.css delete mode 100644 webroot/AutoSa/static/css/bootstrap.css delete mode 100644 webroot/AutoSa/static/css/bootstrap.min.css delete mode 100644 webroot/AutoSa/static/css/docs.css delete mode 100644 webroot/AutoSa/static/css/main.css delete mode 100644 webroot/AutoSa/static/fonts/glyphicons-halflings-regular.eot delete mode 100644 webroot/AutoSa/static/fonts/glyphicons-halflings-regular.woff delete mode 100644 webroot/AutoSa/static/images/1234.png delete mode 100644 webroot/AutoSa/static/images/b.png delete mode 100644 webroot/AutoSa/static/images/bg-body.gif delete mode 100644 webroot/AutoSa/static/images/bg-button-green.gif delete mode 100644 webroot/AutoSa/static/images/bg-content-box.gif delete mode 100644 webroot/AutoSa/static/images/bg-form-field.gif delete mode 100644 webroot/AutoSa/static/images/bg-login.gif delete mode 100644 webroot/AutoSa/static/images/bg-login1.gif delete mode 100644 webroot/AutoSa/static/images/bg-menu-item-current.gif delete mode 100644 webroot/AutoSa/static/images/bg-menu-item-green.gif delete mode 100644 webroot/AutoSa/static/images/bg-radial-gradient.gif delete mode 100644 webroot/AutoSa/static/images/bg-sidebar.gif delete mode 100644 webroot/AutoSa/static/images/bl.png delete mode 100644 webroot/AutoSa/static/images/br.png delete mode 100644 webroot/AutoSa/static/images/error.png delete mode 100644 webroot/AutoSa/static/images/favicon.ico delete mode 100644 webroot/AutoSa/static/images/hammer.png delete mode 100644 webroot/AutoSa/static/images/icons/bullet_black.png delete mode 100644 webroot/AutoSa/static/images/icons/clock_48.png delete mode 100644 webroot/AutoSa/static/images/icons/comment_48.png delete mode 100644 webroot/AutoSa/static/images/icons/cross.png delete mode 100644 webroot/AutoSa/static/images/icons/cross_circle.png delete mode 100644 webroot/AutoSa/static/images/icons/exclamation.png delete mode 100644 webroot/AutoSa/static/images/icons/hammer_screwdriver.png delete mode 100644 webroot/AutoSa/static/images/icons/image_add_48.png delete mode 100644 webroot/AutoSa/static/images/icons/information.png delete mode 100644 webroot/AutoSa/static/images/icons/jquery.wysiwyg.gif delete mode 100644 webroot/AutoSa/static/images/icons/paper_content_pencil_48.png delete mode 100644 webroot/AutoSa/static/images/icons/pencil.png delete mode 100644 webroot/AutoSa/static/images/icons/pencil_48.png delete mode 100644 webroot/AutoSa/static/images/icons/tick_circle.png delete mode 100644 webroot/AutoSa/static/images/logo.png delete mode 100644 webroot/AutoSa/static/images/logo1.png delete mode 100644 webroot/AutoSa/static/images/logo13.png delete mode 100644 webroot/AutoSa/static/images/menu-current-arrow.gif delete mode 100644 webroot/AutoSa/static/images/new_line.png delete mode 100644 webroot/AutoSa/static/images/nut.png delete mode 100644 webroot/AutoSa/static/images/ok.png delete mode 100644 webroot/AutoSa/static/images/shortcut-button-bg.gif delete mode 100644 webroot/AutoSa/static/images/tl.png delete mode 100644 webroot/AutoSa/static/images/tr.png delete mode 100644 webroot/AutoSa/static/js/bootstrap.js delete mode 100644 webroot/AutoSa/static/js/bootstrap.min.js delete mode 100644 webroot/AutoSa/static/js/jquery-1.11.1.min.js delete mode 100644 webroot/AutoSa/static/js/jquery.min.js delete mode 100644 webroot/AutoSa/static/js/main.js delete mode 100644 webroot/AutoSa/templates/addAssets.html delete mode 100644 webroot/AutoSa/templates/addGroup.html delete mode 100644 webroot/AutoSa/templates/addIDC.html delete mode 100644 webroot/AutoSa/templates/addPerm.html delete mode 100644 webroot/AutoSa/templates/addUser.html delete mode 100644 webroot/AutoSa/templates/addUserPerm.html delete mode 100644 webroot/AutoSa/templates/base.html delete mode 100644 webroot/AutoSa/templates/chgGroup.html delete mode 100644 webroot/AutoSa/templates/chgIDC.html delete mode 100644 webroot/AutoSa/templates/chgKey.html delete mode 100644 webroot/AutoSa/templates/chgPass.html delete mode 100644 webroot/AutoSa/templates/chgSudo.html delete mode 100644 webroot/AutoSa/templates/chgUser.html delete mode 100644 webroot/AutoSa/templates/downFile.html delete mode 100644 webroot/AutoSa/templates/error.html delete mode 100644 webroot/AutoSa/templates/index.html delete mode 100644 webroot/AutoSa/templates/info.html delete mode 100644 webroot/AutoSa/templates/logView.html delete mode 100644 webroot/AutoSa/templates/login.html delete mode 100644 webroot/AutoSa/templates/perms.html delete mode 100644 webroot/AutoSa/templates/showAssets.html delete mode 100644 webroot/AutoSa/templates/showGroup.html delete mode 100644 webroot/AutoSa/templates/showIDC.html delete mode 100644 webroot/AutoSa/templates/showPerm.html delete mode 100644 webroot/AutoSa/templates/showSudo.html delete mode 100644 webroot/AutoSa/templates/showUser.html delete mode 100644 webroot/AutoSa/templates/upFile.html create mode 100644 websocket/.bin/node-tail rename {webroot/AutoSa/websocket => websocket}/index.js (76%) create mode 100644 websocket/npm-debug.log rename {webroot/AutoSa/websocket => websocket}/package.json (100%) diff --git a/.gitignore b/.gitignore index dc4c60168..b749de2d9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,43 @@ +*.py[cod] .idea -*.pyc -*.log +test.py + +# C extensions +*.so + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg +lib +lib64 +__pycache__ + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox +nosetests.xml + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject +node_modules +logs +keys +jumpserver.conf +nohup.out diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..d7f105139 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.md b/README.md index 9ad8cf0e5..eaf65fe33 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,2 @@ -Jumpserver是什么? ------------------ -Jumpserver是用Python+Django写的一个开源的跳板机(堡垒机)项目,来集中管理服务器的账号、密码和权限。 - -1.1版本更新 ------------------ -更新Log见笔者blog
-http://laoguang.blog.51cto.com/6013350/1576502 - -部署文档 ------------------ -部署文档见笔者blog
-http://laoguang.blog.51cto.com/6013350/1576729 - -功能截图 ------------------ -1. 安装
- ![install](https://github.com/ibuler/static/blob/master/jumpserver1.1/1.%20install.png) -2. 登陆
- ![login](https://github.com/ibuler/static/blob/master/jumpserver1.1/2.login.png) -3. 添加组
-![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/3.addgroup.png) -4. 添加用户
![adduser](https://github.com/ibuler/static/blob/master/jumpserver1.1/5.adduser.png) -5. 添加主机
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/9.addhost.png) -6. 添加权限
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/11.addperm.png) -7. 查看权限
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/13.showperm.png) -8. 下载私钥
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/16.downkey.png) -9. 登陆shell
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/17.loginshell.png) -10. 显示有权限的主机
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/18.p.png) -11. 批量执行命令
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/19.e.png) -12. 登陆有权限的主机
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/20.%20loginserver.png) -13. 查看sudo
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/22.showsudo.png) -14. 修改sudo
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/25.addsudohost.png) -15. 查看实时监控
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/29.monitor1ok.png) -16. 结束会话
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/28.%20killsession.png) -17. 查看统计日志
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/30.viewlog2.png) -18. 修改密码
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/34.modpass.png) -19. 下载文件
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/32.downfile.png) -20. 上传文件
![addgroup](https://github.com/ibuler/static/blob/master/jumpserver1.1/30.upfile.png) +# jumpserver +# diff --git a/connect.py b/connect.py new file mode 100644 index 000000000..8a4949662 --- /dev/null +++ b/connect.py @@ -0,0 +1,387 @@ +# coding: utf-8 + +import sys + +reload(sys) +sys.setdefaultencoding('utf8') + +import socket +import os +import re +import ast +import select +import time +import paramiko +import struct +import fcntl +import signal +import textwrap +import django +import getpass +import fnmatch +import readline +from multiprocessing import Pool + + +os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings' +django.setup() +from juser.models import User + +from jlog.models import Log +from jumpserver.api import * + +try: + import termios + import tty +except ImportError: + print '\033[1;31mOnly postfix supported.\033[0m' + time.sleep(3) + sys.exit() + +CONF.read(os.path.join(BASE_DIR, 'jumpserver.conf')) +LOG_DIR = os.path.join(BASE_DIR, 'logs') +SSH_KEY_DIR = os.path.join(BASE_DIR, 'keys') +SERVER_KEY_DIR = os.path.join(SSH_KEY_DIR, 'server') +LOGIN_NAME = getpass.getuser() + + +def color_print(msg, color='blue'): + """Print colorful string.""" + color_msg = {'blue': '\033[1;36m%s\033[0m', + 'green': '\033[1;32m%s\033[0m', + 'red': '\033[1;31m%s\033[0m'} + + print color_msg.get(color, 'blue') % msg + + +def color_print_exit(msg, color='red'): + """Print colorful string and exit.""" + color_print(msg, color=color) + time.sleep(2) + sys.exit() + + +def get_win_size(): + """This function use to get the size of the windows!""" + if 'TIOCGWINSZ' in dir(termios): + TIOCGWINSZ = termios.TIOCGWINSZ + else: + TIOCGWINSZ = 1074295912L # Assume + s = struct.pack('HHHH', 0, 0, 0, 0) + x = fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ, s) + return struct.unpack('HHHH', x)[0:2] + + +def set_win_size(sig, data): + """This function use to set the window size of the terminal!""" + try: + win_size = get_win_size() + channel.resize_pty(height=win_size[0], width=win_size[1]) + except: + pass + + +def log_record(username, host): + """Logging user command and output.""" + connect_log_dir = os.path.join(LOG_DIR, 'connect') + timestamp_start = int(time.time()) + today = time.strftime('%Y%m%d', time.localtime(timestamp_start)) + time_now = time.strftime('%H%M%S', time.localtime(timestamp_start)) + today_connect_log_dir = os.path.join(connect_log_dir, today) + log_filename = '%s_%s_%s.log' % (username, host, time_now) + log_file_path = os.path.join(today_connect_log_dir, log_filename) + dept_name = User.objects.get(username=username).dept.name + pid = os.getpid() + ip_list = [] + remote_ip = os.popen("who |grep `ps aux |gawk '{if ($2==%s) print $1}'` |gawk '{print $5}'|tr -d '()'" % pid).readlines() + for ip in remote_ip: + ip_list.append(ip.strip('\n')) + ip_list = ','.join(list(set(ip_list))) + + if not os.path.isdir(today_connect_log_dir): + try: + os.makedirs(today_connect_log_dir) + os.chmod(today_connect_log_dir, 0777) + except OSError: + raise ServerError('Create %s failed, Please modify %s permission.' % (today_connect_log_dir, connect_log_dir)) + + try: + log_file = open(log_file_path, 'a') + except IOError: + raise ServerError('Create logfile failed, Please modify %s permission.' % today_connect_log_dir) + + log = Log(user=username, host=host, remote_ip=ip_list, dept_name=dept_name, + log_path=log_file_path, start_time=datetime.datetime.now(), pid=pid) + log_file.write('Starttime is %s\n' % datetime.datetime.now()) + log.save() + return log_file, log + + +def posix_shell(chan, username, host): + """ + Use paramiko channel connect server interactive. + """ + log_file, log = log_record(username, host) + old_tty = termios.tcgetattr(sys.stdin) + try: + tty.setraw(sys.stdin.fileno()) + tty.setcbreak(sys.stdin.fileno()) + chan.settimeout(0.0) + + while True: + try: + r, w, e = select.select([chan, sys.stdin], [], []) + except: + pass + + if chan in r: + try: + x = chan.recv(1024) + if len(x) == 0: + break + sys.stdout.write(x) + sys.stdout.flush() + log_file.write(x) + log_file.flush() + except socket.timeout: + pass + + if sys.stdin in r: + x = os.read(sys.stdin.fileno(), 1) + if len(x) == 0: + break + chan.send(x) + + finally: + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_tty) + log_file.write('Endtime is %s' % datetime.datetime.now()) + log_file.close() + log.is_finished = True + log.log_finished = False + log.end_time = datetime.datetime.now() + log.save() + print_prompt() + + +def get_user_hostgroup(username): + """Get the hostgroups of under the user control.""" + groups_attr = {} + group_all = user_perm_group_api(username) + for group in group_all: + groups_attr[group.name] = [group.id, group.comment] + return groups_attr + + +def get_user_hostgroup_host(username, gid): + """Get the hostgroup hosts of under the user control.""" + hosts_attr = {} + user = User.objects.get(username=username) + hosts = user_perm_group_hosts_api(gid) + for host in hosts: + alias = AssetAlias.objects.filter(user=user, host=host) + if alias and alias[0].alias != '': + hosts_attr[host.ip] = [host.id, host.ip, alias[0].alias] + else: + hosts_attr[host.ip] = [host.id, host.ip, host.comment] + return hosts_attr + + +def verify_connect(username, part_ip): + ip_matched = [] + try: + hosts_attr = get_user_host(username) + hosts = hosts_attr.values() + except ServerError, e: + color_print(e, 'red') + return False + for ip_info in hosts: + for info in ip_info[1:]: + if part_ip in info: + ip_matched.append(ip_info[1]) + if len(ip_matched) > 1: + for ip in ip_matched: + print '%s -- %s' % (ip, hosts_attr[ip][2]) + elif len(ip_matched) < 1: + color_print('No Permission or No host.', 'red') + else: + username, password, host, port = get_connect_item(username, ip_matched[0]) + connect(username, password, host, port, LOGIN_NAME) + + +def print_prompt(): + msg = """\033[1;32m### Welcome Use JumpServer To Login. ### \033[0m + 1) Type \033[32mIP ADDRESS\033[0m To Login. + 2) Type \033[32mP/p\033[0m To Print The Servers You Available. + 3) Type \033[32mG/g\033[0m To Print The Server Groups You Available. + 4) Type \033[32mG/g(1-N)\033[0m To Print The Server Group Hosts You Available. + 5) Type \033[32mE/e\033[0m To Execute Command On Several Servers. + 6) Type \033[32mQ/q\033[0m To Quit. + """ + print textwrap.dedent(msg) + + +def print_user_host(username): + try: + hosts_attr = get_user_host(username) + except ServerError, e: + color_print(e, 'red') + return + hosts = hosts_attr.keys() + hosts.sort() + for ip in hosts: + print '%-15s -- %s' % (ip, hosts_attr[ip][2]) + print '' + + +def print_user_hostgroup(username): + group_attr = get_user_hostgroup(username) + groups = group_attr.keys() + for g in groups: + print "[%3s] %s -- %s" % (group_attr[g][0], g, group_attr[g][1]) + + +def print_user_hostgroup_host(username, gid): + pattern = re.compile(r'\d+') + match = pattern.match(gid) + if match: + hosts_attr = get_user_hostgroup_host(username, gid) + hosts = hosts_attr.keys() + hosts.sort() + for ip in hosts: + print '%-15s -- %s' % (ip, hosts_attr[ip][2]) + else: + color_print('No such group id, Please check it.', 'red') + + +def connect(username, password, host, port, login_name): + """ + Connect server. + """ + ps1 = "PS1='[\u@%s \W]\$ '\n" % host + login_msg = "clear;echo -e '\\033[32mLogin %s done. Enjoy it.\\033[0m'\n" % host + + # Make a ssh connection + ssh = paramiko.SSHClient() + ssh.load_system_host_keys() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + try: + ssh.connect(host, port=port, username=username, password=password, compress=True) + except paramiko.ssh_exception.AuthenticationException, paramiko.ssh_exception.SSHException: + raise ServerError('Authentication Error.') + except socket.error: + raise ServerError('Connect SSH Socket Port Error, Please Correct it.') + + # Make a channel and set windows size + global channel + win_size = get_win_size() + channel = ssh.invoke_shell(height=win_size[0], width=win_size[1]) + try: + signal.signal(signal.SIGWINCH, set_win_size) + except: + pass + + # Set PS1 and msg it + channel.send(ps1) + channel.send(login_msg) + + # Make ssh interactive tunnel + posix_shell(channel, login_name, host) + + # Shutdown channel socket + channel.close() + ssh.close() + + +def remote_exec_cmd(ip, port, username, password, cmd): + try: + time.sleep(5) + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(ip, port, username, password, timeout=5) + stdin, stdout, stderr = ssh.exec_command("bash -l -c '%s'" % cmd) + out = stdout.readlines() + err = stderr.readlines() + color_print('%s:' % ip, 'blue') + for i in out: + color_print(" " * 4 + i.strip(), 'green') + for j in err: + color_print(" " * 4 + j.strip(), 'red') + ssh.close() + except Exception as e: + color_print(ip + ':', 'blue') + color_print(str(e), 'red') + + +def multi_remote_exec_cmd(hosts, username, cmd): + pool = Pool(processes=5) + for host in hosts: + username, password, ip, port = get_connect_item(username, host) + pool.apply_async(remote_exec_cmd, (ip, port, username, password, cmd)) + pool.close() + pool.join() + + +def exec_cmd_servers(username): + hosts = [] + color_print("Input the Host IP(s),Separated by Commas, q/Q to Quit.\n \ + You can choose in the following IP(s), Use Linux / Unix glob.", 'green') + print_user_host(LOGIN_NAME) + while True: + inputs = raw_input('\033[1;32mip(s)>: \033[0m') + if inputs in ['q', 'Q']: + break + get_hosts = get_user_host(username).keys() + for host in get_hosts: + if fnmatch.fnmatch(host, inputs): + hosts.append(host.strip()) + if len(hosts) == 0: + color_print("Check again, Not matched any ip!", 'red') + continue + else: + print "You matched ip: %s" % hosts + color_print("Input the Command , The command will be Execute on servers, q/Q to quit.", 'green') + while True: + cmd = raw_input('\033[1;32mCmd(s): \033[0m') + if cmd in ['q', 'Q']: + break + exec_log_dir = os.path.join(LOG_DIR, 'exec_cmds') + if not os.path.isdir(exec_log_dir): + os.mkdir(exec_log_dir) + os.chmod(exec_log_dir, 0777) + filename = "%s/%s.log" % (exec_log_dir, time.strftime('%Y%m%d')) + f = open(filename, 'a') + f.write("DateTime: %s User: %s Host: %s Cmds: %s\n" % + (time.strftime('%Y/%m/%d %H:%M:%S'), username, hosts, cmd)) + multi_remote_exec_cmd(hosts, username, cmd) + + +if __name__ == '__main__': + print_prompt() + try: + while True: + try: + option = raw_input("\033[1;32mOpt or IP>:\033[0m ") + except EOFError: + print + continue + if option in ['P', 'p']: + print_user_host(LOGIN_NAME) + continue + elif option in ['G', 'g']: + print_user_hostgroup(LOGIN_NAME) + continue + elif option.startswith('g') or option.startswith('G'): + gid = option[1:].strip() + print_user_hostgroup_host(LOGIN_NAME, gid) + continue + elif option in ['E', 'e']: + exec_cmd_servers(LOGIN_NAME) + elif option in ['Q', 'q', 'exit']: + sys.exit() + else: + try: + verify_connect(LOGIN_NAME, option) + except ServerError, e: + color_print(e, 'red') + except IndexError: + pass diff --git a/docs/AddUserAsset.py b/docs/AddUserAsset.py new file mode 100644 index 000000000..ec918f56b --- /dev/null +++ b/docs/AddUserAsset.py @@ -0,0 +1,141 @@ +#coding:utf-8 +import django +import os +import sys +import random +import datetime + +sys.path.append('../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings' +django.setup() + + +from juser.views import db_add_user, md5_crypt, CRYPTOR, db_add_group +from jasset.models import Asset, IDC, BisGroup +from juser.models import UserGroup, DEPT, User +from jperm.models import CmdGroup +from jlog.models import Log + + +def install(): + IDC.objects.create(name='ALL', comment='ALL') + IDC.objects.create(name='默认', comment='默认') + DEPT.objects.create(name="默认", comment="默认部门") + DEPT.objects.create(name="超管部", comment="超级管理员部门") + dept = DEPT.objects.get(name='超管部') + dept2 = DEPT.objects.get(name='默认') + UserGroup.objects.create(name='ALL', dept=dept, comment='ALL') + UserGroup.objects.create(name='默认', dept=dept, comment='默认') + + BisGroup.objects.create(name='ALL', dept=dept, comment='ALL') + BisGroup.objects.create(name='默认', dept=dept, comment='默认') + + User(id=5000, username="admin", password=md5_crypt('admin'), + name='admin', email='admin@jumpserver.org', role='SU', is_active=True, dept=dept).save() + User(id=5001, username="group_admin", password=md5_crypt('group_admin'), + name='group_admin', email='group_admin@jumpserver.org', role='DA', is_active=True, dept=dept2).save() + + +def test_add_idc(): + for i in range(1, 20): + name = 'IDC' + str(i) + IDC.objects.create(name=name, comment='') + print 'Add: %s' % name + + +def test_add_dept(): + for i in range(1, 100): + name = 'DEPT' + str(i) + print "Add: %s" % name + DEPT.objects.create(name=name, comment=name) + + +def test_add_group(): + dept_all = DEPT.objects.all() + for i in range(1, 100): + name = 'UserGroup' + str(i) + UserGroup.objects.create(name=name, dept=random.choice(dept_all), comment=name) + print 'Add: %s' % name + + +def test_add_cmd_group(): + for i in range(1, 20): + name = 'CMD' + str(i) + cmd = '/sbin/ping%s, /sbin/ifconfig/' % str(i) + CmdGroup.objects.create(name=name, cmd=cmd, comment=name) + print 'Add: %s' % name + + +def test_add_user(): + for i in range(1, 500): + username = "test" + str(i) + dept_all = DEPT.objects.all() + group_all = UserGroup.objects.all() + group_all_id = [group.id for group in group_all] + db_add_user(username=username, + password=md5_crypt(username), + dept=random.choice(dept_all), + name=username, email='%s@jumpserver.org' % username, + groups=[random.choice(group_all_id) for i in range(1, 4)], role='CU', + ssh_key_pwd=CRYPTOR.encrypt(username), + ldap_pwd=CRYPTOR.encrypt(username), + is_active=True, + date_joined=datetime.datetime.now()) + print "Add: %s" % username + + +def test_add_asset_group(): + dept = DEPT.objects.get(name='默认') + for i in range(1, 20): + name = 'AssetGroup' + str(i) + group = BisGroup(name=name, dept=dept, comment=name) + group.save() + print 'Add: %s' % name + + +def test_add_asset(): + idc_all = IDC.objects.all() + test_idc = random.choice(idc_all) + bis_group_all = BisGroup.objects.all() + dept_all = DEPT.objects.all() + for i in range(1, 500): + ip = '192.168.1.' + str(i) + asset = Asset(ip=ip, port=22, login_type='L', idc=test_idc, is_active=True, comment='test') + asset.save() + asset.bis_group = [random.choice(bis_group_all) for i in range(2)] + asset.dept = [random.choice(dept_all) for i in range(2)] + print "Add: %s" % ip + + +def test_add_log(): + li_date = [] + today = datetime.date.today() + oneday = datetime.timedelta(days=1) + for i in range(0, 7): + today = today-oneday + li_date.append(today) + user_list = ['马云', '马化腾', '丁磊', '周鸿祎', '雷军', '柳传志', '陈天桥', '李彦宏', '李开复', '罗永浩'] + for i in range(1, 1000): + user = random.choice(user_list) + ip = random.randint(1, 20) + start_time = random.choice(li_date) + end_time = datetime.datetime.now() + log_path = '/var/log/jumpserver/test.log' + host = '192.168.1.' + str(ip) + Log.objects.create(user=user, host=host, remote_ip='8.8.8.8', dept_name='运维部', log_path=log_path, pid=168, start_time=start_time, + is_finished=1, log_finished=1, end_time=end_time) + + +if __name__ == '__main__': + #install() + test_add_dept() + test_add_group() + test_add_user() + test_add_idc() + test_add_asset_group() + test_add_asset() + test_add_log() + + + + diff --git a/webroot/__init__.py b/docs/__init__.py similarity index 100% rename from webroot/__init__.py rename to docs/__init__.py diff --git a/docs/developer_doc.txt b/docs/developer_doc.txt new file mode 100644 index 000000000..d24cacdcd --- /dev/null +++ b/docs/developer_doc.txt @@ -0,0 +1,36 @@ +# coding: utf8 + +Jumpserver开发者文档 + +开发规范: + 1. 遵守PE8规范 1) 命名规范 2) 导入模块规范 3) 空行规范 4) 长度规范 + 2. 缩进统一4个空格 + 3. 变量命名明了易懂多个单词下划线隔开 + 4. 注释到位 + + +框架说明: + 1. 项目名称 Jumpserver + 2. APP: + juser 用户管理 + jasset 资产管理(设备管理) + jpermission 授权管理 + jlog 日志管理 + 3. connect.py 用户登录入口程序 + 4. logs 日志保存目录 + 5. jumpserver.conf 配置文件 + 6. docs 文档目录 + 7. static 静态文件目录 + 8. templates 模板目录 + + +connect.py逻辑说明: + 用户登录系统,运行该脚本,p调用get_user_host函数查看有权限的服务器ip + 输入部分IP,verify_connect匹配该部分ip,如果是匹配到多个,就显示ip + 匹配到0了就显示没有权限或者主机, + 匹配到1个则继续 + 查询该服务器是否支持ldap 如果是,获得ldap用户密码登陆 + 如果否,查询授权表,查看该服务器授权的角色,并返回对应账号密码,登陆 + connect函数是登陆函数,采用paramiko 使用channel登陆,posix_shell 来完成交互,并记录日志 + signal模块来完成窗口改变导致的tty大小随之改变 + PyCrypt是对称加密类 \ No newline at end of file diff --git a/docs/install.py b/docs/install.py new file mode 100644 index 000000000..76a7da522 --- /dev/null +++ b/docs/install.py @@ -0,0 +1,135 @@ +#coding:utf-8 +import django +import os +import sys +import random +import datetime + +sys.path.append('../') +os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings' +django.setup() + + +from juser.views import db_add_user, md5_crypt, CRYPTOR, db_add_group +from jasset.models import Asset, IDC, BisGroup +from juser.models import UserGroup, DEPT, User +from jasset.views import jasset_group_add +from jperm.models import CmdGroup +from jlog.models import Log + + +def install(): + IDC.objects.create(name='ALL', comment='ALL') + IDC.objects.create(name='默认', comment='默认') + DEPT.objects.create(name="默认", comment="默认部门") + DEPT.objects.create(name="超管部", comment="超级管理员部门") + dept = DEPT.objects.get(name='超管部') + dept2 = DEPT.objects.get(name='默认') + UserGroup.objects.create(name='ALL', dept=dept, comment='ALL') + UserGroup.objects.create(name='默认', dept=dept, comment='默认') + + BisGroup.objects.create(name='ALL', dept=dept, comment='ALL') + BisGroup.objects.create(name='默认', dept=dept, comment='默认') + + User(id=5000, username="admin", password=md5_crypt('admin'), + name='admin', email='admin@jumpserver.org', role='SU', is_active=True, dept=dept).save() + User(id=5001, username="group_admin", password=md5_crypt('group_admin'), + name='group_admin', email='group_admin@jumpserver.org', role='DA', is_active=True, dept=dept2).save() + + +def test_add_idc(): + for i in range(1, 20): + name = 'IDC' + str(i) + IDC.objects.create(name=name, comment='') + print 'Add: %s' % name + + +def test_add_dept(): + for i in range(1, 100): + name = 'DEPT' + str(i) + print "Add: %s" % name + DEPT.objects.create(name=name, comment=name) + + +def test_add_group(): + dept_all = DEPT.objects.all() + for i in range(1, 100): + name = 'UserGroup' + str(i) + UserGroup.objects.create(name=name, dept=random.choice(dept_all), comment=name) + print 'Add: %s' % name + + +def test_add_cmd_group(): + for i in range(1, 20): + name = 'CMD' + str(i) + cmd = '/sbin/ping%s, /sbin/ifconfig/' % str(i) + CmdGroup.objects.create(name=name, cmd=cmd, comment=name) + print 'Add: %s' % name + + +def test_add_user(): + for i in range(1, 500): + username = "test" + str(i) + dept_all = DEPT.objects.all() + group_all = UserGroup.objects.all() + group_all_id = [group.id for group in group_all] + db_add_user(username=username, + password=md5_crypt(username), + dept=random.choice(dept_all), + name=username, email='%s@jumpserver.org' % username, + groups=[random.choice(group_all_id) for i in range(1, 4)], role='CU', + ssh_key_pwd=CRYPTOR.encrypt(username), + ldap_pwd=CRYPTOR.encrypt(username), + is_active=True, + date_joined=datetime.datetime.now()) + print "Add: %s" % username + + +def test_add_asset_group(): + dept = DEPT.objects.get(name='默认') + for i in range(1, 20): + name = 'AssetGroup' + str(i) + group = BisGroup(name=name, dept=dept, comment=name) + group.save() + print 'Add: %s' % name + + +def test_add_asset(): + idc_all = IDC.objects.all() + test_idc = random.choice(idc_all) + bis_group_all = BisGroup.objects.all() + dept_all = DEPT.objects.all() + for i in range(1, 500): + ip = '192.168.1.' + str(i) + asset = Asset(ip=ip, port=22, login_type='L', idc=test_idc, is_active=True, comment='test') + asset.save() + asset.bis_group = [random.choice(bis_group_all) for i in range(2)] + asset.dept = [random.choice(dept_all) for i in range(2)] + print "Add: %s" % ip + + +def test_add_log(): + li_date = [] + today = datetime.date.today() + oneday = datetime.timedelta(days=1) + for i in range(0, 7): + today = today-oneday + li_date.append(today) + user_list = ['马云', '马化腾', '丁磊', '周鸿祎', '雷军', '柳传志', '陈天桥', '李彦宏', '李开复', '罗永浩'] + for i in range(1, 1000): + user = random.choice(user_list) + ip = random.randint(1, 20) + start_time = random.choice(li_date) + end_time = datetime.datetime.now() + log_path = '/var/log/jumpserver/test.log' + host = '192.168.1.' + str(ip) + Log.objects.create(user=user, host=host, log_path=log_path, pid=168, start_time=start_time, + is_finished=1, log_finished=1, end_time=end_time) + + +if __name__ == '__main__': + install() + + + + diff --git a/scripts/requirements.txt b/docs/require.txt similarity index 81% rename from scripts/requirements.txt rename to docs/require.txt index 766faa1c9..85d351fe8 100644 --- a/scripts/requirements.txt +++ b/docs/require.txt @@ -1,9 +1,10 @@ -pexpect==3.3 -sphinx-me==0.3 -django==1.7.1 -python-ldap==2.4.18 -paramiko==1.15.1 -pycrypto==2.6.1 -ecdsa>=0.11 -MySQL-python==1.2.5 -readline +pexpect==3.3 +sphinx-me==0.3 +django==1.6 +python-ldap==2.4.18 +paramiko==1.15.1 +pycrypto==2.6.1 +ecdsa>=0.11 +MySQL-python==1.2.5 +readline +django-uuidfield \ No newline at end of file diff --git a/webroot/AutoSa/Assets/__init__.py b/jasset/__init__.py similarity index 100% rename from webroot/AutoSa/Assets/__init__.py rename to jasset/__init__.py diff --git a/webroot/AutoSa/Assets/admin.py b/jasset/admin.py similarity index 100% rename from webroot/AutoSa/Assets/admin.py rename to jasset/admin.py diff --git a/jasset/models.py b/jasset/models.py new file mode 100644 index 000000000..d7821fd93 --- /dev/null +++ b/jasset/models.py @@ -0,0 +1,54 @@ +import datetime +from django.db import models +from juser.models import User, UserGroup, DEPT + + +class IDC(models.Model): + name = models.CharField(max_length=40, unique=True) + comment = models.CharField(max_length=80, blank=True, null=True) + + def __unicode__(self): + return self.name + + +class BisGroup(models.Model): + GROUP_TYPE = ( + ('P', 'PRIVATE'), + ('A', 'ASSET'), + ) + name = models.CharField(max_length=80, unique=True) + dept = models.ForeignKey(DEPT) + comment = models.CharField(max_length=160, blank=True, null=True) + + def __unicode__(self): + return self.name + + +class Asset(models.Model): + LOGIN_TYPE_CHOICES = ( + ('L', 'LDAP'), + ('M', 'MAP'), + ) + ip = models.IPAddressField(unique=True) + port = models.SmallIntegerField(max_length=5) + idc = models.ForeignKey(IDC) + bis_group = models.ManyToManyField(BisGroup) + dept = models.ManyToManyField(DEPT) + login_type = models.CharField(max_length=1, choices=LOGIN_TYPE_CHOICES, default='L') + username = models.CharField(max_length=20, blank=True, null=True) + password = models.CharField(max_length=80, blank=True, null=True) + date_added = models.DateTimeField(auto_now=True, default=datetime.datetime.now(), null=True) + is_active = models.BooleanField(default=True) + comment = models.CharField(max_length=100, blank=True, null=True) + + def __unicode__(self): + return self.ip + + +class AssetAlias(models.Model): + user = models.ForeignKey(User) + host = models.ForeignKey(Asset) + alias = models.CharField(max_length=100, blank=True, null=True) + + def __unicode__(self): + return self.comment \ No newline at end of file diff --git a/webroot/AutoSa/Assets/tests.py b/jasset/tests.py similarity index 100% rename from webroot/AutoSa/Assets/tests.py rename to jasset/tests.py diff --git a/jasset/urls.py b/jasset/urls.py new file mode 100644 index 000000000..da52529b6 --- /dev/null +++ b/jasset/urls.py @@ -0,0 +1,28 @@ +# coding:utf-8 +from django.conf.urls import patterns, include, url +from jasset.views import * + +urlpatterns = patterns('', + url(r'^host_add/$', host_add), + url(r"^host_add_multi/$", host_add_batch), + url(r'^host_list/$', host_list), + url(r'^search/$', host_search), + url(r"^host_detail/$", host_detail), + url(r"^dept_host_ajax/$", dept_host_ajax), + url(r"^show_all_ajax/$", show_all_ajax), + url(r'^idc_add/$', idc_add), + url(r'^idc_list/$', idc_list), + url(r'^idc_edit/$', idc_edit), + url(r'^idc_detail/$', idc_detail), + url(r'^idc_del/$', idc_del), + url(r'^group_add/$', group_add), + url(r'^group_edit/$', group_edit), + url(r'^group_list/$', group_list), + url(r'^group_detail/$', group_detail), + url(r'^group_del_host/$', group_del_host), + url(r'^group_del/$', group_del), + url(r'^host_del/(\w+)/$', host_del), + url(r'^host_edit/$', view_splitter, {'su': host_edit, 'adm': host_edit_adm}), + url(r'^host_edit/batch/$', host_edit_batch), + url(r'^host_edit_common/batch/$', host_edit_common_batch), +) \ No newline at end of file diff --git a/jasset/views.py b/jasset/views.py new file mode 100644 index 000000000..a62aaca00 --- /dev/null +++ b/jasset/views.py @@ -0,0 +1,927 @@ +# coding:utf-8 + +import ast + +from django.db.models import Q +from django.template import RequestContext +from jperm.models import Perm +from jumpserver.api import * + +cryptor = PyCrypt(KEY) + + +class RaiseError(Exception): + pass + + +def my_render(template, data, request): + return render_to_response(template, data, context_instance=RequestContext(request)) + + +def get_host_groups(groups): + """ 获取主机所属的组类 """ + ret = [] + for group_id in groups: + group = BisGroup.objects.filter(id=group_id) + if group: + group = group[0] + ret.append(group) + return ret + + +def get_host_depts(depts): + """ 获取主机所属的部门类 """ + ret = [] + for dept_id in depts: + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + ret.append(dept) + return ret + + +def db_host_insert(host_info, username='', password=''): + """ 添加主机时数据库操作函数 """ + ip, port, idc, jtype, group, dept, active, comment = host_info + idc = IDC.objects.filter(id=idc) + if idc: + idc = idc[0] + if jtype == 'M': + password = cryptor.encrypt(password) + a = Asset(ip=ip, port=port, + login_type=jtype, idc=idc, + is_active=int(active), + comment=comment, + username=username, + password=password) + else: + a = Asset(ip=ip, port=port, + login_type=jtype, idc=idc, + is_active=int(active), + comment=comment) + a.save() + + all_group = BisGroup.objects.get(name='ALL') + groups = get_host_groups(group) + groups.append(all_group) + + depts = get_host_depts(dept) + + a.bis_group = groups + a.dept = depts + a.save() + + +def db_host_update(host_info, username='', password=''): + """ 修改主机时数据库操作函数 """ + ip, port, idc, jtype, group, dept, active, comment, host = host_info + idc = IDC.objects.filter(id=idc) + if idc: + idc = idc[0] + groups = get_host_groups(group) + depts = get_host_depts(dept) + host.ip = ip + host.port = port + host.login_type = jtype + host.idc = idc + host.is_active = int(active) + host.comment = comment + + if jtype == 'M': + if password != host.password: + password = cryptor.encrypt(password) + host.password = password + host.username = username + host.password = password + host.save() + host.bis_group = groups + host.dept = depts + host.save() + + +def batch_host_edit(host_info, j_user='', j_password=''): + """ 批量修改主机函数 """ + j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment = host_info + groups, depts = [], [] + is_active = {u'是': '1', u'否': '2'} + login_types = {'LDAP': 'L', 'MAP': 'M'} + a = Asset.objects.get(id=j_id) + if '...' in j_group[0].split(): + groups = a.bis_group.all() + else: + for group in j_group[0].split(): + c = BisGroup.objects.get(name=group.strip()) + groups.append(c) + + if '...' in j_dept[0].split(): + depts = a.dept.all() + else: + for d in j_dept[0].split(): + p = DEPT.objects.get(name=d.strip()) + depts.append(p) + + j_type = login_types[j_type] + j_idc = IDC.objects.get(name=j_idc) + if j_type == 'M': + if a.password != j_password: + j_password = cryptor.decrypt(j_password) + a.ip = j_ip + a.port = j_port + a.login_type = j_type + a.idc = j_idc + a.is_active = j_active + a.comment = j_comment + a.username = j_user + a.password = j_password + else: + a.ip = j_ip + a.port = j_port + a.idc = j_idc + a.login_type = j_type + a.is_active = is_active[j_active] + a.comment = j_comment + a.save() + a.bis_group = groups + a.dept = depts + a.save() + + +def db_host_delete(request, host_id): + """ 删除主机操作 """ + if is_group_admin(request) and not validate(request, asset=[host_id]): + return httperror(request, '删除失败, 您无权删除!') + + asset = Asset.objects.filter(id=host_id) + if asset: + asset.delete() + else: + return httperror(request, '删除失败, 没有此主机!') + + +def db_idc_delete(request, idc_id): + """ 删除IDC操作 """ + if idc_id == 1: + return httperror(request, '删除失败, 默认IDC不能删除!') + + default_idc = IDC.objects.get(id=1) + + idc = IDC.objects.filter(id=idc_id) + if idc: + idc_class = idc.first() + idc_class.asset_set.update(idc=default_idc) + idc.delete() + else: + return httperror(request, '删除失败, 没有这个IDC!') + + +@require_admin +def host_add(request): + """ 添加主机 """ + header_title, path1, path2 = u'添加主机', u'资产管理', u'添加主机' + login_types = {'L': 'LDAP', 'M': 'MAP'} + eidc = IDC.objects.exclude(name='ALL') + if is_super_user(request): + edept = DEPT.objects.all() + egroup = BisGroup.objects.exclude(name='ALL') + elif is_group_admin(request): + dept = get_session_user_info(request)[5] + egroup = dept.bisgroup_set.all() + + if request.method == 'POST': + j_ip = request.POST.get('j_ip') + j_idc = request.POST.get('j_idc') + j_port = request.POST.get('j_port') + j_type = request.POST.get('j_type') + j_group = request.POST.getlist('j_group') + j_active = request.POST.get('j_active') + j_comment = request.POST.get('j_comment') + + if is_super_user(request): + j_dept = request.POST.getlist('j_dept') + host_info = [j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment] + elif is_group_admin(request): + j_dept = request.POST.get('j_dept') + host_info = [j_ip, j_port, j_idc, j_type, j_group, [j_dept], j_active, j_comment] + + if is_group_admin(request) and not validate(request, asset_group=j_group, edept=[j_dept]): + return httperror(request, u'添加失败,您无权操作!') + + if Asset.objects.filter(ip=str(j_ip)): + emg = u'该IP %s 已存在!' % j_ip + return my_render('jasset/host_add.html', locals(), request) + if j_type == 'M': + j_user = request.POST.get('j_user') + j_password = request.POST.get('j_password', '') + db_host_insert(host_info, j_user, j_password) + else: + db_host_insert(host_info) + smg = u'主机 %s 添加成功' % j_ip + + return my_render('jasset/host_add.html', locals(), request) + + +@require_admin +def host_add_batch(request): + """ 批量添加主机 """ + header_title, path1, path2 = u'批量添加主机', u'资产管理', u'批量添加主机' + login_types = {'LDAP': 'L', 'MAP': 'M'} + active_types = {'激活': 1, '禁用': 0} + dept_id = get_user_dept(request) + if request.method == 'POST': + multi_hosts = request.POST.get('j_multi').split('\n') + for host in multi_hosts: + if host == '': + break + j_ip, j_port, j_type, j_idc, j_groups, j_depts, j_active, j_comment = host.split() + j_active = active_types[str(j_active)] + j_group = ast.literal_eval(j_groups) + j_dept = ast.literal_eval(j_depts) + + if j_type not in ['LDAP', 'MAP']: + return httperror(request, u'没有%s这种登录方式!' %j_type) + + j_type = login_types[j_type] + idc = IDC.objects.filter(name=j_idc) + if idc: + j_idc = idc[0].id + else: + return httperror(request, '添加失败, 没有%s这个IDC' % j_idc) + + group_ids, dept_ids = [], [] + for group_name in j_group: + group = BisGroup.objects.filter(name=group_name) + if group: + group_id = group[0].id + else: + return httperror(request, '添加失败, 没有%s这个主机组' % group_name) + group_ids.append(group_id) + + for dept_name in j_dept: + dept = DEPT.objects.filter(name=dept_name) + if dept: + dept_id = dept[0].id + else: + return httperror(request, '添加失败, 没有%s这个部门' % dept_name) + dept_ids.append(dept_id) + + if is_group_admin(request) and not validate(request, asset_group=group_ids, edept=dept_ids): + return httperror(request, '添加失败, 没有%s这个主机组' % group_name) + + if Asset.objects.filter(ip=str(j_ip)): + return httperror(request, '添加失败, 改IP%s已存在' % j_ip) + + host_info = [j_ip, j_port, j_idc, j_type, group_ids, dept_ids, j_active, j_comment] + db_host_insert(host_info) + + smg = u'批量添加添加成功' + return my_render('jasset/host_add_multi.html', locals(), request) + + return my_render('jasset/host_add_multi.html', locals(), request) + + +@require_admin +def host_edit_batch(request): + """ 批量修改主机 """ + if request.method == 'POST': + len_table = request.POST.get('len_table') + for i in range(int(len_table)): + j_id = "editable[" + str(i) + "][j_id]" + j_ip = "editable[" + str(i) + "][j_ip]" + j_port = "editable[" + str(i) + "][j_port]" + j_dept = "editable[" + str(i) + "][j_dept]" + j_idc = "editable[" + str(i) + "][j_idc]" + j_type = "editable[" + str(i) + "][j_type]" + j_group = "editable[" + str(i) + "][j_group]" + j_active = "editable[" + str(i) + "][j_active]" + j_comment = "editable[" + str(i) + "][j_comment]" + + j_id = request.POST.get(j_id).strip() + j_ip = request.POST.get(j_ip).strip() + j_port = request.POST.get(j_port).strip() + j_dept = request.POST.getlist(j_dept) + j_idc = request.POST.get(j_idc).strip() + j_type = request.POST.get(j_type).strip() + j_group = request.POST.getlist(j_group) + j_active = request.POST.get(j_active).strip() + j_comment = request.POST.get(j_comment).strip() + + host_info = [j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment] + batch_host_edit(host_info) + + return HttpResponseRedirect('/jasset/host_list/') + + +@require_login +def host_edit_common_batch(request): + """ 普通用户批量修改主机别名 """ + u = get_session_user_info(request)[2] + if request.method == 'POST': + len_table = request.POST.get('len_table') + for i in range(int(len_table)): + j_id = "editable[" + str(i) + "][j_id]" + j_alias = "editable[" + str(i) + "][j_alias]" + j_id = request.POST.get(j_id, '').strip() + j_alias = request.POST.get(j_alias, '').strip() + a = Asset.objects.get(id=j_id) + asset_alias = AssetAlias.objects.filter(user=u, host=a) + if asset_alias: + asset_alias = asset_alias[0] + asset_alias.alias = j_alias + asset_alias.save() + else: + AssetAlias.objects.create(user=u, host=a, alias=j_alias) + return my_render('jasset/host_list_common.html') + + +@require_login +def host_list(request): + """ 列出主机 """ + header_title, path1, path2 = u'查看主机', u'资产管理', u'查看主机' + keyword = request.GET.get('keyword', '') + dept_id = get_session_user_info(request)[3] + dept = DEPT.objects.get(id=dept_id) + did = request.GET.get('did', '') + gid = request.GET.get('gid', '') + sid = request.GET.get('sid', '') + user_id = get_session_user_info(request)[0] + + post_all = Asset.objects.all().order_by('ip') + post_keyword_all = Asset.objects.filter(Q(ip__contains=keyword) | + Q(idc__name__contains=keyword) | + Q(bis_group__name__contains=keyword) | + Q(comment__contains=keyword)).distinct().order_by('ip') + if did: + if is_common_user(request): + return httperror(request, u'您无权查看!') + + if is_group_admin(request): + user, dept = get_session_user_dept(request) + else: + dept = DEPT.objects.get(id=did) + posts = dept.asset_set.all() + return my_render('jasset/host_list_nop.html', locals(), request) + + elif gid: + if is_common_user(request): + return httperror(request, u'您无权查看!') + + elif is_group_admin(request) and not validate(request, user_group=[gid]): + return httperror(request, u'您无权查看!') + + posts = [] + user_group = UserGroup.objects.filter(id=gid) + if user_group: + perms = Perm.objects.filter(user_group=user_group) + for perm in perms: + for post in perm.asset_group.asset_set.all(): + posts.append(post) + posts = list(set(posts)) + else: + return httperror(request, u'没有这个小组!') + return my_render('jasset/host_list_nop.html', locals(), request) + + elif sid: + if is_common_user(request): + return httperror(request, u'您无权查看!') + + elif is_group_admin(request) and not validate(request, user_group=[sid]): + return httperror(request, u'您无权查看!') + + posts, asset_groups = [], [] + user_group = UserGroup.objects.filter(id=int(sid)) + if user_group: + user_group = user_group[0] + for perm in user_group.sudoperm_set.all(): + asset_groups.extend(perm.asset_group.all()) + + for asset_group in asset_groups: + posts.extend(asset_group.asset_set.all()) + posts = list(set(posts)) + else: + return httperror(request, u'没有这个sudo授权!') + return my_render('jasset/host_list_nop.html', locals(), request) + + else: + if is_super_user(request): + if keyword: + posts = post_keyword_all + else: + posts = post_all + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + return my_render('jasset/host_list.html', locals(), request) + + elif is_group_admin(request): + if keyword: + posts = post_keyword_all.filter(dept=dept) + else: + posts = post_all.filter(dept=dept) + + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + return my_render('jasset/host_list.html', locals(), request) + + elif is_common_user(request): + user_id, username = get_session_user_info(request)[0:2] + posts = user_perm_asset_api(username) + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + return my_render('jasset/host_list_common.html', locals(), request) + + +@require_admin +def host_del(request, offset): + """ 删除主机 """ + if offset == 'multi': + len_list = request.POST.get("len_list") + for i in range(int(len_list)): + key = "id_list[" + str(i) + "]" + host_id = request.POST.get(key) + db_host_delete(request, host_id) + else: + db_host_delete(request, offset) + + return HttpResponseRedirect('/jasset/host_list/') + + +@require_super_user +def host_edit(request): + """ 修改主机 """ + header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机' + actives = {1: u'激活', 0: u'禁用'} + login_types = {'L': 'LDAP', 'M': 'MAP'} + eidc = IDC.objects.all() + egroup = BisGroup.objects.exclude(name='ALL') + edept = DEPT.objects.all() + host_id = request.GET.get('id', '') + post = Asset.objects.filter(id=int(host_id)) + if post: + post = post[0] + else: + return httperror(request, '没有此主机!') + + e_group = post.bis_group.all() + e_dept = post.dept.all() + + if request.method == 'POST': + j_ip = request.POST.get('j_ip', '') + j_idc = request.POST.get('j_idc', '') + j_port = request.POST.get('j_port', '') + j_type = request.POST.get('j_type', '') + j_dept = request.POST.getlist('j_dept', '') + j_group = request.POST.getlist('j_group', '') + j_active = request.POST.get('j_active', '') + j_comment = request.POST.get('j_comment', '') + + host_info = [j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, post] + if j_type == 'M': + j_user = request.POST.get('j_user') + j_password = request.POST.get('j_password') + db_host_update(host_info, j_user, j_password) + else: + db_host_update(host_info) + + smg = u'主机 %s 修改成功' % j_ip + return HttpResponseRedirect('/jasset/host_detail/?id=%s' % host_id) + + return my_render('jasset/host_edit.html', locals(), request) + + +@require_admin +def host_edit_adm(request): + """ 部门管理员修改主机 """ + header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机' + actives = {1: u'激活', 0: u'禁用'} + login_types = {'L': 'LDAP', 'M': 'MAP'} + eidc = IDC.objects.all() + dept = get_session_user_info(request)[5] + egroup = BisGroup.objects.exclude(name='ALL').filter(dept=dept) + host_id = request.GET.get('id', '') + post = Asset.objects.filter(id=int(host_id)) + if post: + post = post[0] + else: + return httperror(request, '没有此主机!') + + e_group = post.bis_group.all() + + if request.method == 'POST': + j_ip = request.POST.get('j_ip') + j_idc = request.POST.get('j_idc') + j_port = request.POST.get('j_port') + j_type = request.POST.get('j_type') + j_dept = request.POST.getlist('j_dept') + j_group = request.POST.getlist('j_group') + j_active = request.POST.get('j_active') + j_comment = request.POST.get('j_comment') + + host_info = [j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment] + + if not validate(request, asset_group=j_group, edept=j_dept): + emg = u'修改失败,您无权操作!' + return my_render('jasset/host_edit.html', locals(), request) + + if j_type == 'M': + j_user = request.POST.get('j_user') + j_password = request.POST.get('j_password') + db_host_update(host_info, j_user, j_password, post) + else: + db_host_update(host_info, post) + + smg = u'主机 %s 修改成功' % j_ip + return HttpResponseRedirect('/jasset/host_detail/?id=%s' % host_id) + + return my_render('jasset/host_edit.html', locals(), request) + + +@require_login +def host_detail(request): + """ 主机详情 """ + header_title, path1, path2 = u'主机详细信息', u'资产管理', u'主机详情' + host_id = request.GET.get('id', '') + post = Asset.objects.filter(id=host_id) + if not post: + return httperror(request, '没有此主机!') + post = post.first() + + if is_group_admin(request) and not validate(request, asset=[host_id]): + return httperror(request, '您无权查看!') + + elif is_common_user(request): + username = get_session_user_info(request)[1] + user_permed_hosts = user_perm_asset_api(username) + if post not in user_permed_hosts: + return httperror(request, '您无权查看!') + else: + log_all = Log.objects.filter(host=post.ip) + log, log_more = log_all[:10], log_all[10:] + user_permed_list = asset_perm_api(post) + + return my_render('jasset/host_detail.html', locals(), request) + + +@require_super_user +def idc_add(request): + """ 添加IDC """ + header_title, path1, path2 = u'添加IDC', u'资产管理', u'添加IDC' + if request.method == 'POST': + j_idc = request.POST.get('j_idc') + j_comment = request.POST.get('j_comment') + if IDC.objects.filter(name=j_idc): + emg = u'该IDC已存在!' + return my_render('jasset/idc_add.html', locals(), request) + else: + smg = u'IDC:%s添加成功' % j_idc + IDC.objects.create(name=j_idc, comment=j_comment) + + return my_render('jasset/idc_add.html', locals(), request) + + +@require_admin +def idc_list(request): + """ 列出IDC """ + header_title, path1, path2 = u'查看IDC', u'资产管理', u'查看IDC' + dept_id = get_user_dept(request) + dept = DEPT.objects.get(id=dept_id) + keyword = request.GET.get('keyword', '') + if keyword: + posts = IDC.objects.filter(Q(name__contains=keyword) | Q(comment__contains=keyword)) + else: + posts = IDC.objects.exclude(name='ALL').order_by('id') + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + return my_render('jasset/idc_list.html', locals(), request) + + +@require_super_user +def idc_edit(request): + """ 修改IDC """ + header_title, path1, path2 = u'编辑IDC', u'资产管理', u'编辑IDC' + idc_id = request.GET.get('id', '') + idc = IDC.objects.filter(id=idc_id) + if int(idc_id) == 1: + return httperror(request, u'默认IDC不能编辑!') + if idc: + idc = idc[0] + default = IDC.objects.get(id=1).asset_set.all() + eposts = Asset.objects.filter(idc=idc).order_by('ip') + posts = [g for g in default if g not in eposts] + else: + return httperror(request, u'此IDC不存在') + + if request.method == 'POST': + idc_id = request.POST.get('id') + j_idc = request.POST.get('j_idc') + j_hosts = request.POST.getlist('j_hosts') + j_comment = request.POST.get('j_comment') + idc_default = request.POST.getlist('idc_default') + + idc = IDC.objects.filter(id=idc_id) + if idc: + idc.update(name=j_idc, comment=j_comment) + for host_id in j_hosts: + Asset.objects.filter(id=host_id).update(idc=idc[0]) + + i = IDC.objects.get(id=1) + for host in idc_default: + g = Asset.objects.filter(id=host).update(idc=i) + else: + return httperror(request, u'此IDC不存在') + + return HttpResponseRedirect('/jasset/idc_list/?id=%s' % idc_id) + + return my_render('jasset/idc_edit.html', locals(), request) + + +@require_admin +def idc_detail(request): + """ IDC详情 """ + header_title, path1, path2 = u'IDC详情', u'资产管理', u'IDC详情' + login_types = {'L': 'LDAP', 'M': 'MAP'} + idc_id = request.GET.get('id', '') + idc_filter = IDC.objects.filter(id=idc_id) + if idc_filter: + idc = idc_filter[0] + else: + return httperror(request, '没有此IDC') + dept = get_session_user_info(request)[5] + if is_super_user(request): + posts = Asset.objects.filter(idc=idc).order_by('ip') + elif is_group_admin(request): + posts = Asset.objects.filter(idc=idc, dept=dept).order_by('ip') + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + + return my_render('jasset/idc_detail.html', locals(), request) + + +@require_super_user +def idc_del(request): + """ 删除IDC """ + offset = request.GET.get('id', '') + if offset == 'multi': + len_list = request.POST.get("len_list") + for i in range(int(len_list)): + key = "id_list[" + str(i) + "]" + idc_id = request.POST.get(key) + db_idc_delete(request, int(idc_id)) + else: + db_idc_delete(request, int(offset)) + return HttpResponseRedirect('/jasset/idc_list/') + + +@require_admin +def group_add(request): + """ 添加主机组 """ + header_title, path1, path2 = u'添加主机组', u'资产管理', u'添加主机组' + if is_super_user(request): + posts = Asset.objects.all() + edept = DEPT.objects.all() + elif is_group_admin(request): + dept_id = get_user_dept(request) + dept = DEPT.objects.get(id=dept_id) + posts = Asset.objects.filter(dept=dept) + edept = get_session_user_info(request)[5] + + if request.method == 'POST': + j_group = request.POST.get('j_group', '') + j_dept = request.POST.get('j_dept', '') + j_hosts = request.POST.getlist('j_hosts', '') + j_comment = request.POST.get('j_comment', '') + + try: + if is_group_admin(request) and not validate(request, asset=j_hosts, edept=[j_dept]): + emg = u'添加失败, 您无权操作!' + raise RaiseError + + elif BisGroup.objects.filter(name=j_group): + emg = u'添加失败, 该主机组已存在!' + raise RaiseError + + except RaiseError: + pass + + else: + j_dept = DEPT.objects.filter(id=j_dept).first() + group = BisGroup.objects.create(name=j_group, dept=j_dept, comment=j_comment) + for host in j_hosts: + g = Asset.objects.get(id=host) + group.asset_set.add(g) + smg = u'主机组 %s 添加成功' % j_group + + return my_render('jasset/group_add.html', locals(), request) + + +@require_admin +def group_list(request): + """ 列出主机组 """ + header_title, path1, path2 = u'查看主机组', u'资产管理', u'查看主机组' + dept_id = get_user_dept(request) + dept = DEPT.objects.get(id=dept_id) + keyword = request.GET.get('keyword', '') + gid = request.GET.get('gid') + sid = request.GET.get('sid') + if gid: + if is_common_user(request): + return httperror(request, u'您无权查看!') + + elif is_group_admin(request) and not validate(request, user_group=[gid]): + return httperror(request, u'您无权查看!') + + posts = [] + user_group = UserGroup.objects.filter(id=gid) + if user_group: + user_group = user_group[0] + perms = Perm.objects.filter(user_group=user_group) + for perm in perms: + posts.append(perm.asset_group) + + elif sid: + if is_common_user(request): + return httperror(request, u'您无权查看!') + + elif is_group_admin(request) and not validate(request, user_group=[sid]): + return httperror(request, u'您无权查看!') + + posts = [] + user_group = UserGroup.objects.filter(id=sid) + if user_group: + user_group = user_group[0] + for perm in user_group.sudoperm_set.all(): + posts.extend(perm.asset_group.all()) + posts = list(set(posts)) + else: + return httperror(request, u'没有此sudo授权!') + + else: + if is_super_user(request): + if keyword: + posts = BisGroup.objects.exclude(name='ALL').filter( + Q(name__contains=keyword) | Q(comment__contains=keyword)) + else: + posts = BisGroup.objects.exclude(name='ALL').order_by('id') + elif is_group_admin(request): + if keyword: + posts = BisGroup.objects.filter(Q(name__contains=keyword) | Q(comment__contains=keyword)).filter( + dept=dept) + else: + posts = BisGroup.objects.filter(dept=dept).order_by('id') + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + return my_render('jasset/group_list.html', locals(), request) + + +@require_admin +def group_edit(request): + """ 修改主机组 """ + header_title, path1, path2 = u'编辑主机组', u'资产管理', u'编辑主机组' + group_id = request.GET.get('id', '') + group = BisGroup.objects.filter(id=group_id) + if group: + group = group.first() + else: + httperror(request, u'没有这个主机组!') + + host_all = Asset.objects.all() + dept_id = get_session_user_info(request)[3] + eposts = Asset.objects.filter(bis_group=group) + + if is_group_admin(request) and not validate(request, asset_group=[group_id]): + return httperror(request, '编辑失败, 您无权操作!') + dept = DEPT.objects.filter(id=group.dept.id) + if dept: + dept = dept[0] + else: + return httperror(request, u'没有这个部门!') + + all_dept = dept.asset_set.all() + posts = [g for g in all_dept if g not in eposts] + + if request.method == 'POST': + j_group = request.POST.get('j_group', '') + j_hosts = request.POST.getlist('j_hosts', '') + j_dept = request.POST.get('j_dept', '') + j_comment = request.POST.get('j_comment', '') + + j_dept = DEPT.objects.filter(id=int(j_dept)) + j_dept = j_dept[0] + + group.asset_set.clear() + for host in j_hosts: + g = Asset.objects.get(id=host) + group.asset_set.add(g) + BisGroup.objects.filter(id=group_id).update(name=j_group, dept=j_dept, comment=j_comment) + smg = u'主机组%s修改成功' % j_group + return HttpResponseRedirect('/jasset/group_list') + + return my_render('jasset/group_edit.html', locals(), request) + + +@require_admin +def group_detail(request): + """ 主机组详情 """ + header_title, path1, path2 = u'主机组详情', u'资产管理', u'主机组详情' + login_types = {'L': 'LDAP', 'M': 'MAP'} + dept = get_session_user_info(request)[5] + group_id = request.GET.get('id', '') + group = BisGroup.objects.get(id=group_id) + if is_super_user(request): + posts = Asset.objects.filter(bis_group=group).order_by('ip') + + elif is_group_admin(request): + if not validate(request, asset_group=[group_id]): + return httperror(request, u'您无权查看!') + posts = Asset.objects.filter(bis_group=group).filter(dept=dept).order_by('ip') + + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + return my_render('jasset/group_detail.html', locals(), request) + + +@require_admin +def group_del_host(request): + """ 主机组中剔除主机, 并不删除真实主机 """ + if request.method == 'POST': + group_id = request.POST.get('group_id') + offset = request.GET.get('id', '') + group = BisGroup.objects.get(id=group_id) + if offset == 'group': + len_list = request.POST.get("len_list") + for i in range(int(len_list)): + key = "id_list[" + str(i) + "]" + jid = request.POST.get(key) + g = Asset.objects.get(id=jid) + group.asset_set.remove(g) + + else: + offset = request.GET.get('id', '') + group_id = request.GET.get('gid', '') + group = BisGroup.objects.get(id=group_id) + g = Asset.objects.get(id=offset) + group.asset_set.remove(g) + + return HttpResponseRedirect('/jasset/group_detail/?id=%s' % group.id) + + +@require_admin +def group_del(request): + """ 删除主机组 """ + offset = request.GET.get('id', '') + if offset == 'multi': + len_list = request.POST.get("len_list") + for i in range(int(len_list)): + key = "id_list[" + str(i) + "]" + gid = request.POST.get(key) + if is_group_admin(request) and not validate(request, asset_group=[gid]): + return httperror(request, '删除失败, 您无权删除!') + BisGroup.objects.filter(id=gid).delete() + else: + gid = int(offset) + if is_group_admin(request) and not validate(request, asset_group=[gid]): + return httperror(request, '删除失败, 您无权删除!') + BisGroup.objects.filter(id=gid).delete() + return HttpResponseRedirect('/jasset/group_list/') + + +@require_admin +def dept_host_ajax(request): + """ 添加主机组时, 部门联动主机异步 """ + dept_id = request.GET.get('id', '') + if dept_id not in ['1', '2']: + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + hosts = dept.asset_set.all() + else: + hosts = Asset.objects.all() + + return my_render('jasset/dept_host_ajax.html', locals(), request) + + +def show_all_ajax(request): + """ 批量修改主机时, 部门和组全部显示 """ + env = request.GET.get('env', '') + get_id = request.GET.get('id', '') + host = Asset.objects.filter(id=get_id) + if host: + host = host[0] + return my_render('jasset/show_all_ajax.html', locals(), request) + + +@require_login +def host_search(request): + """ 搜索主机 """ + keyword = request.GET.get('keyword') + login_types = {'L': 'LDAP', 'M': 'MAP'} + dept = get_session_user_info(request)[5] + post_all = Asset.objects.filter(Q(ip__contains=keyword) | + Q(idc__name__contains=keyword) | + Q(bis_group__name__contains=keyword) | + Q(comment__contains=keyword)).distinct().order_by('ip') + if is_super_user(request): + posts = post_all + + elif is_group_admin(request): + posts = post_all.filter(dept=dept) + + elif is_common_user(request): + username = get_session_user_info(request)[2] + post_perm = user_perm_asset_api(username) + posts = list(set(post_all) & set(post_perm)) + + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + + return my_render('jasset/host_search.html', locals(), request) \ No newline at end of file diff --git a/webroot/AutoSa/AutoSa/__init__.py b/jlog/__init__.py similarity index 100% rename from webroot/AutoSa/AutoSa/__init__.py rename to jlog/__init__.py diff --git a/webroot/AutoSa/UserManage/admin.py b/jlog/admin.py similarity index 100% rename from webroot/AutoSa/UserManage/admin.py rename to jlog/admin.py diff --git a/jlog/models.py b/jlog/models.py new file mode 100644 index 000000000..0e22c5d07 --- /dev/null +++ b/jlog/models.py @@ -0,0 +1,17 @@ +from django.db import models + + +class Log(models.Model): + user = models.CharField(max_length=20, null=True) + host = models.CharField(max_length=20, null=True) + remote_ip = models.CharField(max_length=100) + dept_name = models.CharField(max_length=20) + log_path = models.CharField(max_length=100) + start_time = models.DateTimeField(null=True) + pid = models.IntegerField(max_length=10) + is_finished = models.BooleanField(default=False) + log_finished = models.BooleanField(default=False) + end_time = models.DateTimeField(null=True) + + def __unicode__(self): + return self.log_path \ No newline at end of file diff --git a/webroot/AutoSa/UserManage/tests.py b/jlog/tests.py similarity index 100% rename from webroot/AutoSa/UserManage/tests.py rename to jlog/tests.py diff --git a/jlog/urls.py b/jlog/urls.py new file mode 100644 index 000000000..0b6810d3c --- /dev/null +++ b/jlog/urls.py @@ -0,0 +1,11 @@ +# coding:utf-8 +from django.conf.urls import patterns, include, url +from jlog.views import * + +urlpatterns = patterns('', + url(r'^$', log_list), + url(r'^log_list/(\w+)/$', log_list), + url(r'^log_kill/', log_kill), + url(r'^history/$', log_history), + url(r'^search/$', log_search), +) \ No newline at end of file diff --git a/jlog/views.py b/jlog/views.py new file mode 100644 index 000000000..85a937028 --- /dev/null +++ b/jlog/views.py @@ -0,0 +1,117 @@ +# coding:utf-8 +from django.db.models import Q +from django.template import RequestContext +from django.shortcuts import render_to_response + +from jumpserver.api import * +from jasset.views import httperror +from django.http import HttpResponseNotFound + +CONF = ConfigParser() +CONF.read('%s/jumpserver.conf' % BASE_DIR) + + +def get_user_info(request, offset): + """ 获取用户信息及环境 """ + env_dic = {'online': 0, 'offline': 1} + env = env_dic[offset] + keyword = request.GET.get('keyword', '') + user_info = get_session_user_info(request) + user_id, username = user_info[0:2] + dept_id, dept_name = user_info[3:5] + ret = [request, keyword, env, username, dept_name] + + return ret + + +def get_user_log(ret_list): + """ 获取不同类型用户日志记录 """ + request, keyword, env, username, dept_name = ret_list + post_all = Log.objects.filter(is_finished=env).order_by('-start_time') + post_keyword_all = Log.objects.filter(Q(user__contains=keyword) | + Q(host__contains=keyword)) \ + .filter(is_finished=env).order_by('-start_time') + + if is_super_user(request): + if keyword: + posts = post_keyword_all + else: + posts = post_all + + elif is_group_admin(request): + if keyword: + posts = post_keyword_all.filter(dept_name=dept_name) + else: + posts = post_all.filter(dept_name=dept_name) + + elif is_common_user(request): + if keyword: + posts = post_keyword_all.filter(user=username) + else: + posts = post_all.filter(user=username) + + return posts + + +@require_login +def log_list(request, offset): + """ 显示日志 """ + header_title, path1, path2 = u'查看日志', u'查看日志', u'在线用户' + keyword = request.GET.get('keyword', '') + web_socket_host = CONF.get('websocket', 'web_socket_host') + posts = get_user_log(get_user_info(request, offset)) + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + + return render_to_response('jlog/log_%s.html' % offset, locals(), context_instance=RequestContext(request)) + + +@require_admin +def log_kill(request): + """ 杀掉connect进程 """ + pid = request.GET.get('id', '') + log = Log.objects.filter(pid=pid) + if log: + log = log.first() + dept_name = log.dept_name + deptname = get_session_user_info(request)[4] + if is_group_admin(request) and dept_name != deptname: + return httperror(request, u'Kill失败, 您无权操作!') + os.kill(int(pid), 9) + Log.objects.filter(pid=pid).update(is_finished=1, end_time=datetime.datetime.now()) + return render_to_response('jlog/log_offline.html', locals(), context_instance=RequestContext(request)) + else: + return HttpResponseNotFound(u'没有此进程!') + + +@require_login +def log_history(request): + """ 命令历史记录 """ + log_id = request.GET.get('id', 0) + log = Log.objects.filter(id=int(log_id)) + if log: + log = log.first() + dept_name = log.dept_name + deptname = get_session_user_info(request)[4] + if is_group_admin(request) and dept_name != deptname: + return httperror(request, '查看失败, 您无权查看!') + + elif is_common_user(request): + return httperror(request, '查看失败, 您无权查看!') + + log_his = "%s.his" % log.log_path + if os.path.isfile(log_his): + f = open(log_his) + content = f.read() + return HttpResponse(content) + else: + return httperror(request, '无日志记录, 请查看日志处理脚本是否开启!') + + +@require_login +def log_search(request): + """ 日志搜索 """ + offset = request.GET.get('env', '') + keyword = request.GET.get('keyword', '') + posts = get_user_log(get_user_info(request, offset)) + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + return render_to_response('jlog/log_search.html', locals(), context_instance=RequestContext(request)) diff --git a/webroot/AutoSa/AutoSa/templatetags/__init__.py b/jperm/__init__.py similarity index 100% rename from webroot/AutoSa/AutoSa/templatetags/__init__.py rename to jperm/__init__.py diff --git a/jperm/admin.py b/jperm/admin.py new file mode 100644 index 000000000..8c38f3f3d --- /dev/null +++ b/jperm/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/jperm/models.py b/jperm/models.py new file mode 100644 index 000000000..c29cb8e54 --- /dev/null +++ b/jperm/models.py @@ -0,0 +1,54 @@ +import datetime + +from uuidfield import UUIDField + +from django.db import models +from juser.models import UserGroup, DEPT +from jasset.models import Asset, BisGroup + + +class Perm(models.Model): + user_group = models.ForeignKey(UserGroup) + asset_group = models.ForeignKey(BisGroup) + + def __unicode__(self): + return '%s_%s' % (self.user_group.name, self.asset_group.name) + + +class CmdGroup(models.Model): + name = models.CharField(max_length=50, unique=True) + cmd = models.CharField(max_length=999) + dept = models.ForeignKey(DEPT) + comment = models.CharField(blank=True, null=True, max_length=50) + + def __unicode__(self): + return self.name + + +class SudoPerm(models.Model): + user_group = models.ForeignKey(UserGroup) + user_runas = models.CharField(max_length=100) + asset_group = models.ManyToManyField(BisGroup) + cmd_group = models.ManyToManyField(CmdGroup) + comment = models.CharField(max_length=30, null=True, blank=True) + + def __unicode__(self): + return self.user_group.name + + +class Apply(models.Model): + uuid = UUIDField(auto=True) + applyer = models.CharField(max_length=20) + admin = models.CharField(max_length=20) + approver = models.CharField(max_length=20) + dept = models.CharField(max_length=20) + bisgroup = models.CharField(max_length=500) + asset = models.CharField(max_length=500) + comment = models.TextField(blank=True, null=True) + status = models.IntegerField(max_length=2) + date_add = models.DateTimeField(null=True) + date_end = models.DateTimeField(null=True) + read = models.IntegerField(max_length=2) + + def __unicode__(self): + return self.applyer diff --git a/jperm/tests.py b/jperm/tests.py new file mode 100644 index 000000000..7ce503c2d --- /dev/null +++ b/jperm/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/jperm/urls.py b/jperm/urls.py new file mode 100644 index 000000000..41a7b26ed --- /dev/null +++ b/jperm/urls.py @@ -0,0 +1,33 @@ +from django.conf.urls import patterns, include, url +from jperm.views import * + +urlpatterns = patterns('jperm.views', + # Examples: + # url(r'^$', 'jumpserver.views.home', name='home'), + # url(r'^blog/', include('blog.urls')), + + (r'^perm_edit/$', view_splitter, {'su': perm_edit, 'adm': perm_edit_adm}), + (r'^dept_perm_edit/$', 'dept_perm_edit'), + (r'^perm_list/$', view_splitter, {'su': perm_list, 'adm': perm_list_adm}), + (r'^dept_perm_list/$', 'dept_perm_list'), + (r'^perm_user_detail/$', 'perm_user_detail'), + (r'^perm_detail/$', 'perm_detail'), + (r'^perm_del/$', 'perm_del'), + (r'^perm_asset_detail/$', 'perm_asset_detail'), + (r'^sudo_list/$', view_splitter, {'su': sudo_list, 'adm': sudo_list_adm}), + (r'^sudo_del/$', 'sudo_del'), + (r'^sudo_edit/$', view_splitter, {'su': sudo_edit, 'adm': sudo_edit_adm}), + (r'^sudo_refresh/$', 'sudo_refresh'), + (r'^sudo_detail/$', 'sudo_detail'), + (r'^cmd_add/$', view_splitter, {'su': cmd_add, 'adm': cmd_add_adm}), + (r'^cmd_list/$', 'cmd_list'), + (r'^cmd_del/$', 'cmd_del'), + (r'^cmd_edit/$', 'cmd_edit'), + (r'^cmd_detail/$', 'cmd_detail'), + (r'^apply/$', 'perm_apply'), + (r'^apply_show/(\w+)/$', 'perm_apply_log'), + (r'^apply_exec/$', 'perm_apply_exec'), + (r'^apply_info/$', 'perm_apply_info'), + (r'^apply_del/$', 'perm_apply_del'), + (r'^apply_search/$', 'perm_apply_search'), +) diff --git a/jperm/views.py b/jperm/views.py new file mode 100644 index 000000000..d6d6bf2c3 --- /dev/null +++ b/jperm/views.py @@ -0,0 +1,813 @@ +# coding: utf-8 +import sys + +reload(sys) +sys.setdefaultencoding('utf8') + +from django.shortcuts import render_to_response +from django.template import RequestContext +from jperm.models import Perm, SudoPerm, CmdGroup, Apply +from django.db.models import Q +from jumpserver.api import * + + +def asset_cmd_groups_get(asset_groups_select='', cmd_groups_select=''): + asset_groups_select_list = [] + cmd_groups_select_list = [] + + for asset_group_id in asset_groups_select: + asset_groups_select_list.extend(BisGroup.objects.filter(id=asset_group_id)) + + for cmd_group_id in cmd_groups_select: + cmd_groups_select_list.extend(CmdGroup.objects.filter(id=cmd_group_id)) + + return asset_groups_select_list, cmd_groups_select_list + + +@require_admin +def perm_add(request): + header_title, path1, path2 = u'主机授权添加', u'授权管理', u'授权添加' + + if request.method == 'GET': + user_groups = UserGroup.objects.filter(id__gt=2) + asset_groups = BisGroup.objects.all() + + else: + name = request.POST.get('name', '') + user_groups_select = request.POST.getlist('user_groups_select') + asset_groups_select = request.POST.getlist('asset_groups_select') + comment = request.POST.get('comment', '') + + user_groups, asset_groups = user_asset_cmd_groups_get(user_groups_select, asset_groups_select, '')[0:2] + + perm = Perm(name=name, comment=comment) + perm.save() + + perm.user_group = user_groups + perm.asset_group = asset_groups + msg = '添加成功' + return render_to_response('jperm/perm_add.html', locals(), context_instance=RequestContext(request)) + + +def dept_add_asset(dept_id, asset_list): + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + new_perm_asset = [] + for asset_id in asset_list: + asset = Asset.objects.filter(id=asset_id) + new_perm_asset.extend(asset) + + dept.asset_set.clear() + dept.asset_set = new_perm_asset + + +@require_super_user +def dept_perm_edit(request): + header_title, path1, path2 = u'部门授权添加', u'授权管理', u'部门授权添加' + if request.method == 'GET': + dept_id = request.GET.get('id', '') + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + asset_all = Asset.objects.all() + asset_select = dept.asset_set.all() + assets = [asset for asset in asset_all if asset not in asset_select] + else: + dept_id = request.POST.get('dept_id') + asset_select = request.POST.getlist('asset_select') + dept_add_asset(dept_id, asset_select) + return HttpResponseRedirect('/jperm/dept_perm_list/') + return render_to_response('jperm/dept_perm_edit.html', locals(), context_instance=RequestContext(request)) + + +@require_super_user +def perm_list(request): + header_title, path1, path2 = u'小组授权', u'授权管理', u'授权详情' + keyword = request.GET.get('search', '') + uid = request.GET.get('uid', '') + agid = request.GET.get('agid', '') + if keyword: + contact_list = UserGroup.objects.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword)) + else: + contact_list = UserGroup.objects.all().order_by('name') + + if uid: + user = User.objects.filter(id=uid) + print user + if user: + user = user[0] + contact_list = contact_list.filter(user=user) + + if agid: + contact_list_confirm = [] + asset_group = BisGroup.objects.filter(id=agid) + if asset_group: + asset_group = asset_group[0] + for user_group in contact_list: + if asset_group in user_group_perm_asset_group_api(user_group): + contact_list_confirm.append(user_group) + contact_list = contact_list_confirm + + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) + return render_to_response('jperm/perm_list.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def perm_list_adm(request): + header_title, path1, path2 = u'小组授权', u'授权管理', u'授权详情' + keyword = request.GET.get('search', '') + uid = request.GET.get('uid', '') + agid = request.GET.get('agid', '') + user, dept = get_session_user_dept(request) + contact_list = dept.usergroup_set.all().order_by('name') + if keyword: + contact_list = contact_list.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword)) + + if uid: + user = User.objects.filter(id=uid) + print user + if user: + user = user[0] + contact_list = contact_list.filter(user=user) + + if agid: + contact_list_confirm = [] + asset_group = BisGroup.objects.filter(id=agid) + if asset_group: + asset_group = asset_group[0] + for user_group in contact_list: + if asset_group in user_group_perm_asset_group_api(user_group): + contact_list_confirm.append(user_group) + contact_list = contact_list_confirm + + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) + return render_to_response('jperm/perm_list.html', locals(), context_instance=RequestContext(request)) + + +@require_super_user +def dept_perm_list(request): + header_title, path1, path2 = '查看部门', '授权管理', '部门授权' + keyword = request.GET.get('search') + if keyword: + contact_list = DEPT.objects.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword)).order_by('name') + else: + contact_list = DEPT.objects.filter(id__gt=2) + + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) + + return render_to_response('jperm/dept_perm_list.html', locals(), context_instance=RequestContext(request)) + + +def perm_group_update(user_group_id, asset_groups_id_list): + user_group = UserGroup.objects.filter(id=user_group_id) + if user_group: + user_group = user_group[0] + old_asset_group = [perm.asset_group for perm in user_group.perm_set.all()] + new_asset_group = [] + + for asset_group_id in asset_groups_id_list: + new_asset_group.extend(BisGroup.objects.filter(id=asset_group_id)) + + del_asset_group = [asset_group for asset_group in old_asset_group if asset_group not in new_asset_group] + add_asset_group = [asset_group for asset_group in new_asset_group if asset_group not in old_asset_group] + + for asset_group in del_asset_group: + Perm.objects.filter(user_group=user_group, asset_group=asset_group).delete() + + for asset_group in add_asset_group: + Perm(user_group=user_group, asset_group=asset_group).save() + + +@require_super_user +def perm_edit(request): + if request.method == 'GET': + header_title, path1, path2 = u'编辑授权', u'授权管理', u'授权编辑' + user_group_id = request.GET.get('id', '') + user_group = UserGroup.objects.filter(id=user_group_id) + if user_group: + user_group = user_group[0] + asset_groups_all = BisGroup.objects.all() + asset_groups_select = [perm.asset_group for perm in user_group.perm_set.all()] + asset_groups = [asset_group for asset_group in asset_groups_all if asset_group not in asset_groups_select] + else: + user_group_id = request.POST.get('user_group_id') + asset_group_id_list = request.POST.getlist('asset_groups_select') + perm_group_update(user_group_id, asset_group_id_list) + + return HttpResponseRedirect('/jperm/perm_list/') + return render_to_response('jperm/perm_edit.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def perm_edit_adm(request): + if request.method == 'GET': + header_title, path1, path2 = u'编辑授权', u'授权管理', u'授权编辑' + user_group_id = request.GET.get('id', '') + user_group = UserGroup.objects.filter(id=user_group_id) + user, dept = get_session_user_dept(request) + if user_group: + user_group = user_group[0] + asset_groups_all = dept.bisgroup_set.all() + asset_groups_select = [perm.asset_group for perm in user_group.perm_set.all()] + asset_groups = [asset_group for asset_group in asset_groups_all if asset_group not in asset_groups_select] + else: + user_group_id = request.POST.get('user_group_id') + asset_group_id_list = request.POST.getlist('asset_groups_select') + print user_group_id, asset_group_id_list + if not validate(request, user_group=[user_group_id], asset_group=asset_group_id_list): + return HttpResponseRedirect('/') + perm_group_update(user_group_id, asset_group_id_list) + + return HttpResponseRedirect('/jperm/perm_list/') + return render_to_response('jperm/perm_edit.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def perm_detail(request): + header_title, path1, path2 = u'授权管理', u'小组管理', u'授权详情' + group_id = request.GET.get('id') + user_group = UserGroup.objects.filter(id=group_id) + if user_group: + user_group = user_group[0] + users = user_group.user_set.all() + group_user_num = len(users) + perms = user_group.perm_set.all() + asset_groups = [perm.asset_group for perm in perms] + return render_to_response('jperm/perm_detail.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def perm_del(request): + perm_id = request.GET.get('id') + perm = Perm.objects.filter(id=perm_id) + if perm: + perm = perm[0] + perm.delete() + return HttpResponseRedirect('/jperm/perm_list/') + + +@require_admin +def perm_asset_detail(request): + header_title, path1, path2 = u'用户授权主机', u'权限管理', u'用户主机详情' + user_id = request.GET.get('id') + user = User.objects.filter(id=user_id) + if user: + user = user[0] + assets_list = user_perm_asset_api(user.username) + return render_to_response('jperm/perm_asset_detail.html', locals(), context_instance=RequestContext(request)) + + +def unicode2str(unicode_list): + return [str(i) for i in unicode_list] + + +def sudo_ldap_add(user_group, user_runas, asset_groups_select, + cmd_groups_select): + if not LDAP_ENABLE: + return True + + assets = [] + cmds = [] + user_runas = user_runas.split(',') + if len(asset_groups_select) == 1 and asset_groups_select[0].name == 'ALL': + asset_all = True + else: + asset_all = False + for asset_group in asset_groups_select: + assets.extend(asset_group.asset_set.all()) + + if user_group.name == 'ALL': + user_all = True + users = [] + else: + user_all = False + users = user_group.user_set.all() + + for cmd_group in cmd_groups_select: + cmds.extend(cmd_group.cmd.split(',')) + + if user_all: + users_name = ['ALL'] + else: + users_name = list(set([user.username for user in users])) + + if asset_all: + assets_ip = ['ALL'] + else: + assets_ip = list(set([asset.ip for asset in assets])) + + name = 'sudo%s' % user_group.id + sudo_dn = 'cn=%s,ou=Sudoers,%s' % (name, LDAP_BASE_DN) + sudo_attr = {'objectClass': ['top', 'sudoRole'], + 'cn': ['%s' % name], + 'sudoCommand': unicode2str(cmds), + 'sudoHost': unicode2str(assets_ip), + 'sudoOption': ['!authenticate'], + 'sudoRunAsUser': unicode2str(user_runas), + 'sudoUser': unicode2str(users_name)} + ldap_conn.delete(sudo_dn) + ldap_conn.add(sudo_dn, sudo_attr) + + +def sudo_update(user_group, user_runas, asset_groups_select, cmd_groups_select, comment): + asset_groups_select_list, cmd_groups_select_list = \ + asset_cmd_groups_get(asset_groups_select, cmd_groups_select) + sudo_perm = user_group.sudoperm_set.all() + if sudo_perm: + sudo_perm.update(user_runas=user_runas, comment=comment) + sudo_perm = sudo_perm[0] + sudo_perm.asset_group = asset_groups_select_list + sudo_perm.cmd_group = cmd_groups_select_list + else: + sudo_perm = SudoPerm(user_group=user_group, user_runas=user_runas, comment=comment) + sudo_perm.save() + sudo_perm.asset_group = asset_groups_select_list + sudo_perm.cmd_group = cmd_groups_select_list + + sudo_ldap_add(user_group, user_runas, asset_groups_select_list, cmd_groups_select_list) + + +@require_super_user +def sudo_list(request): + header_title, path1, path2 = u'Sudo授权', u'权限管理', u'Sudo权限详情' + keyword = request.GET.get('search', '') + contact_list = UserGroup.objects.all().order_by('name') + if keyword: + contact_list = contact_list.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword)) + + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) + return render_to_response('jperm/sudo_list.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def sudo_list_adm(request): + header_title, path1, path2 = u'Sudo授权', u'权限管理', u'Sudo权限详情' + keyword = request.GET.get('search', '') + user, dept = get_session_user_dept(request) + contact_list = dept.usergroup_set.all().order_by('name') + if keyword: + contact_list = contact_list.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword)) + + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) + return render_to_response('jperm/sudo_list.html', locals(), context_instance=RequestContext(request)) + + +@require_super_user +def sudo_edit(request): + header_title, path1, path2 = u'Sudo授权', u'授权管理', u'Sudo授权' + + if request.method == 'GET': + user_group_id = request.GET.get('id', '0') + user_group = UserGroup.objects.filter(id=user_group_id) + asset_group_all = BisGroup.objects.filter() + cmd_group_all = CmdGroup.objects.all() + if user_group: + user_group = user_group[0] + sudo_perm = user_group.sudoperm_set.all() + if sudo_perm: + sudo_perm = sudo_perm[0] + asset_group_permed = sudo_perm.asset_group.all() + cmd_group_permed = sudo_perm.cmd_group.all() + user_runas = sudo_perm.user_runas + comment = sudo_perm.comment + else: + asset_group_permed = [] + cmd_group_permed = [] + + asset_groups = [asset_group for asset_group in asset_group_all if asset_group not in asset_group_permed] + cmd_groups = [cmd_group for cmd_group in cmd_group_all if cmd_group not in cmd_group_permed] + + else: + user_group_id = request.POST.get('user_group_id', '') + users_runas = request.POST.get('runas', 'root') + asset_groups_select = request.POST.getlist('asset_groups_select') + cmd_groups_select = request.POST.getlist('cmd_groups_select') + comment = request.POST.get('comment', '') + user_group = UserGroup.objects.filter(id=user_group_id) + if user_group: + user_group = user_group[0] + if LDAP_ENABLE: + sudo_update(user_group, users_runas, asset_groups_select, cmd_groups_select, comment) + msg = '修改成功' + + return HttpResponseRedirect('/jperm/sudo_list/') + + return render_to_response('jperm/sudo_edit.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def sudo_edit_adm(request): + header_title, path1, path2 = u'Sudo授权', u'授权管理', u'Sudo授权' + user, dept = get_session_user_dept(request) + if request.method == 'GET': + user_group_id = request.GET.get('id', '0') + if not validate(request, user_group=[user_group_id]): + return render_to_response('/jperm/sudo_list/') + user_group = UserGroup.objects.filter(id=user_group_id) + asset_group_all = dept.bisgroup_set.all() + cmd_group_all = dept.cmdgroup_set.all() + if user_group: + user_group = user_group[0] + sudo_perm = user_group.sudoperm_set.all() + if sudo_perm: + sudo_perm = sudo_perm[0] + asset_group_permed = sudo_perm.asset_group.all() + cmd_group_permed = sudo_perm.cmd_group.all() + user_runas = sudo_perm.user_runas + comment = sudo_perm.comment + else: + asset_group_permed = [] + cmd_group_permed = [] + + asset_groups = [asset_group for asset_group in asset_group_all if asset_group not in asset_group_permed] + cmd_groups = [cmd_group for cmd_group in cmd_group_all if cmd_group not in cmd_group_permed] + + else: + user_group_id = request.POST.get('user_group_id', '') + users_runas = request.POST.get('runas', 'root') + asset_groups_select = request.POST.getlist('asset_groups_select') + cmd_groups_select = request.POST.getlist('cmd_groups_select') + comment = request.POST.get('comment', '') + user_group = UserGroup.objects.filter(id=user_group_id) + if not validate(request, user_group=[user_group_id], asset_group=asset_groups_select): + return render_to_response('/jperm/sudo_list/') + if user_group: + user_group = user_group[0] + if LDAP_ENABLE: + sudo_update(user_group, users_runas, asset_groups_select, cmd_groups_select, comment) + msg = '修改成功' + + return HttpResponseRedirect('/jperm/sudo_list/') + return render_to_response('jperm/sudo_edit.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def sudo_detail(request): + header_title, path1, path2 = u'Sudo授权详情', u'授权管理', u'授权详情' + user_group_id = request.GET.get('id') + user_group = UserGroup.objects.filter(id=user_group_id) + if user_group: + asset_groups = [] + cmd_groups = [] + user_group = user_group[0] + users = user_group.user_set.all() + group_user_num = len(users) + + for perm in user_group.sudoperm_set.all(): + asset_groups.extend(perm.asset_group.all()) + cmd_groups.extend(perm.cmd_group.all()) + + print asset_groups + return render_to_response('jperm/sudo_detail.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def sudo_refresh(request): + sudo_perm_all = SudoPerm.objects.all() + for sudo_perm in sudo_perm_all: + user_group = sudo_perm.user_group + user_runas = sudo_perm.user_runas + asset_groups_select = sudo_perm.asset_group.all() + cmd_groups_select = sudo_perm.cmd_group.all() + sudo_ldap_add(user_group, user_runas, asset_groups_select, cmd_groups_select) + return HttpResponse('刷新sudo授权成功') + + +@require_super_user +def cmd_add(request): + header_title, path1, path2 = u'sudo命令添加', u'授权管理', u'命令组添加' + dept_all = DEPT.objects.all() + + if request.method == 'POST': + name = request.POST.get('name') + dept_id = request.POST.get('dept_id') + cmd = ','.join(request.POST.get('cmd').split()) + comment = request.POST.get('comment') + dept = DEPT.objects.filter(id=dept_id) + + try: + if CmdGroup.objects.filter(name=name): + error = '%s 命令组已存在' + raise ServerError(error) + + if not dept: + error = u"部门不能为空" + raise ServerError(error) + except ServerError, e: + pass + else: + dept = dept[0] + CmdGroup.objects.create(name=name, dept=dept, cmd=cmd, comment=comment) + msg = u'命令组添加成功' + return HttpResponseRedirect('/jperm/cmd_list/') + + return render_to_response('jperm/sudo_cmd_add.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def cmd_add_adm(request): + header_title, path1, path2 = u'sudo命令添加', u'授权管理', u'命令组添加' + user, dept = get_session_user_dept(request) + + if request.method == 'POST': + name = request.POST.get('name') + cmd = ','.join(request.POST.get('cmd').split()) + comment = request.POST.get('comment') + + try: + if CmdGroup.objects.filter(name=name): + error = '%s 命令组已存在' + raise ServerError(error) + except ServerError, e: + pass + else: + CmdGroup.objects.create(name=name, dept=dept, cmd=cmd, comment=comment) + return HttpResponseRedirect('/jperm/cmd_list/') + + return HttpResponseRedirect('/jperm/cmd_list/') + + return render_to_response('jperm/sudo_cmd_add.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def cmd_edit(request): + header_title, path1, path2 = u'sudo命令修改', u'授权管理管理', u'命令组修改' + + cmd_group_id = request.GET.get('id') + cmd_group = CmdGroup.objects.filter(id=cmd_group_id) + dept_all = DEPT.objects.all() + + if cmd_group: + cmd_group = cmd_group[0] + cmd_group_id = cmd_group.id + dept_id = cmd_group.dept.id + name = cmd_group.name + cmd = '\n'.join(cmd_group.cmd.split(',')) + comment = cmd_group.comment + + if request.method == 'POST': + cmd_group_id = request.POST.get('cmd_group_id') + name = request.POST.get('name') + dept_id = request.POST.get('dept_id') + cmd = ','.join(request.POST.get('cmd').split()) + comment = request.POST.get('comment') + cmd_group = CmdGroup.objects.filter(id=cmd_group_id) + + dept = DEPT.objects.filter(id=dept_id) + try: + if not dept: + error = '没有该部门' + raise ServerError(error) + + if not cmd_group: + error = '没有该命令组' + except ServerError, e: + pass + else: + cmd_group.update(name=name, cmd=cmd, dept=dept[0], comment=comment) + return HttpResponseRedirect('/jperm/cmd_list/') + return render_to_response('jperm/sudo_cmd_add.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def cmd_list(request): + header_title, path1, path2 = u'sudo命令查看', u'权限管理', u'Sudo命令添加' + + if is_super_user(request): + cmd_groups = contact_list = CmdGroup.objects.all() + else: + user, dept = get_session_user_dept(request) + cmd_groups = contact_list = dept.cmdgroup_set.all() + p = paginator = Paginator(contact_list, 10) + + try: + page = int(request.GET.get('page', '1')) + except ValueError: + page = 1 + + try: + contacts = paginator.page(page) + except (EmptyPage, InvalidPage): + contacts = paginator.page(paginator.num_pages) + return render_to_response('jperm/sudo_cmd_list.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def cmd_del(request): + cmd_group_id = request.GET.get('id') + cmd_group = CmdGroup.objects.filter(id=cmd_group_id) + + if cmd_group: + cmd_group[0].delete() + return HttpResponseRedirect('/jperm/cmd_list/') + + +@require_admin +def cmd_detail(request): + cmd_ids = request.GET.get('id').split(',') + cmds = [] + if len(cmd_ids) == 1: + if cmd_ids[0]: + cmd_id = cmd_ids[0] + else: + cmd_id = 1 + cmd_group = CmdGroup.objects.filter(id=cmd_id) + if cmd_group: + cmd_group = cmd_group[0] + cmds.extend(cmd_group.cmd.split(',')) + cmd_group_name = cmd_group.name + else: + cmd_groups = [] + for cmd_id in cmd_ids: + cmd_groups.extend(CmdGroup.objects.filter(id=cmd_id)) + for cmd_group in cmd_groups: + cmds.extend(cmd_group.cmd.split(',')) + + cmds_str = ', '.join(cmds) + + return render_to_response('jperm/sudo_cmd_detail.html', locals(), context_instance=RequestContext(request)) + + +@require_login +def perm_apply(request): + """ 权限申请 """ + header_title, path1, path2 = u'主机权限申请', u'权限管理', u'申请主机' + user_id, username = get_session_user_info(request)[0:2] + name = User.objects.get(id=user_id).name + dept_id, deptname, dept = get_session_user_info(request)[3:6] + perm_host = user_perm_asset_api(username) + all_host = Asset.objects.filter(dept=dept) + + perm_group = user_perm_group_api(username) + all_group = dept.bisgroup_set.all() + + posts = [g for g in all_host if g not in perm_host] + egroup = [d for d in all_group if d not in perm_group] + + dept_da = User.objects.filter(dept_id=dept_id, role='DA') + admin = User.objects.get(name='admin') + + if request.method == 'POST': + applyer = request.POST.get('applyer') + dept = request.POST.get('dept') + da = request.POST.get('da') + group = request.POST.getlist('group') + hosts = request.POST.getlist('hosts') + comment = request.POST.get('comment') + if not da: + return httperror(request, u'请选择管理员!') + da = User.objects.get(id=da) + mail_address = da.email + mail_title = '%s - 权限申请' % username + group_lis = ', '.join(group) + hosts_lis = ', '.join(hosts) + time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + a = Apply.objects.create(applyer=applyer, admin=da, dept=dept, bisgroup=group, date_add=datetime.datetime.now(), + asset=hosts, status=0, comment=comment, read=0) + uuid = a.uuid + url = "http://%s:%s/jperm/apply_exec/?uuid=%s" % (SEND_IP, SEND_PORT, uuid) + mail_msg = """ + Hi,%s: + 有新的权限申请, 详情如下: + 申请人: %s + 申请主机组: %s + 申请的主机: %s + 申请时间: %s + 申请说明: %s + 请及时审批, 审批完成后, 点击以下链接或登录授权管理-权限审批页面点击确认键,告知申请人。 + + %s + """ % (da.username, applyer, group_lis, hosts_lis, time_now, comment, url) + + send_mail(mail_title, mail_msg, MAIL_FROM, [mail_address], fail_silently=False) + smg = "提交成功,已发邮件至 %s 通知部门管理员。" % mail_address + return render_to_response('jperm/perm_apply.html', locals(), context_instance=RequestContext(request)) + return render_to_response('jperm/perm_apply.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def perm_apply_exec(request): + """ 确认权限 """ + header_title, path1, path2 = u'主机权限申请', u'权限管理', u'审批完成' + uuid = request.GET.get('uuid') + user_id = request.session.get('user_id') + approver = User.objects.get(id=user_id).name + if uuid: + p_apply = Apply.objects.filter(uuid=str(uuid)) + q_apply = Apply.objects.get(uuid=str(uuid)) + if q_apply.status == 1: + smg = '此权限已经审批完成, 请勿重复审批, 十秒钟后返回首页' + return render_to_response('jperm/perm_apply_exec.html', locals(), context_instance=RequestContext(request)) + else: + user = User.objects.get(username=q_apply.applyer) + mail_address = user.email + time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + p_apply.update(status=1, approver=approver, date_end=time_now) + mail_title = '%s - 权限审批完成' % q_apply.applyer + mail_msg = """ + Hi,%s: + 您所申请的权限已由 %s 在 %s 审批完成, 请登录验证。 + """ % (q_apply.applyer, q_apply.approver, time_now) + send_mail(mail_title, mail_msg, MAIL_FROM, [mail_address], fail_silently=False) + smg = '授权完成, 已邮件通知申请人, 十秒钟后返回首页' + return render_to_response('jperm/perm_apply_exec.html', locals(), context_instance=RequestContext(request)) + else: + smg = '没有此授权记录, 十秒钟后返回首页' + return render_to_response('jperm/perm_apply_exec.html', locals(), context_instance=RequestContext(request)) + + +def get_apply_posts(request, status, username, dept_name, keyword=None): + """ 获取申请记录 """ + post_all = Apply.objects.filter(status=status).order_by('-date_add') + post_keyword_all = Apply.objects.filter(Q(applyer__contains=keyword) | + Q(approver__contains=keyword)) \ + .filter(status=status).order_by('-date_add') + + if is_super_user(request): + if keyword: + posts = post_keyword_all + else: + posts = post_all + elif is_group_admin(request): + if keyword: + posts = post_keyword_all.filter(dept=dept_name) + else: + posts = post_all.filter(dept=dept_name) + elif is_common_user(request): + if keyword: + posts = post_keyword_all.filter(applyer=username) + else: + posts = post_all.filter(applyer=username) + + return posts + + +@require_login +def perm_apply_log(request, offset): + """ 申请记录 """ + header_title, path1, path2 = u'权限申请记录', u'权限管理', u'申请记录' + keyword = request.GET.get('keyword', '') + user_id = get_session_user_info(request)[0] + username = User.objects.get(id=user_id).name + dept_name = get_session_user_info(request)[4] + status_dic = {'online': 0, 'offline': 1} + status = status_dic[offset] + posts = get_apply_posts(request, status, username, dept_name, keyword) + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + return render_to_response('jperm/perm_log_%s.html' % offset, locals(), context_instance=RequestContext(request)) + + +@require_login +def perm_apply_info(request): + """ 申请信息详情 """ + uuid = request.GET.get('uuid', '') + post = Apply.objects.filter(uuid=uuid) + username = get_session_user_info(request)[1] + if post: + post = post[0] + if post.read == 0 and post.applyer != username: + post.read = 1 + post.save() + else: + return httperror(request, u'没有这个申请记录!') + + return render_to_response('jperm/perm_apply_info.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def perm_apply_del(request): + """ 删除日志记录 """ + uuid = request.GET.get('uuid') + u_apply = Apply.objects.filter(uuid=uuid) + if u_apply: + u_apply.delete() + return HttpResponseRedirect('/jperm/apply_show/online/') + + +@require_login +def perm_apply_search(request): + """ 申请搜索 """ + keyword = request.GET.get('keyword') + offset = request.GET.get('env') + username = get_session_user_info(request)[1] + dept_name = get_session_user_info(request)[3] + status_dic = {'online': 0, 'offline': 1} + status = status_dic[offset] + posts = get_apply_posts(request, status, username, dept_name, keyword) + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + return render_to_response('jperm/perm_apply_search.html', locals(), context_instance=RequestContext(request)) + + + + + + + + + + + + + + diff --git a/jumpserver.conf b/jumpserver.conf index 4f0913527..c1e035757 100644 --- a/jumpserver.conf +++ b/jumpserver.conf @@ -1,16 +1,34 @@ -#coding:utf-8 +#coding: utf8 + +[base] +ip = 192.168.20.209 +port = 80 +key = 88aaaf7ffe3c6c04 + [db] host = 127.0.0.1 port = 3306 -user = root -password = redhat -db = jumpserver +user = jumpserver +password = mysql234 +database = jumpserver -[jumpserver] -key = 88aaaf7ffe3c6c04 -ldap_host = ldap://127.0.0.1:389 -ldap_base_dn = dc=yolu,dc=com -admin_cn = cn=admin,dc=yolu,dc=com -admin_pass = VNLqNCjpNBIetEoCA2h3 -web_socket_host = 172.10.10.9:3000 \ No newline at end of file + +[ldap] +ldap_enable = 1 +host_url = ldap://127.0.0.1:389 +base_dn = dc=jumpserver, dc=org +root_dn = cn=admin,dc=jumpserver,dc=org +root_pw = secret234 + + +[websocket] +web_socket_host = 192.168.20.209:3000 + + +[mail] +email_host = smtp.exmail.qq.com +email_port = 25 +email_host_user = noreply@jumpserver.org +email_host_password = jumpserver123 +email_use_tls = False diff --git a/jumpserver.py b/jumpserver.py deleted file mode 100755 index 12f466b2a..000000000 --- a/jumpserver.py +++ /dev/null @@ -1,311 +0,0 @@ -#!/usr/bin/python -# coding: utf-8 - - -import os -import sys -import subprocess -import struct -import fcntl -import termios -import signal -import re -import time -from Crypto.Cipher import AES -from binascii import b2a_hex, a2b_hex -import ConfigParser -import paramiko -import pxssh -import pexpect -import readline - -cur_dir = os.path.abspath(os.path.dirname(__file__)) -sys.path.append('%s/webroot/AutoSa/' % cur_dir) -os.environ['DJANGO_SETTINGS_MODULE'] = 'AutoSa.settings' - -import django -django.setup() -from UserManage.models import User, Logs, Pid -from Assets.models import Assets - - -cf = ConfigParser.ConfigParser() -cf.read('%s/jumpserver.conf' % cur_dir) - -db_host = cf.get('db', 'host') -db_port = cf.getint('db', 'port') -db_user = cf.get('db', 'user') -db_password = cf.get('db', 'password') -db_db = cf.get('db', 'db') -log_dir = os.path.join(cur_dir, 'logs') -key = cf.get('jumpserver', 'key') - - -class PyCrypt(object): - """It's used to encrypt and decrypt password.""" - def __init__(self, key): - self.key = key - self.mode = AES.MODE_CBC - - def encrypt(self, text): - cryptor = AES.new(self.key, self.mode, b'0000000000000000') - length = 16 - count = len(text) - if count < length: - add = (length - count) - text += ('\0' * add) - elif count > length: - add = (length - (count % length)) - text += ('\0' * add) - ciphertext = cryptor.encrypt(text) - return b2a_hex(ciphertext) - - def decrypt(self, text): - cryptor = AES.new(self.key, self.mode, b'0000000000000000') - plain_text = cryptor.decrypt(a2b_hex(text)) - return plain_text.rstrip('\0') - - -def sigwinch_passthrough(sig, data): - """This function use to set the window size of the terminal!""" - winsize = getwinsize() - try: - foo.setwinsize(winsize[0], winsize[1]) - except: - pass - - -def getwinsize(): - """This function use to get the size of the windows!""" - if 'TIOCGWINSZ' in dir(termios): - TIOCGWINSZ = termios.TIOCGWINSZ - else: - TIOCGWINSZ = 1074295912L # Assume - s = struct.pack('HHHH', 0, 0, 0, 0) - x = fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ, s) - return struct.unpack('HHHH', x)[0:2] - - -def run_cmd(cmd): - """run command and return stdout""" - pipe = subprocess.Popen(cmd, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - if pipe.stdout: - stdout = pipe.stdout.read().strip() - pipe.wait() - return stdout - if pipe.stderr: - stderr = pipe.stderr.read() - pipe.wait() - return stderr - - -def connect(host, port, user, password): - """Use pexpect module to connect other server.""" - log_date_dir = '%s/%s' % (log_dir, time.strftime('%Y%m%d')) - if not os.path.isdir(log_date_dir): - os.mkdir(log_date_dir) - os.chmod(log_date_dir, 0777) - structtime_start = time.localtime() - datetime_start = time.strftime('%Y%m%d%H%M%S', structtime_start) - logtime_start = time.strftime('%Y/%m/%d %H:%M:%S', structtime_start) - timestamp_start = int(time.mktime(structtime_start)) - logfile_name = "%s/%s_%s_%s" % (log_date_dir, host, user, datetime_start) - - try: - global foo - foo = pxssh.pxssh() - foo.login(host, user, password, port=port, auto_prompt_reset=False) - log = Logs(user=user, host=host, logfile=logfile_name, start_time=timestamp_start, ppid=os.getpid()) # 日志信息记录到数据库 - log.save() - pid = Pid(ppid=os.getpid(), cpid=foo.pid, start_time=timestamp_start, logid=log.id) - pid.save() - - logfile = open(logfile_name, 'a') # 记录日志文件 - logfile.write('\nDateTime:%s' % logtime_start) - foo.logfile = logfile - foo.sendline("export PS1='[\u@%s \W]\$ ';clear" % host) - signal.signal(signal.SIGWINCH, sigwinch_passthrough) - size = getwinsize() - foo.setwinsize(size[0], size[1]) - foo.interact(escape_character=chr(28)) # 进入交互模式 - logfile.write('\nEndTime: %s' % time.strftime('%Y/%m/%d %H:%M:%S')) - log.finish = 1 - log.end_time = int(time.time()) - log.save() - - except pxssh.ExceptionPxssh as e: - print('登录失败: %s' % e) - except pexpect.EOF: - print('登录失败: Host refuse') - except KeyboardInterrupt: - foo.logout() - log.finish = 1 - log.end_time = int(time.time()) - log.save() - - -def ip_all_select(username): - """select all the server of the user can control.""" - ip_all = [] - ip_all_dict = {} - try: - user = User.objects.get(username=username) - except: - return (['error'], {'error':"Don't Use Root To Do That or User isn't Exist."}) - all_assets_user = user.assetsuser_set.all() - for assets_user in all_assets_user: - ip_all.append(assets_user.aid.ip) - ip_all_dict[assets_user.aid.ip] = assets_user.aid.comment - - return ip_all, ip_all_dict - - -def sth_select(username='', ip=''): - """if username: return password elif ip return port""" - if username: - user = User.objects.get(username=username) - ldap_password = user.ldap_password - return ldap_password - - if ip: - asset = Assets.objects.get(ip=ip) - port = asset.port - return port - return None - - -def remote_exec_cmd(host, user, cmd): - jm = PyCrypt(key) - ssh = paramiko.SSHClient() - ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - port = sth_select(ip=host) - password = jm.decrypt(sth_select(username=username)) - try: - ssh.connect(host, port, user, password) - except paramiko.AuthenticationException: - print 'Password Error .' - return None - stdin, stdout, stderr = ssh.exec_command(cmd) - print '\033[32m' + '#'*15 + ' ' + host + ' ' + '#'*15 + '\n' + '\033[0m' - output = stdout.read() - error = stderr.read() - if output: - print output - if error: - print error - print '\033[32m' + '#'*15 + ' End result ' + '#'*15 + '\n' + '\033[0m' - ssh.close() - - -def match_ip(all_ip, string): - ip_matched = [] - pattern = re.compile(r'%s' % string) - - for ip in all_ip: - if pattern.search(ip): - ip_matched.append(ip) - return ip_matched - - -def print_prompt(): - print """ -\033[1;32m### Welcome Use JumpServer To Login. ### \033[0m -1) Type \033[32mIP ADDRESS\033[0m To Login. -2) Type \033[32mP/p\033[0m To Print The Servers You Available. -3) Type \033[32mE/e\033[0m To Execute Command On Several Servers. -4) Type \033[32mQ/q\033[0m To Quit. -""" - - -def print_your_server(username): - ip_all, ip_all_dict = ip_all_select(username) - for ip in ip_all: - if ip_all_dict[ip]: - print "%s -- %s" % (ip, ip_all_dict[ip]) - else: - print ip - - -def exec_cmd_servers(username): - print '\nInput the \033[32mHost IP(s)\033[0m,Separated by Commas, q/Q to Quit.\n' - while True: - hosts = raw_input('\033[1;32mip(s)>: \033[0m') - if hosts in ['q', 'Q']: - break - hosts = hosts.split(',') - hosts.append('') - hosts = list(set(hosts)) - hosts.remove('') - ip_all, ip_all_dict = ip_all_select(username) - no_perm = set(hosts)-set(ip_all) - if no_perm: - print "You have NO PERMISSION on %s..." % list(no_perm) - continue - print '\nInput the \033[32mCommand\033[0m , The command will be Execute on servers, q/Q to quit.\n' - while True: - cmd = raw_input('\033[1;32mCmd(s): \033[0m') - if cmd in ['q', 'Q']: - break - exec_log_dir = os.path.join(log_dir, 'exec_cmds') - if not os.path.isdir(exec_log_dir): - os.mkdir(exec_log_dir) - os.chmod(exec_log_dir, 0777) - filename = "%s/%s.log" % (exec_log_dir, time.strftime('%Y%m%d')) - f = open(filename, 'a') - f.write("DateTime: %s User: %s Host: %s Cmds: %s\n" % - (time.strftime('%Y/%m/%d %H:%M:%S'), username, hosts, cmd)) - for host in hosts: - remote_exec_cmd(host, username, cmd) - - -def connect_one(username, option): - ip_input = option.strip() - ip_all, ip_all_dict = ip_all_select(username) - ip_matched = match_ip(ip_all, ip_input) - ip_len = len(ip_matched) - ip = '' - if ip_len >= 1: - if ip_len == 1: - ip = ip_matched[0] - else: - if ip_input in ip_matched: - ip = ip_input - else: - for one_ip in ip_matched: - print one_ip - if ip: - password = jm.decrypt(sth_select(username=username)) - port = sth_select(ip=ip) - print "Connecting %s ..." % ip - connect(ip, port, username, password) - else: - print '\033[31mNo permision .\033[0m' - - -if __name__ == '__main__': - username = run_cmd('whoami') - jm = PyCrypt(key) - print_prompt() - try: - while True: - try: - option = raw_input("\033[1;32mOpt or IP>:\033[0m ") - except EOFError: - print - continue - if option in ['P', 'p']: - print_your_server(username) - continue - elif option in ['e', 'E']: - exec_cmd_servers(username) - elif option in ['q', 'Q']: - sys.exit() - else: - connect_one(username, option) - #except (BaseException, Exception): - except IndexError: - print "Exit." - sys.exit() diff --git a/webroot/AutoSa/UserManage/__init__.py b/jumpserver/__init__.py similarity index 100% rename from webroot/AutoSa/UserManage/__init__.py rename to jumpserver/__init__.py diff --git a/jumpserver/api.py b/jumpserver/api.py new file mode 100644 index 000000000..7c416925a --- /dev/null +++ b/jumpserver/api.py @@ -0,0 +1,502 @@ +# coding: utf-8 + + +from django.http import HttpResponseRedirect +import json +import os +from ConfigParser import ConfigParser +import getpass +from Crypto.Cipher import AES +from binascii import b2a_hex, a2b_hex +import ldap +from ldap import modlist +import hashlib +import datetime +import subprocess +from django.core.paginator import Paginator, EmptyPage, InvalidPage +from django.http import HttpResponse, Http404 +from django.shortcuts import render_to_response +from juser.models import User, UserGroup, DEPT +from jasset.models import Asset, BisGroup, IDC +from jlog.models import Log +from jasset.models import AssetAlias +from django.core.exceptions import ObjectDoesNotExist +from django.core.mail import send_mail + + +BASE_DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) +CONF = ConfigParser() +CONF.read(os.path.join(BASE_DIR, 'jumpserver.conf')) +LOG_DIR = os.path.join(BASE_DIR, 'logs') +SSH_KEY_DIR = os.path.join(BASE_DIR, 'keys') +SERVER_KEY_DIR = os.path.join(SSH_KEY_DIR, 'server') +KEY = CONF.get('base', 'key') +LOGIN_NAME = getpass.getuser() +LDAP_ENABLE = CONF.getint('ldap', 'ldap_enable') +SEND_IP = CONF.get('base', 'ip') +SEND_PORT = CONF.get('base', 'port') +MAIL_FROM = CONF.get('mail', 'email_host_user') + + +class LDAPMgmt(): + def __init__(self, + host_url, + base_dn, + root_cn, + root_pw): + self.ldap_host = host_url + self.ldap_base_dn = base_dn + self.conn = ldap.initialize(host_url) + self.conn.set_option(ldap.OPT_REFERRALS, 0) + self.conn.protocol_version = ldap.VERSION3 + self.conn.simple_bind_s(root_cn, root_pw) + + def list(self, filter, scope=ldap.SCOPE_SUBTREE, attr=None): + result = {} + try: + ldap_result = self.conn.search_s(self.ldap_base_dn, scope, filter, attr) + for entry in ldap_result: + name, data = entry + for k, v in data.items(): + print '%s: %s' % (k, v) + result[k] = v + return result + except ldap.LDAPError, e: + print e + + def add(self, dn, attrs): + try: + ldif = modlist.addModlist(attrs) + self.conn.add_s(dn, ldif) + except ldap.LDAPError, e: + print e + + def modify(self, dn, attrs): + try: + attr_s = [] + for k, v in attrs.items(): + attr_s.append((2, k, v)) + self.conn.modify_s(dn, attr_s) + except ldap.LDAPError, e: + print e + + def delete(self, dn): + try: + self.conn.delete_s(dn) + except ldap.LDAPError, e: + print e + + def decrypt(self, text): + cryptor = AES.new(self.key, self.mode, b'0000000000000000') + try: + plain_text = cryptor.decrypt(a2b_hex(text)) + except TypeError: + raise ServerError('Decrypt password error, TYpe error.') + return plain_text.rstrip('\0') + + +if LDAP_ENABLE: + LDAP_HOST_URL = CONF.get('ldap', 'host_url') + LDAP_BASE_DN = CONF.get('ldap', 'base_dn') + LDAP_ROOT_DN = CONF.get('ldap', 'root_dn') + LDAP_ROOT_PW = CONF.get('ldap', 'root_pw') + ldap_conn = LDAPMgmt(LDAP_HOST_URL, LDAP_BASE_DN, LDAP_ROOT_DN, LDAP_ROOT_PW) +else: + ldap_conn = None + + +def md5_crypt(string): + return hashlib.new("md5", string).hexdigest() + + +def page_list_return(total, current=1): + min_page = current - 2 if current - 4 > 0 else 1 + max_page = min_page + 4 if min_page + 4 < total else total + + return range(min_page, max_page+1) + + +def pages(posts, r): + """分页公用函数""" + contact_list = posts + p = paginator = Paginator(contact_list, 10) + try: + current_page = int(r.GET.get('page', '1')) + except ValueError: + current_page = 1 + + page_range = page_list_return(len(p.page_range), current_page) + + try: + contacts = paginator.page(current_page) + except (EmptyPage, InvalidPage): + contacts = paginator.page(paginator.num_pages) + + if current_page >= 5: + show_first = 1 + else: + show_first = 0 + if current_page <= (len(p.page_range) - 3): + show_end = 1 + else: + show_end = 0 + + return contact_list, p, contacts, page_range, current_page, show_first, show_end + + +class PyCrypt(object): + """This class used to encrypt and decrypt password.""" + + def __init__(self, key): + self.key = key + self.mode = AES.MODE_CBC + + def encrypt(self, text): + cryptor = AES.new(self.key, self.mode, b'0000000000000000') + length = 16 + try: + count = len(text) + except TypeError: + raise ServerError('Encrypt password error, TYpe error.') + add = (length - (count % length)) + text += ('\0' * add) + ciphertext = cryptor.encrypt(text) + return b2a_hex(ciphertext) + + def decrypt(self, text): + cryptor = AES.new(self.key, self.mode, b'0000000000000000') + try: + plain_text = cryptor.decrypt(a2b_hex(text)) + except TypeError: + raise ServerError('Decrypt password error, TYpe error.') + return plain_text.rstrip('\0') + + +CRYPTOR = PyCrypt(KEY) + + +class ServerError(Exception): + pass + + +def get_object(model, **kwargs): + try: + the_object = model.objects.get(**kwargs) + except ObjectDoesNotExist: + raise ServerError('Object get %s failed.' % str(kwargs.values())) + return the_object + + +def require_login(func): + """要求登录的装饰器""" + def _deco(request, *args, **kwargs): + if not request.session.get('user_id'): + return HttpResponseRedirect('/login/') + return func(request, *args, **kwargs) + return _deco + + +def require_super_user(func): + def _deco(request, *args, **kwargs): + if not request.session.get('user_id'): + return HttpResponseRedirect('/login/') + + if request.session.get('role_id', 0) != 2: + return HttpResponseRedirect('/') + return func(request, *args, **kwargs) + return _deco + + +def require_admin(func): + def _deco(request, *args, **kwargs): + if not request.session.get('user_id'): + return HttpResponseRedirect('/login/') + + if request.session.get('role_id', 0) < 1: + return HttpResponseRedirect('/') + return func(request, *args, **kwargs) + return _deco + + +def is_super_user(request): + if request.session.get('role_id') == 2: + return True + else: + return False + + +def is_group_admin(request): + if request.session.get('role_id') == 1: + return True + else: + return False + + +def is_common_user(request): + if request.session.get('role_id') == 0: + return True + else: + return False + + +@require_login +def get_session_user_dept(request): + user_id = request.session.get('user_id', 0) + user = User.objects.filter(id=user_id) + if user: + user = user[0] + dept = user.dept + return user, dept + + +@require_login +def get_session_user_info(request): + user_id = request.session.get('user_id', 0) + user = User.objects.filter(id=user_id) + if user: + user = user.first() + dept = user.dept + return [user.id, user.username, user, dept.id, dept.name, dept] + + +def get_user_dept(request): + user_id = request.session.get('user_id') + if user_id: + user_dept = User.objects.get(id=user_id).dept + return user_dept.id + + +def api_user(request): + hosts = Log.objects.filter(is_finished=0).count() + users = Log.objects.filter(is_finished=0).values('user').distinct().count() + ret = {'users': users, 'hosts': hosts} + json_data = json.dumps(ret) + return HttpResponse(json_data) + + +def view_splitter(request, su=None, adm=None): + if is_super_user(request): + return su(request) + elif is_group_admin(request): + return adm(request) + else: + return HttpResponseRedirect('/login/') + + +def user_group_perm_asset_group_api(user_group): + asset_group_list = [] + perm_list = user_group.perm_set.all() + for perm in perm_list: + asset_group_list.append(perm.asset_group) + return asset_group_list + + +def user_perm_group_api(username): + if username: + user = User.objects.get(username=username) + perm_list = [] + user_group_all = user.group.all() + for user_group in user_group_all: + perm_list.extend(user_group.perm_set.all()) + + asset_group_list = [] + for perm in perm_list: + asset_group_list.append(perm.asset_group) + return asset_group_list + + +def user_perm_group_hosts_api(gid): + hostgroup = BisGroup.objects.filter(id=gid) + if hostgroup: + return hostgroup[0].asset_set.all() + else: + return [] + + +def user_perm_asset_api(username): + user = User.objects.filter(username=username) + if user: + user = user[0] + asset_list = [] + asset_group_list = user_perm_group_api(user) + for asset_group in asset_group_list: + asset_list.extend(asset_group.asset_set.all()) + asset_list = list(set(asset_list)) + return asset_list + else: + return [] + + +def asset_perm_api(asset): + if asset: + perm_list = [] + asset_group_all = asset.bis_group.all() + for asset_group in asset_group_all: + perm_list.extend(asset_group.perm_set.all()) + + user_group_list = [] + for perm in perm_list: + user_group_list.append(perm.user_group) + + user_permed_list = [] + for user_group in user_group_list: + user_permed_list.extend(user_group.user_set.all()) + user_permed_list = list(set(user_permed_list)) + return user_permed_list + + +def get_user_host(username): + """Get the hosts of under the user control.""" + hosts_attr = {} + asset_all = user_perm_asset_api(username) + user = User.objects.filter(username=username) + if user: + user = user[0] + for asset in asset_all: + alias = AssetAlias.objects.filter(user=user, host=asset) + if alias and alias[0].alias != '': + hosts_attr[asset.ip] = [asset.id, asset.ip, alias[0].alias] + else: + hosts_attr[asset.ip] = [asset.id, asset.ip, asset.comment] + return hosts_attr + else: + raise ServerError('User %s does not exit!' % username) + + +def get_connect_item(username, ip): + asset = get_object(Asset, ip=ip) + port = asset.port + + if not asset.is_active: + raise ServerError('Host %s is not active.' % ip) + + user = get_object(User, username=username) + + if not user.is_active: + raise ServerError('User %s is not active.' % username) + + login_type_dict = { + 'L': user.ldap_pwd, + } + + if asset.login_type in login_type_dict: + password = CRYPTOR.decrypt(login_type_dict[asset.login_type]) + return username, password, ip, port + + elif asset.login_type == 'M': + username = asset.username + password = CRYPTOR.decrypt(asset.password) + return username, password, ip, port + + else: + raise ServerError('Login type is not in ["L", "M"]') + + +def validate(request, user_group=None, user=None, asset_group=None, asset=None, edept=None): + dept = get_session_user_dept(request)[1] + if edept: + if dept.id != int(edept[0]): + return False + + if user_group: + dept_user_groups = dept.usergroup_set.all() + user_group_ids = [] + for group in dept_user_groups: + user_group_ids.append(str(group.id)) + + if not set(user_group).issubset(set(user_group_ids)): + return False + + if user: + dept_users = dept.user_set.all() + user_ids = [] + for dept_user in dept_users: + user_ids.append(str(dept_user.id)) + + if not set(user).issubset(set(user_ids)): + return False + + if asset_group: + dept_asset_groups = dept.bisgroup_set.all() + asset_group_ids = [] + for group in dept_asset_groups: + asset_group_ids.append(str(group.id)) + + if not set(asset_group).issubset(set(asset_group_ids)): + return False + + if asset: + dept_assets = dept.asset_set.all() + asset_ids = [] + for dept_asset in dept_assets: + asset_ids.append(str(dept_asset.id)) + + if not set(asset).issubset(set(asset_ids)): + return False + + return True + + +def verify(request, user_group=None, user=None, asset_group=None, asset=None, edept=None): + dept = get_session_user_dept(request)[1] + if edept: + if dept.id != int(edept[0]): + return False + + if user_group: + dept_user_groups = dept.usergroup_set.all() + user_groups = [] + for user_group_id in user_group: + user_groups.extend(UserGroup.objects.filter(id=user_group_id)) + if not set(user_groups).issubset(set(dept_user_groups)): + return False + + if user: + dept_users = dept.user_set.all() + users = [] + for user_id in user: + users.extend(User.objects.filter(id=user_id)) + + if not set(users).issubset(set(dept_users)): + return False + + if asset_group: + dept_asset_groups = dept.bisgroup_set.all() + asset_group_ids = [] + for group in dept_asset_groups: + asset_group_ids.append(str(group.id)) + + if not set(asset_group).issubset(set(asset_group_ids)): + return False + + if asset: + dept_assets = dept.asset_set.all() + asset_ids = [] + for a in dept_assets: + asset_ids.append(str(a.id)) + print asset, asset_ids + if not set(asset).issubset(set(asset_ids)): + return False + + return True + + +def bash(cmd): + """执行bash命令""" + return subprocess.call(cmd, shell=True) + + +def is_dir(dir_name, username='root', mode=0755): + if not os.path.isdir(dir_name): + os.makedirs(dir_name) + bash("chown %s:%s '%s'" % (username, username, dir_name)) + os.chmod(dir_name, mode) + + +def success(request, msg): + return render_to_response('success.html', locals()) + + +def httperror(request, emg): + message = emg + return render_to_response('error.html', locals()) \ No newline at end of file diff --git a/jumpserver/context_processors.py b/jumpserver/context_processors.py new file mode 100644 index 000000000..aac09c7a7 --- /dev/null +++ b/jumpserver/context_processors.py @@ -0,0 +1,35 @@ +from juser.models import User +from jasset.models import Asset +from jumpserver.api import * +from jperm.models import Apply + + +def name_proc(request): + user_id = request.session.get('user_id') + role_id = request.session.get('role_id') + if role_id == 2: + user_total_num = User.objects.all().count() + user_active_num = User.objects.filter().count() + host_total_num = Asset.objects.all().count() + host_active_num = Asset.objects.filter(is_active=True).count() + else: + user, dept = get_session_user_dept(request) + user_total_num = dept.user_set.all().count() + user_active_num = dept.user_set.filter(is_active=True).count() + host_total_num = dept.asset_set.all().count() + host_active_num = dept.asset_set.all().filter(is_active=True).count() + + username = User.objects.get(id=user_id).name + apply_info = Apply.objects.filter(admin=username, status=0, read=0) + request.session.set_expiry(3600) + + info_dic = {'session_user_id': user_id, + 'session_role_id': role_id, + 'user_total_num': user_total_num, + 'user_active_num': user_active_num, + 'host_total_num': host_total_num, + 'host_active_num': host_active_num, + 'apply_info': apply_info} + + return info_dic + diff --git a/webroot/AutoSa/AutoSa/settings.py b/jumpserver/settings.py similarity index 58% rename from webroot/AutoSa/AutoSa/settings.py rename to jumpserver/settings.py index cbd7561f6..d44a781ee 100644 --- a/webroot/AutoSa/AutoSa/settings.py +++ b/jumpserver/settings.py @@ -1,40 +1,47 @@ """ -Django settings for AutoSa project. +Django settings for jumpserver project. For more information on this file, see -https://docs.djangoproject.com/en/1.6/topics/settings/ +https://docs.djangoproject.com/en/1.7/topics/settings/ For the full list of settings and their values, see -https://docs.djangoproject.com/en/1.6/ref/settings/ +https://docs.djangoproject.com/en/1.7/ref/settings/ """ # Build paths inside the project like this: os.path.join(BASE_DIR, ...) import os import ConfigParser -BASE_DIR = os.path.dirname(os.path.dirname(__file__)) -CONF_DIR = os.path.dirname(os.path.dirname(BASE_DIR)) -CF = ConfigParser.ConfigParser() -CF.read('%s/jumpserver.conf' % CONF_DIR) +config = ConfigParser.ConfigParser() -DB_HOST = CF.get('db', 'host') -DB_PORT = CF.getint('db', 'port') -DB_USER = CF.get('db', 'user') -DB_PASSWORD = CF.get('db', 'password') -DB_DB = CF.get('db', 'db') +BASE_DIR = os.path.dirname(os.path.dirname(__file__)) +config.read(os.path.join(BASE_DIR, 'jumpserver.conf')) + +DB_HOST = config.get('db', 'host') +DB_PORT = config.getint('db', 'port') +DB_USER = config.get('db', 'user') +DB_PASSWORD = config.get('db', 'password') +DB_DATABASE = config.get('db', 'database') + +# mail config +EMAIL_HOST = config.get('mail', 'email_host') +EMAIL_PORT = config.get('mail', 'email_port') +EMAIL_HOST_USER = config.get('mail', 'email_host_user') +EMAIL_HOST_PASSWORD = config.get('mail', 'email_host_password') +EMAIL_USE_TLS = config.getboolean('mail', 'email_use_tls') # Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/ +# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'tg-49xz3a#%5@^%83my*2up51)c3pove2_+21_(j*795gm38u*' +SECRET_KEY = '!%=t81uof5rhmtpi&(zr=q^fah#$enny-c@mswz49l42j0o49-' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True TEMPLATE_DEBUG = True -ALLOWED_HOSTS = ['*'] +ALLOWED_HOSTS = ['0.0.0.0/8'] # Application definition @@ -46,10 +53,12 @@ INSTALLED_APPS = ( 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'UserManage', - 'Assets', - 'AutoSa', - #'RunCommand', + 'django.contrib.humanize', + 'jumpserver', + 'juser', + 'jasset', + 'jperm', + 'jlog', ) MIDDLEWARE_CLASSES = ( @@ -57,22 +66,23 @@ MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', #'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) -ROOT_URLCONF = 'AutoSa.urls' +ROOT_URLCONF = 'jumpserver.urls' -WSGI_APPLICATION = 'AutoSa.wsgi.application' +WSGI_APPLICATION = 'jumpserver.wsgi.application' # Database -# https://docs.djangoproject.com/en/1.6/ref/settings/#databases +# https://docs.djangoproject.com/en/1.7/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', - 'NAME': DB_DB, + 'NAME': DB_DATABASE, 'USER': DB_USER, 'PASSWORD': DB_PASSWORD, 'HOST': DB_HOST, @@ -88,7 +98,7 @@ TEMPLATE_CONTEXT_PROCESSORS = ( 'django.core.context_processors.static', 'django.core.context_processors.tz', 'django.contrib.messages.context_processors.messages', - 'AutoSa.context_processors.name_proc', + 'jumpserver.context_processors.name_proc' ) TEMPLATE_DIRS = ( @@ -100,11 +110,10 @@ TEMPLATE_DIRS = ( STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), ) - # Internationalization -# https://docs.djangoproject.com/en/1.6/topics/i18n/ +# https://docs.djangoproject.com/en/1.7/topics/i18n/ -LANGUAGE_CODE = 'zh-cn' +LANGUAGE_CODE = 'en-us' TIME_ZONE = 'Asia/Shanghai' @@ -112,12 +121,12 @@ USE_I18N = True USE_L10N = True -USE_TZ = True +USE_TZ = False # Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/1.6/howto/static-files/ +# https://docs.djangoproject.com/en/1.7/howto/static-files/ STATIC_URL = '/static/' -SESSION_COOKIE_AGE = 3600 + diff --git a/jumpserver/templatetags/__init__.py b/jumpserver/templatetags/__init__.py new file mode 100644 index 000000000..bfd53d39f --- /dev/null +++ b/jumpserver/templatetags/__init__.py @@ -0,0 +1 @@ +__author__ = 'Hudie' diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py new file mode 100644 index 000000000..ee2f05c13 --- /dev/null +++ b/jumpserver/templatetags/mytags.py @@ -0,0 +1,394 @@ +# coding: utf-8 + +import re +import ast +import time + +from django import template +from jperm.models import CmdGroup +from jumpserver.api import * +from jasset.models import AssetAlias + +register = template.Library() + + +@register.filter(name='stamp2str') +def stamp2str(value): + try: + return time.strftime('%Y/%m/%d %H:%M:%S', time.localtime(value)) + except AttributeError: + return '0000/00/00 00:00:00' + + +@register.filter(name='int2str') +def int2str(value): + return str(value) + + +@register.filter(name='get_role') +def get_role(user_id): + user_role = {'SU': u'超级管理员', 'DA': u'部门管理员', 'CU': u'普通用户'} + user = User.objects.filter(id=user_id) + if user: + user = user[0] + return user_role.get(str(user.role), u"普通用户") + else: + return u"普通用户" + + +@register.filter(name='groups_str') +def groups_str(user_id): + groups = [] + user = User.objects.get(id=user_id) + for group in user.group.all(): + groups.append(group.name) + if len(groups) < 3: + return ' '.join(groups) + else: + return "%s ..." % ' '.join(groups[0:2]) + + +@register.filter(name='group_str2') +def groups_str2(group_list): + if len(group_list) < 3: + return ' '.join([group.name for group in group_list]) + else: + return '%s ...' % ' '.join([group.name for group in group_list[0:2]]) + + +@register.filter(name='group_str2_all') +def group_str2_all(group_list): + group_lis = [] + for i in group_list: + if str(i) != 'ALL': + group_lis.append(i) + if len(group_lis) < 3: + return ' '.join([group.name for group in group_lis]) + else: + return '%s ...' % ' '.join([group.name for group in group_lis[0:2]]) + + +@register.filter(name='group_dept_all') +def group_dept_all(group_list): + group_lis = [] + for i in group_list: + if str(i) != 'ALL': + group_lis.append(i) + return ' '.join([group.name for group in group_lis]) + + +@register.filter(name='group_manage_str') +def group_manage_str(username): + user = User.objects.get(username=username) + group = user.user_group.filter(type='M') + if group: + return group[0].name + else: + return '' + + +@register.filter(name='get_item') +def get_item(dictionary, key): + return dictionary.get(key) + + +@register.filter(name='get_login_type') +def get_login_type(login): + login_types = {'L': 'LDAP', 'M': 'MAP'} + return login_types[login] + + +@register.filter(name='bool2str') +def bool2str(value): + if value: + return u'是' + else: + return u'否' + + +# @register.filter(name='user_readonly') +# def user_readonly(user_id): +# user = User.objects.filter(id=user_id) +# if user: +# user = user[0] +# if user.role == 'CU': +# return False +# return True +# + +@register.filter(name='member_count') +def member_count(group_id): + group = UserGroup.objects.get(id=group_id) + return group.user_set.count() + + +@register.filter(name='group_user_count') +def group_user_count(group_id): + group = UserGroup.objects.get(id=group_id) + return group.user_set.count() + + +@register.filter(name='dept_user_num') +def dept_user_num(dept_id): + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + return dept.user_set.count() + else: + return 0 + + +@register.filter(name='dept_group_num') +def dept_group_num(dept_id): + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + return dept.usergroup_set.all().count() + else: + return 0 + + +@register.filter(name='perm_count') +def perm_count(group_id): + group = UserGroup.objects.get(id=group_id) + return group.perm_set.count() + + +@register.filter(name='dept_asset_num') +def dept_asset_num(dept_id): + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + return dept.asset_set.all().count() + return 0 + + +@register.filter(name='ugrp_perm_agrp_count') +def ugrp_perm_agrp_count(user_group_id): + user_group = UserGroup.objects.filter(id=user_group_id) + if user_group: + user_group = user_group[0] + return user_group.perm_set.all().count() + return 0 + + +@register.filter(name='ugrp_sudo_agrp_count') +def ugrp_sudo_agrp_count(user_group_id): + user_group = UserGroup.objects.filter(id=user_group_id) + asset_groups = [] + if user_group: + user_group = user_group[0] + for perm in user_group.sudoperm_set.all(): + asset_groups.extend(perm.asset_group.all()) + return len(set(asset_groups)) + return 0 + + +@register.filter(name='ugrp_perm_asset_count') +def ugrp_perm_asset_count(user_group_id): + user_group = UserGroup.objects.filter(id=user_group_id) + assets = [] + if user_group: + user_group = user_group[0] + asset_groups = [perm.asset_group for perm in user_group.perm_set.all()] + for asset_group in asset_groups: + assets.extend(asset_group.asset_set.all()) + return len(set(assets)) + + +@register.filter(name='ugrp_sudo_asset_count') +def ugrp_sudo_asset_count(user_group_id): + user_group = UserGroup.objects.filter(id=user_group_id) + asset_groups = [] + assets = [] + if user_group: + user_group = user_group[0] + for perm in user_group.sudoperm_set.all(): + asset_groups.extend(perm.asset_group.all()) + + for asset_group in asset_groups: + assets.extend(asset_group.asset_set.all()) + return len(set(assets)) + + +@register.filter(name='get_user_alias') +def get_user_alias(post, user_id): + user = User.objects.get(id=user_id) + host = Asset.objects.get(id=post.id) + alias = AssetAlias.objects.filter(user=user, host=host) + if alias: + return alias[0].alias + else: + return '' + + +@register.filter(name='group_type_to_str') +def group_type_to_str(type_name): + group_types = { + 'P': '用户', + 'M': '部门', + 'A': '用户组', + } + return group_types.get(type_name) + + +@register.filter(name='ast_to_list') +def ast_to_list(lis): + ast_lis = ast.literal_eval(lis) + if len(ast_lis) <= 2: + return ','.join([i for i in ast_lis]) + else: + restr = ','.join([i for i in ast_lis[0:2]]) + '...' + return restr + + +@register.filter(name='get_group_count') +def get_group_count(post, dept): + count = post.asset_set.filter(dept=dept).count() + return count + + +@register.filter(name='get_idc_count') +def get_idc_count(post, dept): + count = post.asset_set.filter(dept=dept).count() + return count + + +@register.filter(name='ast_to_list_1') +def ast_to_list_1(lis): + return ast.literal_eval(lis) + + +@register.filter(name='string_length') +def string_length(string, length): + return '%s ...' % string[0:length] + + +@register.filter(name='to_name') +def to_name(user_id): + try: + user = User.objects.filter(id=int(user_id)) + if user: + user = user[0] + return user.name + except: + return '非法用户' + + +@register.filter(name='to_dept_name') +def to_dept_name(user_id): + try: + user = User.objects.filter(id=int(user_id)) + if user: + user = user[0] + return user.dept.name + except: + return '非法部门' + + +@register.filter(name='to_role_name') +def to_role_name(role_id): + role_dict = {'0': '普通用户', '1': '部门管理员', '2': '超级管理员'} + return role_dict.get(str(role_id), '未知') + + +@register.filter(name='to_avatar') +def to_avatar(role_id='0'): + role_dict = {'0': 'user', '1': 'admin', '2': 'root'} + return role_dict.get(str(role_id), 'user') + + +@register.filter(name='get_user_asset_group') +def get_user_asset_group(user): + return user_perm_group_api(user) + + +@register.filter(name='group_asset_list') +def group_asset_list(group): + return group.asset_set.all() + + +@register.filter(name='group_asset_list_count') +def group_asset_list_count(group): + return group.asset_set.all().count() + + +@register.filter(name='time_delta') +def time_delta(time_before): + delta = datetime.datetime.now() - time_before + days = delta.days + if days: + return "%s 天前" % days + else: + hours = delta.seconds/3600 + if hours: + return "%s 小时前" % hours + else: + mins = delta.seconds/60 + if mins: + return '%s 分钟前' % mins + else: + return '%s 秒前' % delta.seconds + + +@register.filter(name='sudo_cmd_list') +def sudo_cmd_list(cmd_group_id): + cmd_group = CmdGroup.objects.filter(id=cmd_group_id) + if cmd_group: + cmd_group = cmd_group[0] + return cmd_group.cmd.split(',') + + +@register.filter(name='sudo_cmd_count') +def sudo_cmd_count(user_group_id): + user_group = UserGroup.objects.filter(id=user_group_id) + cmds = [] + if user_group: + user_group = user_group[0] + cmd_groups = [] + + for perm in user_group.sudoperm_set.all(): + cmd_groups.extend(perm.cmd_group.all()) + + for cmd_group in cmd_groups: + cmds.extend(cmd_group.cmd.split(',')) + return len(set(cmds)) + + else: + return 0 + + +@register.filter(name='sudo_cmd_count') +def sudo_cmd_count(user_group_id): + user_group = UserGroup.objects.filter(id=user_group_id) + cmds = [] + if user_group: + user_group = user_group[0] + cmd_groups = [] + for perm in user_group.sudoperm_set.all(): + cmd_groups.extend(perm.cmd_group.all()) + + for cmd_group in cmd_groups: + cmds.extend(cmd_group.cmd.split(',')) + return len(set(cmds)) + else: + return 0 + + +@register.filter(name='sudo_cmd_ids') +def sudo_cmd_ids(user_group_id): + user_group = UserGroup.objects.filter(id=user_group_id) + if user_group: + user_group = user_group[0] + cmd_groups = [] + for perm in user_group.sudoperm_set.all(): + cmd_groups.extend(perm.cmd_group.all()) + cmd_ids = [str(cmd_group.id) for cmd_group in cmd_groups] + return ','.join(cmd_ids) + else: + return '0' + + +@register.filter(name='cmd_group_split') +def cmd_group_split(cmd_group): + return cmd_group.cmd.split(',') diff --git a/jumpserver/urls.py b/jumpserver/urls.py new file mode 100644 index 000000000..f6019aa5d --- /dev/null +++ b/jumpserver/urls.py @@ -0,0 +1,21 @@ +from django.conf.urls import patterns, include, url + + +urlpatterns = patterns('', + # Examples: + (r'^$', 'jumpserver.views.index'), + (r'^api/user/$', 'jumpserver.api.api_user'), + (r'^skin_config/$', 'jumpserver.views.skin_config'), + (r'^install/$', 'jumpserver.views.install'), + (r'^base/$', 'jumpserver.views.base'), + (r'^login/$', 'jumpserver.views.login'), + (r'^logout/$', 'jumpserver.views.logout'), + (r'^file/upload/$', 'jumpserver.views.upload'), + (r'^file/download/$', 'jumpserver.views.download'), + (r'^error/$', 'jumpserver.views.httperror'), + (r'^juser/', include('juser.urls')), + (r'^jasset/', include('jasset.urls')), + (r'^jlog/', include('jlog.urls')), + (r'^jperm/', include('jperm.urls')), + +) diff --git a/jumpserver/views.py b/jumpserver/views.py new file mode 100644 index 000000000..005baa162 --- /dev/null +++ b/jumpserver/views.py @@ -0,0 +1,313 @@ +# coding: utf-8 + +from __future__ import division +from django.db.models import Count +from django.shortcuts import render_to_response +from django.template import RequestContext +from django.http import HttpResponseNotFound +from jperm.models import Apply +import paramiko +from jumpserver.api import * + + +def getDaysByNum(num): + today = datetime.date.today() + oneday = datetime.timedelta(days=1) + li_date, li_str = [], [] + for i in range(0, num): + today = today-oneday + li_date.append(today) + li_str.append(str(today)[5:10]) + li_date.reverse() + li_str.reverse() + t = (li_date, li_str) + return t + + +def get_data(data, items, option): + dic = {} + li_date, li_str = getDaysByNum(7) + for item in items: + li = [] + name = item[option] + if option == 'user': + option_data = data.filter(user=name) + elif option == 'host': + option_data = data.filter(host=name) + for t in li_date: + year, month, day = t.year, t.month, t.day + times = option_data.filter(start_time__year=year, start_time__month=month, start_time__day=day).count() + li.append(times) + dic[name] = li + return dic + + +@require_login +def index_cu(request): + user_id = request.session.get('user_id') + user = User.objects.filter(id=user_id) + if user: + user = user[0] + login_types = {'L': 'LDAP', 'M': 'MAP'} + user_id = request.session.get('user_id') + username = User.objects.get(id=user_id).username + posts = user_perm_asset_api(username) + host_count = len(posts) + new_posts = [] + post_five = [] + for post in posts: + if len(post_five) < 5: + post_five.append(post) + else: + new_posts.append(post_five) + post_five = [] + new_posts.append(post_five) + + return render_to_response('index_cu.html', locals(), context_instance=RequestContext(request)) + + +@require_login +def index(request): + li_date, li_str = getDaysByNum(7) + today = datetime.datetime.now().day + from_week = datetime.datetime.now() - datetime.timedelta(days=7) + + if is_common_user(request): + return index_cu(request) + + elif is_super_user(request): + users = User.objects.all() + hosts = Asset.objects.all() + online = Log.objects.filter(is_finished=0) + online_host = online.values('host').distinct() + online_user = online.values('user').distinct() + active_users = User.objects.filter(is_active=1) + active_hosts = Asset.objects.filter(is_active=1) + week_data = Log.objects.filter(start_time__range=[from_week, datetime.datetime.now()]) + + elif is_group_admin(request): + user = get_session_user_info(request)[2] + dept_name, dept = get_session_user_info(request)[4:] + users = User.objects.filter(dept=dept) + hosts = Asset.objects.filter(dept=dept) + online = Log.objects.filter(dept_name=dept_name, is_finished=0) + online_host = online.values('host').distinct() + online_user = online.values('user').distinct() + active_users = users.filter(is_active=1) + active_hosts = hosts.filter(is_active=1) + week_data = Log.objects.filter(dept_name=dept_name, start_time__range=[from_week, datetime.datetime.now()]) + + # percent of dashboard + if users.count() == 0: + percent_user, percent_online_user = '0%', '0%' + else: + percent_user = format(active_users.count() / users.count(), '.0%') + percent_online_user = format(online_user.count() / users.count(), '.0%') + if hosts.count() == 0: + percent_host, percent_online_host = '0%', '0%' + else: + percent_host = format(active_hosts.count() / hosts.count(), '.0%') + percent_online_host = format(online_host.count() / hosts.count(), '.0%') + + user_top_ten = week_data.values('user').annotate(times=Count('user')).order_by('-times')[:10] + host_top_ten = week_data.values('host').annotate(times=Count('host')).order_by('-times')[:10] + user_dic, host_dic = get_data(week_data, user_top_ten, 'user'), get_data(week_data, host_top_ten, 'host') + + # a week data + week_users = week_data.values('user').distinct().count() + week_hosts = week_data.count() + + user_top_five = week_data.values('user').annotate(times=Count('user')).order_by('-times')[:5] + color = ['label-success', 'label-info', 'label-primary', 'label-default', 'label-warnning'] + + # perm apply latest 10 + perm_apply_10 = Apply.objects.order_by('-date_add')[:10] + + # latest 10 login + login_10 = Log.objects.order_by('-start_time')[:10] + login_more_10 = Log.objects.order_by('-start_time')[10:21] + + # a week top 10 + for user_info in user_top_ten: + username = user_info.get('user') + last = Log.objects.filter(user=username).latest('start_time') + user_info['last'] = last + + top = {'user': '活跃用户数', 'host': '活跃主机数', 'times': '登录次数'} + top_dic = {} + for key, value in top.items(): + li = [] + for t in li_date: + year, month, day = t.year, t.month, t.day + if key != 'times': + times = week_data.filter(start_time__year=year, start_time__month=month, start_time__day=day).values(key).distinct().count() + else: + times = week_data.filter(start_time__year=year, start_time__month=month, start_time__day=day).count() + li.append(times) + top_dic[value] = li + return render_to_response('index.html', locals(), context_instance=RequestContext(request)) + + +def skin_config(request): + return render_to_response('skin_config.html') + + +def pages(posts, r): + """分页公用函数""" + contact_list = posts + p = paginator = Paginator(contact_list, 10) + try: + current_page = int(r.GET.get('page', '1')) + except ValueError: + current_page = 1 + + page_range = page_list_return(len(p.page_range), current_page) + + try: + contacts = paginator.page(current_page) + except (EmptyPage, InvalidPage): + contacts = paginator.page(paginator.num_pages) + + if current_page >= 5: + show_first = 1 + else: + show_first = 0 + if current_page <= (len(p.page_range) - 3): + show_end = 1 + else: + show_end = 0 + + return contact_list, p, contacts, page_range, current_page, show_first, show_end + + +def login(request): + """登录界面""" + if request.session.get('username'): + return HttpResponseRedirect('/') + if request.method == 'GET': + return render_to_response('login.html') + else: + username = request.POST.get('username') + password = request.POST.get('password') + user_filter = User.objects.filter(username=username) + if user_filter: + user = user_filter[0] + if md5_crypt(password) == user.password: + request.session['user_id'] = user.id + user_filter.update(last_login=datetime.datetime.now()) + if user.role == 'SU': + request.session['role_id'] = 2 + elif user.role == 'DA': + request.session['role_id'] = 1 + else: + request.session['role_id'] = 0 + return HttpResponseRedirect('/') + else: + error = '密码错误,请重新输入。' + else: + error = '用户不存在。' + return render_to_response('login.html', {'error': error}) + + +def logout(request): + request.session.delete() + return HttpResponseRedirect('/login/') + + +def filter_ajax_api(request): + attr = request.GET.get('attr', 'user') + value = request.GET.get('value', '') + if attr == 'user': + contact_list = User.objects.filter(name__icontains=value) + elif attr == "user_group": + contact_list = UserGroup.objects.filter(name__icontains=value) + elif attr == "asset": + contact_list = Asset.objects.filter(ip__icontains=value) + elif attr == "asset": + contact_list = BisGroup.objects.filter(name__icontains=value) + + return render_to_response('filter_ajax_api.html', locals()) + + +def install(request): + from juser.models import DEPT, User + if User.objects.filter(id=5000): + return httperror(request, 'Jumpserver已初始化,不能重复安装!') + + dept = DEPT(id=1, name="超管部", comment="超级管理部门") + dept.save() + dept2 = DEPT(id=2, name="默认", comment="默认部门") + dept2.save() + IDC(id=1, name="默认", comment="默认IDC").save() + BisGroup(id=1, name="ALL", dept=dept, comment="所有主机组").save() + + User(id=5000, username="admin", password=md5_crypt('admin'), + name='admin', email='admin@jumpserver.org', role='SU', is_active=True, dept=dept).save() + return success(request, u'Jumpserver初始化成功') + + +def download(request): + return render_to_response('download.html', locals(), context_instance=RequestContext(request)) + + +def transfer(sftp, filenames): + # pool = Pool(processes=5) + for filename, file_path in filenames.items(): + print filename, file_path + sftp.put(file_path, '/tmp/%s' % filename) + # pool.apply_async(transfer, (sftp, file_path, '/tmp/%s' % filename)) + sftp.close() + # pool.close() + # pool.join() + + +def upload(request): + user, dept = get_session_user_dept(request) + if request.method == 'POST': + hosts = request.POST.get('hosts') + upload_files = request.FILES.getlist('file[]', None) + upload_dir = "/tmp/%s" % user.username + is_dir(upload_dir) + date_now = datetime.datetime.now().strftime("%Y%m%d%H%M%S") + hosts_list = hosts.split(',') + user_hosts = get_user_host(user.username).keys() + unperm_hosts = [] + filenames = {} + for ip in hosts_list: + if ip not in user_hosts: + unperm_hosts.append(ip) + + if not hosts: + return HttpResponseNotFound(u'地址不能为空') + + if unperm_hosts: + print hosts_list + return HttpResponseNotFound(u'%s 没有权限.' % ', '.join(unperm_hosts)) + + for upload_file in upload_files: + file_path = '%s/%s.%s' % (upload_dir, upload_file.name, date_now) + filenames[upload_file.name] = file_path + f = open(file_path, 'w') + for chunk in upload_file.chunks(): + f.write(chunk) + f.close() + + sftps = [] + for host in hosts_list: + username, password, host, port = get_connect_item(user.username, host) + try: + t = paramiko.Transport((host, port)) + t.connect(username=username, password=password) + sftp = paramiko.SFTPClient.from_transport(t) + sftps.append(sftp) + except paramiko.AuthenticationException: + return HttpResponseNotFound(u'%s 连接失败.' % host) + + # pool = Pool(processes=5) + for sftp in sftps: + transfer(sftp, filenames) + # pool.close() + # pool.join() + return HttpResponse('传送成功') + + return render_to_response('upload.html', locals(), context_instance=RequestContext(request)) diff --git a/webroot/AutoSa/AutoSa/wsgi.py b/jumpserver/wsgi.py similarity index 50% rename from webroot/AutoSa/AutoSa/wsgi.py rename to jumpserver/wsgi.py index 178504cbf..cf26c6b87 100644 --- a/webroot/AutoSa/AutoSa/wsgi.py +++ b/jumpserver/wsgi.py @@ -1,16 +1,14 @@ """ -WSGI config for AutoSa project. +WSGI config for jumpserver project. It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see -https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/ +https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/ """ import os -import sys -sys.path.append('/opt/jumpserver/webroot/AutoSa') -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "AutoSa.settings") +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "jumpserver.settings") from django.core.wsgi import get_wsgi_application application = get_wsgi_application() diff --git a/keys/test.pub b/juser/__init__.py similarity index 100% rename from keys/test.pub rename to juser/__init__.py diff --git a/juser/admin.py b/juser/admin.py new file mode 100644 index 000000000..8c38f3f3d --- /dev/null +++ b/juser/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/juser/models.py b/juser/models.py new file mode 100644 index 000000000..d7efd7a28 --- /dev/null +++ b/juser/models.py @@ -0,0 +1,41 @@ +from django.db import models + + +class DEPT(models.Model): + name = models.CharField(max_length=80, unique=True) + comment = models.CharField(max_length=160, blank=True, null=True) + + def __unicode__(self): + return self.name + + +class UserGroup(models.Model): + name = models.CharField(max_length=80, unique=True) + dept = models.ForeignKey(DEPT) + comment = models.CharField(max_length=160, blank=True, null=True) + + def __unicode__(self): + return self.name + + +class User(models.Model): + USER_ROLE_CHOICES = ( + ('SU', 'SuperUser'), + ('DA', 'DeptAdmin'), + ('CU', 'CommonUser'), + ) + username = models.CharField(max_length=80, unique=True) + password = models.CharField(max_length=100) + name = models.CharField(max_length=80) + email = models.EmailField(max_length=75) + role = models.CharField(max_length=2, choices=USER_ROLE_CHOICES, default='CU') + dept = models.ForeignKey(DEPT) + group = models.ManyToManyField(UserGroup) + ldap_pwd = models.CharField(max_length=100) + ssh_key_pwd = models.CharField(max_length=100) + is_active = models.BooleanField(default=True) + last_login = models.DateTimeField(null=True) + date_joined = models.DateTimeField(null=True) + + def __unicode__(self): + return self.username diff --git a/juser/tests.py b/juser/tests.py new file mode 100644 index 000000000..7ce503c2d --- /dev/null +++ b/juser/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/juser/urls.py b/juser/urls.py new file mode 100644 index 000000000..cbaba7bb0 --- /dev/null +++ b/juser/urls.py @@ -0,0 +1,33 @@ +from django.conf.urls import patterns, include, url +from jumpserver.api import view_splitter +from juser.views import * + +urlpatterns = patterns('juser.views', + # Examples: + # url(r'^$', 'jumpserver.views.home', name='home'), + # url(r'^blog/', include('blog.urls')), + + (r'^dept_list/$', view_splitter, {'su': dept_list, 'adm': dept_list_adm}), + (r'^dept_add/$', 'dept_add'), + (r'^dept_del/$', 'dept_del'), + (r'^dept_detail/$', 'dept_detail'), + (r'^dept_del_ajax/$', 'dept_del_ajax'), + (r'^dept_edit/$', 'dept_edit'), + (r'^dept_user_ajax/$', 'dept_user_ajax'), + (r'^group_add/$', view_splitter, {'su': group_add, 'adm': group_add_adm}), + (r'^group_list/$', view_splitter, {'su': group_list, 'adm': group_list_adm}), + (r'^group_detail/$', 'group_detail'), + (r'^group_del/$', view_splitter, {'su': group_del, 'adm': group_del_adm}), + (r'^group_del_ajax/$', 'group_del_ajax'), + (r'^group_edit/$', view_splitter, {'su': group_edit, 'adm': group_edit_adm}), + (r'^user_add/$', view_splitter, {'su': user_add, 'adm': user_add_adm}), + (r'^user_list/$', view_splitter, {'su': user_list, 'adm': user_list_adm}), + (r'^user_detail/$', 'user_detail'), + (r'^user_del/$', 'user_del'), + (r'^user_del_ajax/$', 'user_del_ajax'), + (r'^user_edit/$', view_splitter, {'su': user_edit, 'adm': user_edit_adm}), + (r'^profile/$', 'profile'), + (r'^chg_info/$', 'chg_info'), + (r'^chg_role/$', 'chg_role'), + (r'^down_key/$', 'down_key'), +) diff --git a/juser/views.py b/juser/views.py new file mode 100644 index 000000000..0fd6ee4c0 --- /dev/null +++ b/juser/views.py @@ -0,0 +1,1050 @@ +# coding: utf-8 +# Author: Guanghongwei +# Email: ibuler@qq.com + +import random +from Crypto.PublicKey import RSA +import crypt + +from django.shortcuts import render_to_response +from django.db.models import Q +from django.template import RequestContext + +from jumpserver.api import * + + +def gen_rand_pwd(num): + """生成随机密码""" + seed = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + salt_list = [] + for i in range(num): + salt_list.append(random.choice(seed)) + salt = ''.join(salt_list) + return salt + + +class AddError(Exception): + pass + + +def gen_sha512(salt, password): + return crypt.crypt(password, '$6$%s$' % salt) + + +def group_add_user(group, user_id=None, username=None): + try: + if user_id: + user = User.objects.get(id=user_id) + else: + user = User.objects.get(username=username) + except ObjectDoesNotExist: + raise AddError('用户获取失败') + else: + group.user_set.add(user) + + +def db_add_group(**kwargs): + name = kwargs.get('name') + group = UserGroup.objects.filter(name=name) + users = kwargs.pop('users') + if group: + raise AddError(u'用户组 %s 已经存在' % name) + group = UserGroup(**kwargs) + group.save() + for user_id in users: + group_add_user(group, user_id) + + +def db_add_user(**kwargs): + groups_post = kwargs.pop('groups') + user = User(**kwargs) + user.save() + if groups_post: + group_select = [] + for group_id in groups_post: + group = UserGroup.objects.filter(id=group_id) + group_select.extend(group) + user.group = group_select + return user + + +def db_update_user(**kwargs): + print kwargs + groups_post = kwargs.pop('groups') + user_id = kwargs.pop('user_id') + user = User.objects.filter(id=user_id) + if user: + user.update(**kwargs) + user = User.objects.get(id=user_id) + user.save() + + if groups_post: + group_select = [] + for group_id in groups_post: + group = UserGroup.objects.filter(id=group_id) + group_select.extend(group) + user.group = group_select + + +def db_del_user(username): + try: + user = User.objects.get(username=username) + user.delete() + except ObjectDoesNotExist: + pass + + +def gen_ssh_key(username, password=None, length=2048): + private_key_dir = os.path.join(BASE_DIR, 'keys/jumpserver/') + private_key_file = os.path.join(private_key_dir, username+".pem") + public_key_dir = '/home/%s/.ssh/' % username + public_key_file = os.path.join(public_key_dir, 'authorized_keys') + is_dir(private_key_dir) + is_dir(public_key_dir, username, mode=0700) + + key = RSA.generate(length) + with open(private_key_file, 'w') as pri_f: + pri_f.write(key.exportKey('PEM', password)) + os.chmod(private_key_file, 0600) + + pub_key = key.publickey() + with open(public_key_file, 'w') as pub_f: + pub_f.write(pub_key.exportKey('OpenSSH')) + os.chmod(public_key_file, 0600) + bash('chown %s:%s %s' % (username, username, public_key_file)) + + +def server_add_user(username, password, ssh_key_pwd): + bash("useradd '%s'; echo '%s' | passwd --stdin '%s'" % (username, password, username)) + gen_ssh_key(username, ssh_key_pwd) + + +def server_del_user(username): + bash('userdel -r %s' % username) + + +def ldap_add_user(username, ldap_pwd): + user_dn = "uid=%s,ou=People,%s" % (username, LDAP_BASE_DN) + password_sha512 = gen_sha512(gen_rand_pwd(6), ldap_pwd) + user = User.objects.filter(username=username) + if user: + user = user[0] + else: + raise AddError(u'用户 %s 不存在' % username) + + user_attr = {'uid': [str(username)], + 'cn': [str(username)], + 'objectClass': ['account', 'posixAccount', 'top', 'shadowAccount'], + 'userPassword': ['{crypt}%s' % password_sha512], + 'shadowLastChange': ['16328'], + 'shadowMin': ['0'], + 'shadowMax': ['99999'], + 'shadowWarning': ['7'], + 'loginShell': ['/bin/bash'], + 'uidNumber': [str(user.id)], + 'gidNumber': [str(user.id)], + 'homeDirectory': [str('/home/%s' % username)]} + + group_dn = "cn=%s,ou=Group,%s" % (username, LDAP_BASE_DN) + group_attr = {'objectClass': ['posixGroup', 'top'], + 'cn': [str(username)], + 'userPassword': ['{crypt}x'], + 'gidNumber': [str(user.id)]} + + ldap_conn.add(user_dn, user_attr) + ldap_conn.add(group_dn, group_attr) + + +def ldap_del_user(username): + user_dn = "uid=%s,ou=People,%s" % (username, LDAP_BASE_DN) + group_dn = "cn=%s,ou=Group,%s" % (username, LDAP_BASE_DN) + sudo_dn = 'cn=%s,ou=Sudoers,%s' % (username, LDAP_BASE_DN) + + ldap_conn.delete(user_dn) + ldap_conn.delete(group_dn) + ldap_conn.delete(sudo_dn) + + +@require_super_user +def dept_add(request): + header_title, path1, path2 = '添加部门', '用户管理', '添加部门' + if request.method == 'POST': + name = request.POST.get('name', '') + comment = request.POST.get('comment', '') + + try: + if not name: + raise AddError('部门名称不能为空') + if DEPT.objects.filter(name=name): + raise AddError(u'部门名称 %s 已存在' % name) + except AddError, e: + error = e + else: + DEPT(name=name, comment=comment).save() + msg = u'添加部门 %s 成功' % name + + return render_to_response('juser/dept_add.html', locals(), context_instance=RequestContext(request)) + + +@require_super_user +def dept_list(request): + header_title, path1, path2 = '查看部门', '用户管理', '查看部门' + keyword = request.GET.get('search') + if keyword: + contact_list = DEPT.objects.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword)).order_by('name') + else: + contact_list = DEPT.objects.all().order_by('id') + + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) + + return render_to_response('juser/dept_list.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def dept_list_adm(request): + header_title, path1, path2 = '查看部门', '用户管理', '查看部门' + user, dept = get_session_user_dept(request) + contact_list = [dept] + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) + + return render_to_response('juser/dept_list.html', locals(), context_instance=RequestContext(request)) + + +def chg_role(request): + role = {'SU': 2, 'DA': 1, 'CU': 0} + user, dept = get_session_user_dept(request) + if request.session['role_id'] > 0: + request.session['role_id'] = 0 + elif request.session['role_id'] == 0: + request.session['role_id'] = role.get(user.role, 0) + return HttpResponseRedirect('/') + + +@require_super_user +def dept_detail(request): + dept_id = request.GET.get('id', None) + if not dept_id: + return HttpResponseRedirect('/juser/dept_list/') + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + users = dept.user_set.all() + return render_to_response('juser/dept_detail.html', locals(), context_instance=RequestContext(request)) + + +@require_super_user +def dept_del(request): + dept_id = request.GET.get('id', None) + if not dept_id or dept_id in ['1', '2']: + return HttpResponseRedirect('/juser/dept_list/') + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + dept.delete() + return HttpResponseRedirect('/juser/dept_list/') + + +def dept_member(dept_id): + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + return dept.user_set.all() + + +def dept_member_update(dept, users_id_list): + old_users = dept.user_set.all() + new_users = [] + for user_id in users_id_list: + new_users.extend(User.objects.filter(id=user_id)) + + remove_user = [user for user in old_users if user not in new_users] + add_user = [user for user in new_users if user not in old_users] + + for user in add_user: + user.dept = dept + user.save() + + dept_default = DEPT.objects.get(id=2) + for user in remove_user: + user.dept = dept_default + user.save() + + +@require_super_user +def dept_del_ajax(request): + dept_ids = request.POST.get('dept_ids') + for dept_id in dept_ids.split(','): + if int(dept_id) > 2: + DEPT.objects.filter(id=dept_id).delete() + return HttpResponse("删除成功") + + +@require_super_user +def dept_edit(request): + header_title, path1, path2 = '部门编辑', '用户管理', '部门编辑' + if request.method == 'GET': + dept_id = request.GET.get('id', '') + if dept_id: + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + users = dept_member(dept_id) + users_all = User.objects.all() + users_other = [user for user in users_all if user not in users] + else: + error = 'id 错误' + else: + error = u'部门不存在' + else: + dept_id = request.POST.get('id', '') + name = request.POST.get('name', '') + users = request.POST.getlist('users_selected', []) + comment = request.POST.get('comment', '') + + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept.update(name=name, comment=comment) + dept_member_update(dept[0], users) + else: + error = '部门不存在' + return HttpResponseRedirect('/juser/dept_list/') + return render_to_response('juser/dept_edit.html', locals(), context_instance=RequestContext(request)) + + +def dept_user_ajax(request): + dept_id = request.GET.get('id', '4') + if dept_id not in ['1', '2']: + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + users = dept.user_set.all() + else: + users = User.objects.all() + + return render_to_response('juser/dept_user_ajax.html', locals()) + + + +@require_super_user +def group_add(request): + error = '' + msg = '' + header_title, path1, path2 = '添加小组', '用户管理', '添加小组' + user_all = User.objects.all() + dept_all = DEPT.objects.all() + + if request.method == 'POST': + group_name = request.POST.get('group_name', '') + dept_id = request.POST.get('dept_id', '') + users_selected = request.POST.getlist('users_selected', '') + comment = request.POST.get('comment', '') + + try: + if '' in [group_name, dept_id]: + error = u'组名 或 部门 不能为空' + raise AddError(error) + + if UserGroup.objects.filter(name=group_name): + error = u'组名已存在' + raise AddError(error) + + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + else: + error = u'部门不存在' + raise AddError(error) + + db_add_group(name=group_name, users=users_selected, dept=dept, comment=comment) + except AddError: + pass + except TypeError: + error = u'保存小组失败' + else: + msg = u'添加组 %s 成功' % group_name + + return render_to_response('juser/group_add.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def group_add_adm(request): + error = '' + msg = '' + header_title, path1, path2 = '添加小组', '用户管理', '添加小组' + user, dept = get_session_user_dept(request) + user_all = dept.user_set.all() + + if request.method == 'POST': + group_name = request.POST.get('group_name', '') + users_selected = request.POST.getlist('users_selected', '') + comment = request.POST.get('comment', '') + + try: + if not validate(request, user=users_selected): + raise AddError('没有某用户权限') + if '' in [group_name]: + error = u'组名不能为空' + raise AddError(error) + + db_add_group(name=group_name, users=users_selected, dept=dept, comment=comment) + except AddError: + pass + except TypeError: + error = u'保存小组失败' + else: + msg = u'添加组 %s 成功' % group_name + + return render_to_response('juser/group_add.html', locals(), context_instance=RequestContext(request)) + + +@require_super_user +def group_list(request): + header_title, path1, path2 = '查看小组', '用户管理', '查看小组' + keyword = request.GET.get('search', '') + did = request.GET.get('did', '') + contact_list = UserGroup.objects.all().order_by('name') + + if did: + dept = DEPT.objects.filter(id=did) + if dept: + dept = dept[0] + contact_list = dept.usergroup_set.all() + + if keyword: + contact_list = contact_list.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword)) + + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) + return render_to_response('juser/group_list.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def group_list_adm(request): + header_title, path1, path2 = '查看部门小组', '用户管理', '查看小组' + keyword = request.GET.get('search', '') + did = request.GET.get('did', '') + user, dept = get_session_user_dept(request) + contact_list = dept.usergroup_set.all().order_by('name') + + if keyword: + contact_list = contact_list.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword)) + + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) + return render_to_response('juser/group_list.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def group_detail(request): + group_id = request.GET.get('id', None) + if not group_id: + return HttpResponseRedirect('/') + group = UserGroup.objects.get(id=group_id) + users = group.user_set.all() + return render_to_response('juser/group_detail.html', locals(), context_instance=RequestContext(request)) + + +@require_super_user +def group_del(request): + group_id = request.GET.get('id', '') + if not group_id: + return HttpResponseRedirect('/') + UserGroup.objects.filter(id=group_id).delete() + return HttpResponseRedirect('/juser/group_list/') + + +@require_admin +def group_del_adm(request): + group_id = request.GET.get('id', '') + if not validate(request, user_group=[group_id]): + return HttpResponseRedirect('/juser/group_list/') + if not group_id: + return HttpResponseRedirect('/') + UserGroup.objects.filter(id=group_id).delete() + return HttpResponseRedirect('/juser/group_list/') + + +@require_admin +def group_del_ajax(request): + group_ids = request.POST.get('group_ids') + group_ids = group_ids.split(',') + if request.session.get('role_id') == 1: + if not validate(request, user_group=group_ids): + return "error" + for group_id in group_ids: + UserGroup.objects.filter(id=group_id).delete() + return HttpResponse('删除成功') + + +def group_update_member(group_id, users_id_list): + group = UserGroup.objects.filter(id=group_id) + if group: + group = group[0] + group.user_set.clear() + for user_id in users_id_list: + user = User.objects.get(id=user_id) + group.user_set.add(user) + + +@require_super_user +def group_edit(request): + error = '' + msg = '' + header_title, path1, path2 = '修改小组信息', '用户管理', '编辑小组' + if request.method == 'GET': + group_id = request.GET.get('id', '') + group = UserGroup.objects.filter(id=group_id) + if group: + group = group[0] + dept_all = DEPT.objects.all() + users_all = User.objects.all() + users_selected = group.user_set.all() + users = [user for user in users_all if user not in users_selected] + + return render_to_response('juser/group_edit.html', locals(), context_instance=RequestContext(request)) + else: + group_id = request.POST.get('group_id', '') + group_name = request.POST.get('group_name', '') + dept_id = request.POST.get('dept_id', '') + comment = request.POST.get('comment', '') + users_selected = request.POST.getlist('users_selected') + + users = [] + try: + if '' in [group_id, group_name]: + raise AddError('组名不能为空') + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + else: + raise AddError('部门不存在') + for user_id in users_selected: + users.extend(User.objects.filter(id=user_id)) + + user_group = UserGroup.objects.filter(id=group_id) + if user_group: + user_group.update(name=group_name, comment=comment, dept=dept) + user_group = user_group[0] + user_group.user_set.clear() + user_group.user_set = users + + except AddError, e: + error = e + + return HttpResponseRedirect('/juser/group_list/') + + +@require_admin +def group_edit_adm(request): + error = '' + msg = '' + header_title, path1, path2 = '修改小组信息', '用户管理', '编辑小组' + user, dept = get_session_user_dept(request) + if request.method == 'GET': + group_id = request.GET.get('id', '') + if not validate(request, user_group=[group_id]): + return HttpResponseRedirect('/juser/group_list/') + group = UserGroup.objects.filter(id=group_id) + if group: + group = group[0] + users_all = dept.user_set.all() + users_selected = group.user_set.all() + users = [user for user in users_all if user not in users_selected] + + return render_to_response('juser/group_edit.html', locals(), context_instance=RequestContext(request)) + else: + group_id = request.POST.get('group_id', '') + group_name = request.POST.get('group_name', '') + comment = request.POST.get('comment', '') + users_selected = request.POST.getlist('users_selected') + + users = [] + try: + if not validate(request, user=users_selected): + raise AddError(u'右侧非部门用户') + + if not validate(request, user_group=[group_id]): + raise AddError(u'没有权限修改本组') + + for user_id in users_selected: + users.extend(User.objects.filter(id=user_id)) + + user_group = UserGroup.objects.filter(id=group_id) + if user_group: + user_group.update(name=group_name, comment=comment, dept=dept) + user_group = user_group[0] + user_group.user_set.clear() + user_group.user_set = users + + except AddError, e: + error = e + + return HttpResponseRedirect('/juser/group_list/') + + +@require_super_user +def user_add(request): + error = '' + msg = '' + header_title, path1, path2 = '添加用户', '用户管理', '添加用户' + user_role = {'SU': u'超级管理员', 'DA': u'部门管理员', 'CU': u'普通用户'} + dept_all = DEPT.objects.all() + group_all = UserGroup.objects.all() + + if request.method == 'POST': + username = request.POST.get('username', '') + password = gen_rand_pwd(16) + name = request.POST.get('name', '') + email = request.POST.get('email', '') + dept_id = request.POST.get('dept_id') + groups = request.POST.getlist('groups', []) + role_post = request.POST.get('role', 'CU') + ssh_key_pwd = gen_rand_pwd(16) + is_active = True if request.POST.get('is_active', '1') == '1' else False + ldap_pwd = gen_rand_pwd(16) + + try: + if '' in [username, password, ssh_key_pwd, name, groups, role_post, is_active]: + error = u'带*内容不能为空' + raise AddError + user = User.objects.filter(username=username) + if user: + error = u'用户 %s 已存在' % username + raise AddError + + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + else: + error = u'部门不存在' + raise AddError(error) + + except AddError: + pass + else: + try: + user = db_add_user(username=username, + password=md5_crypt(password), + name=name, email=email, dept=dept, + groups=groups, role=role_post, + ssh_key_pwd=md5_crypt(ssh_key_pwd), + ldap_pwd=CRYPTOR.encrypt(ldap_pwd), + is_active=is_active, + date_joined=datetime.datetime.now()) + + server_add_user(username, password, ssh_key_pwd) + if LDAP_ENABLE: + ldap_add_user(username, ldap_pwd) + mail_title = u'恭喜你的跳板机用户添加成功 Jumpserver' + mail_msg = """ + Hi, %s + 您的用户名: %s + 您的部门: %s + 您的角色: %s + 您的web登录密码: %s + 您的ssh登录密码: %s + 密钥下载地址: http://%s:%s/juser/down_key/?id=%s + 说明: 请登陆后再下载密钥! + """ % (name, username, dept.name, user_role.get(role_post, ''), + password, ssh_key_pwd, SEND_IP, SEND_PORT, user.id) + + except Exception, e: + error = u'添加用户 %s 失败 %s ' % (username, e) + try: + db_del_user(username) + server_del_user(username) + if LDAP_ENABLE: + ldap_del_user(username) + except Exception: + pass + else: + send_mail(mail_title, mail_msg, MAIL_FROM, [email], fail_silently=False) + msg = u'添加用户 %s 成功! 用户密码已发送到 %s 邮箱!' % (username, email) + return render_to_response('juser/user_add.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def user_add_adm(request): + error = '' + msg = '' + header_title, path1, path2 = '添加用户', '用户管理', '添加用户' + user, dept = get_session_user_dept(request) + group_all = dept.usergroup_set.all() + + if request.method == 'POST': + username = request.POST.get('username', '') + password = gen_rand_pwd(16) + name = request.POST.get('name', '') + email = request.POST.get('email', '') + groups = request.POST.getlist('groups', []) + ssh_key_pwd = gen_rand_pwd(16) + is_active = True if request.POST.get('is_active', '1') == '1' else False + ldap_pwd = gen_rand_pwd(16) + + try: + if '' in [username, password, ssh_key_pwd, name, groups, is_active]: + error = u'带*内容不能为空' + raise AddError + user = User.objects.filter(username=username) + if user: + error = u'用户 %s 已存在' % username + raise AddError + + except AddError: + pass + else: + try: + user = db_add_user(username=username, + password=md5_crypt(password), + name=name, email=email, dept=dept, + groups=groups, role='CU', + ssh_key_pwd=md5_crypt(ssh_key_pwd), + ldap_pwd=CRYPTOR.encrypt(ldap_pwd), + is_active=is_active, + date_joined=datetime.datetime.now()) + + server_add_user(username, password, ssh_key_pwd) + if LDAP_ENABLE: + ldap_add_user(username, ldap_pwd) + + except Exception, e: + error = u'添加用户 %s 失败 %s ' % (username, e) + try: + db_del_user(username) + server_del_user(username) + if LDAP_ENABLE: + ldap_del_user(username) + except Exception: + pass + else: + mail_title = u'恭喜你的跳板机用户添加成功 Jumpserver' + mail_msg = """ + Hi, %s + 您的用户名: %s + 您的部门: %s + 您的角色: %s + 您的web登录密码: %s + 您的ssh登录密码: %s + 密钥下载地址: http://%s:%s/juser/down_key/?id=%s + 说明: 请登陆后再下载密钥! + """ % (name, username, dept.name, '普通用户', + password, ssh_key_pwd, SEND_IP, SEND_PORT, user.id) + print MAIL_FROM + send_mail(mail_title, mail_msg, MAIL_FROM, [email], fail_silently=False) + msg = u'添加用户 %s 成功! 用户密码已发送到 %s 邮箱!' % (username, email) + + return render_to_response('juser/user_add.html', locals(), context_instance=RequestContext(request)) + + +@require_super_user +def user_list(request): + user_role = {'SU': u'超级管理员', 'GA': u'组管理员', 'CU': u'普通用户'} + header_title, path1, path2 = '查看用户', '用户管理', '用户列表' + keyword = request.GET.get('keyword', '') + gid = request.GET.get('gid', '') + did = request.GET.get('did', '') + contact_list = User.objects.all().order_by('name') + + if gid: + user_group = UserGroup.objects.filter(id=gid) + if user_group: + user_group = user_group[0] + contact_list = user_group.user_set.all() + + if did: + dept = DEPT.objects.filter(id=did) + if dept: + dept = dept[0] + contact_list = dept.user_set.all().order_by('name') + + if keyword: + contact_list = contact_list.filter(Q(username__icontains=keyword) | Q(name__icontains=keyword)).order_by('name') + + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) + + return render_to_response('juser/user_list.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def user_list_adm(request): + user_role = {'SU': u'超级管理员', 'GA': u'组管理员', 'CU': u'普通用户'} + header_title, path1, path2 = '查看用户', '用户管理', '用户列表' + keyword = request.GET.get('keyword', '') + user, dept = get_session_user_dept(request) + gid = request.GET.get('gid', '') + contact_list = dept.user_set.all().order_by('name') + + if gid: + if not validate(request, user_group=[gid]): + return HttpResponseRedirect('/juser/user_list/') + user_group = UserGroup.objects.filter(id=gid) + if user_group: + user_group = user_group[0] + contact_list = user_group.user_set.all() + + if keyword: + contact_list = contact_list.filter(Q(username__icontains=keyword) | Q(name__icontains=keyword)).order_by('name') + + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) + + return render_to_response('juser/user_list.html', locals(), context_instance=RequestContext(request)) + + +@require_login +def user_detail(request): + header_title, path1, path2 = '查看用户', '用户管理', '用户详情' + if request.session.get('role_id') == 0: + user_id = request.session.get('user_id') + else: + user_id = request.GET.get('id', '') + if request.session.get('role_id') == 1: + user, dept = get_session_user_dept(request) + if not validate(request, user=[user_id]): + return HttpResponseRedirect('/') + if not user_id: + return HttpResponseRedirect('/juser/user_list/') + + user = User.objects.filter(id=user_id) + if user: + user = user[0] + asset_group_permed = user_perm_group_api(user) + logs_last = Log.objects.filter(user=user.name).order_by('-start_time')[0:10] + logs_all = Log.objects.filter(user=user.name).order_by('-start_time') + logs_num = len(logs_all) + + return render_to_response('juser/user_detail.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def user_del(request): + user_id = request.GET.get('id', '') + if not user_id: + return HttpResponseRedirect('/juser/user_list/') + + if request.session.get('role_id', '') == '1': + if not validate(request, user=[user_id]): + return HttpResponseRedirect('/juser/user_list/') + + user = User.objects.filter(id=user_id) + if user and user[0].username != 'admin': + user = user[0] + user.delete() + server_del_user(user.username) + if LDAP_ENABLE: + ldap_del_user(user.username) + return HttpResponseRedirect('/juser/user_list/') + + +@require_admin +def user_del_ajax(request): + user_ids = request.POST.get('ids') + user_ids = user_ids.split(',') + if request.session.get('role_id', '') == 1: + if not validate(request, user=user_ids): + return "error" + for user_id in user_ids: + user = User.objects.filter(id=user_id) + if user and user[0].username != 'admin': + user = user[0] + user.delete() + server_del_user(user.username) + if LDAP_ENABLE: + ldap_del_user(user.username) + + return HttpResponse('删除成功') + + +@require_super_user +def user_edit(request): + header_title, path1, path2 = '编辑用户', '用户管理', '用户编辑' + if request.method == 'GET': + user_id = request.GET.get('id', '') + if not user_id: + return HttpResponseRedirect('/') + + user_role = {'SU': u'超级管理员', 'DA': u'部门管理员', 'CU': u'普通用户'} + user = User.objects.filter(id=user_id) + dept_all = DEPT.objects.all() + group_all = UserGroup.objects.all() + if user: + user = user[0] + groups_str = ' '.join([str(group.id) for group in user.group.all()]) + + else: + user_id = request.POST.get('user_id', '') + password = request.POST.get('password', '') + name = request.POST.get('name', '') + email = request.POST.get('email', '') + dept_id = request.POST.get('dept_id') + groups = request.POST.getlist('groups', []) + role_post = request.POST.get('role', 'CU') + ssh_key_pwd = request.POST.get('ssh_key_pwd', '') + is_active = True if request.POST.get('is_active', '1') == '1' else False + + user_role = {'SU': u'超级管理员', 'DA': u'部门管理员', 'CU': u'普通用户'} + dept = DEPT.objects.filter(id=dept_id) + if dept: + dept = dept[0] + else: + dept = DEPT.objects.get(id='2') + + if user_id: + user = User.objects.filter(id=user_id) + if user: + user = user[0] + else: + return HttpResponseRedirect('/juser/user_list/') + + if password != user.password: + password = md5_crypt(password) + + if ssh_key_pwd != user.ssh_key_pwd: + gen_ssh_key(user.username, ssh_key_pwd) + ssh_key_pwd = CRYPTOR.encrypt(ssh_key_pwd) + + db_update_user(user_id=user_id, + password=password, + name=name, + email=email, + groups=groups, + dept=dept, + role=role_post, + is_active=is_active, + ssh_key_pwd=ssh_key_pwd) + + return HttpResponseRedirect('/juser/user_list/') + + return render_to_response('juser/user_edit.html', locals(), context_instance=RequestContext(request)) + + +@require_admin +def user_edit_adm(request): + header_title, path1, path2 = '编辑用户', '用户管理', '用户编辑' + user, dept = get_session_user_dept(request) + if request.method == 'GET': + user_id = request.GET.get('id', '') + if not user_id: + return HttpResponseRedirect('/juser/user_list/') + + if not validate(request, user=[user_id]): + return HttpResponseRedirect('/juser/user_list/') + + user = User.objects.filter(id=user_id) + dept_all = DEPT.objects.all() + group_all = dept.usergroup_set.all() + if user: + user = user[0] + groups_str = ' '.join([str(group.id) for group in user.group.all()]) + + else: + user_id = request.POST.get('user_id', '') + password = request.POST.get('password', '') + name = request.POST.get('name', '') + email = request.POST.get('email', '') + groups = request.POST.getlist('groups', []) + ssh_key_pwd = request.POST.get('ssh_key_pwd', '') + is_active = True if request.POST.get('is_active', '1') == '1' else False + + if not validate(request, user=[user_id], user_group=groups): + return HttpResponseRedirect('/juser/user_edit/') + if user_id: + user = User.objects.filter(id=user_id) + if user: + user = user[0] + else: + return HttpResponseRedirect('/juser/user_list/') + + if password != user.password: + password = md5_crypt(password) + + if ssh_key_pwd != user.ssh_key_pwd: + ssh_key_pwd = CRYPTOR.encrypt(ssh_key_pwd) + + db_update_user(user_id=user_id, + password=password, + name=name, + email=email, + groups=groups, + is_active=is_active, + ssh_key_pwd=ssh_key_pwd) + + return HttpResponseRedirect('/juser/user_list/') + + return render_to_response('juser/user_edit.html', locals(), context_instance=RequestContext(request)) + + +def profile(request): + user_id = request.session.get('user_id') + if not user_id: + return HttpResponseRedirect('/') + user = User.objects.get(id=user_id) + return render_to_response('juser/profile.html', locals(), context_instance=RequestContext(request)) + + +def chg_info(request): + header_title, path1, path2 = '修改信息', '用户管理', '修改个人信息' + user_id = request.session.get('user_id') + user_set = User.objects.filter(id=user_id) + error = '' + if user_set: + user = user_set[0] + else: + return HttpResponseRedirect('/') + + if request.method == 'POST': + name = request.POST.get('name', '') + password = request.POST.get('password', '') + ssh_key_pwd = request.POST.get('ssh_key_pwd', '') + email = request.POST.get('email', '') + + if '' in [name, password, ssh_key_pwd, email]: + error = '不能为空' + + if len(password) < 6 or len(ssh_key_pwd) < 6: + error = '密码须大于6位' + + if not error: + if password != user.password: + password = md5_crypt(password) + + if ssh_key_pwd != user.ssh_key_pwd: + gen_ssh_key(user.username, ssh_key_pwd) + ssh_key_pwd = md5_crypt(ssh_key_pwd) + + user_set.update(name=name, password=password, ssh_key_pwd=ssh_key_pwd, email=email) + msg = '修改成功' + + return render_to_response('juser/chg_info.html', locals(), context_instance=RequestContext(request)) + + + + + +@require_login +def down_key(request): + user_id = '' + if is_super_user(request): + user_id = request.GET.get('id') + + if is_group_admin(request): + user_id = request.GET.get('id') + if not validate(request, user=[user_id]): + user_id = request.session.get('user_id') + + if is_common_user(request): + user_id = request.session.get('user_id') + + if user_id: + user = User.objects.filter(id=user_id) + if user: + user = user[0] + username = user.username + private_key_dir = os.path.join(BASE_DIR, 'keys/jumpserver/') + private_key_file = os.path.join(private_key_dir, username+".pem") + if os.path.isfile(private_key_file): + f = open(private_key_file) + data = f.read() + f.close() + response = HttpResponse(data, content_type='application/octet-stream') + response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(private_key_file) + return response + + return HttpResponse('No Key File. Contact Admin.') \ No newline at end of file diff --git a/keys/test b/keys/test deleted file mode 100644 index 0ae67e91e..000000000 --- a/keys/test +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,D5AF0CC627FA8B85 - -oQLAgKLelCYNGc7cP51Bx3b66GmCKHAEhqBCsrPEi4eYKV7D30WOp+sdp8F5RaK1 -I/ZtGmv4jAaK4/KCBr2bGgH7cnkOhdj6T+ro9YVr92r5kD0gwHzYzbTCZP44N9Wn -83pUy4eUpMB659Y4TQgUAQVejyr1/ZZJSb8Kgah1xlLlM1ZSmK7PuqCSpBz16wil -TXrywWvsUhrAuAJh1NC7wr7mXm8tb2DMkT1+ckIQUqhOMJGEvgByI3SXUKR1c9lL -ZBh7RwukipvbujazxJxBvW50fLpdSDuBIxRsQhJ5PvYTV8BBwsp5KvbO5b/qkIOL -RUxY4q3o7fHtXiRf4vD9iD1U7F39UMnDIie6jk642oN4aYmvyc0SnVH8RcVarnCA -HkdZ/5c93BCZRovay6DoIumN/OmURe83A9hzsHnMg9hkLAapw5dmlsvtk307YWK8 -YnAy7TMLS72RdAxSJHXN9U+U7QKDu47jiIkST3kwNLXYm4gvY7eFlg82Ux2h9Soh -R5qJ6pdYh1Ah/msbE9v/HkWCqhU6fD38MaAmcuCAoOh2LuI+32+2ZkCT04hPhzQL -AjfrMsUFKiH/+IrFtQ8CcwaFtVR9b/Ebe65SQuBXV3Bcrcx91MWKBjCpiB1rQQZ/ -mxNh4jQmvUOJYhDv8D1TZMCLrAREt07uPLhL24klv6v4lf204xbLhdYA1kW/m/16 -+oEH6CHMo8qVqWylATfya1Iv+htAXs6Pi65j6QQjyM/sQZ+Cn0enGSS5S9WIx+Ca -C+kbRBmxfwYXROu7NkmWexiU3a7VmTj/0yA8uRXY7jbEyGgupXiAeXa2/pRX2XRo -8MugyIoZzLxvkszQ90WxH/9hO+eNDY1Wo+ONo8deos3pogjeIPhiFQlx2EFowGcf -TcNFgluQliwVm5qEWe2SWoNlHgnI7rhus1yAexH/G2uJHpd8eid3Rn19Fh1TxD16 -r/+I6TEp7u27Fc9T+HVXg46kXxf7+p0/fcHLxOk0A5wfLzQgB6fVvXoXoldWoomr -FXpKmDTDjTp15R1pVZ3eVtuJp3wA+N6YsL7F2NsmtKMaMrXuMwSwJUJPpFSD/DXe -BUcqSeQMwvwSgzH4qkBtJcQ6baEVgBvDeRKoVInZ9D7FpumTv5tSnsqyD0NBZsXC -qmA5Sk+w2CRW1Nbi/uSFdDACZo8iDhILJ9fHRtNLyB+BN2cN7dIQZlmOQxK3omqd -iCgu1q31iE8wgxzEnrtPxLWi/2jr7WX0NVFzE6Qjjpvqa+3k4MjNDeNfPKHJMK50 -o8hf4jlSZxhjc4D+U9ksSJZOl6NyuLhpp8YlVSkZ/Oiz6U1reTf8qZUOkBgY5V2T -0N+Pwqs81nA4Hsh32MxuVIt0RLtp2uLUyeEHatEp3akABFvWWMWbxgbwsmOXtnsj -QxJQ6jL+CCvpufu34prkMeKPApqTrwHq9YLNBFgg4ts+pl8wHrFo1CFma2ljvFzq -8FNn8FDJcebasNmnJOvXTryqp/Qd85fKH0XuR100azmXnuRmxuDmNXfN/ejtne1b -ZyDrSEGOlr/GpxTLDtbSSu82I+XqvAicXsUqbOqWUPM2mAKtDVfaIQ== ------END RSA PRIVATE KEY----- \ No newline at end of file diff --git a/log_handler.py b/log_handler.py new file mode 100644 index 000000000..0d8b91e77 --- /dev/null +++ b/log_handler.py @@ -0,0 +1,84 @@ +#!/usr/bin/python +# coding: utf-8 + +import os +import re +import time +import psutil +from datetime import datetime + +os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings' + +import django +django.setup() +from jlog.models import Log + + +def log_hanler(id): + log = Log.objects.get(id=id) + pattern = re.compile(r'([\[.*@.*\][\$#].*)|(.*mysql>.*)') + if log: + filename = log.log_path + if os.path.isfile(filename): + f_his = filename + '.his' + f1 = open(filename) + f2 = open(f_his, 'a') + lines = f1.readlines() + for line in lines[7:]: + match = pattern.match(line) + if match: + newline = re.sub('\[[A-Z]', '', line) + f2.write(newline) + f1.close() + f2.close() + log.log_finished = True + log.save() + + +def set_finish(id): + log = Log.objects.filter(id=id) + if log: + log.update(is_finished=1, end_time=datetime.now()) + + +def kill_pid(pid): + try: + os.kill(pid, 9) + except OSError: + pass + + +def get_pids(): + pids1, pids2 = [], [] + pids1_obj = Log.objects.filter(is_finished=0) + pids2_obj = Log.objects.filter(is_finished=1, log_finished=0) + for pid_obj in pids1_obj: + pids1.append((pid_obj.id, pid_obj.pid, pid_obj.log_path, pid_obj.is_finished, pid_obj.log_finished, pid_obj.start_time)) + for pid_obj in pids2_obj: + pids2.append(pid_obj.id) + + return pids1, pids2 + + +def run(): + pids1, pids2 = get_pids() + for pid_id in pids2: + log_hanler(pid_id) + + for pid_id, pid, log_path, is_finished, log_finished, start_time in pids1: + print pid_id, start_time, type(start_time) + try: + file_time = int(os.stat(log_path).st_ctime) + now_time = int(time.time()) + if now_time - file_time > 18000: + if psutil.pid_exists(pid): + kill_pid(pid) + set_finish(pid_id) + log_hanler(pid_id) + except OSError: + pass + +if __name__ == '__main__': + while True: + run() + time.sleep(5) diff --git a/logs/test.log b/logs/test.log deleted file mode 100755 index e69de29bb..000000000 diff --git a/webroot/AutoSa/manage.py b/manage.py old mode 100755 new mode 100644 similarity index 70% rename from webroot/AutoSa/manage.py rename to manage.py index b9e26787a..f72e2bc4a --- a/webroot/AutoSa/manage.py +++ b/manage.py @@ -3,7 +3,7 @@ import os import sys if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "AutoSa.settings") + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "jumpserver.settings") from django.core.management import execute_from_command_line diff --git a/runserver b/runserver deleted file mode 100755 index 9a5211734..000000000 --- a/runserver +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -manage_file="./webroot/AutoSa/manage.py" -log_handler_file="./webroot/AutoSa/log_handler.py" -websocket_file="./webroot/AutoSa/websocket/index.js" - -which node &> /dev/null -if [ $? != '0' ];then - echo "Please define the node.js binary file 'node' in the PATH." - exit -fi -node $websocket_file & -if [ -f $manage_file -a -e $manage_file ] && [ -f $log_handler_file -a -e $log_handler_file ];then - sudo $manage_file runserver 0.0.0.0:80 &> logs/access.log & - $log_handler_file &> logs/handler.log & -else - echo "manage.py or log_handler.py isn't exist or executable." -fi diff --git a/scripts/jumpserver.sh b/scripts/jumpserver.sh deleted file mode 100644 index b59520a03..000000000 --- a/scripts/jumpserver.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -if [ $USER == 'admin' ] || [ $USER == 'root' ];then - echo "" -else - python /opt/jumpserver/jumpserver.py - if [ $USER == 'guanghongwei' ];then - echo - else - exit 3 - echo - fi -fi diff --git a/service.sh b/service.sh new file mode 100644 index 000000000..fbac87af4 --- /dev/null +++ b/service.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# Date: 2015-04-12 +# Version: 2.0.0 +# Site: http://www.jumpserver.org +# Author: jumpserver group + +. /etc/init.d/functions +export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/node/bin + +base_dir=$(dirname $0) + +case $1 in +start) + daemon $base_dir/manage.py runserver 0.0.0.0:80 & + daemon $base_dir/log_handler.py & + cd $base_dir/websocket/; daemon node index.js & + ;; + +stop) + pkill -15 python + pkill -15 node + ;; + +esac diff --git a/ssh b/ssh new file mode 100644 index 000000000..173fd3667 --- /dev/null +++ b/ssh @@ -0,0 +1,395 @@ +#!/usr/local/bin/python + +import socket +import sys +import os +import ast +import select +import time +from datetime import datetime +import paramiko +import struct +import fcntl +import signal +import textwrap +import django +import getpass +import fnmatch +import optparse +import readline +from multiprocessing import Pool +from ConfigParser import ConfigParser +from django.core.exceptions import ObjectDoesNotExist + +os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings' +django.setup() +from juser.models import User +from jasset.models import Asset +from jlog.models import Log +from jumpserver.views import PyCrypt +from jumpserver.api import user_perm_asset_api, user_perm_group_api + +try: + import termios + import tty +except ImportError: + print '\033[1;31mOnly postfix supported.\033[0m' + time.sleep(3) + sys.exit() + +BASE_DIR = os.path.abspath(os.path.dirname(__file__)) +CONF = ConfigParser() +CONF.read(os.path.join(BASE_DIR, 'jumpserver.conf')) +LOG_DIR = os.path.join(BASE_DIR, 'logs') +SSH_KEY_DIR = os.path.join(BASE_DIR, 'keys') +SERVER_KEY_DIR = os.path.join(SSH_KEY_DIR, 'server') +KEY = CONF.get('web', 'key') +LOGIN_NAME = getpass.getuser() + + +def color_print(msg, color='blue'): + """Print colorful string.""" + color_msg = {'blue': '\033[1;36m%s\033[0m', + 'green': '\033[1;32m%s\033[0m', + 'red': '\033[1;31m%s\033[0m'} + + print color_msg.get(color, 'blue') % msg + + +def color_print_exit(msg, color='red'): + """Print colorful string and exit.""" + color_print(msg, color=color) + time.sleep(2) + sys.exit() + + +class ServerError(Exception): + pass + + +def get_win_size(): + """This function use to get the size of the windows!""" + if 'TIOCGWINSZ' in dir(termios): + TIOCGWINSZ = termios.TIOCGWINSZ + else: + TIOCGWINSZ = 1074295912L # Assume + s = struct.pack('HHHH', 0, 0, 0, 0) + x = fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ, s) + return struct.unpack('HHHH', x)[0:2] + + +def set_win_size(sig, data): + """This function use to set the window size of the terminal!""" + try: + win_size = get_win_size() + channel.resize_pty(height=win_size[0], width=win_size[1]) + except: + pass + + +def get_object(model, **kwargs): + try: + the_object = model.objects.get(**kwargs) + except ObjectDoesNotExist: + raise ServerError('Object get %s failed.' % str(kwargs.values())) + return the_object + + +def log_record(username, host): + """Logging user command and output.""" + connect_log_dir = os.path.join(LOG_DIR, 'connect') + timestamp_start = int(time.time()) + today = time.strftime('%Y%m%d', time.localtime(timestamp_start)) + time_now = time.strftime('%H%M%S', time.localtime(timestamp_start)) + today_connect_log_dir = os.path.join(connect_log_dir, today) + log_filename = '%s_%s_%s.log' % (username, host, time_now) + log_file_path = os.path.join(today_connect_log_dir, log_filename) + pid = os.getpid() + ip_list = [] + remote_ip = os.popen("who |grep `ps aux |gawk '{if ($2==%s) print $1}'` |gawk '{print $5}'|tr -d '()'" % pid).readlines() + for ip in remote_ip: + ip_list.append(ip.strip('\n')) + ip_list = ','.join(list(set(ip_list))) + + if not os.path.isdir(today_connect_log_dir): + try: + os.makedirs(today_connect_log_dir) + os.chmod(today_connect_log_dir, 0777) + except OSError: + raise ServerError('Create %s failed, Please modify %s permission.' % (today_connect_log_dir, connect_log_dir)) + + try: + log_file = open(log_file_path, 'a') + except IOError: + raise ServerError('Create logfile failed, Please modify %s permission.' % today_connect_log_dir) + + log = Log(user=username, host=host, remote_ip=ip_list, log_path=log_file_path, start_time=datetime.now(), pid=pid) + log_file.write('Starttime is %s\n' % datetime.now()) + log.save() + return log_file, log + + +def posix_shell(chan, username, host): + """ + Use paramiko channel connect server interactive. + """ + log_file, log = log_record(username, host) + old_tty = termios.tcgetattr(sys.stdin) + try: + tty.setraw(sys.stdin.fileno()) + tty.setcbreak(sys.stdin.fileno()) + chan.settimeout(0.0) + + while True: + try: + r, w, e = select.select([chan, sys.stdin], [], []) + except: + pass + + if chan in r: + try: + x = chan.recv(1024) + if len(x) == 0: + break + sys.stdout.write(x) + sys.stdout.flush() + log_file.write(x) + log_file.flush() + except socket.timeout: + pass + + if sys.stdin in r: + x = os.read(sys.stdin.fileno(), 1) + if len(x) == 0: + break + chan.send(x) + + finally: + timestamp_end = time.time() + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_tty) + log_file.write('Endtime is %s' % datetime.now()) + log_file.close() + log.is_finished = True + log.log_finished = False + log.end_time = datetime.now() + log.save() + + +def get_user_host(username): + """Get the hosts of under the user control.""" + hosts_attr = {} + asset_all = user_perm_asset_api(username) + for asset in asset_all: + hosts_attr[asset.ip] = [asset.id, asset.comment] + return hosts_attr + + +def get_user_hostgroup(username): + """Get the hostgroups of under the user control.""" + groups_attr = {} + group_all = user_perm_group_api(username) + for group in group_all: + groups_attr[group.name] = [group.id, group.comment] + return groups_attr + + +def get_connect_item(username, ip): + cryptor = PyCrypt(KEY) + + asset = get_object(Asset, ip=ip) + port = asset.port + + if not asset.is_active: + raise ServerError('Host %s is not active.' % ip) + + user = get_object(User, username=username) + + if not user.is_active: + raise ServerError('User %s is not active.' % username) + + login_type_dict = { + 'L': user.ldap_pwd, + } + + if asset.login_type in login_type_dict: + password = cryptor.decrypt(login_type_dict[asset.login_type]) + return username, password, ip, port + + elif asset.login_type == 'M': + username = asset.username + password = cryptor.decrypt(asset.password) + return username, password, ip, port + + else: + raise ServerError('Login type is not in ["L", "M"]') + + +def verify_connect(username, part_ip): + hosts_attr = get_user_host(username) + hosts = hosts_attr.keys() + ip_matched = [ip for ip in hosts if part_ip in ip] + + if len(ip_matched) > 1: + for ip in ip_matched: + print '%s -- %s' % (ip, hosts_attr[ip][1]) + elif len(ip_matched) < 1: + color_print('No Permission or No host.', 'red') + else: + username, password, host, port = get_connect_item(username, ip_matched[0]) + print username, password, host, port + connect(username, password, host, port, LOGIN_NAME) + + +def print_prompt(): + msg = """\033[1;32m### Welcome Use JumpServer To Login. ### \033[0m + 1) Type \033[32mIP ADDRESS\033[0m To Login. + 2) Type \033[32mP/p\033[0m To Print The Servers You Available. + 3) Type \033[32mG/g\033[0m To Print The Server Groups You Available. + 4) Type \033[32mE/e\033[0m To Execute Command On Several Servers. + 5) Type \033[32mQ/q\033[0m To Quit. + """ + print textwrap.dedent(msg) + + +def print_user_host(username): + hosts_attr = get_user_host(username) + hosts = hosts_attr.keys() + hosts.sort() + for ip in hosts: + print '%s -- %s' % (ip, hosts_attr[ip][1]) + + +def print_user_hostgroup(username): + group_attr = get_user_hostgroup(username) + groups = group_attr.keys() + for g in groups: + print '%s -- %s' % (g, group_attr[g][1]) + + +def connect(username, password, host, port, login_name): + """ + Connect server. + """ + ps1 = "PS1='[\u@%s \W]\$ '\n" % host + login_msg = "clear;echo -e '\\033[32mLogin %s done. Enjoy it.\\033[0m'\n" % host + + # Make a ssh connection + ssh = paramiko.SSHClient() + ssh.load_system_host_keys() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + try: + ssh.connect(host, port=port, username=username, password=password, compress=True) + except paramiko.ssh_exception.AuthenticationException, paramiko.ssh_exception.SSHException: + raise ServerError('Authentication Error.') + except socket.error: + raise ServerError('Connect SSH Socket Port Error, Please Correct it.') + + # Make a channel and set windows size + global channel + win_size = get_win_size() + channel = ssh.invoke_shell(height=win_size[0], width=win_size[1]) + #channel.resize_pty(height=win_size[0], width=win_size[1]) + try: + signal.signal(signal.SIGWINCH, set_win_size) + except: + pass + + # Set PS1 and msg it + channel.send(ps1) + channel.send(login_msg) + + # Make ssh interactive tunnel + posix_shell(channel, login_name, host) + + # Shutdown channel socket + channel.close() + ssh.close() + + +def remote_exec_cmd(ip, port, username, password, cmd): + try: + time.sleep(5) + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(ip, port, username, password, timeout=5) + stdin, stdout, stderr = ssh.exec_command("bash -l -c '%s'" % cmd) + out = stdout.readlines() + err = stderr.readlines() + color_print('%s:' %ip, 'blue') + for i in out: + color_print(" " * 4 + i.strip(), 'green') + for j in err: + color_print(" " * 4 + j.strip(), 'red') + ssh.close() + except Exception as e: + color_print(ip + ':', 'blue') + color_print(str(e), 'red') + + +def multi_remote_exec_cmd(hosts, username, cmd): + pool = Pool(processes=5) + for host in hosts: + username, password, ip, port = get_connect_item(username, host) + pool.apply_async(remote_exec_cmd, (ip, port, username, password, cmd)) + pool.close() + pool.join() + + +def exec_cmd_servers(username): + hosts = [] + color_print("Input the Host IP(s),Separated by Commas, q/Q to Quit.\n \ + You can choose in the following IP(s), Use Linux / Unix glob.", 'green') + print_user_host(LOGIN_NAME) + while True: + inputs = raw_input('\033[1;32mip(s)>: \033[0m') + if inputs in ['q', 'Q']: + break + get_hosts = get_user_host(username).keys() + for host in get_hosts: + if fnmatch.fnmatch(host, inputs): + hosts.append(host.strip()) + if len(hosts) == 0: + color_print("Check again, Not matched any ip!", 'red') + continue + else: + print "You matched ip: %s" % hosts + color_print("Input the Command , The command will be Execute on servers, q/Q to quit.", 'green') + while True: + cmd = raw_input('\033[1;32mCmd(s): \033[0m') + if cmd in ['q', 'Q']: + break + exec_log_dir = os.path.join(LOG_DIR, 'exec_cmds') + if not os.path.isdir(exec_log_dir): + os.mkdir(exec_log_dir) + os.chmod(exec_log_dir, 0777) + filename = "%s/%s.log" % (exec_log_dir, time.strftime('%Y%m%d')) + f = open(filename, 'a') + f.write("DateTime: %s User: %s Host: %s Cmds: %s\n" % + (time.strftime('%Y/%m/%d %H:%M:%S'), username, hosts, cmd)) + multi_remote_exec_cmd(hosts, username, cmd) + + +def help(): + global p, options, arguments + usage = "usage: %prog '' [options] arg1 [options] arg2" + p = optparse.OptionParser(usage=usage) + p.add_option('-p', '--host', help = "Print The Servers You Available.") + p.add_option('-g', '--group', help = "Print The Server Groups You Available.") + options, arguments = p.parse_args() + + +def main(): + help() + if options.host: + pass + elif options.group: + pass + else: + try: + verify_connect(LOGIN_NAME, sys.argv[1]) + except ServerError, e: + color_print(e, 'red') + + +if __name__ == '__main__': + main() diff --git a/ssh.py b/ssh.py new file mode 100644 index 000000000..57836735b --- /dev/null +++ b/ssh.py @@ -0,0 +1,395 @@ +#!/usr/bin/env python + +import socket +import sys +import os +import ast +import select +import time +from datetime import datetime +import paramiko +import struct +import fcntl +import signal +import textwrap +import django +import getpass +import fnmatch +import optparse +import readline +from multiprocessing import Pool +from ConfigParser import ConfigParser +from django.core.exceptions import ObjectDoesNotExist + +os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings' +django.setup() +from juser.models import User +from jasset.models import Asset +from jlog.models import Log +from jumpserver.views import PyCrypt +from jumpserver.api import user_perm_asset_api, user_perm_group_api + +try: + import termios + import tty +except ImportError: + print '\033[1;31mOnly postfix supported.\033[0m' + time.sleep(3) + sys.exit() + +BASE_DIR = os.path.abspath(os.path.dirname(__file__)) +CONF = ConfigParser() +CONF.read(os.path.join(BASE_DIR, 'jumpserver.conf')) +LOG_DIR = os.path.join(BASE_DIR, 'logs') +SSH_KEY_DIR = os.path.join(BASE_DIR, 'keys') +SERVER_KEY_DIR = os.path.join(SSH_KEY_DIR, 'server') +KEY = CONF.get('web', 'key') +LOGIN_NAME = getpass.getuser() + + +def color_print(msg, color='blue'): + """Print colorful string.""" + color_msg = {'blue': '\033[1;36m%s\033[0m', + 'green': '\033[1;32m%s\033[0m', + 'red': '\033[1;31m%s\033[0m'} + + print color_msg.get(color, 'blue') % msg + + +def color_print_exit(msg, color='red'): + """Print colorful string and exit.""" + color_print(msg, color=color) + time.sleep(2) + sys.exit() + + +class ServerError(Exception): + pass + + +def get_win_size(): + """This function use to get the size of the windows!""" + if 'TIOCGWINSZ' in dir(termios): + TIOCGWINSZ = termios.TIOCGWINSZ + else: + TIOCGWINSZ = 1074295912L # Assume + s = struct.pack('HHHH', 0, 0, 0, 0) + x = fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ, s) + return struct.unpack('HHHH', x)[0:2] + + +def set_win_size(sig, data): + """This function use to set the window size of the terminal!""" + try: + win_size = get_win_size() + channel.resize_pty(height=win_size[0], width=win_size[1]) + except: + pass + + +def get_object(model, **kwargs): + try: + the_object = model.objects.get(**kwargs) + except ObjectDoesNotExist: + raise ServerError('Object get %s failed.' % str(kwargs.values())) + return the_object + + +def log_record(username, host): + """Logging user command and output.""" + connect_log_dir = os.path.join(LOG_DIR, 'connect') + timestamp_start = int(time.time()) + today = time.strftime('%Y%m%d', time.localtime(timestamp_start)) + time_now = time.strftime('%H%M%S', time.localtime(timestamp_start)) + today_connect_log_dir = os.path.join(connect_log_dir, today) + log_filename = '%s_%s_%s.log' % (username, host, time_now) + log_file_path = os.path.join(today_connect_log_dir, log_filename) + pid = os.getpid() + ip_list = [] + remote_ip = os.popen("who |grep `ps aux |gawk '{if ($2==%s) print $1}'` |gawk '{print $5}'|tr -d '()'" % pid).readlines() + for ip in remote_ip: + ip_list.append(ip.strip('\n')) + ip_list = ','.join(list(set(ip_list))) + + if not os.path.isdir(today_connect_log_dir): + try: + os.makedirs(today_connect_log_dir) + os.chmod(today_connect_log_dir, 0777) + except OSError: + raise ServerError('Create %s failed, Please modify %s permission.' % (today_connect_log_dir, connect_log_dir)) + + try: + log_file = open(log_file_path, 'a') + except IOError: + raise ServerError('Create logfile failed, Please modify %s permission.' % today_connect_log_dir) + + log = Log(user=username, host=host, remote_ip=ip_list, log_path=log_file_path, start_time=datetime.now(), pid=pid) + log_file.write('Starttime is %s\n' % datetime.now()) + log.save() + return log_file, log + + +def posix_shell(chan, username, host): + """ + Use paramiko channel connect server interactive. + """ + log_file, log = log_record(username, host) + old_tty = termios.tcgetattr(sys.stdin) + try: + tty.setraw(sys.stdin.fileno()) + tty.setcbreak(sys.stdin.fileno()) + chan.settimeout(0.0) + + while True: + try: + r, w, e = select.select([chan, sys.stdin], [], []) + except: + pass + + if chan in r: + try: + x = chan.recv(1024) + if len(x) == 0: + break + sys.stdout.write(x) + sys.stdout.flush() + log_file.write(x) + log_file.flush() + except socket.timeout: + pass + + if sys.stdin in r: + x = os.read(sys.stdin.fileno(), 1) + if len(x) == 0: + break + chan.send(x) + + finally: + timestamp_end = time.time() + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_tty) + log_file.write('Endtime is %s' % datetime.now()) + log_file.close() + log.is_finished = True + log.log_finished = False + log.end_time = datetime.now() + log.save() + + +def get_user_host(username): + """Get the hosts of under the user control.""" + hosts_attr = {} + asset_all = user_perm_asset_api(username) + for asset in asset_all: + hosts_attr[asset.ip] = [asset.id, asset.comment] + return hosts_attr + + +def get_user_hostgroup(username): + """Get the hostgroups of under the user control.""" + groups_attr = {} + group_all = user_perm_group_api(username) + for group in group_all: + groups_attr[group.name] = [group.id, group.comment] + return groups_attr + + +def get_connect_item(username, ip): + cryptor = PyCrypt(KEY) + + asset = get_object(Asset, ip=ip) + port = asset.port + + if not asset.is_active: + raise ServerError('Host %s is not active.' % ip) + + user = get_object(User, username=username) + + if not user.is_active: + raise ServerError('User %s is not active.' % username) + + login_type_dict = { + 'L': user.ldap_pwd, + } + + if asset.login_type in login_type_dict: + password = cryptor.decrypt(login_type_dict[asset.login_type]) + return username, password, ip, port + + elif asset.login_type == 'M': + username = asset.username + password = cryptor.decrypt(asset.password) + return username, password, ip, port + + else: + raise ServerError('Login type is not in ["L", "M"]') + + +def verify_connect(username, part_ip): + hosts_attr = get_user_host(username) + hosts = hosts_attr.keys() + ip_matched = [ip for ip in hosts if part_ip in ip] + + if len(ip_matched) > 1: + for ip in ip_matched: + print '%s -- %s' % (ip, hosts_attr[ip][1]) + elif len(ip_matched) < 1: + color_print('No Permission or No host.', 'red') + else: + username, password, host, port = get_connect_item(username, ip_matched[0]) + print username, password, host, port + connect(username, password, host, port, LOGIN_NAME) + + +def print_prompt(): + msg = """\033[1;32m### Welcome Use JumpServer To Login. ### \033[0m + 1) Type \033[32mIP ADDRESS\033[0m To Login. + 2) Type \033[32mP/p\033[0m To Print The Servers You Available. + 3) Type \033[32mG/g\033[0m To Print The Server Groups You Available. + 4) Type \033[32mE/e\033[0m To Execute Command On Several Servers. + 5) Type \033[32mQ/q\033[0m To Quit. + """ + print textwrap.dedent(msg) + + +def print_user_host(username): + hosts_attr = get_user_host(username) + hosts = hosts_attr.keys() + hosts.sort() + for ip in hosts: + print '%s -- %s' % (ip, hosts_attr[ip][1]) + + +def print_user_hostgroup(username): + group_attr = get_user_hostgroup(username) + groups = group_attr.keys() + for g in groups: + print '%s -- %s' % (g, group_attr[g][1]) + + +def connect(username, password, host, port, login_name): + """ + Connect server. + """ + ps1 = "PS1='[\u@%s \W]\$ '\n" % host + login_msg = "clear;echo -e '\\033[32mLogin %s done. Enjoy it.\\033[0m'\n" % host + + # Make a ssh connection + ssh = paramiko.SSHClient() + ssh.load_system_host_keys() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + try: + ssh.connect(host, port=port, username=username, password=password, compress=True) + except paramiko.ssh_exception.AuthenticationException, paramiko.ssh_exception.SSHException: + raise ServerError('Authentication Error.') + except socket.error: + raise ServerError('Connect SSH Socket Port Error, Please Correct it.') + + # Make a channel and set windows size + global channel + win_size = get_win_size() + channel = ssh.invoke_shell(height=win_size[0], width=win_size[1]) + #channel.resize_pty(height=win_size[0], width=win_size[1]) + try: + signal.signal(signal.SIGWINCH, set_win_size) + except: + pass + + # Set PS1 and msg it + channel.send(ps1) + channel.send(login_msg) + + # Make ssh interactive tunnel + posix_shell(channel, login_name, host) + + # Shutdown channel socket + channel.close() + ssh.close() + + +def remote_exec_cmd(ip, port, username, password, cmd): + try: + time.sleep(5) + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(ip, port, username, password, timeout=5) + stdin, stdout, stderr = ssh.exec_command("bash -l -c '%s'" % cmd) + out = stdout.readlines() + err = stderr.readlines() + color_print('%s:' %ip, 'blue') + for i in out: + color_print(" " * 4 + i.strip(), 'green') + for j in err: + color_print(" " * 4 + j.strip(), 'red') + ssh.close() + except Exception as e: + color_print(ip + ':', 'blue') + color_print(str(e), 'red') + + +def multi_remote_exec_cmd(hosts, username, cmd): + pool = Pool(processes=5) + for host in hosts: + username, password, ip, port = get_connect_item(username, host) + pool.apply_async(remote_exec_cmd, (ip, port, username, password, cmd)) + pool.close() + pool.join() + + +def exec_cmd_servers(username): + hosts = [] + color_print("Input the Host IP(s),Separated by Commas, q/Q to Quit.\n \ + You can choose in the following IP(s), Use Linux / Unix glob.", 'green') + print_user_host(LOGIN_NAME) + while True: + inputs = raw_input('\033[1;32mip(s)>: \033[0m') + if inputs in ['q', 'Q']: + break + get_hosts = get_user_host(username).keys() + for host in get_hosts: + if fnmatch.fnmatch(host, inputs): + hosts.append(host.strip()) + if len(hosts) == 0: + color_print("Check again, Not matched any ip!", 'red') + continue + else: + print "You matched ip: %s" % hosts + color_print("Input the Command , The command will be Execute on servers, q/Q to quit.", 'green') + while True: + cmd = raw_input('\033[1;32mCmd(s): \033[0m') + if cmd in ['q', 'Q']: + break + exec_log_dir = os.path.join(LOG_DIR, 'exec_cmds') + if not os.path.isdir(exec_log_dir): + os.mkdir(exec_log_dir) + os.chmod(exec_log_dir, 0777) + filename = "%s/%s.log" % (exec_log_dir, time.strftime('%Y%m%d')) + f = open(filename, 'a') + f.write("DateTime: %s User: %s Host: %s Cmds: %s\n" % + (time.strftime('%Y/%m/%d %H:%M:%S'), username, hosts, cmd)) + multi_remote_exec_cmd(hosts, username, cmd) + + +def help(): + global p, options, arguments + usage = "usage: %prog '' [options] arg1 [options] arg2" + p = optparse.OptionParser(usage=usage) + p.add_option('-p', '--host', help = "Print The Servers You Available.") + p.add_option('-g', '--group', help = "Print The Server Groups You Available.") + options, arguments = p.parse_args() + + +def main(): + help() + if options.host: + pass + elif options.group: + pass + else: + try: + verify_connect(LOGIN_NAME, sys.argv[1]) + except ServerError, e: + color_print(e, 'red') + + +if __name__ == '__main__': + main() diff --git a/static/css/animate.css b/static/css/animate.css new file mode 100644 index 000000000..0f9fba11e --- /dev/null +++ b/static/css/animate.css @@ -0,0 +1,2848 @@ +@charset "UTF-8"; + +/*! +Animate.css - http://daneden.me/animate +Licensed under the MIT license + +Copyright (c) 2013 Daniel Eden + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + z-index: 100; +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} + +.animated.hinge { + -webkit-animation-duration: 2s; + animation-duration: 2s; +} + +@-webkit-keyframes bounce { + 0%, 20%, 50%, 80%, 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 40% { + -webkit-transform: translateY(-30px); + transform: translateY(-30px); + } + + 60% { + -webkit-transform: translateY(-15px); + transform: translateY(-15px); + } +} + +@keyframes bounce { + 0%, 20%, 50%, 80%, 100% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 40% { + -webkit-transform: translateY(-30px); + -ms-transform: translateY(-30px); + transform: translateY(-30px); + } + + 60% { + -webkit-transform: translateY(-15px); + -ms-transform: translateY(-15px); + transform: translateY(-15px); + } +} + +.bounce { + -webkit-animation-name: bounce; + animation-name: bounce; +} + +@-webkit-keyframes flash { + 0%, 50%, 100% { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +@keyframes flash { + 0%, 50%, 100% { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +.flash { + -webkit-animation-name: flash; + animation-name: flash; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 50% { + -webkit-transform: scale(1.1); + transform: scale(1.1); + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes pulse { + 0% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + + 50% { + -webkit-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); + } + + 100% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} + +.pulse { + -webkit-animation-name: pulse; + animation-name: pulse; +} + +@-webkit-keyframes rubberBand { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 30% { + -webkit-transform: scaleX(1.25) scaleY(0.75); + transform: scaleX(1.25) scaleY(0.75); + } + + 40% { + -webkit-transform: scaleX(0.75) scaleY(1.25); + transform: scaleX(0.75) scaleY(1.25); + } + + 60% { + -webkit-transform: scaleX(1.15) scaleY(0.85); + transform: scaleX(1.15) scaleY(0.85); + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes rubberBand { + 0% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + + 30% { + -webkit-transform: scaleX(1.25) scaleY(0.75); + -ms-transform: scaleX(1.25) scaleY(0.75); + transform: scaleX(1.25) scaleY(0.75); + } + + 40% { + -webkit-transform: scaleX(0.75) scaleY(1.25); + -ms-transform: scaleX(0.75) scaleY(1.25); + transform: scaleX(0.75) scaleY(1.25); + } + + 60% { + -webkit-transform: scaleX(1.15) scaleY(0.85); + -ms-transform: scaleX(1.15) scaleY(0.85); + transform: scaleX(1.15) scaleY(0.85); + } + + 100% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} + +.rubberBand { + -webkit-animation-name: rubberBand; + animation-name: rubberBand; +} + +@-webkit-keyframes shake { + 0%, 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } +} + +@keyframes shake { + 0%, 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translateX(-10px); + -ms-transform: translateX(-10px); + transform: translateX(-10px); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translateX(10px); + -ms-transform: translateX(10px); + transform: translateX(10px); + } +} + +.shake { + -webkit-animation-name: shake; + animation-name: shake; +} + +@-webkit-keyframes swing { + 20% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); + } + + 40% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg); + } + + 60% { + -webkit-transform: rotate(5deg); + transform: rotate(5deg); + } + + 80% { + -webkit-transform: rotate(-5deg); + transform: rotate(-5deg); + } + + 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} + +@keyframes swing { + 20% { + -webkit-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 40% { + -webkit-transform: rotate(-10deg); + -ms-transform: rotate(-10deg); + transform: rotate(-10deg); + } + + 60% { + -webkit-transform: rotate(5deg); + -ms-transform: rotate(5deg); + transform: rotate(5deg); + } + + 80% { + -webkit-transform: rotate(-5deg); + -ms-transform: rotate(-5deg); + transform: rotate(-5deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } +} + +.swing { + -webkit-transform-origin: top center; + -ms-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing; +} + +@-webkit-keyframes tada { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 10%, 20% { + -webkit-transform: scale(0.9) rotate(-3deg); + transform: scale(0.9) rotate(-3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale(1.1) rotate(-3deg); + transform: scale(1.1) rotate(-3deg); + } + + 100% { + -webkit-transform: scale(1) rotate(0); + transform: scale(1) rotate(0); + } +} + +@keyframes tada { + 0% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + + 10%, 20% { + -webkit-transform: scale(0.9) rotate(-3deg); + -ms-transform: scale(0.9) rotate(-3deg); + transform: scale(0.9) rotate(-3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale(1.1) rotate(3deg); + -ms-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale(1.1) rotate(-3deg); + -ms-transform: scale(1.1) rotate(-3deg); + transform: scale(1.1) rotate(-3deg); + } + + 100% { + -webkit-transform: scale(1) rotate(0); + -ms-transform: scale(1) rotate(0); + transform: scale(1) rotate(0); + } +} + +.tada { + -webkit-animation-name: tada; + animation-name: tada; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + 0% { + -webkit-transform: translateX(0%); + transform: translateX(0%); + } + + 15% { + -webkit-transform: translateX(-25%) rotate(-5deg); + transform: translateX(-25%) rotate(-5deg); + } + + 30% { + -webkit-transform: translateX(20%) rotate(3deg); + transform: translateX(20%) rotate(3deg); + } + + 45% { + -webkit-transform: translateX(-15%) rotate(-3deg); + transform: translateX(-15%) rotate(-3deg); + } + + 60% { + -webkit-transform: translateX(10%) rotate(2deg); + transform: translateX(10%) rotate(2deg); + } + + 75% { + -webkit-transform: translateX(-5%) rotate(-1deg); + transform: translateX(-5%) rotate(-1deg); + } + + 100% { + -webkit-transform: translateX(0%); + transform: translateX(0%); + } +} + +@keyframes wobble { + 0% { + -webkit-transform: translateX(0%); + -ms-transform: translateX(0%); + transform: translateX(0%); + } + + 15% { + -webkit-transform: translateX(-25%) rotate(-5deg); + -ms-transform: translateX(-25%) rotate(-5deg); + transform: translateX(-25%) rotate(-5deg); + } + + 30% { + -webkit-transform: translateX(20%) rotate(3deg); + -ms-transform: translateX(20%) rotate(3deg); + transform: translateX(20%) rotate(3deg); + } + + 45% { + -webkit-transform: translateX(-15%) rotate(-3deg); + -ms-transform: translateX(-15%) rotate(-3deg); + transform: translateX(-15%) rotate(-3deg); + } + + 60% { + -webkit-transform: translateX(10%) rotate(2deg); + -ms-transform: translateX(10%) rotate(2deg); + transform: translateX(10%) rotate(2deg); + } + + 75% { + -webkit-transform: translateX(-5%) rotate(-1deg); + -ms-transform: translateX(-5%) rotate(-1deg); + transform: translateX(-5%) rotate(-1deg); + } + + 100% { + -webkit-transform: translateX(0%); + -ms-transform: translateX(0%); + transform: translateX(0%); + } +} + +.wobble { + -webkit-animation-name: wobble; + animation-name: wobble; +} + +@-webkit-keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.3); + transform: scale(.3); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.05); + transform: scale(1.05); + } + + 70% { + -webkit-transform: scale(.9); + transform: scale(.9); + } + + 100% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.3); + -ms-transform: scale(.3); + transform: scale(.3); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.05); + -ms-transform: scale(1.05); + transform: scale(1.05); + } + + 70% { + -webkit-transform: scale(.9); + -ms-transform: scale(.9); + transform: scale(.9); + } + + 100% { + opacity: 1; + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} + +.bounceIn { + -webkit-animation-name: bounceIn; + animation-name: bounceIn; +} + +@-webkit-keyframes bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(30px); + transform: translateY(30px); + } + + 80% { + -webkit-transform: translateY(-10px); + transform: translateY(-10px); + } + + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(30px); + -ms-transform: translateY(30px); + transform: translateY(30px); + } + + 80% { + -webkit-transform: translateY(-10px); + -ms-transform: translateY(-10px); + transform: translateY(-10px); + } + + 100% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} + +.bounceInDown { + -webkit-animation-name: bounceInDown; + animation-name: bounceInDown; +} + +@-webkit-keyframes bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(30px); + transform: translateX(30px); + } + + 80% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(30px); + -ms-transform: translateX(30px); + transform: translateX(30px); + } + + 80% { + -webkit-transform: translateX(-10px); + -ms-transform: translateX(-10px); + transform: translateX(-10px); + } + + 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} + +@-webkit-keyframes bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(-30px); + transform: translateX(-30px); + } + + 80% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(-30px); + -ms-transform: translateX(-30px); + transform: translateX(-30px); + } + + 80% { + -webkit-transform: translateX(10px); + -ms-transform: translateX(10px); + transform: translateX(10px); + } + + 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.bounceInRight { + -webkit-animation-name: bounceInRight; + animation-name: bounceInRight; +} + +@-webkit-keyframes bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(-30px); + transform: translateY(-30px); + } + + 80% { + -webkit-transform: translateY(10px); + transform: translateY(10px); + } + + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + -ms-transform: translateY(2000px); + transform: translateY(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(-30px); + -ms-transform: translateY(-30px); + transform: translateY(-30px); + } + + 80% { + -webkit-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + + 100% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} + +.bounceInUp { + -webkit-animation-name: bounceInUp; + animation-name: bounceInUp; +} + +@-webkit-keyframes bounceOut { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 25% { + -webkit-transform: scale(.95); + transform: scale(.95); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.1); + transform: scale(1.1); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.3); + transform: scale(.3); + } +} + +@keyframes bounceOut { + 0% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + + 25% { + -webkit-transform: scale(.95); + -ms-transform: scale(.95); + transform: scale(.95); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.3); + -ms-transform: scale(.3); + transform: scale(.3); + } +} + +.bounceOut { + -webkit-animation-name: bounceOut; + animation-name: bounceOut; +} + +@-webkit-keyframes bounceOutDown { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +@keyframes bounceOutDown { + 0% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + -ms-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} + +@-webkit-keyframes bounceOutLeft { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(20px); + transform: translateX(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +@keyframes bounceOutLeft { + 0% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(20px); + -ms-transform: translateX(20px); + transform: translateX(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} + +@-webkit-keyframes bounceOutRight { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +@keyframes bounceOutRight { + 0% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(-20px); + -ms-transform: translateX(-20px); + transform: translateX(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} + +@-webkit-keyframes bounceOutUp { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(20px); + transform: translateY(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} + +@keyframes bounceOutUp { + 0% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(20px); + -ms-transform: translateY(20px); + transform: translateY(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} + +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} + +@-webkit-keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} + +@-webkit-keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} + +@-webkit-keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} + +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} + +@-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-20px); + -ms-transform: translateX(-20px); + transform: translateX(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} + +@-webkit-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} + +@-webkit-keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(20px); + transform: translateX(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(40px); + -ms-transform: translateX(40px); + transform: translateX(40px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} + +@-webkit-keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} + +@-webkit-keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(20px); + transform: translateY(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(20px); + -ms-transform: translateY(20px); + transform: translateY(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} + +@-webkit-keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + -ms-transform: translateY(2000px); + transform: translateY(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} + +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} + +@-webkit-keyframes fadeOut { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +@keyframes fadeOut { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +@-webkit-keyframes fadeOutDown { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(20px); + transform: translateY(20px); + } +} + +@keyframes fadeOutDown { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(20px); + -ms-transform: translateY(20px); + transform: translateY(20px); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} + +@-webkit-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +@keyframes fadeOutDownBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + -ms-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} + +@-webkit-keyframes fadeOutLeft { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + } +} + +@keyframes fadeOutLeft { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-20px); + -ms-transform: translateX(-20px); + transform: translateX(-20px); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} + +@-webkit-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +@keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} + +@-webkit-keyframes fadeOutRight { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(20px); + transform: translateX(20px); + } +} + +@keyframes fadeOutRight { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(20px); + -ms-transform: translateX(20px); + transform: translateX(20px); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} + +@-webkit-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +@keyframes fadeOutRightBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} + +@-webkit-keyframes fadeOutUp { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + } +} + +@keyframes fadeOutUp { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} + +@-webkit-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} + +@keyframes fadeOutUpBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} + +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} + +@-webkit-keyframes flip { + 0% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 100% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +@keyframes flip { + 0% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -ms-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 100% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible; + -ms-backface-visibility: visible; + backface-visibility: visible; + -webkit-animation-name: flip; + animation-name: flip; +} + +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateX(-10deg); + transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateX(10deg); + transform: perspective(400px) rotateX(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} + +@keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotateX(90deg); + -ms-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateX(-10deg); + -ms-transform: perspective(400px) rotateX(-10deg); + transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateX(10deg); + -ms-transform: perspective(400px) rotateX(10deg); + transform: perspective(400px) rotateX(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateX(0deg); + -ms-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + -ms-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInX; + animation-name: flipInX; +} + +@-webkit-keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateY(-10deg); + transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateY(10deg); + transform: perspective(400px) rotateY(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} + +@keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotateY(90deg); + -ms-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateY(-10deg); + -ms-transform: perspective(400px) rotateY(-10deg); + transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateY(10deg); + -ms-transform: perspective(400px) rotateY(10deg); + transform: perspective(400px) rotateY(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateY(0deg); + -ms-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + -ms-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInY; + animation-name: flipInY; +} + +@-webkit-keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px) rotateX(0deg); + -ms-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotateX(90deg); + -ms-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +.flipOutX { + -webkit-animation-name: flipOutX; + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + -ms-backface-visibility: visible !important; + backface-visibility: visible !important; +} + +@-webkit-keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} + +@keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px) rotateY(0deg); + -ms-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotateY(90deg); + -ms-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-backface-visibility: visible !important; + -ms-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + animation-name: flipOutY; +} + +@-webkit-keyframes lightSpeedIn { + 0% { + -webkit-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: translateX(-20%) skewX(30deg); + transform: translateX(-20%) skewX(30deg); + opacity: 1; + } + + 80% { + -webkit-transform: translateX(0%) skewX(-15deg); + transform: translateX(0%) skewX(-15deg); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + opacity: 1; + } +} + +@keyframes lightSpeedIn { + 0% { + -webkit-transform: translateX(100%) skewX(-30deg); + -ms-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: translateX(-20%) skewX(30deg); + -ms-transform: translateX(-20%) skewX(30deg); + transform: translateX(-20%) skewX(30deg); + opacity: 1; + } + + 80% { + -webkit-transform: translateX(0%) skewX(-15deg); + -ms-transform: translateX(0%) skewX(-15deg); + transform: translateX(0%) skewX(-15deg); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(0%) skewX(0deg); + -ms-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + opacity: 1; + } +} + +.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} + +@-webkit-keyframes lightSpeedOut { + 0% { + -webkit-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + opacity: 0; + } +} + +@keyframes lightSpeedOut { + 0% { + -webkit-transform: translateX(0%) skewX(0deg); + -ms-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(100%) skewX(-30deg); + -ms-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + opacity: 0; + } +} + +.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} + +@-webkit-keyframes rotateIn { + 0% { + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(-200deg); + transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateIn { + 0% { + -webkit-transform-origin: center center; + -ms-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(-200deg); + -ms-transform: rotate(-200deg); + transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: center center; + -ms-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +.rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn; +} + +@-webkit-keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} + +@-webkit-keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} + +@-webkit-keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} + +@-webkit-keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} + +@-webkit-keyframes rotateOut { + 0% { + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(200deg); + transform: rotate(200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + 0% { + -webkit-transform-origin: center center; + -ms-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: center center; + -ms-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(200deg); + -ms-transform: rotate(200deg); + transform: rotate(200deg); + opacity: 0; + } +} + +.rotateOut { + -webkit-animation-name: rotateOut; + animation-name: rotateOut; +} + +@-webkit-keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} + +@-webkit-keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } +} + +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} + +@-webkit-keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} + +@-webkit-keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} + +@-webkit-keyframes slideInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } + + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes slideInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } + + 100% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} + +.slideInDown { + -webkit-animation-name: slideInDown; + animation-name: slideInDown; +} + +@-webkit-keyframes slideInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } + + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes slideInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } + + 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.slideInLeft { + -webkit-animation-name: slideInLeft; + animation-name: slideInLeft; +} + +@-webkit-keyframes slideInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } + + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes slideInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } + + 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.slideInRight { + -webkit-animation-name: slideInRight; + animation-name: slideInRight; +} + +@-webkit-keyframes slideOutLeft { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +@keyframes slideOutLeft { + 0% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} + +@-webkit-keyframes slideOutRight { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +@keyframes slideOutRight { + 0% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +.slideOutRight { + -webkit-animation-name: slideOutRight; + animation-name: slideOutRight; +} + +@-webkit-keyframes slideOutUp { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} + +@keyframes slideOutUp { + 0% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} + +.slideOutUp { + -webkit-animation-name: slideOutUp; + animation-name: slideOutUp; +} + +@-webkit-keyframes slideOutDown { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +@keyframes slideOutDown { + 0% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + -ms-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +.slideOutDown { + -webkit-animation-name: slideOutDown; + animation-name: slideOutDown; +} + +@-webkit-keyframes hinge { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + -webkit-transform: rotate(80deg); + transform: rotate(80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40% { + -webkit-transform: rotate(60deg); + transform: rotate(60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 80% { + -webkit-transform: rotate(60deg) translateY(0); + transform: rotate(60deg) translateY(0); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + 100% { + -webkit-transform: translateY(700px); + transform: translateY(700px); + opacity: 0; + } +} + +@keyframes hinge { + 0% { + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + -webkit-transform-origin: top left; + -ms-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + -webkit-transform: rotate(80deg); + -ms-transform: rotate(80deg); + transform: rotate(80deg); + -webkit-transform-origin: top left; + -ms-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40% { + -webkit-transform: rotate(60deg); + -ms-transform: rotate(60deg); + transform: rotate(60deg); + -webkit-transform-origin: top left; + -ms-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 80% { + -webkit-transform: rotate(60deg) translateY(0); + -ms-transform: rotate(60deg) translateY(0); + transform: rotate(60deg) translateY(0); + -webkit-transform-origin: top left; + -ms-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + 100% { + -webkit-transform: translateY(700px); + -ms-transform: translateY(700px); + transform: translateY(700px); + opacity: 0; + } +} + +.hinge { + -webkit-animation-name: hinge; + animation-name: hinge; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + 0% { + opacity: 0; + -webkit-transform: translateX(-100%) rotate(-120deg); + transform: translateX(-100%) rotate(-120deg); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } +} + +@keyframes rollIn { + 0% { + opacity: 0; + -webkit-transform: translateX(-100%) rotate(-120deg); + -ms-transform: translateX(-100%) rotate(-120deg); + transform: translateX(-100%) rotate(-120deg); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + -ms-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } +} + +.rollIn { + -webkit-animation-name: rollIn; + animation-name: rollIn; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + 0% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(100%) rotate(120deg); + transform: translateX(100%) rotate(120deg); + } +} + +@keyframes rollOut { + 0% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + -ms-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(100%) rotate(120deg); + -ms-transform: translateX(100%) rotate(120deg); + transform: translateX(100%) rotate(120deg); + } +} + +.rollOut { + -webkit-animation-name: rollOut; + animation-name: rollOut; +} \ No newline at end of file diff --git a/static/css/bootstrap.min.css b/static/css/bootstrap.min.css new file mode 100644 index 000000000..4af8905e5 --- /dev/null +++ b/static/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.0 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:before,:after{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px;line-height:1.5 \0}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px;line-height:1.33 \0}_:-ms-fullscreen,:root input[type=date],_:-ms-fullscreen,:root input[type=time],_:-ms-fullscreen,:root input[type=datetime-local],_:-ms-fullscreen,:root input[type=month]{line-height:1.42857143}_:-ms-fullscreen.input-sm,:root input[type=date].input-sm,_:-ms-fullscreen.input-sm,:root input[type=time].input-sm,_:-ms-fullscreen.input-sm,:root input[type=datetime-local].input-sm,_:-ms-fullscreen.input-sm,:root input[type=month].input-sm{line-height:1.5}_:-ms-fullscreen.input-lg,:root input[type=date].input-lg,_:-ms-fullscreen.input-lg,:root input[type=time].input-lg,_:-ms-fullscreen.input-lg,:root input[type=datetime-local].input-lg,_:-ms-fullscreen.input-lg,:root input[type=month].input-lg{line-height:1.33}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#428bca;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=radio],[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important;visibility:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#428bca;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-right:15px;padding-left:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/static/css/colorbox.css b/static/css/colorbox.css new file mode 100644 index 000000000..0a6710404 --- /dev/null +++ b/static/css/colorbox.css @@ -0,0 +1,50 @@ +/* + Colorbox Core Style: + The following CSS is consistent between example themes and should not be altered. +*/ +#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;} +#cboxWrapper {max-width:none;} +#cboxOverlay{position:fixed; width:100%; height:100%;} +#cboxMiddleLeft, #cboxBottomLeft{clear:left;} +#cboxContent{position:relative;} +#cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;} +#cboxTitle{margin:0;} +#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;} +#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;} +.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;} +.cboxIframe{width:100%; height:100%; display:block; border:0; padding:0; margin:0;} +#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;} + +/* + User Style: + Change the following styles to modify the appearance of Colorbox. They are + ordered & tabbed in a way that represents the nesting of the generated HTML. +*/ +#cboxOverlay{background:#fff; opacity: 0.9; filter: alpha(opacity = 90);} +#colorbox{outline:0;} + #cboxContent{margin-top:32px; overflow:visible; background:#000;} + .cboxIframe{background:#fff;} + #cboxError{padding:50px; border:1px solid #ccc;} + #cboxLoadedContent{background:#000; padding:1px;} + #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;} + #cboxLoadingOverlay{background:#000;} + #cboxTitle{position:absolute; top:-22px; left:0; color:#000;} + #cboxCurrent{position:absolute; top:-22px; right:205px; text-indent:-9999px;} + + /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */ + #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; text-indent:-9999px; width:20px; height:20px; position:absolute; top:-20px; background:url(images/controls.png) no-repeat 0 0;} + + /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */ + #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;} + + #cboxPrevious{background-position:0px 0px; right:44px;} + #cboxPrevious:hover{background-position:0px -25px;} + #cboxNext{background-position:-25px 0px; right:22px;} + #cboxNext:hover{background-position:-25px -25px;} + #cboxClose{background-position:-50px 0px; right:0;} + #cboxClose:hover{background-position:-50px -25px;} + .cboxSlideshow_on #cboxPrevious, .cboxSlideshow_off #cboxPrevious{right:66px;} + .cboxSlideshow_on #cboxSlideshow{background-position:-75px -25px; right:44px;} + .cboxSlideshow_on #cboxSlideshow:hover{background-position:-100px -25px;} + .cboxSlideshow_off #cboxSlideshow{background-position:-100px 0px; right:44px;} + .cboxSlideshow_off #cboxSlideshow:hover{background-position:-75px -25px;} diff --git a/static/css/images/controls.png b/static/css/images/controls.png new file mode 100644 index 0000000000000000000000000000000000000000..36f5269929f735d3d3d14424f03fd7f3010045c7 GIT binary patch literal 503 zcmVQvGG};B5A2d>; z`je}=1^Jhm`qW>d=5@(X;wfqp5zC7xY5KLHsKHI)ugz!V^z|WQ5G@grgb<^mpB`H} zW~d_aZoY|?qhnAH9ubM?Q+{M8B1Eja$*vFiawj$>< zcl;^3jy`qk{QLUWuSQZQ=j@%)I5_6g@dSx z);f7w8#O&GAZlPy__Uae1XCY6Ako4ARxAK3dN9z^Aww0Bck@k7Ia&vGG5}z${g5Ad z{MiD4x|{48%9o(%@R3Gz2PL<@OID4C8ZWh$*srh9)Zg$ybRA6W*4^*xOTRAkPN%^q zZ-Ek=bK*L>?9gA*5*_QWl5aNqSGE@Kn002ovPDHLkV1k`%>Zt$# literal 0 HcmV?d00001 diff --git a/static/css/images/loading.gif b/static/css/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..a32df5c0881b563e18f3660758009a4aec47a5a0 GIT binary patch literal 6244 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 literal 0 HcmV?d00001 diff --git a/static/css/magnific/magnific-popup.css b/static/css/magnific/magnific-popup.css new file mode 100644 index 000000000..a530c65ae --- /dev/null +++ b/static/css/magnific/magnific-popup.css @@ -0,0 +1,374 @@ +/* Magnific Popup CSS */ +.mfp-bg { + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1042; + overflow: hidden; + position: fixed; + background: #0b0b0b; + opacity: 0.8; + filter: alpha(opacity=80); } + +.mfp-wrap { + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1043; + position: fixed; + outline: none !important; + -webkit-backface-visibility: hidden; } + +.mfp-container { + text-align: center; + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + padding: 0 8px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +.mfp-container:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; } + +.mfp-align-top .mfp-container:before { + display: none; } + +.mfp-content { + position: relative; + display: inline-block; + vertical-align: middle; + margin: 0 auto; + text-align: left; + z-index: 1045; } + +.mfp-inline-holder .mfp-content, .mfp-ajax-holder .mfp-content { + width: 100%; + cursor: auto; } + +.mfp-ajax-cur { + cursor: progress; } + +.mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close { + cursor: -moz-zoom-out; + cursor: -webkit-zoom-out; + cursor: zoom-out; } + +.mfp-zoom { + cursor: pointer; + cursor: -webkit-zoom-in; + cursor: -moz-zoom-in; + cursor: zoom-in; } + +.mfp-auto-cursor .mfp-content { + cursor: auto; } + +.mfp-close, .mfp-arrow, .mfp-preloader, .mfp-counter { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; } + +.mfp-loading.mfp-figure { + display: none; } + +.mfp-hide { + display: none !important; } + +.mfp-preloader { + color: #CCC; + position: absolute; + top: 50%; + width: auto; + text-align: center; + margin-top: -0.8em; + left: 8px; + right: 8px; + z-index: 1044; } + .mfp-preloader a { + color: #CCC; } + .mfp-preloader a:hover { + color: #FFF; } + +.mfp-s-ready .mfp-preloader { + display: none; } + +.mfp-s-error .mfp-content { + display: none; } + +button.mfp-close, button.mfp-arrow { + overflow: visible; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + display: block; + outline: none; + padding: 0; + z-index: 1046; + -webkit-box-shadow: none; + box-shadow: none; } +button::-moz-focus-inner { + padding: 0; + border: 0; } + +.mfp-close { + width: 44px; + height: 44px; + line-height: 44px; + position: absolute; + right: 0; + top: 0; + text-decoration: none; + text-align: center; + opacity: 0.65; + filter: alpha(opacity=65); + padding: 0 0 18px 10px; + color: #FFF; + font-style: normal; + font-size: 28px; + font-family: Arial, Baskerville, monospace; } + .mfp-close:hover, .mfp-close:focus { + opacity: 1; + filter: alpha(opacity=100); } + .mfp-close:active { + top: 1px; } + +.mfp-close-btn-in .mfp-close { + color: #333; } + +.mfp-image-holder .mfp-close, .mfp-iframe-holder .mfp-close { + color: #FFF; + right: -6px; + text-align: right; + padding-right: 6px; + width: 100%; } + +.mfp-counter { + position: absolute; + top: 0; + right: 0; + color: #CCC; + font-size: 12px; + line-height: 18px; + white-space: nowrap; } + +.mfp-arrow { + position: absolute; + opacity: 0.65; + filter: alpha(opacity=65); + margin: 0; + top: 50%; + margin-top: -55px; + padding: 0; + width: 90px; + height: 110px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + .mfp-arrow:active { + margin-top: -54px; } + .mfp-arrow:hover, .mfp-arrow:focus { + opacity: 1; + filter: alpha(opacity=100); } + .mfp-arrow:before, .mfp-arrow:after, .mfp-arrow .mfp-b, .mfp-arrow .mfp-a { + content: ''; + display: block; + width: 0; + height: 0; + position: absolute; + left: 0; + top: 0; + margin-top: 35px; + margin-left: 35px; + border: medium inset transparent; } + .mfp-arrow:after, .mfp-arrow .mfp-a { + border-top-width: 13px; + border-bottom-width: 13px; + top: 8px; } + .mfp-arrow:before, .mfp-arrow .mfp-b { + border-top-width: 21px; + border-bottom-width: 21px; + opacity: 0.7; } + +.mfp-arrow-left { + left: 0; } + .mfp-arrow-left:after, .mfp-arrow-left .mfp-a { + border-right: 17px solid #FFF; + margin-left: 31px; } + .mfp-arrow-left:before, .mfp-arrow-left .mfp-b { + margin-left: 25px; + border-right: 27px solid #3F3F3F; } + +.mfp-arrow-right { + right: 0; } + .mfp-arrow-right:after, .mfp-arrow-right .mfp-a { + border-left: 17px solid #FFF; + margin-left: 39px; } + .mfp-arrow-right:before, .mfp-arrow-right .mfp-b { + border-left: 27px solid #3F3F3F; } + +.mfp-iframe-holder { + padding-top: 40px; + padding-bottom: 40px; } + .mfp-iframe-holder .mfp-content { + line-height: 0; + width: 100%; + max-width: 900px; } + .mfp-iframe-holder .mfp-close { + top: -40px; } + +.mfp-iframe-scaler { + width: 100%; + height: 0; + overflow: hidden; + padding-top: 56.25%; } + .mfp-iframe-scaler iframe { + position: absolute; + display: block; + top: 0; + left: 0; + width: 100%; + height: 100%; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); + background: #000; } + +/* Main image in popup */ +img.mfp-img { + width: auto; + max-width: 100%; + height: auto; + display: block; + line-height: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 40px 0 40px; + margin: 0 auto; } + +/* The shadow behind the image */ +.mfp-figure { + line-height: 0; } + .mfp-figure:after { + content: ''; + position: absolute; + left: 0; + top: 40px; + bottom: 40px; + display: block; + right: 0; + width: auto; + height: auto; + z-index: -1; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); + background: #444; } + .mfp-figure small { + color: #BDBDBD; + display: block; + font-size: 12px; + line-height: 14px; } + .mfp-figure figure { + margin: 0; } + +.mfp-bottom-bar { + margin-top: -36px; + position: absolute; + top: 100%; + left: 0; + width: 100%; + cursor: auto; } + +.mfp-title { + text-align: left; + line-height: 18px; + color: #F3F3F3; + word-wrap: break-word; + padding-right: 36px; } + +.mfp-image-holder .mfp-content { + max-width: 100%; } + +.mfp-gallery .mfp-image-holder .mfp-figure { + cursor: pointer; } + +@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) { + /** + * Remove all paddings around the image on small screen + */ + .mfp-img-mobile .mfp-image-holder { + padding-left: 0; + padding-right: 0; } + .mfp-img-mobile img.mfp-img { + padding: 0; } + .mfp-img-mobile .mfp-figure:after { + top: 0; + bottom: 0; } + .mfp-img-mobile .mfp-figure small { + display: inline; + margin-left: 5px; } + .mfp-img-mobile .mfp-bottom-bar { + background: rgba(0, 0, 0, 0.6); + bottom: 0; + margin: 0; + top: auto; + padding: 3px 5px; + position: fixed; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + .mfp-img-mobile .mfp-bottom-bar:empty { + padding: 0; } + .mfp-img-mobile .mfp-counter { + right: 5px; + top: 3px; } + .mfp-img-mobile .mfp-close { + top: 0; + right: 0; + width: 35px; + height: 35px; + line-height: 35px; + background: rgba(0, 0, 0, 0.6); + position: fixed; + text-align: center; + padding: 0; } + } + +@media all and (max-width: 900px) { + .mfp-arrow { + -webkit-transform: scale(0.75); + transform: scale(0.75); } + + .mfp-arrow-left { + -webkit-transform-origin: 0; + transform-origin: 0; } + + .mfp-arrow-right { + -webkit-transform-origin: 100%; + transform-origin: 100%; } + + .mfp-container { + padding-left: 6px; + padding-right: 6px; } + } + +.mfp-ie7 .mfp-img { + padding: 0; } +.mfp-ie7 .mfp-bottom-bar { + width: 600px; + left: 50%; + margin-left: -300px; + margin-top: 5px; + padding-bottom: 5px; } +.mfp-ie7 .mfp-container { + padding: 0; } +.mfp-ie7 .mfp-content { + padding-top: 44px; } +.mfp-ie7 .mfp-close { + top: 0; + right: 0; + padding-top: 0; } diff --git a/static/css/patterns/congruent_pentagon.png b/static/css/patterns/congruent_pentagon.png new file mode 100644 index 0000000000000000000000000000000000000000..c7126603280255eec0b7784b461f4e4c3f6a9d8d GIT binary patch literal 28934 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 VKS%rozu)kVs-otz3I&Vs{{j5Cbi@Dv literal 0 HcmV?d00001 diff --git a/static/css/patterns/header-profile-skin-1.png b/static/css/patterns/header-profile-skin-1.png new file mode 100644 index 0000000000000000000000000000000000000000..41c5c089bbf7ea03e71b19fe86d590d9e5e9f471 GIT binary patch literal 26278 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 literal 0 HcmV?d00001 diff --git a/static/css/patterns/header-profile-skin-2.png b/static/css/patterns/header-profile-skin-2.png new file mode 100644 index 0000000000000000000000000000000000000000..df46d46e5869cace338e54a38ed5442eea9dd4e2 GIT binary patch literal 28211 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%0A%BW7ZR}F^`k0WT5}i2)fKqGBP(Qq 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 LNkvXXu0mjf-K0Pr literal 0 HcmV?d00001 diff --git a/static/css/patterns/otis_redding.png b/static/css/patterns/otis_redding.png new file mode 100644 index 0000000000000000000000000000000000000000..7fa3533a0098920edc0dc06518f8f6d49d13960c GIT binary patch literal 10849 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 M6*b=%zx(>*f4_F4NdN!< literal 0 HcmV?d00001 diff --git a/static/css/patterns/shattered.png b/static/css/patterns/shattered.png new file mode 100644 index 0000000000000000000000000000000000000000..90ed42b85b7bdc8bd3147b9b21f53d3c57fdac26 GIT binary patch literal 137733 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

YWl9y`;K)zj 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

=Q8sO0wWEuL4*j_O7+qC@+(OC za%7h%t44Y!4&HDOr|B=HJntg`;_w@N4-Plsgn;XLaDHf+Iz)$@`R~RiFCBqBjYW@A z4O=0>8Lte%%+jH~;2x|dGimd|w=QG(0pWmr|M2eEm@8)TI$yRuo+jaRhHu!Wwd`c| z`;4Ym6o1kQxh(6)6lj(@q*Prn!a?yIQ_|lCwZfQ{eO?I{fqvp&?zmE3AzpagDm+_0 z`+2{-LJW`|^i=XE!ss1W-!2p6HDi}p5fp&@^3meua)MT^*bXVkY;@(|-K?<*v8b;` z5;PS=osbTUEP0~-60P6_7|kV*FQF*5h-M^?&bXciFGp#&`@|@eO4vD1%*aM;hrbZeo09!l|9j6+}bF7_DZP z$@fe}?Q@wt9G%Cu5s3$aHGZ+V{kJF_)?Scm(750J=O8R0j>`AbWoLHRz@YnTXqQAp z5Z5CrpNk0kfaeGWz}a()d~=pKE%H^S z7b$oO%~{p16D>pT%_a9?VH}JS2u{PP*zGtB^tw#20p}`&?@7OrheB`Nd#g>mcIz0qz8I+R+u6=*<0l% zd7^WjXAE|d0>By}U4=8MK8YMvs}kne_Ps4961`ZBqpT^pO7#T~y2;->;$)MUv-^w4 zprWcha~bUN>)kognt=W!cBOH^hofdtSf72d-JJa0W^6{i#~E6*X^7Qb=5)|}uXW|5 zkXhf|G|ovhVNti$)8WS&-Zj^QMqlh0DFPBkaLJk<9Zt{FhHF?zVrJ0cRA~<26Al&E z$eXUex-y;Dp}lv1B7n*YC-N|GHyG&O{&6u1vAj}E3vC~ zT-sr=BNN#waQ(V#?KV;3u|>?^bU9au!xB-dvOk>v9?R~jn#I+DT_}pV*u0JxKQmqA zMkj>4NocQ#TYk$i5|n4gRLGWyK0?0r&z}0niz3cPf0I0zxCdMlo6EPbWG4r9 z2y7S>%gpe8x+h>T0sY!RrLPeAb^MKGjSo`6iKWFtW*X;B5K7QK%M_q_+pP{!H_r*uY zp}+3Ty*^eNFvdj(Xlh!#p5Tni2~QnMD|P>0@Fnt+gB(;btS84U;dGcneVvtGE2dxt z@xNLYF4lF{{=3~osw_Oolri?R+Vq1L8~cS(XK&_Mb+2?N!^g_Fjq|d7-+{qI1#cca+-^@!9vp|G zXKWwxU6cAQUvqzI8IZ$2Ipe@Hi*uNM+$DU7c>oj;n#N|+ z;n$Sokx%N;cD76grMudWt6(^(TH!Pf;@Jn@}4<4GcIjQtL{nE+6y$KmWvfYYaeXepIS7Csa3S zVFt!IOy2dNbaBz(bLico(3fY;Y*Tw2f1SFIVtbYP^EB`;=*N%ykh%J}va~f6hR$`r zU*qDPC+7A^b#QCaIa}I5qDxq(m*vOdkuF=wpvyK*Xi>S3B8{aqhmBrCIZX+Etx-Y~ z_*MQDmA(SH&u$oZ_A0gMhx8BkE4qBPxC81CC?F-)_8F#Z#zCWMAxPxN>lI;>^gzgm zis-OGfA7RhgfNQ2d8AsJbBWUx3d+G{AYquCbr7&Ii|RDhGv44@8DY0aH*c+gvIekE$YcyH^A1P+V7RumPhu1JQK9rxMG!_Yl9i_(h0T6o_##82S; zH5om_do`)V&uJF=`F8uDT8{U~z2Hv|uCH0v44oQXdEGY6u4T(4kdV4|5WhcaoF^FS z#$>SP@7c2aC3hSd50}IF^4!IriR}_sY!*eJv(KWVm;#HBckVI%KUM(=UQ305x1F@xm$y&I;Pcn??_} za1fK{W&fM3L(oa=$~lGuaZpM8JItfy-_+H=>zUDecg9M+`fn=$xexD2rIN6T#-1IB zuUx#qsArB+G9PO#v}qlYR^qWTU5c@>(O=BuM1>cf9pCT*{I-+jrr7Rj^_fXr;(Q=M zWNM$tX##rL%0!v0uzA|byHI<(#gwyu4mlu!+NrDU+RKq{7opNiGrQgS5hCDd*oEv& zfXmuV{oJg0#A!iv#i0%>jz6B61OxNEK3NR;VZz!kG)H?3_v`K>L*=pFdZ|T@H0By~ zs9%!Se++6$!n3!oLA~CN5?n1mdQ> zZ(~4sm|-VlIIYI?VExo~yWKq69Dni4?Slv1St{o>xnTiC`f^cF99bSd>w_)O`gXzW zBwc+uo+GsxKUxkwA!eZX%pC5)^qTPP@{)Yf&S7nVKHNR?Ep-XaFRJ<@E%1xJz-qb` zbqgtNFnLdHcQiUW_Rd#TP6fa-5jX??Dz`(MpGcCr`jzDRt#P=qmBFJh4B{?XV0Tpv zINh-SZV)mdi}8+lN|zUqw2>tev~)6~Tdixwb!7EErVOKEdpULePpWSJZp&O4w*0vf z;rXV=#%U50!(2-8w%AafC)kav_;@WV`*^JFs`!Qwk-5`GbUO^}#f;Er2x_ys>59ZH z$K0c{V+knNlR?lwER#%MpP|fboY0xy&~j}IW-X6L0gdG4pzr#0**rLTK(Py}h;M)P z(>4C|?o8@d!}ln6=~$_#=fU#nGXpk@(Xfp1RHJg41v=jrc+eS*dF7qu zYBo{lxn^Qp4GXfkl-Pgt9DDn1{A#y!i{qHYNo&@u5?Cui_QsC|Hh&C}pfn?DV6*3F z;4tD|tS#8^w|iZeVv3RC#}((l$1m)50Efa{n;9+TC$#x#Vy7(NgHhm6-dMg@qY^~Y z_e}+|gYz^qH9U!k1Kfcc@Gl%$t&oOr2-;g=?(_#1V;Qln_C5>aDaJ_!pZ9s z+VFgF@{bRHz1=)`0K?YSPZ2D=FO`wrwzVChW-2A+@OC^Wv%5U2&(6wv7Lz8~5x;Hu z<&RC3XP4bv!Z+4z!+i>diQUA_d3-UDk;5W0h>~8vqZ-)~3EeD#mxN&8_+1*8Y0QPN z@KhFS*Rqmw-JQPs-h0vSR;xeW>z5GhW#f{J=4cY8SuLawcH-kbDX7er)>-ehyQ8Nk zi}yvySLr-X%S%QoTO-|Be8qoAqjA~SwUgpk+~H9;i|A`ix{DMIRC-TsN}OeOv@cW* zdf&YmdkJ5)dj9myZJGV518*CZb?bW?` z=Cq2pwp>gDH+XNBKNh{->ZvV9KB*8-H!P#KWZy;@WVB2}#V|!KoR8iAfUASPd#gV! ztrKQ11xx|nsHFd84?0MX(DqgqcL;jvJXWe=I5e!t?}7SI{^i*JptM&|6WyB$5$^qq zpRD*u+SBITFI2?yiH~~~hY>f%STqj%K?cus;7g6#RBd(CrQ#fU;;&nZk_=;|GIEow zZKs}9lVqosRo0t)(Rz#RzS_cxW!*=w=Q0g=Kr#~p%t{UO>*QOiaJQ~p@!pzj4*IGz z|1-(b-8uq-@K8bYTdPx2iAlyzME6A6n*^s<$>#H4ZZ;2odV;sUIeD->JTugqcQZx3 z?+*hjfmL6&^$UPGzv9CZjtnp+eD!~6I@=dHt}IVyWQ1;IN+Cs+RHbyPqO5dQO68KO ztLVgD`9rU5wN`~}W4EAg2E^|h;q zWhcUx^BCP#-h02&dQg1tJ!+J~5?zfOx7`c)mgV`e^Q4!+nmug42c^)mthS18!`2bd zDvkpCdd0@Rd2fH(G(bt56-XZT`bDOQ&KAW87d#DJI#W zLfTy{cji_r_1-$lO)YJop@=f4W=2jZv8hHOG2UwUc_|sy5@Av<6G>W$i;(_xKCKzn zP)MAoN&!9i$RuLrcT1bhk&iKsdQ zj;F6-@X3?%BL}6TrPP#)rJO?#_>Uh*4ih%<+xBcg7H%~(uI(-N%DSle==?@| zAAjq>RBY&r)u1{b?M2EnSP8M$Iq=6Dgt2c?*Brb@g+Rdo0+}lF&FIve zz|J*Kyw9_hx4Q&>C3Gn4ed2i5+g3S~NK}o*a{y03u)iSsDz7ggC_(b|#haI(zgnN4 zUtK&$sb8%7$BXBykf7&gri#?5-eTD-r6d3q=aXqf<(xEtX@4 zO7Gq__X~a@O5D&4O__O=Ckl8Cf+|pIX^JLMKJ{(<=S2B93AP&2B5TF!*n2z#<>}U4 zd^rgoFn;bCmkCWdG;Iji#3|pY4P8DD>vf<%!NG90t|6KooHuRE>y~JeT`BEkQL9}y z8wC3q^)H*#vo#L;`g6&jf{fNokO|lA!KwX%3(OoxoF_(zi<1y*EJz&?FTIG_Q zOEcx|L3|Bk4<0i;c)p0FdJRlUTDvtS#>4aCBE{4}abu|&Wia9NE*%VD+YUl#!yzDS zH`>JR_6LFy7dL*V_)gFcQmQ7D&ayL{o(MY89R-5wI}3vWrAB+tGZVP&qeCVCP9(-F!RdYy0hpqeHH#+S#4DparywrbYlR0mFn@`JxFg&z0oq5 z<7NA}eGNbMKRw%E$(_DgZ=S8rPR}=ID}?nA1XW*akHLi&(P@KEnFHmRW0nqu*G;p% zGgB@=#w>~oVMbvcB{&#%ATHdn)CJTO*tzc?G!mDJrI1+AdV(R)CPKd0fs!YodJH@< zkUTCELK=m)a#~{WOaeC0C(#^E>I|r~8nnDs-_0H@&nN18Y_R?ix(^BJ^OB~T4*O18 z@R7aTap^GgJPA9@zG=4pAD77;LIi(Tmj_kUsCOj;qzf{IJr_~jk`QsOWp+|Rd=ANz zhW5oS-3jSB5Gjn{aI5yA`1PtJR#6UlH=3n;^E#lGbjxa#!sb?YPwouV_hC5G-Hok7JgnFv9=;oJalk+ zNM|1WDP`2VP+nET+gufiEjB`Fzu~-8Rp3K4*t_m@0l0qVFgF-02^)D4kFmsNPX@Rz zf)}yc&(^OlHW!|}*sPyFUkwnNj)oI6=l%4P1w!5!Dmd$DJTVs0hvr7}CSc~uj2U3$ zj@OK|J-vS2(GijES?@ZL^F7L-eQc1Hb$A8{T?<>yc8h?wPK^S%&VG_fms+nBgp{Y8 z@Lj@Ua`g~~%>vwNT__}bKZ2dTRaJYW!T`0g$_t@%2^l+_kgOr~;V6?Krn@S`*bd)2 ziaX%DXahdZlUQ~D0q<6VyXK~+_h$`8jkw-yTK>Q?Qd59A7IPh9MM)TJj`4L={(<2}!xwP?Z%Wixt*&#KCXt*%4cN3-m*sX+2M!^T%lf8Uj47>Bz znA9ynfQ7}936Y6t{42Ti72^F&5x+vvug^|5=l5pF>Ne@M@$0@3`HIzMDJ)o4P5P`v z#D`8W#akfSPp@VCc9Iesl4sWxV2zjp6L8WnN0hwhj}+muwpms$kEERBaSB9Ehw$=nlX{0o1?E4{>XU~vS+v>Q zI8g-@)dPnF*Lm0?jtG8RYH{aiR&)&b+k^B+mmkCUOBoQai}Jm0Rj5UV`QOx*kRq#~_FdEn41gq?_M$5vK=v`TS zBdyN>$#E1S`6mJ{1kcM5zzk;leE+N7{t8)6bRWlyRCtZhw}h0V`p{bgo$ZV?9)1h>!RdQzgtyQ2dYxtmWq3r6P0-MR0o z+!pP@aS_5nys`lten8+KHNl3Q%0G1{lLvRD*pAT6i6OERfyr^<5_6BgmVK~NTQRUL z@B3;kv}nAfN~N$3@dDKtz8}CvLQu;IRMv_k zyZYZY>+jZQu>0qmb*-eMRGP4i)>~U!oHj<rW*iO_Yn$)v|3hu8i5 z^rXEeL`xdB{RG;&R3?0WC}KIQqF34$YZtZGx?=gM($VzT&28=4-`M*AIdR<_k!_PA z(#8#+DXV^ZiQf#*LxI|KPJ?|C6^$vtK-}|*JU=u(qK-IFU&MmbD{uLNfgNs^w9R9@ z(-FjV8IG9%SS%>@`%O7gpbU2~VE6D8wG`vzJ+h;P&`X)@BiM84#A)EqYG5KRVxZcP z1#$+`AT71qR}xSI+>5Af@A44`-8eeR(WtJq7E$}vKFlpeJ|htTZjPCHlg}4xuuZ8n z5}MOZp*A_THygGycO=^cQ!GuLz3V5&$)V^#94&Eou74cpSqP~GOL7;fVOa~4f@jJY zNA6qEGkwtj?4?OCG2o5T_kBpw8GdeM^1zjoQT6bl3ERWt+)T-G?D*2YHgd)YvVcR8 zn_)AvpV-p)Whi(^serf2y)Yr{GK>eGuVhImm^yN~D+g6x@ZyoDQc>ORBj#FL=K{l! zooQA&nf*Rey-#?yAng%6`#(T+=4_i--f-~V^>9k%z(`ziQZcdD5X@59FlbP9GOu?! z=Yix~#ci`SwXX=bN^PYHlSF({bA=Wt+JhgvkxO7U#fee9v@94KzE{+5Q(*yCguQOH z-3$mM1AlPUuVK0gx%oN$9ldD4QP4HT3=GRpH7(v5=$6;XjJNlS859_JH0SP=o;~49 z=}>E~rB*x4tgCD~Cxm~*zD6^Ii?Xh3+$Wos6|(W!K5(kx)()XDIzEkt6OiF>h_-~v z@_Pqijj@zT;7nb7vaP1Jv6O+u-6VT;!ZXnf%Z5tfbuD#eK^B5Dy@uiF4MfF}m-_0u z_6MvD8h4DUs{8Yz!ng;SIcU<68r~~>z4Uh*W`_|%o111Cs=L$;lSM^!he3rqjaCw> z)NMj2RZ|qLJZ4`*s?x@+Ts8WkI#l%b3TfXc++)=z)6OgL#~i8Azp4tt@nP+TIk2+~ z5fjz9uV~}GuI=g(= zVnpw6;`4mMeKEB6u)Lo;75VS(qPcV2G?JaP+SD1eFf7NX+nE`DLrW|=<0QK-MY;qw zC%;MnhC1bKBH>l_4yH;gtPOGxBlM}_xk?GfBiCca1`JK4S%y^k zLDgtitZjxFsc+-4T0zHhP_g3JU23ntSZm3>f%xB@0-k}}FaFQhz~L)00ui0`OZUZJ zt%g^vKcGL#XnE_fXwAkgfV}rV4xJPi{Wu;stVg81b(^gA9GjaVJEIzh&+>te*+rjW_g>HM1kf$pMCa&_QMhyc`V5KW92&DV=c!kj_x%k0o5 zi+o0X;~WO`s4MWWK3cpbqi^31aBzLo8D?~*x4E-d5Sj}fyd%>C**S{ksQKro4wOH& z98&UDUXDGLEL#FJI?lebTwD55iDkAW+$vF#-^sJo3XJeFvO&wMPlyY1Pw2YSg@t zxD56gG~C*y(d&(hU8XeyhlAJn#tm1TD1T!-RVq*3$5uzHdTq%|9JlJ76?j~^9+|%9 zQq5ae4N_7J6$~f%@hEC%uNmHRqsoyWpN0Q8FfjEE;4%A4c~XYE-9E-mf5+^SAR2v+ zfVpBPK;GoQmQksdwaYHorW9sma6n?Eq-M0nyh(c9p0)hez?_-!P<;n&l=RZPusM!0 z@zTOXFH%euG0z@-Q7an=y#~ti_x)#!s*XeP7J`|7r&z7v-8dWH`O;z)jA?LrBrsYOONbUN9)+q*&U~mLk@h zLh}NqF}?a-vC#=Jlw@9$S%oyUR!QOxN07^y3VF|iy%D%m>KygX4^`*#KU`crXEipO zJAqolH{<+BeZXuIQfUB(4{rHQmsu@3C)0nGl-X>2`SBNpLcLDX1L>WV+u(I;*#bE;bo( zHMO?`^AEv6)uINgO`$xdo;=(Z*|}uI01ZU0a0*>+ix$JjHi@nQQ}*~zk|^lOLkVYQ zG_0>iamRBa9Ho?ZxInu4g7_F84Ddq!NB7Pj?fG2>@Kp8JcnhOVI{>iuH$?1+(A_sS zH}Cl#lfiI&MNbp9QBM{z%J6UGPrk>I=8nK zXNkdw>bL_|JO!8M%g~#6Y!&nz@aIZQ#_{p=o=u3#)2txy&c=g698WhuV2!{Y6X&9DJjcF{|89^?&2Y&Kc!#(?jIaf5*ee9OchM=AHIq*f*I@~KYeO@p$iuz%* zmG8jK3?yEThUDOn_)2xu6b2ABDS8}$A%l&^JKOuheI>zEyL~#pJL8YS>Yc#l2(XBI z%Wv-^F9zb1jnqCmGFzCuK*#>!c(#_Cv*}xf;p$qSCSO8rYtE}Ro*uO&Riy%{@>sY! zYo-a1@tI5we;CSloOfNjTmH-_Ul?d~lWyx+g$=|zX9y>=1yHhxRs{qZlF(M)^`gn;zw>m4J== z=xY%dp&z#=N6@_@E+Tz1{GOTO5i7kKY_Y?-qH&0&-%PSrFTj69`P3<8Bo_MftF_NX z1=uuOH~Frp z(<)#ZN!@VCmMjhw^=&CEtv9;$3Uk#8pN}H&dr#~-OQY$f=~RixF^hwoy@1rKjSBtz z?EK|sbM^A#bn{c(xZiy}wqFDp(Y-G0k8M6~<@t{dc0Z>;pJ0C%B-%e-@I>>E{aikl zL?+WHNmHqJ7Lx*of?q@0x`L)ZK2+5FJOS_WtgS@GJdhp}1krsg;Tn!PL32u+Jpr^* zOeMREn-0>ji>VizEOMllChehb2gzE=>|7BqrITN6c%SCx-mpI(_7|TZ)%yc|$vd;* z;65gdUfOW~Kv_S)=M|2dD30IAUt!PmJ%Z#P0&PYuqtGQmXv&B`-B$B0K3grFbg=qn zDQ@vsG+o+~cZsm3MD8RQ_PFU<1Sw6cDm}>9UDbU;{M;J2+b>VP#jWPG&ZRjSLZKt! zPtQoGuKu{bI*p7!J72%~9H#$neg6IC{M1q<3zTN|qLJgjRI8^mVG|8M$J8?)2d;|Q zA$SndreHL^K)8tTHPD)_y_}{`431xDI1fXQHT!Isy`=B=T)O)WD-@?{ zVF)F&Z<|4|oXj1fagmgJ2AV7z$g{l9V}Z^F9m9TXBz|ERu2=E%RK9d%-mXxoWg-=C z{?2R?(K}bmH68iYnOeT*DJH`FfwRZy%3rC!ArWFjeTr@hMF5%!e+SDh_tFo_!>YWVg zlzJqdMg~sAottcGd-V0u!x36IJ19(41R0wzx^G2)o^b|5NkZL(aT4zN<^W-S4JRk# z;H}bCriS1mHADs=_~m){GH8rUnA_Av1w&tY{3y4LlK9u`C;+A@lkmTx6h zfmi`bcNORqeXwP}VyyTh0KTkumV0oNH7jpTY83|oUgd4XN6)lyiS~|YsV=`A<~w-w zUAKAm>3Ri;U2STGdf(V@2$nwwH01=K;rQ%v7cf+T))Y8!)<2%Se)^+@Nqk8gZ5}NHcu4R=lL@U`xLBk z)RlONyAanRn)d$IDdMc1s!wJy57h4NI14Jzez{5*CQyy^8!Vrf=+`Q;6C@8(nOlzO zfXUw#KO+e+j#Q`@F@BN(v6X*d+nO2pzLuovC@i)r*d16F?Qx8F21z3;33)@DMr+AK^h~eNX zcEQxt%e#^%d&xW)LU=CB4?VP&%E-jN%0$7Ni( zoui@F?SLqVevebnt6kRS#<}r zbr=CKbmZj zXk5}v8Gm*K62{!jF}c&M8Y&7Fb6{fTEyZld#|M*Jp@soD86=5&H9>6`Nh`HN+PWh1 zDj)Yl^1nJU8g6g*84k8ONZENS{ zsNmH5-UQWZK9#*68Tvt9f2m~d(H0Rv~0~;GG(AO&Wx!`Xi9JYCA;C|{0uynU4BTw&7 z{TGAUjuHkGCZgQ$;B+!@GYJ1}YmCr*+ulS8q%Xj17{uBS>n9Ld+uWRJCob{(Uhnjr6RI219$u4ha zGCRtJ&uhU0XX!K3*l|YbF#7H;`CitkcoH8Sk-mdT!Mc7U(V4_~p;Q*~Y6Y;h0+=Ls zf1DcezBQqSOsA-6Ln!veX~OULaNjY+gdo*+wQgAscv>LUEE(0s^x7(y){FfI?Z2l9 zyG~Y(o85MCzv6^*2WAd?SF^noEImW)SptN+&H-&U6Joo7n?zR@1ZY7>KKwOjR;6!z zTKX##y5OWL5^HZ8ss*7Di)?6*dBK6hz7qBB-%D+=a3+Qam8z^pl-%&4ZttLQvh@7@Z=lNf0)1mQg- ziYkIG^(>}VN6|K6)6ick$DxnQb`n5cT((-eTpD8RK9X#W#$7Ykw&oRtsYyur5-WLS znbuy1eUU{PZ5ZFK6Nottr@we3G)}bC^Ue3@^35jV{_5<1Ue9b3{5nvW3Ucl}_B{(f znENv5Vmc*pH^VMBO(k84Jq5Lp^`Ijn&5f=X-{MMUP5|#M)ug&=^04u@8$1NpWvgp# zYSwY-tjc!Nwh7)$EhtO5%h47ppjMJkm!-p^5WLQd_eY-9Dv2y1q;}V(H;7*TzEtcy zo2)CrIfKT{KBpbzJ-*vG^FVy+n%|wb$H^*}PYBJ|bX%t*FWO3zFgT8cdjiTi=tD@g zE~M;|0nb)K-#Q~kk8De}4o?ksRf7BQn0nV*6*0=?P*o`|w7N;p8-2Q(!_8H{Trc|0 zYIK{52dqeyS!eCSR|o)+am!}}WL~US=O+olpTAiHpE*C1&##yiK$3Kv; zQ-W}>rw`&5I9KxTaMa%MBz+=RLhtayGIyZ$&SFP_sO+CC z8xSp7-c4-V&)}T}#{JeO#DAfQ>D3E({eQ#RXT;w(&(2?+(~5)u%}da7xNQGy zSZPpv@7$1zQihS@|S*=8e?Tcou&k1;}09Xl01=e$X)G%ri9RG@Le^3nZ)n2wAs0x6?UUBG|5t4E{P1za4peABpWVi5>$6y1}+H% zgB`psLt7AG%r8KOpku9brDtMdzEH10a~sck-%JY z*W7D9okzOmlOa%-Wx#M>ELfi1#IW<=Nj$vi@(juT{qxPzTq+EHMgMx4o%AY)D=2?@ z_MdRyj-S59OK-5>en=@|f!Ec$he@kcsOwHwbJ3Chf`|;M#ih-y@F$2;!>CS+I$0Fp zsap)--8cC4QROcDVRWZsCg=>xTUlrqnIIK!5^6b8e)E9{Z+N(um7P=UCC@1m^Z&H?P(7?vqo`#@*z!};YdBvyyx!7(~bhIPh|lOj}} zXc5$mP0~Cm$j}8yfs|yg*oa*iHcng@T`Wc_VU}+FF*Rx$^-hpl$Fd%a_{op@>bt_! zdKmMWTGU>uchIw@-@sD6g=SwY@${xmXPEZ#i@&PTyRvzM^oHy!S(|tayiJIP<^=yN zIu`FuJPk5`Ion^1S}k8vtIDzj1zeN=nkhX*jd$V^Zw{fcgp@avQJYsfExTxYY5Ji{ zd~KI3cUi4luC&0p!@n9H+71cNkVh^>S2C`&t{Iyqe^QatAs$1uG+hA#lDQgGT}y>B zno1~mmrRtXk3_Ex_&QHrEUOYV1p|eP zC5BbW+a)Xz+U`AMrnqfuhYOz`o>qXc3De{%>JbUgia ztyPP2UOQM3&(X*mdg)tw&9_1;b_mVvWpF{E>T$t*U$38?ozh3_RGayQ)qAsqR^>cW5%Jp5TEX#5!Z~G>piptlS4G3Y5 z65bqJHck_cO|GZYrVk90V-?Mzww3FaB<8q6Lfy@zs=HTf)%vT`7ntrL z|M%x_&R<;?V>{9ZibODXa&PDWv5?M5iHEe!hue0dt1cL-1kWsWVr{#W?$C*%iE=Q< zVp=6CJkD9-_CsKCaSphU?X3e3?<-pvij;`T7-mcXHbtuDyG)A;Q z-X9$K_dJU0#!rm*ylL|80Z$T*nOVou^g06$AnWzln*GwCpYH}oYd1wN1EES%m-E&; z@zURGN=S5F#v}yQFob#mes7nj_+2NO+_iGuq6gqiV-jy4b-F#vDp81Y#&-T%Rs16D zaPU}Mf}{*Q&wUY6wMV=$I3~g3+bJX8e*q+Oldzj>p~Y9b9o!pH?REtWl9=F`O0=k)cUc(Z zx-obu8DJa(T}fCyE`9uS?=5*c==f^qSHG-A+>s!DWOb0r!|#dW(BQ2mwL%5DIYunxZfZvk$KSQ)^h7o}$IO3UNI(b8DOx zwfk|%4nE8_l8i3=-eIFt8gB1mO~kT`D0*nu;awlm5+bFOoZgV=mlA-DTx5Y>F!@CvoBZ&w8O5|Pp1GpX~qpN@~EJKW#D2BGTz(6^T@?4H(-s`nQ1X4_N< z^eMg?NpwuR+N1zZUtg_OzilqS&$TJ{Z58W5u68%E;h4UN%ZTTQZ=EaSu!+csi{yDu zB&hV$56kQ@B$o(XO~=lyTT_-#vR(^mMws)Up%E)=Tqt`6Xxl$>tTZeS>$- z9)56IH`SGA0De|T3yrxGb@4#@3W`Y4L$9Q7xu4Gz;LrEf zY~@G-Qj?-5#NgsqZ;UrgVpUht7$~ zH=HU4_K@=o+X@_e;8MPZzU)Y$7J@R6TU?~3T^%f(tX600aYa1;LEq;WCn--CD@k}p zA3iyk&%a~za`W?LI~fO)o)0FGzX3{U6puzZB_= zDU>LGb$4L!7OOenjIhAv*Wk(-F*zEPWTO*LE(a{eZM`LsCirGz`m=xfrW}NarKP$Z zWUH2Qy=c-2R+ZBs3H+Lzm*g7eXSneCfjP92hl^VLzV>PQU&^rw!Kubgv*@iY1i>r2 z7ewQ@cTH9fCrR_ow0v_UQj^=s+-|GQ8sZ1>5!{@+A)SBIaEkx(lQt8B;3;D=oXhsn z@zOfTD6P3pG2oEwJ{qO#`*%Sqa)xNqgiktkc5lJd`HbrmI*_C;9g5m_L=jJSsb|t0 z#;*7Yx(TA-|FvdaLCYP9w<>D496YpCY6~aE)v640EE))Rorat z1jN&O5A)C?y}9>XD~Qnra6F;QUs_FacHcnN9){kh^@#o{r+0ce8vX8El-ZAw{tiHD zQQZm8Z%N0dDMs+v!s``v6he14$$;y@Q;7+_OV4oGSt;G6vyhS-URv73&#x;0A|(|EIr+QVw(#&Zpqp zjGEYyT9>Mv*Xj#Db9F1`?WTA)4q0bNt_Eq^IJ&kX(mJbQxhl&CETcr}g-}QC^M~9D zveC#;cUU_Wzbp=8neP^7*mW3FZ!2Y#_DX9>Ekio~elND%@VFq;q35>!MGWK&%MHTw z__c<77baI_Teo~y;h+$>1HTcWrC-{?OzC}}hlWp@Mo*(A^5d4OLK34)@tqxwm}7JR zUY)@4K~G_a(dT#bQ@n1sKz) z_7a*eH!m*P$leXElXN@CfG{}ZV0R!%_0#4bSYbi3E6b~!UAdXLn$&s}0}@wMO;;dg zbp!SN^~|-;d@HH&sQfA>%)}=Y;^?7XUQO6TyA-N4HM9DDr{tT^NPx0!0!;?VaN7Xq zl-xcdh={EDfCx8tt_6QIyE749Q@E!u-rXlUTios(^hhF}zttg#rboLTYn<#m1a*mrqzOWm#-== znT-d$&VV!JsObbu+p6kch_yY4rybnQtog-$=2KOE;;)IuDZ+c7VT|)%CO~G<<*`@o zw_>KAo5$COb~{V3Eii<{_>?wYUS3_YZt3qAi_bLme}Bmu)h_0q0NmdN44VqW zuCA6PH_Fo-RKr;xF_#8Xb+)ca`KOQ;nf~njr#I9(#k8kC@X`lU-^j}I@VhILpRW<| zq<%2}(@zRg z*Myo&O~pO$%Kz`_?0Vz2wlpml>8&b>HXSDx!>D9SRM~PV0!uQI_Boy)&T){yb^xC= z5ClOt(7EVzBZEQGX!K1k8gtQeHn`9-a&RPE6fq}Pb{p+jK(W)o^`|HKkJj~r@hd$pR-+{{_ z@pm`V_Gb8D*!-{EIPCp%f_153QM@{Y(rkG91z zQ=q3^LCvzR_4Qdf@z%r{Tj-vwOq((aglht;#%Ad*hFUPKS=$2FIyDd!wKF&rG5Z~h zf*kB|Bi$j%x6oBVejpX8?`XxumV3(sEV`9aJ{CUlI=}_DE49tMY1e7pvkY*TzSH-Q zMiGRao|MA8v(}XOcsdM}MiN@cT!M4&s}}Xor*SeI1J&F8miDg!#HBq&fEZEw?!}Bc zQ0G%j%<@=Ns5%t);>I20U^N<$$gwXSa^rYLm0PoR8D6)jNf^c7Y|-x~*RHOfT%A9j zrl&~#IPnqp(|X>_*Si_|4k-3{I}VKD`>~rg^ZZY{Y3BPE_g^M@5=qVx;%U^CYJD>) z+xB+<_F+?aJv4@XYn87~9q+frH-G8l4c1W3Ge3#|FvRJ)Jm4y3;Z{yxafasmaTnccd@LN)ms;=iLZ-Oy^3Ia5xz zG3PjngA)hwJx|6=UFuvN#`o{DdF#ART&Ao)MFP|Q~QtGcd1QJ8Ixs#=B#gm z%(ZAi;e8r7Wb}MflX7YLtv;{a;W5^`<~K+x8m^;>uenrkk=W~pM>_d7f7Z5t)b;Zw zm>7*W9d*g<;5@S%9Jx1g_QOw8x(b$ti=p@dUY<7){cL7tm29cWquuTVpp0+;ARVAJwd4@4=zRDf#}*fBjH zpvAf-XME@H2*vZr_ig(B9e-80%bh>=36G%hZSl6BV6F~2tB-L*HpZe=$O#E=gMY#R_FlNV{bVin@V%?jAd_3Cy_R8=H24xD{{P2hAWkMJk zw2p6=AUxV&_;~GJTD{hCmG>w*tTu0_TE?7SV`8S-XR2~@G0ai&X8R}&fg#NrQBp!> z$fH5ycG;{I_G|e5_;ptfCHgoVT~6m$(?tMMQ2VdvASWRE6-7?jknefwSYdDlfhK+) zQ#*+&-ze6x+X>bT@^-xT`DVA%jh~r!fEM`EG=4G^xb-i6jmIQriw~C~Rk4yJWa$DO ztW7-}o1CND@aJNy1i;49!Pk zQY)t28%75!*)kZ|@?=f+rIcX~`z^c-pmg~lCR-6z-|=CARh$+|{KmabQ~(@mY<2pF zp7*s*G~kRvWlp|F)}#-bNS~F?ws<&u2c@TX%99PaClfOU1OKemt*pee|Rf9r_uLwIU4}Y#&F!n@)j1lxE8k(6T=vCO0D3Czu{X4skz1W#;BB(w;RjP1n2a+>Enp!}r=UAc9vf z|3Sw$QM4L)?a}FJLjj?KkZ&}$Fr3lZtBCY!=ZT9eeloft@9zbJS$?U}`y~FXq44%E z`G3-J$f5o-&-zOL$|pT zG1=|kra1{#5|ZGKjL+-gdl5CAMykW~o@ExMwu5||HuRoWMv{^Z*3Mhdh)8r}h%83V zX0ajfm|qU=>+P_)TQ|E2Hu08%fWh5jp=qQ1kC5GBnbB*vZ^CiOG)eG)ojQA1_{4 z4$;qGJIVHHgWbu^JmBVtg4LjvFTt@xQL`nZmYq7jg6YyD8rtjATZCLv)ne$fw6M4@ z#BOs5aEC5vW6?QNJV%RuA1qXYBT7<@dY2NGGs99{bMAgBF}zX-qgf}qn+aXFMvEVU zM0{hfud0z&2)-J)Su=Kl^i15TF0W=3>w0PZa6FhygWQ}j=7g_`i2Z?) zWrwL}TTE|=vVMKKdGlBRB!KsAtyeyojJT)1=~UZo)WF*j#DVDH+bjPL5LaTw5Z z94t+uel=gqB)x;1y^nrwQ}i4tF7A4|#)hq>-S;HdEN?IxCbOqvjk})`UN4OsYQm!5 zVxJ`|?y=Yl5V8?JA+5=*=#3kjS+I={+-xR>9wXK;m)o~*4KG{KRR|9I<;GRx2<=N^ z!!=@P6DlA2tlF60a)S|f5`x$4TaYlC^J6(}tzckIXtV~Nv)N&9{p;NHvxNTh(ePC{ zg4W{?L|@C76dRV4Q!#OvfgMmFw^S4h8$a#&)6G?CSfKrMp|F?q7er>0XaD=BaJ#)J z-frKyw+qA5>C0i*$iCtB#A74mXI(b0-5AAwgJ~I>d$Zw?k z%FjRR+5cQI@js^#u-Y5$&g0Uzk^fdd7e>Hx#N+vckRvDarFMHu z`2%CPDcJY*;iU!h>lHEAq*AN)7W)!>_Feq+(k(;ELQF23x702vI`Apq-S-I-MrZHn z+9yQwOyKnD&a$I^IZI4(YGFj3>v<#|`#@%YkQ7nmPA^t=?WU>i32?ccGYo{>Y} zoRkc+Zr^S^Y>xV0SN&ah-l|8O=3*Bb7+R|fk*#}I@sjo)s)$U_u>{f!zWHSpP*r@r zsQN%CH3o}TfIhk6Rf6{q{P;dtEoLiR_2+E$1F=eYx@fsO5y$(uX}xH+-2p)pZVrEQ zj__Z>JXt9gJ9cNf>Myme4lHNI5vUsoapfFYv?7GC^N4OYf6mYZ`dVSY!FlnePWc4r z75093{zMrrp|7C&`KdcGo>n`K^SB8V-sg}U|80<_1LPY+eZukA^KXa;Xd7P*-j>6~ zUb!mN@2_JCKy>ck@R9=z0HOKx_~r<0-LVO1h5!fy>=L;2##hH)V4R={qqGs5O=Fhs zzHMmMOveMj^%s!K=k?8#PP5rqB4gn)hPdz9V(->ZdtG8>OL2E9WpjJg zsM)*4e$;xGmO>%eJ#PG%$#<(98QJ~cXBZu4HTRxHr}%c>#>D#uUzvHZY68nl!T}g( zQ7*vG=Mp*)xcKVnCI#J1qNZbkXe#+P#@%s=aW=2JK;63~t~#tP?+;e8xqq7d6AruA zyzz)PB;hD6zlMFc=Ww#p{7T3(+?+eQ%0cev@zd$Ck(%wr$@X%3HT_wl!?i~96l)bcLR~S&5pyxz*D?=n4W3ozfeE?894?mNv4x?mPwoHoGG#;rSw#F zb0VzQd!vV@a<4FpMAl5bV*|$j!zw5rlg`j$hoO=2Y7H2^{XQ{wN{D5*5ALYUL%0Q6 zx@lGxEZugZ5P*N#Ri2IvcbE6Vweu8?4*>c=z~nMR4MBf&>m|3cq6aa;hrX9mtg zy9;GIYchLFJV;E!)yU&d#u}J|v_ZqC<%G0noDL-TzftJSe>^UFi5glJ$VY9BI5DkJj~1C7Yreeu$8M`Qdh65bYb+l-+W0YEot9D=jVz-NiQ-B}g?LqZL3v;*YTiuThtAQ+=tHAK=Iva9@w%fN?rw$qMU+qs| zx7bf@BlqR*w3ayfJ}#a^WdEOjNC4iYxSMX~2ytm|&K1^&(-j5N^*nG}ojZ(sW)Uv% ze{;i2Rm5ZE8|yK3({xC3Gp4~sH5zidYkEy?>=gwML&Da`1ukT$nQ9dbEw;N%UZq2^ z2`TyNG!)u@5Q|C;TI!z6C4IeN>;*yeyLOF9MdI>c)v2@lE(!8J-gGfnY0n+BIBz=D zm6!Ka3Mpn}IS7yh6PX@EE8g5^oQ(W?YI{wYo9V;v4KHz9%b3OA`_O+JE95^{M$;v3 z#lB9xzPZGA5u_{VuXG`ZvWJB~BkDpkKm+T913w2B8O~n_kL$av1J1|*PR-mMjc_qg zN9pNyT$2Z&8KyAgwCl5QHH^%Fc_gt9A_H&7Fni-Gd&6IDOl@A1$1XS7w+|am4=n9!h0YRy0H>vB4<#F%P zlU}gsen|iyI@dq65iy5|(LHRr^r^xA>o|atS2#`(PQo8j=gJ;jybQg(u$3lm|6MW7;M!jB;twWK_3wi}k>HAf38ajnO zf7we2ON9L*eT4pyksav5F+2T%{m!D;LG-PF*vmhR$M2@6DR^ToB%9i8AiWOR42$24 zgyAIpW*oVNvfE7qJ$Kuz0X?@lBhK6FY3^gtpJH>xur9Uks@Td(uuy_f9Q1i^y0 zQeDT!vtq8cA55^mm$D%>?}XB=wC@w&(|Auu0y8I^Dm<2Ssyg;VZUKi{2X{*WeRqWj z48|F~jjV^;mttTodQg$4>?I7$+_SdaiK4H~<-Azr%W z_)t?#ztVd*1DC)&^fUg(7BH6C=|Nmv{X+p=3`}lDZTVt^0vs5t6B5WvB z8>Y3hM&Tv(L+~Cg9SI(iat*YC1{C4g%G-5o)t#BsT@tKcKS>Apt<#8iek46XyC+P6 zp~^PA)ft2E@zgn)ZjpEfU>G0)RN>N}lW_UjW7Nyjz(ZDayL{4xGGrqe?mVt-gZg|o z0rQqkwa_4|v1Br|r7ZQS zbpcd&Ts>~Vl0shDEhz^c*m6R3?VF420GI&0*4uErw?NO=UD_7Nb&-wozAL7FKk};V zYpbJvB)SJHc;BFGn$5?kPv-_*6>gH zY|*^4M78ShlZl*vf!+jV2YXA+te_)0%1!nVQc2s&zh=)T2oB3v0F473l^+=z$`HOd=3qZaTg@4)0%CfhSSS!^zN)y%IO4QQx(hT$)a$E8V7(Mb>3@`23p3|lFAZ0HBAF=7vDgEC&zAJ)|T-}v_nNd_^})x z;M9m6x1?E%D!Va4#n4$Jw%VnxaLQ~~ZF0{+y%>*Edh z2WD9jSb9P#o?qy$lYQS1i+zs1KfSt;tYg4Z@^$m#Vji^O&(QLcZcuK^&jUh5$-UX~ zY$v8Fxwk>Ho}22?RS9w9V3(ji$0ch-5y0L0Y}niT=Y;8q%v&Az0WjmhYigxL3fodP zt2y6rT{(ih=?-yUhY9hn#!NjM{Mi&O?2k*S?X9e4kYc99Bkn_zyN(76)|1CnAxLgX z4bb zZoHPAmF;u%JrpOgdadn#J^C8+5S-6w_wy~XeG?_HiG`rmXTW|+VMUkk&_rzhl8ToK zvx4+uskx+n)eD_4{?0CRa8{|YTKQl6Ofk2K!L)C_YtOyc_JJ_p(H6t;q6I-|!r^$? zKi-4*wwbAH4YltuM3%P$xpS<&%*8YBh|t_2pISss1}DpdwVSKE%h9)1K@yV9X3ai| zx`y+)^`C|P&XTQ5uEOEp??sXQMiwX3uh(pP+Dn3{7{%p{xas#6zYmL1e%GTk7LHQ8^P-R@%UpxC5U?j($?J9lH8E}3<%#%P$v ziEkL70U)WK-q{FgUr2P`xR&A@KGHF8j5{$S;MPDFTDbY=`|HGSnm&ER)5Rj&wd%PQ zefIP{8NZGEOz2hILa(9xa#hj+vRT;q(FAP#w@S9?@`WK8!>XA%h7gN&+Q*gTWG!l5 z2rE9O4>)mJKjJ#TzT?aLBdt8&?nKL}cePTA(a%SMk*IKbz-e(dU|zredcT=Bi`MUd_%d!5sFSPET^0 z5$9i+&J})9%=$aW1JtdXurXNIz1Y<5M;&*zh%5fI3w|5^A07V2A}|DNyV1kZf8MCZ zFOLcd*u`0huK&F`k(o8wzrIXMp#)*MD!D;e*y;c392oQ#$)HHs)(ST@{OQTtO>8*@ zF+W_)pJJ@VhnqG~aI0m{Awf5r+37R14qOdq*XddPKU*p#%(7ExXdDX4Fl2+fm$)4- zOMM=oA)fQewcXwC?#YWmRM&psa=%&>lE>P^oR25uB)?5UV5;Z4K{G@9Fl4C_c1bHz zxRWm2O0;_33;Ty>1Fz_6&UFv-{wJAyJ*+BnveA+6EPaY4m;|t7^tbjllI()^_aU)( z_&lxlW&42dlK3oy`>X#fzslL^DAY=AEq6GWh1G(1R?@g%7VX1WA9asJA~qe3*w^a( z(gglIH0@w=^{W#>j%HO(rEN_1r*8$u3W-KGI|~B-Ri2!>m(Pk^YV&yIH@p|iO|Z?28nE{+i-Hk!53c$QYmt`| zs`FRzVT8{WWIbi4FE7SA`y-{TWJrylp50-b4SEW+9Di7iJrt}R%I!BGD@*c4@D6Z2 zvj<9hR7BO!JZd|pjn7DQyeksHsCC3DbdQu+H_vEpgYGt+&I?BA0EzIr$S6I#il87u z;EBg_wI$PBOJKmh2-yuh>8l%-#moCp+K(s6x~R#K^}V%g3qcbGW`IGaiN63i#K7RN zE27`mZEGxEu%rW&`y*8UNucby=T~veL;C5{^Ga-mz?-Lu&Tu&CpZH%BrmuBSO!28` zX~A&G%b4ex`OMN;f-dqjn~JjV8+nRf8oNXLuB7%XmWQN zqad!)@QR4oj5{hTb|8x4vsu_=O(@)s;?5%Y2Lx!F_HzEm}V9`y|XXP3EEZu^G zBUQ#|Az}G6XU#L%omv)gV5(}TG2pWBn#!BU zUTRsTh*+Mx|A=DAEdQ!i0GNrhN+)7LZv#}|$75Pmyc_pj+6!!@u#rUS6g-!FiB0 zECCP}Cl;(5yCcmi&9MQtZ=$bC}lAWms!<#AW8rQADt#}bG z<`YgE&}puD!1da%(k$eSt$DifY~-Y|$0hdN_#bOj+Dn}Fwsqgu1mpU`*;evm@JP8N z8`7%Qm-}*I$g0}C_g+aaN)$JpDWc+QLcJ3KD==b!hzHBN^q1n}qGQrAl*0mcg?aa5 zY(C~XCKxT!L%8GTj*OltEMJ*YYHBNW9|PM;<7viyqf|Fc#}*l)N4S0YVfiwxgl;`M zIZ3yQ@bBEO?cv@0ZjS*0evg_M>r(!8`#W_kMH_xml36_xNrQcGWu}D&LO`I1tG^m` z)cQJQp^8%nK=G-hFBNA=2*CTP_47IJi3ZQ{>*_Nqf9mueDMlnk7D-9&o z@G|2O_3kQx_<>Cvu1dmr_bOb@tUR!3jDtYt49ldcVK4d`V%v+z#rJ(QxcL`f2?{<@ z8p|H@vjYA4E>N1Z{GBo2FzReGLA9tP)s1}JDN%+2S#CsTIE2i_xlXA+TJ=IjlniTs znMw1^Z5^a~1xf7^j-|lu^8D2ClP&4B(?9YKFU7Kl_n-c4uPkbi)mITMc{SIIby! zx;k_XFW+3R=R%y^^60t)zv@1vGW}6st5!WhjAXz9iRiSq@zV{zPS|6hwJCwcfBPYgwV&VO{I;2i1x?}^x1yY9t2yW4qPj=Tsh9Ss>+4n%aNF9yE~;|9_bh0}1EH?4Ky4beH>^{8 zO1#E;XDQ7CUNZwXkH@r?R(jOPOrJJ2etKV1-(+B-g;Q*w=&z+wBW3(cu#`=L9v*ND7J5PgKIc85fUW0P;avq9)+ye7>@ zln2{raRzA;`^UMa-luerg&kwOag9lBEM_A)7-(zF524TqT4pnBLfiL{*cy42UOcWM z{sQjSpKq`U5a)T0Y})GknQzB;>v;cC-!O{+D^RIE{iEvL1(TO1t0;%V_Acrj-f^35 zpjLNlGb!7>e`B@r?Oan)FRu9O_B&RjVzvUZ;_ z9J)vIa>IkZ(*L#**=6r8>jdBrsITxynY8`E)A3FaU#zx>eXH+ydY^A}L4ezhTu{o} z7qWbV91{`&O`-7-zlSDFhvBov;$FEKn7I!WgQz4Y4J5Xb5hLe`R+o33)-EAx3W9lvZ;(oDruw4Dv+edKUkb+=n zSUqw_JiL{Tva_1~BQb(4!K2K2Esg|6`e$+>Ja-_nW- zr0hG@J0ZF+w{rTKv`BeF;w@@*ZfoL&pTK3X#gyU~(bUn3{f;2g&QR4sY@d8tnS?$%;|*+|d3 zaQYC+l!a`Z6u3lLM9P1gbd1Tk*m#}3nFgGQS6;3W9afA<6&@ecSS(<=(m>fj;}e~K zxw^xZM$+F&S4?y9k#!#c_`JRUp>}00Y_s1yhpS50!gD&033yMCYJJtacP#U67 zkDpMeTDRgneP=Zz)3Q0AHHfo)dJ&;5w4GanDuKR}Leaw#8Lj?(0UlO?jv$EQRmX3= z@GvpkS^`%Ud&49KWutbe@tgXsHH2?6c9#E}@zr$03b;^!REgno-~&4F9eJAhx|@jL zp|eg1$KU<0kbVhyQJGPhSn<}pT{@+^uHY|SQZVlU6}P!2PY$Q8JUU4IUX9mU zrV>Mr7+w8hrdb~qQn`rdZU`a%cZw~top*X#+ND&04d%R7UAE&EGg}I0j%xBX)~GFq zk$>4&ZgD-&C7p%j{58ZCHPiJh3V#<`b2B^XK5QPbA=l?8aGU`cDEX<|=SoBLIS}aN zO*dbwznLJPPWlC&OJw$alAT9c1F46YHh()_O|y>mi#gS867hN~fsD{_N(Dr0J(4<% z;9$(RaH)1bzv3v3vU1~#*QVU0zApt_AFg$AY+&K*?Yxn&*!sMX)#i6cVN6`P#1xES jAz)W+!Qf8=R^9&t5RCb|aP$Yx00000NkvXXu0mjfTqbw+ literal 0 HcmV?d00001 diff --git a/static/css/patterns/triangular.png b/static/css/patterns/triangular.png new file mode 100644 index 0000000000000000000000000000000000000000..7f41795c8878b914d43732f6cc995b4a7c154c16 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKz3?$tr89oG3JOMr-uG_co-Mo3%jvf1U?K<#z z+tFn}@kUP<$B+uf*y9VQGBNVFUNr4qxUbWbea3xp)r3ppYI6=7JlgyE-Tm|bKZaJl zzSzG0X>`9`jqd%bFAuYSUR%r`e|o!I?T@H^Utb)){%Nhd{J(8~{{AYgvhlwjU$YmR mf_>BSZGU~(S_3od5BpV~E$uupm0N+1VeoYIb6Mw<&;$Te17r~Z literal 0 HcmV?d00001 diff --git a/static/css/plugins/dropzone/basic.css b/static/css/plugins/dropzone/basic.css new file mode 100644 index 000000000..83084dbe1 --- /dev/null +++ b/static/css/plugins/dropzone/basic.css @@ -0,0 +1,155 @@ +/* The MIT License */ +.dropzone, +.dropzone *, +.dropzone-previews, +.dropzone-previews * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.dropzone { + position: relative; + border: 1px solid rgba(0,0,0,0.08); + background: rgba(0,0,0,0.02); + padding: 1em; +} +.dropzone.dz-clickable { + cursor: pointer; +} +.dropzone.dz-clickable .dz-message, +.dropzone.dz-clickable .dz-message span { + cursor: pointer; +} +.dropzone.dz-clickable * { + cursor: default; +} +.dropzone .dz-message { + opacity: 1; + -ms-filter: none; + filter: none; +} +.dropzone.dz-drag-hover { + border-color: rgba(0,0,0,0.15); + background: rgba(0,0,0,0.04); +} +.dropzone.dz-started .dz-message { + display: none; +} +.dropzone .dz-preview, +.dropzone-previews .dz-preview { + background: rgba(255,255,255,0.8); + position: relative; + display: inline-block; + margin: 17px; + vertical-align: top; + border: 1px solid #acacac; + padding: 6px 6px 6px 6px; +} +.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail], +.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] { + display: none; +} +.dropzone .dz-preview .dz-details, +.dropzone-previews .dz-preview .dz-details { + width: 100px; + height: 100px; + position: relative; + background: #ebebeb; + padding: 5px; + margin-bottom: 22px; +} +.dropzone .dz-preview .dz-details .dz-filename, +.dropzone-previews .dz-preview .dz-details .dz-filename { + overflow: hidden; + height: 100%; +} +.dropzone .dz-preview .dz-details img, +.dropzone-previews .dz-preview .dz-details img { + position: absolute; + top: 0; + left: 0; + width: 100px; + height: 100px; +} +.dropzone .dz-preview .dz-details .dz-size, +.dropzone-previews .dz-preview .dz-details .dz-size { + position: absolute; + bottom: -28px; + left: 3px; + height: 28px; + line-height: 28px; +} +.dropzone .dz-preview.dz-error .dz-error-mark, +.dropzone-previews .dz-preview.dz-error .dz-error-mark { + display: block; +} +.dropzone .dz-preview.dz-success .dz-success-mark, +.dropzone-previews .dz-preview.dz-success .dz-success-mark { + display: block; +} +.dropzone .dz-preview:hover .dz-details img, +.dropzone-previews .dz-preview:hover .dz-details img { + display: none; +} +.dropzone .dz-preview .dz-success-mark, +.dropzone-previews .dz-preview .dz-success-mark, +.dropzone .dz-preview .dz-error-mark, +.dropzone-previews .dz-preview .dz-error-mark { + display: none; + position: absolute; + width: 40px; + height: 40px; + font-size: 30px; + text-align: center; + right: -10px; + top: -10px; +} +.dropzone .dz-preview .dz-success-mark, +.dropzone-previews .dz-preview .dz-success-mark { + color: #8cc657; +} +.dropzone .dz-preview .dz-error-mark, +.dropzone-previews .dz-preview .dz-error-mark { + color: #ee162d; +} +.dropzone .dz-preview .dz-progress, +.dropzone-previews .dz-preview .dz-progress { + position: absolute; + top: 100px; + left: 6px; + right: 6px; + height: 6px; + background: #d7d7d7; + display: none; +} +.dropzone .dz-preview .dz-progress .dz-upload, +.dropzone-previews .dz-preview .dz-progress .dz-upload { + display: block; + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 0%; + background-color: #8cc657; +} +.dropzone .dz-preview.dz-processing .dz-progress, +.dropzone-previews .dz-preview.dz-processing .dz-progress { + display: block; +} +.dropzone .dz-preview .dz-error-message, +.dropzone-previews .dz-preview .dz-error-message { + display: none; + position: absolute; + top: -5px; + left: -20px; + background: rgba(245,245,245,0.8); + padding: 8px 10px; + color: #800; + min-width: 140px; + max-width: 500px; + z-index: 500; +} +.dropzone .dz-preview:hover.dz-error .dz-error-message, +.dropzone-previews .dz-preview:hover.dz-error .dz-error-message { + display: block; +} diff --git a/static/css/plugins/dropzone/dropzone.css b/static/css/plugins/dropzone/dropzone.css new file mode 100644 index 000000000..fc18729c5 --- /dev/null +++ b/static/css/plugins/dropzone/dropzone.css @@ -0,0 +1,410 @@ +/* The MIT License */ +.dropzone, +.dropzone *, +.dropzone-previews, +.dropzone-previews * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.dropzone { + position: relative; + border: 1px solid rgba(0,0,0,0.08); + background: rgba(0,0,0,0.02); + padding: 1em; +} +.dropzone.dz-clickable { + cursor: pointer; +} +.dropzone.dz-clickable .dz-message, +.dropzone.dz-clickable .dz-message span { + cursor: pointer; +} +.dropzone.dz-clickable * { + cursor: default; +} +.dropzone .dz-message { + opacity: 1; + -ms-filter: none; + filter: none; +} +.dropzone.dz-drag-hover { + border-color: rgba(0,0,0,0.15); + background: rgba(0,0,0,0.04); +} +.dropzone.dz-started .dz-message { + display: none; +} +.dropzone .dz-preview, +.dropzone-previews .dz-preview { + background: rgba(255,255,255,0.8); + position: relative; + display: inline-block; + margin: 17px; + vertical-align: top; + border: 1px solid #acacac; + padding: 6px 6px 6px 6px; +} +.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail], +.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] { + display: none; +} +.dropzone .dz-preview .dz-details, +.dropzone-previews .dz-preview .dz-details { + width: 100px; + height: 100px; + position: relative; + background: #ebebeb; + padding: 5px; + margin-bottom: 22px; +} +.dropzone .dz-preview .dz-details .dz-filename, +.dropzone-previews .dz-preview .dz-details .dz-filename { + overflow: hidden; + height: 100%; +} +.dropzone .dz-preview .dz-details img, +.dropzone-previews .dz-preview .dz-details img { + position: absolute; + top: 0; + left: 0; + width: 100px; + height: 100px; +} +.dropzone .dz-preview .dz-details .dz-size, +.dropzone-previews .dz-preview .dz-details .dz-size { + position: absolute; + bottom: -28px; + left: 3px; + height: 28px; + line-height: 28px; +} +.dropzone .dz-preview.dz-error .dz-error-mark, +.dropzone-previews .dz-preview.dz-error .dz-error-mark { + display: block; +} +.dropzone .dz-preview.dz-success .dz-success-mark, +.dropzone-previews .dz-preview.dz-success .dz-success-mark { + display: block; +} +.dropzone .dz-preview:hover .dz-details img, +.dropzone-previews .dz-preview:hover .dz-details img { + display: none; +} +.dropzone .dz-preview .dz-success-mark, +.dropzone-previews .dz-preview .dz-success-mark, +.dropzone .dz-preview .dz-error-mark, +.dropzone-previews .dz-preview .dz-error-mark { + display: none; + position: absolute; + width: 40px; + height: 40px; + font-size: 30px; + text-align: center; + right: -10px; + top: -10px; +} +.dropzone .dz-preview .dz-success-mark, +.dropzone-previews .dz-preview .dz-success-mark { + color: #8cc657; +} +.dropzone .dz-preview .dz-error-mark, +.dropzone-previews .dz-preview .dz-error-mark { + color: #ee162d; +} +.dropzone .dz-preview .dz-progress, +.dropzone-previews .dz-preview .dz-progress { + position: absolute; + top: 100px; + left: 6px; + right: 6px; + height: 6px; + background: #d7d7d7; + display: none; +} +.dropzone .dz-preview .dz-progress .dz-upload, +.dropzone-previews .dz-preview .dz-progress .dz-upload { + display: block; + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 0%; + background-color: #8cc657; +} +.dropzone .dz-preview.dz-processing .dz-progress, +.dropzone-previews .dz-preview.dz-processing .dz-progress { + display: block; +} +.dropzone .dz-preview .dz-error-message, +.dropzone-previews .dz-preview .dz-error-message { + display: none; + position: absolute; + top: -5px; + left: -20px; + background: rgba(245,245,245,0.8); + padding: 8px 10px; + color: #800; + min-width: 140px; + max-width: 500px; + z-index: 500; +} +.dropzone .dz-preview:hover.dz-error .dz-error-message, +.dropzone-previews .dz-preview:hover.dz-error .dz-error-message { + display: block; +} +.dropzone { + border: 1px solid rgba(0,0,0,0.03); + min-height: 360px; + -webkit-border-radius: 3px; + border-radius: 3px; + background: rgba(0,0,0,0.03); + padding: 23px; +} +.dropzone .dz-default.dz-message { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transition: opacity 0.3s ease-in-out; + -moz-transition: opacity 0.3s ease-in-out; + -o-transition: opacity 0.3s ease-in-out; + -ms-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; + background-image: url("../images/spritemap.png"); + background-repeat: no-repeat; + background-position: 0 0; + position: absolute; + width: 428px; + height: 123px; + margin-left: -214px; + margin-top: -61.5px; + top: 50%; + left: 50%; +} +@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) { + .dropzone .dz-default.dz-message { + background-image: url("../images/spritemap@2x.png"); + -webkit-background-size: 428px 406px; + -moz-background-size: 428px 406px; + background-size: 428px 406px; + } +} +.dropzone .dz-default.dz-message span { + display: none; +} +.dropzone.dz-square .dz-default.dz-message { + background-position: 0 -123px; + width: 268px; + margin-left: -134px; + height: 174px; + margin-top: -87px; +} +.dropzone.dz-drag-hover .dz-message { + opacity: 0.15; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=15)"; + filter: alpha(opacity=15); +} +.dropzone.dz-started .dz-message { + display: block; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.dropzone .dz-preview, +.dropzone-previews .dz-preview { + -webkit-box-shadow: 1px 1px 4px rgba(0,0,0,0.16); + box-shadow: 1px 1px 4px rgba(0,0,0,0.16); + font-size: 14px; +} +.dropzone .dz-preview.dz-image-preview:hover .dz-details img, +.dropzone-previews .dz-preview.dz-image-preview:hover .dz-details img { + display: block; + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); +} +.dropzone .dz-preview.dz-success .dz-success-mark, +.dropzone-previews .dz-preview.dz-success .dz-success-mark { + opacity: 1; + -ms-filter: none; + filter: none; +} +.dropzone .dz-preview.dz-error .dz-error-mark, +.dropzone-previews .dz-preview.dz-error .dz-error-mark { + opacity: 1; + -ms-filter: none; + filter: none; +} +.dropzone .dz-preview.dz-error .dz-progress .dz-upload, +.dropzone-previews .dz-preview.dz-error .dz-progress .dz-upload { + background: #ee1e2d; +} +.dropzone .dz-preview .dz-error-mark, +.dropzone-previews .dz-preview .dz-error-mark, +.dropzone .dz-preview .dz-success-mark, +.dropzone-previews .dz-preview .dz-success-mark { + display: block; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.4s ease-in-out; + -moz-transition: opacity 0.4s ease-in-out; + -o-transition: opacity 0.4s ease-in-out; + -ms-transition: opacity 0.4s ease-in-out; + transition: opacity 0.4s ease-in-out; + background-image: url("../images/spritemap.png"); + background-repeat: no-repeat; +} +@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) { + .dropzone .dz-preview .dz-error-mark, + .dropzone-previews .dz-preview .dz-error-mark, + .dropzone .dz-preview .dz-success-mark, + .dropzone-previews .dz-preview .dz-success-mark { + background-image: url("../images/spritemap@2x.png"); + -webkit-background-size: 428px 406px; + -moz-background-size: 428px 406px; + background-size: 428px 406px; + } +} +.dropzone .dz-preview .dz-error-mark span, +.dropzone-previews .dz-preview .dz-error-mark span, +.dropzone .dz-preview .dz-success-mark span, +.dropzone-previews .dz-preview .dz-success-mark span { + display: none; +} +.dropzone .dz-preview .dz-error-mark, +.dropzone-previews .dz-preview .dz-error-mark { + background-position: -268px -123px; +} +.dropzone .dz-preview .dz-success-mark, +.dropzone-previews .dz-preview .dz-success-mark { + background-position: -268px -163px; +} +.dropzone .dz-preview .dz-progress .dz-upload, +.dropzone-previews .dz-preview .dz-progress .dz-upload { + -webkit-animation: loading 0.4s linear infinite; + -moz-animation: loading 0.4s linear infinite; + -o-animation: loading 0.4s linear infinite; + -ms-animation: loading 0.4s linear infinite; + animation: loading 0.4s linear infinite; + -webkit-transition: width 0.3s ease-in-out; + -moz-transition: width 0.3s ease-in-out; + -o-transition: width 0.3s ease-in-out; + -ms-transition: width 0.3s ease-in-out; + transition: width 0.3s ease-in-out; + -webkit-border-radius: 2px; + border-radius: 2px; + position: absolute; + top: 0; + left: 0; + width: 0%; + height: 100%; + background-image: url("../images/spritemap.png"); + background-repeat: repeat-x; + background-position: 0px -400px; +} +@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) { + .dropzone .dz-preview .dz-progress .dz-upload, + .dropzone-previews .dz-preview .dz-progress .dz-upload { + background-image: url("../images/spritemap@2x.png"); + -webkit-background-size: 428px 406px; + -moz-background-size: 428px 406px; + background-size: 428px 406px; + } +} +.dropzone .dz-preview.dz-success .dz-progress, +.dropzone-previews .dz-preview.dz-success .dz-progress { + display: block; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.4s ease-in-out; + -moz-transition: opacity 0.4s ease-in-out; + -o-transition: opacity 0.4s ease-in-out; + -ms-transition: opacity 0.4s ease-in-out; + transition: opacity 0.4s ease-in-out; +} +.dropzone .dz-preview .dz-error-message, +.dropzone-previews .dz-preview .dz-error-message { + display: block; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.3s ease-in-out; + -moz-transition: opacity 0.3s ease-in-out; + -o-transition: opacity 0.3s ease-in-out; + -ms-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; +} +.dropzone .dz-preview:hover.dz-error .dz-error-message, +.dropzone-previews .dz-preview:hover.dz-error .dz-error-message { + opacity: 1; + -ms-filter: none; + filter: none; +} +.dropzone a.dz-remove, +.dropzone-previews a.dz-remove { + background-image: -webkit-linear-gradient(top, #fafafa, #eee); + background-image: -moz-linear-gradient(top, #fafafa, #eee); + background-image: -o-linear-gradient(top, #fafafa, #eee); + background-image: -ms-linear-gradient(top, #fafafa, #eee); + background-image: linear-gradient(to bottom, #fafafa, #eee); + -webkit-border-radius: 2px; + border-radius: 2px; + border: 1px solid #eee; + text-decoration: none; + display: block; + padding: 4px 5px; + text-align: center; + color: #aaa; + margin-top: 26px; +} +.dropzone a.dz-remove:hover, +.dropzone-previews a.dz-remove:hover { + color: #666; +} +@-moz-keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} +@-webkit-keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} +@-o-keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} +@-ms-keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} +@keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} diff --git a/static/css/plugins/fullcalendar/fullcalendar.css b/static/css/plugins/fullcalendar/fullcalendar.css new file mode 100644 index 000000000..b2feb028e --- /dev/null +++ b/static/css/plugins/fullcalendar/fullcalendar.css @@ -0,0 +1,977 @@ +/*! + * FullCalendar v2.2.0 Stylesheet + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + + +.fc { + direction: ltr; + text-align: left; +} + +.fc-rtl { + text-align: right; +} + +body .fc { /* extra precedence to overcome jqui */ + font-size: 1em; +} + + +/* Colors +--------------------------------------------------------------------------------------------------*/ + +.fc-unthemed th, +.fc-unthemed td, +.fc-unthemed hr, +.fc-unthemed thead, +.fc-unthemed tbody, +.fc-unthemed .fc-row, +.fc-unthemed .fc-popover { + border-color: #ddd; +} + +.fc-unthemed .fc-popover { + background-color: #fff; +} + +.fc-unthemed hr, +.fc-unthemed .fc-popover .fc-header { + background: #eee; +} + +.fc-unthemed .fc-popover .fc-header .fc-close { + color: #666; +} + +.fc-unthemed .fc-today { + background: #fcf8e3; +} + +.fc-highlight { /* when user is selecting cells */ + background: #bce8f1; + opacity: .3; + filter: alpha(opacity=30); /* for IE */ +} + +.fc-bgevent { /* default look for background events */ + background: rgb(143, 223, 130); + opacity: .3; + filter: alpha(opacity=30); /* for IE */ +} + +.fc-nonbusiness { /* default look for non-business-hours areas */ + /* will inherit .fc-bgevent's styles */ + background: #ccc; +} + + +/* Icons (inline elements with styled text that mock arrow icons) +--------------------------------------------------------------------------------------------------*/ + +.fc-icon { + display: inline-block; + font-size: 2em; + line-height: .5em; + height: .5em; /* will make the total height 1em */ + font-family: "Courier New", Courier, monospace; +} + +.fc-icon-left-single-arrow:after { + content: "\02039"; + font-weight: bold; +} + +.fc-icon-right-single-arrow:after { + content: "\0203A"; + font-weight: bold; +} + +.fc-icon-left-double-arrow:after { + content: "\000AB"; +} + +.fc-icon-right-double-arrow:after { + content: "\000BB"; +} + +.fc-icon-x:after { + content: "\000D7"; +} + + +/* Buttons (styled ',tClose:"Close (Esc)",tLoading:"Loading..."}},a.fn.magnificPopup=function(c){A();var d=a(this);if("string"==typeof c)if("open"===c){var e,f=u?d.data("magnificPopup"):d[0].magnificPopup,g=parseInt(arguments[1],10)||0;f.items?e=f.items[g]:(e=d,f.delegate&&(e=e.find(f.delegate)),e=e.eq(g)),b._openClick({mfpEl:e},d,f)}else b.isOpen&&b[c].apply(b,Array.prototype.slice.call(arguments,1));else c=a.extend(!0,{},c),u?d.data("magnificPopup",c):d[0].magnificPopup=c,b.addGroup(d,c);return d};var C,D,E,F="inline",G=function(){E&&(D.after(E.addClass(C)).detach(),E=null)};a.magnificPopup.registerModule(F,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){b.types.push(F),w(h+"."+F,function(){G()})},getInline:function(c,d){if(G(),c.src){var e=b.st.inline,f=a(c.src);if(f.length){var g=f[0].parentNode;g&&g.tagName&&(D||(C=e.hiddenClass,D=x(C),C="mfp-"+C),E=f.after(D).detach().removeClass(C)),b.updateStatus("ready")}else b.updateStatus("error",e.tNotFound),f=a("

");return c.inlineElement=f,f}return b.updateStatus("ready"),b._parseMarkup(d,{},c),d}}});var H,I="ajax",J=function(){H&&a(document.body).removeClass(H)},K=function(){J(),b.req&&b.req.abort()};a.magnificPopup.registerModule(I,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){b.types.push(I),H=b.st.ajax.cursor,w(h+"."+I,K),w("BeforeChange."+I,K)},getAjax:function(c){H&&a(document.body).addClass(H),b.updateStatus("loading");var d=a.extend({url:c.src,success:function(d,e,f){var g={data:d,xhr:f};y("ParseAjax",g),b.appendContent(a(g.data),I),c.finished=!0,J(),b._setFocus(),setTimeout(function(){b.wrap.addClass(q)},16),b.updateStatus("ready"),y("AjaxContentAdded")},error:function(){J(),c.finished=c.loadError=!0,b.updateStatus("error",b.st.ajax.tError.replace("%url%",c.src))}},b.st.ajax.settings);return b.req=a.ajax(d),""}}});var L,M=function(c){if(c.data&&void 0!==c.data.title)return c.data.title;var d=b.st.image.titleSrc;if(d){if(a.isFunction(d))return d.call(b,c);if(c.el)return c.el.attr(d)||""}return""};a.magnificPopup.registerModule("image",{options:{markup:'
',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var c=b.st.image,d=".image";b.types.push("image"),w(m+d,function(){"image"===b.currItem.type&&c.cursor&&a(document.body).addClass(c.cursor)}),w(h+d,function(){c.cursor&&a(document.body).removeClass(c.cursor),v.off("resize"+p)}),w("Resize"+d,b.resizeImage),b.isLowIE&&w("AfterChange",b.resizeImage)},resizeImage:function(){var a=b.currItem;if(a&&a.img&&b.st.image.verticalFit){var c=0;b.isLowIE&&(c=parseInt(a.img.css("padding-top"),10)+parseInt(a.img.css("padding-bottom"),10)),a.img.css("max-height",b.wH-c)}},_onImageHasSize:function(a){a.img&&(a.hasSize=!0,L&&clearInterval(L),a.isCheckingImgSize=!1,y("ImageHasSize",a),a.imgHidden&&(b.content&&b.content.removeClass("mfp-loading"),a.imgHidden=!1))},findImageSize:function(a){var c=0,d=a.img[0],e=function(f){L&&clearInterval(L),L=setInterval(function(){return d.naturalWidth>0?void b._onImageHasSize(a):(c>200&&clearInterval(L),c++,void(3===c?e(10):40===c?e(50):100===c&&e(500)))},f)};e(1)},getImage:function(c,d){var e=0,f=function(){c&&(c.img[0].complete?(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("ready")),c.hasSize=!0,c.loaded=!0,y("ImageLoadComplete")):(e++,200>e?setTimeout(f,100):g()))},g=function(){c&&(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("error",h.tError.replace("%url%",c.src))),c.hasSize=!0,c.loaded=!0,c.loadError=!0)},h=b.st.image,i=d.find(".mfp-img");if(i.length){var j=document.createElement("img");j.className="mfp-img",c.el&&c.el.find("img").length&&(j.alt=c.el.find("img").attr("alt")),c.img=a(j).on("load.mfploader",f).on("error.mfploader",g),j.src=c.src,i.is("img")&&(c.img=c.img.clone()),j=c.img[0],j.naturalWidth>0?c.hasSize=!0:j.width||(c.hasSize=!1)}return b._parseMarkup(d,{title:M(c),img_replaceWith:c.img},c),b.resizeImage(),c.hasSize?(L&&clearInterval(L),c.loadError?(d.addClass("mfp-loading"),b.updateStatus("error",h.tError.replace("%url%",c.src))):(d.removeClass("mfp-loading"),b.updateStatus("ready")),d):(b.updateStatus("loading"),c.loading=!0,c.hasSize||(c.imgHidden=!0,d.addClass("mfp-loading"),b.findImageSize(c)),d)}}});var N,O=function(){return void 0===N&&(N=void 0!==document.createElement("p").style.MozTransform),N};a.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(a){return a.is("img")?a:a.find("img")}},proto:{initZoom:function(){var a,c=b.st.zoom,d=".zoom";if(c.enabled&&b.supportsTransition){var e,f,g=c.duration,j=function(a){var b=a.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),d="all "+c.duration/1e3+"s "+c.easing,e={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},f="transition";return e["-webkit-"+f]=e["-moz-"+f]=e["-o-"+f]=e[f]=d,b.css(e),b},k=function(){b.content.css("visibility","visible")};w("BuildControls"+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.content.css("visibility","hidden"),a=b._getItemToZoom(),!a)return void k();f=j(a),f.css(b._getOffset()),b.wrap.append(f),e=setTimeout(function(){f.css(b._getOffset(!0)),e=setTimeout(function(){k(),setTimeout(function(){f.remove(),a=f=null,y("ZoomAnimationEnded")},16)},g)},16)}}),w(i+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.st.removalDelay=g,!a){if(a=b._getItemToZoom(),!a)return;f=j(a)}f.css(b._getOffset(!0)),b.wrap.append(f),b.content.css("visibility","hidden"),setTimeout(function(){f.css(b._getOffset())},16)}}),w(h+d,function(){b._allowZoom()&&(k(),f&&f.remove(),a=null)})}},_allowZoom:function(){return"image"===b.currItem.type},_getItemToZoom:function(){return b.currItem.hasSize?b.currItem.img:!1},_getOffset:function(c){var d;d=c?b.currItem.img:b.st.zoom.opener(b.currItem.el||b.currItem);var e=d.offset(),f=parseInt(d.css("padding-top"),10),g=parseInt(d.css("padding-bottom"),10);e.top-=a(window).scrollTop()-f;var h={width:d.width(),height:(u?d.innerHeight():d[0].offsetHeight)-g-f};return O()?h["-moz-transform"]=h.transform="translate("+e.left+"px,"+e.top+"px)":(h.left=e.left,h.top=e.top),h}}});var P="iframe",Q="//about:blank",R=function(a){if(b.currTemplate[P]){var c=b.currTemplate[P].find("iframe");c.length&&(a||(c[0].src=Q),b.isIE8&&c.css("display",a?"block":"none"))}};a.magnificPopup.registerModule(P,{options:{markup:'
',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){b.types.push(P),w("BeforeChange",function(a,b,c){b!==c&&(b===P?R():c===P&&R(!0))}),w(h+"."+P,function(){R()})},getIframe:function(c,d){var e=c.src,f=b.st.iframe;a.each(f.patterns,function(){return e.indexOf(this.index)>-1?(this.id&&(e="string"==typeof this.id?e.substr(e.lastIndexOf(this.id)+this.id.length,e.length):this.id.call(this,e)),e=this.src.replace("%id%",e),!1):void 0});var g={};return f.srcAction&&(g[f.srcAction]=e),b._parseMarkup(d,g,c),b.updateStatus("ready"),d}}});var S=function(a){var c=b.items.length;return a>c-1?a-c:0>a?c+a:a},T=function(a,b,c){return a.replace(/%curr%/gi,b+1).replace(/%total%/gi,c)};a.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var c=b.st.gallery,e=".mfp-gallery",g=Boolean(a.fn.mfpFastClick);return b.direction=!0,c&&c.enabled?(f+=" mfp-gallery",w(m+e,function(){c.navigateByImgClick&&b.wrap.on("click"+e,".mfp-img",function(){return b.items.length>1?(b.next(),!1):void 0}),d.on("keydown"+e,function(a){37===a.keyCode?b.prev():39===a.keyCode&&b.next()})}),w("UpdateStatus"+e,function(a,c){c.text&&(c.text=T(c.text,b.currItem.index,b.items.length))}),w(l+e,function(a,d,e,f){var g=b.items.length;e.counter=g>1?T(c.tCounter,f.index,g):""}),w("BuildControls"+e,function(){if(b.items.length>1&&c.arrows&&!b.arrowLeft){var d=c.arrowMarkup,e=b.arrowLeft=a(d.replace(/%title%/gi,c.tPrev).replace(/%dir%/gi,"left")).addClass(s),f=b.arrowRight=a(d.replace(/%title%/gi,c.tNext).replace(/%dir%/gi,"right")).addClass(s),h=g?"mfpFastClick":"click";e[h](function(){b.prev()}),f[h](function(){b.next()}),b.isIE7&&(x("b",e[0],!1,!0),x("a",e[0],!1,!0),x("b",f[0],!1,!0),x("a",f[0],!1,!0)),b.container.append(e.add(f))}}),w(n+e,function(){b._preloadTimeout&&clearTimeout(b._preloadTimeout),b._preloadTimeout=setTimeout(function(){b.preloadNearbyImages(),b._preloadTimeout=null},16)}),void w(h+e,function(){d.off(e),b.wrap.off("click"+e),b.arrowLeft&&g&&b.arrowLeft.add(b.arrowRight).destroyMfpFastClick(),b.arrowRight=b.arrowLeft=null})):!1},next:function(){b.direction=!0,b.index=S(b.index+1),b.updateItemHTML()},prev:function(){b.direction=!1,b.index=S(b.index-1),b.updateItemHTML()},goTo:function(a){b.direction=a>=b.index,b.index=a,b.updateItemHTML()},preloadNearbyImages:function(){var a,c=b.st.gallery.preload,d=Math.min(c[0],b.items.length),e=Math.min(c[1],b.items.length);for(a=1;a<=(b.direction?e:d);a++)b._preloadItem(b.index+a);for(a=1;a<=(b.direction?d:e);a++)b._preloadItem(b.index-a)},_preloadItem:function(c){if(c=S(c),!b.items[c].preloaded){var d=b.items[c];d.parsed||(d=b.parseEl(c)),y("LazyLoad",d),"image"===d.type&&(d.img=a('').on("load.mfploader",function(){d.hasSize=!0}).on("error.mfploader",function(){d.hasSize=!0,d.loadError=!0,y("LazyLoadError",d)}).attr("src",d.src)),d.preloaded=!0}}}});var U="retina";a.magnificPopup.registerModule(U,{options:{replaceSrc:function(a){return a.src.replace(/\.\w+$/,function(a){return"@2x"+a})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var a=b.st.retina,c=a.ratio;c=isNaN(c)?c():c,c>1&&(w("ImageHasSize."+U,function(a,b){b.img.css({"max-width":b.img[0].naturalWidth/c,width:"100%"})}),w("ElementParse."+U,function(b,d){d.src=a.replaceSrc(d,c)}))}}}}),function(){var b=1e3,c="ontouchstart"in window,d=function(){v.off("touchmove"+f+" touchend"+f)},e="mfpFastClick",f="."+e;a.fn.mfpFastClick=function(e){return a(this).each(function(){var g,h=a(this);if(c){var i,j,k,l,m,n;h.on("touchstart"+f,function(a){l=!1,n=1,m=a.originalEvent?a.originalEvent.touches[0]:a.touches[0],j=m.clientX,k=m.clientY,v.on("touchmove"+f,function(a){m=a.originalEvent?a.originalEvent.touches:a.touches,n=m.length,m=m[0],(Math.abs(m.clientX-j)>10||Math.abs(m.clientY-k)>10)&&(l=!0,d())}).on("touchend"+f,function(a){d(),l||n>1||(g=!0,a.preventDefault(),clearTimeout(i),i=setTimeout(function(){g=!1},b),e())})})}h.on("click"+f,function(){g||e()})})},a.fn.destroyMfpFastClick=function(){a(this).off("touchstart"+f+" click"+f),c&&v.off("touchmove"+f+" touchend"+f)}}(),A()}); \ No newline at end of file diff --git a/static/js/mindmup-editabletable.js b/static/js/mindmup-editabletable.js new file mode 100644 index 000000000..4ae1b9b0e --- /dev/null +++ b/static/js/mindmup-editabletable.js @@ -0,0 +1,133 @@ +/*global $, window*/ +$.fn.editableTableWidget = function (options) { + 'use strict'; + return $(this).each(function () { + var buildDefaultOptions = function () { + var opts = $.extend({}, $.fn.editableTableWidget.defaultOptions); + opts.editor = opts.editor.clone(); + return opts; + }, + activeOptions = $.extend(buildDefaultOptions(), options), + ARROW_LEFT = 37, ARROW_UP = 38, ARROW_RIGHT = 39, ARROW_DOWN = 40, ENTER = 13, ESC = 27, TAB = 9, + element = $(this), + editor = activeOptions.editor.css('position', 'absolute').hide().appendTo(element.parent()), + active, + showEditor = function (select) { + active = element.find('td:focus'); + if (active.length) { + editor.val(active.text()) + .removeClass('error') + .show() + .offset(active.offset()) + .css(active.css(activeOptions.cloneProperties)) + .width(active.width()) + .height(active.height()) + .focus(); + if (select) { + editor.select(); + } + } + }, + setActiveText = function () { + var text = editor.val(), + evt = $.Event('change'), + originalContent; + if (active.text() === text || editor.hasClass('error')) { + return true; + } + originalContent = active.html(); + active.text(text).trigger(evt, text); + if (evt.result === false) { + active.html(originalContent); + } + }, + movement = function (element, keycode) { + if (keycode === ARROW_RIGHT) { + return element.next('td'); + } else if (keycode === ARROW_LEFT) { + return element.prev('td'); + } else if (keycode === ARROW_UP) { + return element.parent().prev().children().eq(element.index()); + } else if (keycode === ARROW_DOWN) { + return element.parent().next().children().eq(element.index()); + } + return []; + }; + editor.blur(function () { + setActiveText(); + editor.hide(); + }).keydown(function (e) { + if (e.which === ENTER) { + setActiveText(); + editor.hide(); + active.focus(); + e.preventDefault(); + e.stopPropagation(); + } else if (e.which === ESC) { + editor.val(active.text()); + e.preventDefault(); + e.stopPropagation(); + editor.hide(); + active.focus(); + } else if (e.which === TAB) { + active.focus(); + } else if (this.selectionEnd - this.selectionStart === this.value.length) { + var possibleMove = movement(active, e.which); + if (possibleMove.length > 0) { + possibleMove.focus(); + e.preventDefault(); + e.stopPropagation(); + } + } + }) + .on('input paste', function () { + var evt = $.Event('validate'); + active.trigger(evt, editor.val()); + if (evt.result === false) { + editor.addClass('error'); + } else { + editor.removeClass('error'); + } + }); + //element.on('click keypress dblclick', showEditor) + element.find("td:not([data-editable='false'])").on('click keypress dblclick', showEditor) + .css('cursor', 'pointer') + .keydown(function (e) { + var prevent = true, + possibleMove = movement($(e.target), e.which); + if (possibleMove.length > 0) { + possibleMove.focus(); + } else if (e.which === ENTER) { + showEditor(false); + } else if (e.which === 17 || e.which === 91 || e.which === 93) { + showEditor(true); + prevent = false; + } else { + prevent = false; + } + if (prevent) { + e.stopPropagation(); + e.preventDefault(); + } + }); + + //element.find('td').prop('tabindex', 1); + element.find("td:not([data-editable='false'])").prop('tabindex', 1); + + $(window).on('resize', function () { + if (editor.is(':visible')) { + editor.offset(active.offset()) + .width(active.width()) + .height(active.height()); + } + }); + }); + +}; +$.fn.editableTableWidget.defaultOptions = { + cloneProperties: ['padding', 'padding-top', 'padding-bottom', 'padding-left', 'padding-right', + 'text-align', 'font', 'font-size', 'font-family', 'font-weight', + 'border', 'border-top', 'border-bottom', 'border-left', 'border-right'], + editor: $('') +}; + diff --git a/static/js/plugins/fullcalendar/fullcalendar.min.js b/static/js/plugins/fullcalendar/fullcalendar.min.js new file mode 100644 index 000000000..fcbf126f1 --- /dev/null +++ b/static/js/plugins/fullcalendar/fullcalendar.min.js @@ -0,0 +1,8 @@ +/*! + * FullCalendar v2.2.0 + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){function n(t,e){return e.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"t")}function i(t,e){var n=e.longDateFormat("L");return n=n.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g,""),t.isRTL?n+=" ddd":n="ddd "+n,n}function r(t){s(Fe,t)}function s(e){function n(n,i){t.isPlainObject(i)&&t.isPlainObject(e[n])&&!o(n)?e[n]=s({},e[n],i):void 0!==i&&(e[n]=i)}for(var i=1;arguments.length>i;i++)t.each(arguments[i],n);return e}function o(t){return/(Time|Duration)$/.test(t)}function l(n,i){function r(t){var n=e.localeData||e.langData;return n.call(e,t)||n.call(e,"en")}function o(t){ne?u()&&(p(),f(t)):l()}function l(){ie=K.theme?"ui":"fc",n.addClass("fc"),K.isRTL?n.addClass("fc-rtl"):n.addClass("fc-ltr"),K.theme?n.addClass("ui-widget"):n.addClass("fc-unthemed"),ne=t("
").prependTo(n),te=new a(q,K),ee=te.render(),ee&&n.prepend(ee),h(K.defaultView),K.handleWindowResize&&(oe=_(v,K.windowResizeDelay),t(window).resize(oe))}function d(){re&&re.destroy(),te.destroy(),ne.remove(),n.removeClass("fc fc-ltr fc-rtl fc-unthemed ui-widget"),t(window).unbind("resize",oe)}function u(){return n.is(":visible")}function h(t){f(0,t)}function f(e,n){ue++,re&&n&&re.name!==n&&(te.deactivateButton(re.name),B(),re.start&&re.destroy(),re.el.remove(),re=null),!re&&n&&(re=new Ge[n](q),re.el=t("
").appendTo(ne),te.activateButton(n)),re&&(e&&(le=re.incrementDate(le,e)),re.start&&!e&&le.isWithin(re.intervalStart,re.intervalEnd)||u()&&(B(),re.start&&re.destroy(),re.render(le),I(),C(),H(),b())),I(),ue--}function g(t){return u()?(t&&m(),ue++,re.updateSize(!0),ue--,!0):void 0}function p(){u()&&m()}function m(){se="number"==typeof K.contentHeight?K.contentHeight:"number"==typeof K.height?K.height-(ee?ee.outerHeight(!0):0):Math.round(ne.width()/Math.max(K.aspectRatio,.5))}function v(t){!ue&&t.target===window&&re.start&&g(!0)&&re.trigger("windowResize",de)}function y(){S(),E()}function w(){u()&&(B(),re.destroyEvents(),re.renderEvents(he),I())}function S(){B(),re.destroyEvents(),I()}function b(){!K.lazyFetching||ae(re.start,re.end)?E():w()}function E(){ce(re.start,re.end)}function D(t){he=t,w()}function T(){w()}function C(){te.updateTitle(re.title)}function H(){var t=q.getNow();t.isWithin(re.intervalStart,re.intervalEnd)?te.disableButton("today"):te.enableButton("today")}function x(t,e){t=q.moment(t),e=e?q.moment(e):t.hasTime()?t.clone().add(q.defaultTimedEventDuration):t.clone().add(q.defaultAllDayEventDuration),re.select(t,e)}function k(){re&&re.unselect()}function R(){f(-1)}function P(){f(1)}function F(){le.add(-1,"years"),f()}function L(){le.add(1,"years"),f()}function G(){le=q.getNow(),f()}function N(t){le=q.moment(t),f()}function A(t){le.add(e.duration(t)),f()}function Y(t,e){var n,i;e&&void 0!==Ge[e]||(e=e||"day",n=te.getViewsWithButtons().join(" "),i=n.match(RegExp("\\w+"+z(e))),i||(i=n.match(/\w+Day/)),e=i?i[0]:"agendaDay"),le=t,h(e)}function V(){return le.clone()}function B(){ne.css({width:"100%",height:ne.height(),overflow:"hidden"})}function I(){ne.css({width:"",height:"",overflow:""})}function Z(){return q}function j(){return re}function X(t,e){return void 0===e?K[t]:(("height"==t||"contentHeight"==t||"aspectRatio"==t)&&(K[t]=e,g(!0)),void 0)}function $(t,e){return K[t]?K[t].apply(e||de,Array.prototype.slice.call(arguments,2)):void 0}var q=this;i=i||{};var U,K=s({},Fe,i);U=K.lang in Le?Le[K.lang]:Le[Fe.lang],U&&(K=s({},Fe,U,i)),K.isRTL&&(K=s({},Fe,ze,U||{},i)),q.options=K,q.render=o,q.destroy=d,q.refetchEvents=y,q.reportEvents=D,q.reportEventChange=T,q.rerenderEvents=w,q.changeView=h,q.select=x,q.unselect=k,q.prev=R,q.next=P,q.prevYear=F,q.nextYear=L,q.today=G,q.gotoDate=N,q.incrementDate=A,q.zoomTo=Y,q.getDate=V,q.getCalendar=Z,q.getView=j,q.option=X,q.trigger=$;var Q=M(r(K.lang));if(K.monthNames&&(Q._months=K.monthNames),K.monthNamesShort&&(Q._monthsShort=K.monthNamesShort),K.dayNames&&(Q._weekdays=K.dayNames),K.dayNamesShort&&(Q._weekdaysShort=K.dayNamesShort),null!=K.firstDay){var J=M(Q._week);J.dow=K.firstDay,Q._week=J}q.defaultAllDayEventDuration=e.duration(K.defaultAllDayEventDuration),q.defaultTimedEventDuration=e.duration(K.defaultTimedEventDuration),q.moment=function(){var t;return"local"===K.timezone?(t=_e.moment.apply(null,arguments),t.hasTime()&&t.local()):t="UTC"===K.timezone?_e.moment.utc.apply(null,arguments):_e.moment.parseZone.apply(null,arguments),"_locale"in t?t._locale=Q:t._lang=Q,t},q.getIsAmbigTimezone=function(){return"local"!==K.timezone&&"UTC"!==K.timezone},q.rezoneDate=function(t){return q.moment(t.toArray())},q.getNow=function(){var t=K.now;return"function"==typeof t&&(t=t()),q.moment(t)},q.calculateWeekNumber=function(t){var e=K.weekNumberCalculation;return"function"==typeof e?e(t):"local"===e?t.week():"ISO"===e.toUpperCase()?t.isoWeek():void 0},q.getEventEnd=function(t){return t.end?t.end.clone():q.getDefaultEventEnd(t.allDay,t.start)},q.getDefaultEventEnd=function(t,e){var n=e.clone();return t?n.stripTime().add(q.defaultAllDayEventDuration):n.add(q.defaultTimedEventDuration),q.getIsAmbigTimezone()&&n.stripZone(),n},q.formatRange=function(t,e,n){return"function"==typeof n&&(n=n.call(q,K,Q)),W(t,e,n,null,K.isRTL)},q.formatDate=function(t,e){return"function"==typeof e&&(e=e.call(q,K,Q)),O(t,e)},c.call(q,K);var te,ee,ne,ie,re,se,oe,le,ae=q.isFetchNeeded,ce=q.fetchEvents,de=n[0],ue=0,he=[];le=null!=K.defaultDate?q.moment(K.defaultDate):q.getNow(),q.getSuggestedViewHeight=function(){return void 0===se&&p(),se},q.isHeightAuto=function(){return"auto"===K.contentHeight||"auto"===K.height}}function a(e,n){function i(){var e=n.header;return f=n.theme?"ui":"fc",e?g=t("
").append(s("left")).append(s("right")).append(s("center")).append('
'):void 0}function r(){g.remove()}function s(i){var r=t('
'),s=n.header[i];return s&&t.each(s.split(" "),function(){var i,s=t(),o=!0;t.each(this.split(","),function(i,r){var l,a,c,d,u,h,g,m;"title"==r?(s=s.add(t("

 

")),o=!1):(e[r]?l=function(){e[r]()}:Ge[r]&&(l=function(){e.changeView(r)},p.push(r)),l&&(a=T(n.themeButtonIcons,r),c=T(n.buttonIcons,r),d=T(n.defaultButtonText,r),u=T(n.buttonText,r),h=u?F(u):a&&n.theme?"":c&&!n.theme?"":F(d||r),g=["fc-"+r+"-button",f+"-button",f+"-state-default"],m=t('").click(function(){m.hasClass(f+"-state-disabled")||(l(),(m.hasClass(f+"-state-active")||m.hasClass(f+"-state-disabled"))&&m.removeClass(f+"-state-hover"))}).mousedown(function(){m.not("."+f+"-state-active").not("."+f+"-state-disabled").addClass(f+"-state-down")}).mouseup(function(){m.removeClass(f+"-state-down")}).hover(function(){m.not("."+f+"-state-active").not("."+f+"-state-disabled").addClass(f+"-state-hover")},function(){m.removeClass(f+"-state-hover").removeClass(f+"-state-down")}),s=s.add(m)))}),o&&s.first().addClass(f+"-corner-left").end().last().addClass(f+"-corner-right").end(),s.length>1?(i=t("
"),o&&i.addClass("fc-button-group"),i.append(s),r.append(i)):r.append(s)}),r}function o(t){g.find("h2").text(t)}function l(t){g.find(".fc-"+t+"-button").addClass(f+"-state-active")}function a(t){g.find(".fc-"+t+"-button").removeClass(f+"-state-active")}function c(t){g.find(".fc-"+t+"-button").attr("disabled","disabled").addClass(f+"-state-disabled")}function d(t){g.find(".fc-"+t+"-button").removeAttr("disabled").removeClass(f+"-state-disabled")}function u(){return p}var h=this;h.render=i,h.destroy=r,h.updateTitle=o,h.activateButton=l,h.deactivateButton=a,h.disableButton=c,h.enableButton=d,h.getViewsWithButtons=u;var f,g=t(),p=[]}function c(n){function i(t,e){return!A||t.clone().stripZone()Y.clone().stripZone()}function r(t,e){A=t,Y=e,q=[];var n=++j,i=Z.length;X=i;for(var r=0;i>r;r++)s(Z[r],n)}function s(e,n){o(e,function(i){var r,s,o,l=t.isArray(e.events);if(n==j){if(i)for(r=0;i.length>r;r++)s=i[r],o=l?s:S(s,e),o&&q.push.apply(q,E(o));X--,X||B(q)}})}function o(e,i){var r,s,l=_e.sourceFetchers;for(r=0;l.length>r;r++){if(s=l[r].call(N,e,A.clone(),Y.clone(),n.timezone,i),s===!0)return;if("object"==typeof s)return o(s,i),void 0}var a=e.events;if(a)t.isFunction(a)?(y(),a.call(N,A.clone(),Y.clone(),n.timezone,function(t){i(t),w()})):t.isArray(a)?i(a):i();else{var c=e.url;if(c){var d,u=e.success,h=e.error,f=e.complete;d=t.isFunction(e.data)?e.data():e.data;var g=t.extend({},d||{}),p=P(e.startParam,n.startParam),m=P(e.endParam,n.endParam),v=P(e.timezoneParam,n.timezoneParam);p&&(g[p]=A.format()),m&&(g[m]=Y.format()),n.timezone&&"local"!=n.timezone&&(g[v]=n.timezone),y(),t.ajax(t.extend({},Ne,e,{data:g,success:function(e){e=e||[];var n=R(u,this,arguments);t.isArray(n)&&(e=n),i(e)},error:function(){R(h,this,arguments),i()},complete:function(){R(f,this,arguments),w()}}))}else i()}}function l(t){var e=a(t);e&&(Z.push(e),X++,s(e,j))}function a(e){var n,i,r=_e.sourceNormalizers;if(t.isFunction(e)||t.isArray(e)?n={events:e}:"string"==typeof e?n={url:e}:"object"==typeof e&&(n=t.extend({},e)),n){for(n.className?"string"==typeof n.className&&(n.className=n.className.split(/\s+/)):n.className=[],t.isArray(n.events)&&(n.origArray=n.events,n.events=t.map(n.events,function(t){return S(t,n)})),i=0;r.length>i;i++)r[i].call(N,n);return n}}function c(e){Z=t.grep(Z,function(t){return!u(t,e)}),q=t.grep(q,function(t){return!u(t.source,e)}),B(q)}function u(t,e){return t&&e&&h(t)==h(e)}function h(t){return("object"==typeof t?t.origArray||t.url||t.events:null)||t}function f(t){t.start=N.moment(t.start),t.end&&(t.end=N.moment(t.end)),D(t),g(t),B(q)}function g(t){var e,n,i,r;for(e=0;q.length>e;e++)if(n=q[e],n._id==t._id&&n!==t)for(i=0;U.length>i;i++)r=U[i],void 0!==t[r]&&(n[r]=t[r])}function p(t,e){var n,i,r,s=S(t);if(s){for(n=E(s),i=0;n.length>i;i++)r=n[i],r.source||(e&&(W.events.push(r),r.source=W),q.push(r));return B(q),n}return[]}function m(e){var n,i;for(null==e?e=function(){return!0}:t.isFunction(e)||(n=e+"",e=function(t){return t._id==n}),q=t.grep(q,e,!0),i=0;Z.length>i;i++)t.isArray(Z[i].events)&&(Z[i].events=t.grep(Z[i].events,e,!0));B(q)}function v(e){return t.isFunction(e)?t.grep(q,e):null!=e?(e+="",t.grep(q,function(t){return t._id==e})):q}function y(){$++||V("loading",null,!0,O())}function w(){--$||V("loading",null,!1,O())}function S(i,r){var s,o,l,a,c={};if(n.eventDataTransform&&(i=n.eventDataTransform(i)),r&&r.eventDataTransform&&(i=r.eventDataTransform(i)),t.extend(c,i),r&&(c.source=r),c._id=i._id||(void 0===i.id?"_fc"+Ae++:i.id+""),c.className=i.className?"string"==typeof i.className?i.className.split(/\s+/):i.className:[],s=i.start||i.date,o=i.end,k(s)&&(s=e.duration(s)),k(o)&&(o=e.duration(o)),i.dow||e.isDuration(s)||e.isDuration(o))c.start=s?e.duration(s):null,c.end=o?e.duration(o):null,c._recurring=!0;else{if(s&&(s=N.moment(s),!s.isValid()))return!1;if(o&&(o=N.moment(o),!o.isValid()))return!1;l=i.allDay,void 0===l&&(a=P(r?r.allDayDefault:void 0,n.allDayDefault),l=void 0!==a?a:!(s.hasTime()||o&&o.hasTime())),b(s,o,l,c)}return c}function b(t,e,i,r){i?(t.hasTime()&&t.stripTime(),e&&e.hasTime()&&e.stripTime()):(t.hasTime()||(t=N.rezoneDate(t)),e&&!e.hasTime()&&(e=N.rezoneDate(e))),r.allDay=i,r.start=t,r.end=e||null,n.forceEventDuration&&!r.end&&(r.end=I(r)),d(r)}function E(e){var n,i,r,s,o,l,a,c,d,u,h=[],f=A,g=Y;if(f&&g||(n=N.getView(),f=n.start,g=n.end),e)if(e._recurring){if(r=e.dow)for(i={},s=0;r.length>s;s++)i[r[s]]=!0;for(o=f.clone().stripTime();o.isBefore(g);)(!i||i[o.day()])&&(l=e.start,a=e.end,c=o.clone(),d=null,l&&(c=c.time(l)),a&&(d=o.clone().time(a)),u=t.extend({},e),b(c,d,!l&&!a,u),h.push(u)),o.add(1,"days")}else h.push(e);return h}function D(t,e,n){var i,r,s,o,l=t._allDay,a=t._start,c=t._end,d=!1;return e||n||(e=t.start,n=t.end),i=t.allDay!=l?t.allDay:!(e||n).hasTime(),i&&(e&&(e=e.clone().stripTime()),n&&(n=n.clone().stripTime())),e&&(r=i?C(e,a.clone().stripTime()):C(e,a)),i!=l?d=!0:n&&(s=C(n||N.getDefaultEventEnd(i,e||a),e||a).subtract(C(c||N.getDefaultEventEnd(l,a),a))),o=T(v(t._id),d,i,r,s),{dateDelta:r,durationDelta:s,undo:o}}function T(e,i,r,s,o){var l=N.getIsAmbigTimezone(),a=[];return t.each(e,function(t,e){var c=e._allDay,u=e._start,h=e._end,f=null!=r?r:c,g=u.clone(),p=!i&&h?h.clone():null;f?(g.stripTime(),p&&p.stripTime()):(g.hasTime()||(g=N.rezoneDate(g)),p&&!p.hasTime()&&(p=N.rezoneDate(p))),p||!n.forceEventDuration&&!+o||(p=N.getDefaultEventEnd(f,g)),g.add(s),p&&p.add(s).add(o),l&&(+s||+o)&&(g.stripZone(),p&&p.stripZone()),e.allDay=f,e.start=g,e.end=p,d(e),a.push(function(){e.allDay=c,e.start=u,e.end=h,d(e)})}),function(){for(var t=0;a.length>t;t++)a[t]()}}function H(){var e,i=n.businessHours,r={className:"fc-nonbusiness",start:"09:00",end:"17:00",dow:[1,2,3,4,5],rendering:"inverse-background"};return i&&(e="object"==typeof i?t.extend({},r,i):r),e?E(S(e)):[]}function x(t,e,i){var r=t.source||{},s=P(t.constraint,r.constraint,n.eventConstraint),o=P(t.overlap,r.overlap,n.eventOverlap);return L(e,i,s,o,t)}function M(t,e){return L(t,e,n.selectConstraint,n.selectOverlap)}function F(t,e,n){var i;return n&&(i=E(S(n))[0])?x(i,t,e):M(t,e)}function L(t,e,n,i,r){var s,o,l,a,c;if(t=t.clone().stripZone(),e=e.clone().stripZone(),null!=n){for(s=z(n),o=!1,l=0;s.length>l;l++)if(_(s[l],t,e)){o=!0;break}if(!o)return!1}for(l=0;q.length>l;l++)if(a=q[l],(!r||r._id!==a._id)&&G(a,t,e)){if(i===!1)return!1;if("function"==typeof i&&!i(a,r))return!1;if(r){if(c=P(a.overlap,(a.source||{}).overlap),c===!1)return!1;if("function"==typeof c&&!c(r,a))return!1}}return!0}function z(t){return"businessHours"===t?H():"object"==typeof t?E(S(t)):v(t)}function _(t,e,n){var i=t.start.clone().stripZone(),r=N.getEventEnd(t).stripZone();return e>=i&&r>=n}function G(t,e,n){var i=t.start.clone().stripZone(),r=N.getEventEnd(t).stripZone();return r>e&&n>i}var N=this;N.isFetchNeeded=i,N.fetchEvents=r,N.addEventSource=l,N.removeEventSource=c,N.updateEvent=f,N.renderEvent=p,N.removeEvents=m,N.clientEvents=v,N.mutateEvent=D;var A,Y,V=N.trigger,O=N.getView,B=N.reportEvents,I=N.getEventEnd,W={events:[]},Z=[W],j=0,X=0,$=0,q=[];t.each((n.events?[n.events]:[]).concat(n.eventSources||[]),function(t,e){var n=a(e);n&&Z.push(n)});var U=["title","url","allDay","className","editable","color","backgroundColor","borderColor","textColor"];N.getBusinessHoursEvents=H,N.isEventAllowedInRange=x,N.isSelectionAllowedInRange=M,N.isExternalDragAllowedInRange=F}function d(t){t._allDay=t.allDay,t._start=t.start.clone(),t._end=t.end?t.end.clone():null}function u(t,e){e.left&&t.css({"border-left-width":1,"margin-left":e.left-1}),e.right&&t.css({"border-right-width":1,"margin-right":e.right-1})}function h(t){t.css({"margin-left":"","margin-right":"","border-left-width":"","border-right-width":""})}function f(){t("body").addClass("fc-not-allowed")}function g(){t("body").removeClass("fc-not-allowed")}function p(e,n,i){var r=Math.floor(n/e.length),s=Math.floor(n-r*(e.length-1)),o=[],l=[],a=[],c=0;m(e),e.each(function(n,i){var d=n===e.length-1?s:r,u=t(i).outerHeight(!0);d>u?(o.push(i),l.push(u),a.push(t(i).height())):c+=u}),i&&(n-=c,r=Math.floor(n/o.length),s=Math.floor(n-r*(o.length-1))),t(o).each(function(e,n){var i=e===o.length-1?s:r,c=l[e],d=a[e],u=i-(c-d);i>c&&t(n).height(u)})}function m(t){t.height("")}function v(e){var n=0;return e.find("> *").each(function(e,i){var r=t(i).outerWidth();r>n&&(n=r)}),n++,e.width(n),n}function y(t,e){return t.height(e).addClass("fc-scroller"),t[0].scrollHeight-1>t[0].clientHeight?!0:(w(t),!1)}function w(t){t.height("").removeClass("fc-scroller")}function S(e){var n=e.css("position"),i=e.parents().filter(function(){var e=t(this);return/(auto|scroll)/.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==n&&i.length?i:t(e[0].ownerDocument||document)}function b(t){var e=t.offset().left,n=e+t.width(),i=t.children(),r=i.offset().left,s=r+i.outerWidth();return{left:r-e,right:n-s}}function E(t){return 1==t.which&&!t.ctrlKey}function D(t,e,n,i){var r,s,o,l;return e>n&&i>t?(t>=n?(r=t.clone(),o=!0):(r=n.clone(),o=!1),i>=e?(s=e.clone(),l=!0):(s=i.clone(),l=!1),{start:r,end:s,isStart:o,isEnd:l}):void 0}function T(t,e){if(t=t||{},void 0!==t[e])return t[e];for(var n,i=e.split(/(?=[A-Z])/),r=i.length-1;r>=0;r--)if(n=t[i[r].toLowerCase()],void 0!==n)return n;return t["default"]}function C(t,n){return e.duration({days:t.clone().stripTime().diff(n.clone().stripTime(),"days"),ms:t.time()-n.time()})}function H(t){return"[object Date]"===Object.prototype.toString.call(t)||t instanceof Date}function x(t,e){return t-e}function k(t){return/^\d+\:\d+(?:\:\d+\.?(?:\d{3})?)?$/.test(t)}function M(t){var e=function(){};return e.prototype=t,new e}function R(e,n,i){if(t.isFunction(e)&&(e=[e]),e){var r,s;for(r=0;e.length>r;r++)s=e[r].apply(n,i)||s;return s}}function P(){for(var t=0;arguments.length>t;t++)if(void 0!==arguments[t])return arguments[t]}function F(t){return(t+"").replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
")}function L(t){return t.replace(/&.*?;/g,"")}function z(t){return t.charAt(0).toUpperCase()+t.slice(1)}function _(t,e){var n,i,r,s,o=function(){var l=+new Date-s;e>l&&l>0?n=setTimeout(o,e-l):(n=null,t.apply(r,i),n||(r=i=null))};return function(){r=this,i=arguments,s=+new Date,n||(n=setTimeout(o,e))}}function G(n,i,r){var s,o,l,a,c=n[0],d=1==n.length&&"string"==typeof c;return e.isMoment(c)?(a=e.apply(null,n),A(c,a)):H(c)||void 0===c?a=e.apply(null,n):(s=!1,o=!1,d?Ie.test(c)?(c+="-01",n=[c],s=!0,o=!0):(l=We.exec(c))&&(s=!l[5],o=!0):t.isArray(c)&&(o=!0),a=i?e.utc.apply(e,n):e.apply(null,n),s?(a._ambigTime=!0,a._ambigZone=!0):r&&(o?a._ambigZone=!0:d&&a.zone(c))),a._fullCalendar=!0,a}function N(t,e){var n,i=[],r=!1,s=!1;for(n=0;t.length>n;n++)i.push(_e.moment.parseZone(t[n])),r=r||i[n]._ambigTime,s=s||i[n]._ambigZone;for(n=0;i.length>n;n++)r&&!e?i[n].stripTime():s&&i[n].stripZone();return i}function A(t,e){t._ambigTime?e._ambigTime=!0:e._ambigTime&&(e._ambigTime=!1),t._ambigZone?e._ambigZone=!0:e._ambigZone&&(e._ambigZone=!1)}function Y(t,e){t.year(e[0]||0).month(e[1]||0).date(e[2]||0).hours(e[3]||0).minutes(e[4]||0).seconds(e[5]||0).milliseconds(e[6]||0)}function V(t,e){return je.format.call(t,e)}function O(t,e){return B(t,X(e))}function B(t,e){var n,i="";for(n=0;e.length>n;n++)i+=I(t,e[n]);return i}function I(t,e){var n,i;return"string"==typeof e?e:(n=e.token)?Xe[n]?Xe[n](t):V(t,n):e.maybe&&(i=B(t,e.maybe),i.match(/[1-9]/))?i:""}function W(t,e,n,i,r){var s;return t=_e.moment.parseZone(t),e=_e.moment.parseZone(e),s=(t.localeData||t.lang).call(t),n=s.longDateFormat(n)||n,i=i||" - ",Z(t,e,X(n),i,r)}function Z(t,e,n,i,r){var s,o,l,a,c="",d="",u="",h="",f="";for(o=0;n.length>o&&(s=j(t,e,n[o]),s!==!1);o++)c+=s;for(l=n.length-1;l>o&&(s=j(t,e,n[l]),s!==!1);l--)d=s+d;for(a=o;l>=a;a++)u+=I(t,n[a]),h+=I(e,n[a]);return(u||h)&&(f=r?h+i+u:u+i+h),c+f+d}function j(t,e,n){var i,r;return"string"==typeof n?n:(i=n.token)&&(r=$e[i.charAt(0)],r&&t.isSame(e,r))?V(t,i):!1}function X(t){return t in qe?qe[t]:qe[t]=$(t)}function $(t){for(var e,n=[],i=/\[([^\]]*)\]|\(([^\)]*)\)|(LT|(\w)\4*o?)|([^\w\[\(]+)/g;e=i.exec(t);)e[1]?n.push(e[1]):e[2]?n.push({maybe:$(e[2])}):e[3]?n.push({token:e[3]}):e[5]&&n.push(e[5]);return n}function q(t){this.options=t||{}}function U(t){this.grid=t}function K(t){this.coordMaps=t}function Q(t,e){this.coordMap=t,this.options=e||{}}function J(t,e){return t||e?t&&e?t.grid===e.grid&&t.row===e.row&&t.col===e.col:!1:!0}function te(e,n){this.options=n=n||{},this.sourceEl=e,this.parentEl=n.parentEl?t(n.parentEl):e.parent()}function ee(t){this.view=t}function ne(t){ee.call(this,t),this.coordMap=new U(this),this.elsByFill={}}function ie(t){var e=se(t);return"background"===e||"inverse-background"===e}function re(t){return"inverse-background"===se(t)}function se(t){return P((t.source||{}).rendering,t.rendering)}function oe(t){var e,n,i={};for(e=0;t.length>e;e++)n=t[e],(i[n._id]||(i[n._id]=[])).push(n);return i}function le(t,e){return t.eventStartMS-e.eventStartMS}function ae(t,e){return t.eventStartMS-e.eventStartMS||e.eventDurationMS-t.eventDurationMS||e.event.allDay-t.event.allDay||(t.event.title||"").localeCompare(e.event.title)}function ce(t){ne.call(this,t)}function de(t,e){var n,i;for(n=0;e.length>n;n++)if(i=e[n],i.leftCol<=t.rightCol&&i.rightCol>=t.leftCol)return!0;return!1}function ue(t,e){return t.leftCol-e.leftCol}function he(t){ne.call(this,t)}function fe(t){var e,n,i;if(t.sort(ae),e=ge(t),pe(e),n=e[0]){for(i=0;n.length>i;i++)me(n[i]);for(i=0;n.length>i;i++)ve(n[i],0,0)}}function ge(t){var e,n,i,r=[];for(e=0;t.length>e;e++){for(n=t[e],i=0;r.length>i&&ye(n,r[i]).length;i++);n.level=i,(r[i]||(r[i]=[])).push(n)}return r}function pe(t){var e,n,i,r,s;for(e=0;t.length>e;e++)for(n=t[e],i=0;n.length>i;i++)for(r=n[i],r.forwardSegs=[],s=e+1;t.length>s;s++)ye(r,t[s],r.forwardSegs)}function me(t){var e,n,i=t.forwardSegs,r=0;if(void 0===t.forwardPressure){for(e=0;i.length>e;e++)n=i[e],me(n),r=Math.max(r,1+n.forwardPressure);t.forwardPressure=r}}function ve(t,e,n){var i,r=t.forwardSegs;if(void 0===t.forwardCoord)for(r.length?(r.sort(Se),ve(r[0],e+1,n),t.forwardCoord=r[0].backwardCoord):t.forwardCoord=1,t.backwardCoord=t.forwardCoord-(t.forwardCoord-n)/(e+1),i=0;r.length>i;i++)ve(r[i],0,t.forwardCoord)}function ye(t,e,n){n=n||[];for(var i=0;e.length>i;i++)we(t,e[i])&&n.push(e[i]);return n}function we(t,e){return t.bottom>e.top&&t.topd;d++){var u=d*i,h=u+i-1,f=Math.max(a,u),g=Math.min(c,h);if(g>=f){var m=S(f),v=S(g),b=[m.col,v.col].sort(),D=p(f)==o,T=p(g)+1==l;r.push({row:d,leftCol:b[0],rightCol:b[1],isStart:D,isEnd:T})}}return r}function E(t,e){var n,i,r=t.clone().stripTime();return e&&(n=e.clone().stripTime(),i=+e.time(),i&&i>=k&&n.add(1,"days")),(!e||r>=n)&&(n=r.clone().add(1,"days")),{start:r,end:n}}function D(t){var e=E(t.start,t.end);return e.end.diff(e.start,"days")>1}var C=this;C.calendar=n,C.opt=i,C.trigger=r,C.isEventDraggable=s,C.isEventResizable=l,C.eventDrop=a,C.eventResize=c;var H=n.reportEventChange,x=n.options,k=e.duration(x.nextDayThreshold);C.init(),C.getEventTimeText=function(t,e){var r,s;return"object"==typeof t&&"object"==typeof e?(r=t,s=e,e=arguments[2]):(r=t.start,s=t.end),e=e||i("timeFormat"),s&&i("displayEventEnd")?n.formatRange(r,s,e):n.formatDate(r,e)},C.isHiddenDay=d,C.skipHiddenDays=h,C.getCellsPerWeek=u,C.dateToCell=v,C.dateToDayOffset=y,C.dayOffsetToCellOffset=w,C.cellOffsetToCell=S,C.cellToDate=f,C.cellToCellOffset=g,C.cellOffsetToDayOffset=p,C.dayOffsetToDate=m,C.rangeToSegments=b,C.isMultiDayEvent=D;var M,R=i("hiddenDays")||[],F=[],L=[],z=[],_=i("isRTL");(function(){i("weekends")===!1&&R.push(0,6);for(var e=0,n=0;7>e;e++)L[e]=n,F[e]=-1!=t.inArray(e,R),F[e]||(z[n]=e,n++);if(M=n,!M)throw"invalid hiddenDays"})()}function Ee(n){var i,r,s,o,l=_e.dataAttrPrefix;return l&&(l+="-"),i=n.data(l+"event")||null,i&&(i="object"==typeof i?t.extend({},i):{},r=i.start,null==r&&(r=i.time),s=i.duration,o=i.stick,delete i.start,delete i.time,delete i.duration,delete i.stick),null==r&&(r=n.data(l+"start")),null==r&&(r=n.data(l+"time")),null==s&&(s=n.data(l+"duration")),null==o&&(o=n.data(l+"stick")),r=null!=r?e.duration(r):null,s=null!=s?e.duration(s):null,o=Boolean(o),{eventProps:i,startTime:r,duration:s,stick:o}}function De(t){be.call(this,t),this.dayGrid=new ce(this),this.coordMap=this.dayGrid.coordMap}function Te(t){De.call(this,t)}function Ce(t){De.call(this,t)}function He(t){De.call(this,t)}function xe(t,e){return e.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"a")}function ke(t,e){return e.longDateFormat("LT").replace(/\s*a$/i,"")}function Me(t){be.call(this,t),this.timeGrid=new he(this),this.opt("allDaySlot")?(this.dayGrid=new ce(this),this.coordMap=new K([this.dayGrid.coordMap,this.timeGrid.coordMap])):this.coordMap=this.timeGrid.coordMap}function Re(t){Me.call(this,t)}function Pe(t){Me.call(this,t)}var Fe={lang:"en",defaultTimedEventDuration:"02:00:00",defaultAllDayEventDuration:{days:1},forceEventDuration:!1,nextDayThreshold:"09:00:00",defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberTitle:"W",weekNumberCalculation:"local",lazyFetching:!0,startParam:"start",endParam:"end",timezoneParam:"timezone",timezone:!1,titleFormat:{month:"MMMM YYYY",week:"ll",day:"LL"},columnFormat:{month:"ddd",week:i,day:"dddd"},timeFormat:{"default":n},displayEventEnd:{month:!1,basicWeek:!1,"default":!0},isRTL:!1,defaultButtonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",today:"today",month:"month",week:"week",day:"day"},buttonIcons:{prev:"left-single-arrow",next:"right-single-arrow",prevYear:"left-double-arrow",nextYear:"right-double-arrow"},theme:!1,themeButtonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e",prevYear:"seek-prev",nextYear:"seek-next"},dragOpacity:.75,dragRevertDuration:500,dragScroll:!0,unselectAuto:!0,dropAccept:"*",eventLimit:!1,eventLimitText:"more",eventLimitClick:"popover",dayPopoverFormat:"LL",handleWindowResize:!0,windowResizeDelay:200},Le={en:{columnFormat:{week:"ddd M/D"},dayPopoverFormat:"dddd, MMMM D"}},ze={header:{left:"next,prev today",center:"",right:"title"},buttonIcons:{prev:"right-single-arrow",next:"left-single-arrow",prevYear:"right-double-arrow",nextYear:"left-double-arrow"},themeButtonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w",nextYear:"seek-prev",prevYear:"seek-next"}},_e=t.fullCalendar={version:"2.2.0"},Ge=_e.views={};t.fn.fullCalendar=function(e){var n=Array.prototype.slice.call(arguments,1),i=this;return this.each(function(r,s){var o,a=t(s),c=a.data("fullCalendar");"string"==typeof e?c&&t.isFunction(c[e])&&(o=c[e].apply(c,n),r||(i=o),"destroy"===e&&a.removeData("fullCalendar")):c||(c=new l(a,e),a.data("fullCalendar",c),c.render())}),i},_e.langs=Le,_e.datepickerLang=function(e,n,i){var r=Le[e];r||(r=Le[e]={}),s(r,{isRTL:i.isRTL,weekNumberTitle:i.weekHeader,titleFormat:{month:i.showMonthAfterYear?"YYYY["+i.yearSuffix+"] MMMM":"MMMM YYYY["+i.yearSuffix+"]"},defaultButtonText:{prev:L(i.prevText),next:L(i.nextText),today:L(i.currentText)}}),t.datepicker&&(t.datepicker.regional[n]=t.datepicker.regional[e]=i,t.datepicker.regional.en=t.datepicker.regional[""],t.datepicker.setDefaults(i))},_e.lang=function(t,e){var n;e&&(n=Le[t],n||(n=Le[t]={}),s(n,e||{})),Fe.lang=t},_e.sourceNormalizers=[],_e.sourceFetchers=[];var Ne={dataType:"json",cache:!1},Ae=1,Ye=["sun","mon","tue","wed","thu","fri","sat"];_e.applyAll=R;var Ve,Oe,Be,Ie=/^\s*\d{4}-\d\d$/,We=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/,Ze=e.fn,je=t.extend({},Ze);_e.moment=function(){return G(arguments)},_e.moment.utc=function(){var t=G(arguments,!0);return t.hasTime()&&t.utc(),t},_e.moment.parseZone=function(){return G(arguments,!0,!0)},Ze.clone=function(){var t=je.clone.apply(this,arguments);return A(this,t),this._fullCalendar&&(t._fullCalendar=!0),t},Ze.time=function(t){if(!this._fullCalendar)return je.time.apply(this,arguments);if(null==t)return e.duration({hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()});this._ambigTime=!1,e.isDuration(t)||e.isMoment(t)||(t=e.duration(t));var n=0;return e.isDuration(t)&&(n=24*Math.floor(t.asDays())),this.hours(n+t.hours()).minutes(t.minutes()).seconds(t.seconds()).milliseconds(t.milliseconds())},Ze.stripTime=function(){var t=this.toArray();return this.utc(),Oe(this,t.slice(0,3)),this._ambigTime=!0,this._ambigZone=!0,this},Ze.hasTime=function(){return!this._ambigTime},Ze.stripZone=function(){var t=this.toArray(),e=this._ambigTime;return this.utc(),Oe(this,t),e&&(this._ambigTime=!0),this._ambigZone=!0,this},Ze.hasZone=function(){return!this._ambigZone},Ze.zone=function(t){return null!=t&&(this._ambigTime=!1,this._ambigZone=!1),je.zone.apply(this,arguments)},Ze.local=function(){var t=this.toArray(),e=this._ambigZone;return je.local.apply(this,arguments),e&&Be(this,t),this},Ze.format=function(){return this._fullCalendar&&arguments[0]?O(this,arguments[0]):this._ambigTime?V(this,"YYYY-MM-DD"):this._ambigZone?V(this,"YYYY-MM-DD[T]HH:mm:ss"):je.format.apply(this,arguments)},Ze.toISOString=function(){return this._ambigTime?V(this,"YYYY-MM-DD"):this._ambigZone?V(this,"YYYY-MM-DD[T]HH:mm:ss"):je.toISOString.apply(this,arguments)},Ze.isWithin=function(t,e){var n=N([this,t,e]);return n[0]>=n[1]&&n[0]').addClass(n.className||"").css({top:0,left:0}).append(n.content).appendTo(n.parentEl),this.el.on("click",".fc-close",function(){e.hide()}),n.autoHide&&t(document).on("mousedown",this.documentMousedownProxy=t.proxy(this,"documentMousedown"))},documentMousedown:function(e){this.el&&!t(e.target).closest(this.el).length&&this.hide()},destroy:function(){this.hide(),this.el&&(this.el.remove(),this.el=null),t(document).off("mousedown",this.documentMousedownProxy) +},position:function(){var e,n,i,r,s,o=this.options,l=this.el.offsetParent().offset(),a=this.el.outerWidth(),c=this.el.outerHeight(),d=t(window),u=S(this.el);r=o.top||0,s=void 0!==o.left?o.left:void 0!==o.right?o.right-a:0,u.is(window)||u.is(document)?(u=d,e=0,n=0):(i=u.offset(),e=i.top,n=i.left),e+=d.scrollTop(),n+=d.scrollLeft(),o.viewportConstrain!==!1&&(r=Math.min(r,e+u.outerHeight()-c-this.margin),r=Math.max(r,e+this.margin),s=Math.min(s,n+u.outerWidth()-a-this.margin),s=Math.max(s,n+this.margin)),this.el.css({top:r-l.top,left:s-l.left})},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))}},U.prototype={grid:null,rows:null,cols:null,containerEl:null,minX:null,maxX:null,minY:null,maxY:null,build:function(){this.grid.buildCoords(this.rows=[],this.cols=[]),this.computeBounds()},getCell:function(t,e){var n,i=null,r=this.rows,s=this.cols,o=-1,l=-1;if(this.inBounds(t,e)){for(n=0;r.length>n;n++)if(e>=r[n][0]&&r[n][1]>e){o=n;break}for(n=0;s.length>n;n++)if(t>=s[n][0]&&s[n][1]>t){l=n;break}o>=0&&l>=0&&(i={row:o,col:l},i.grid=this.grid,i.date=this.grid.getCellDate(i))}return i},computeBounds:function(){var t;this.containerEl&&(t=this.containerEl.offset(),this.minX=t.left,this.maxX=t.left+this.containerEl.outerWidth(),this.minY=t.top,this.maxY=t.top+this.containerEl.outerHeight())},inBounds:function(t,e){return this.containerEl?t>=this.minX&&this.maxX>t&&e>=this.minY&&this.maxY>e:!0}},K.prototype={coordMaps:null,build:function(){var t,e=this.coordMaps;for(t=0;e.length>t;t++)e[t].build()},getCell:function(t,e){var n,i=this.coordMaps,r=null;for(n=0;i.length>n&&!r;n++)r=i[n].getCell(t,e);return r}},Q.prototype={coordMap:null,options:null,isListening:!1,isDragging:!1,origCell:null,origDate:null,cell:null,date:null,mouseX0:null,mouseY0:null,mousemoveProxy:null,mouseupProxy:null,scrollEl:null,scrollBounds:null,scrollTopVel:null,scrollLeftVel:null,scrollIntervalId:null,scrollHandlerProxy:null,scrollSensitivity:30,scrollSpeed:200,scrollIntervalMs:50,mousedown:function(t){E(t)&&(t.preventDefault(),this.startListening(t),this.options.distance||this.startDrag(t))},startListening:function(e){var n,i;this.isListening||(e&&this.options.scroll&&(n=S(t(e.target)),n.is(window)||n.is(document)||(this.scrollEl=n,this.scrollHandlerProxy=_(t.proxy(this,"scrollHandler"),100),this.scrollEl.on("scroll",this.scrollHandlerProxy))),this.computeCoords(),e&&(i=this.getCell(e),this.origCell=i,this.origDate=i?i.date:null,this.mouseX0=e.pageX,this.mouseY0=e.pageY),t(document).on("mousemove",this.mousemoveProxy=t.proxy(this,"mousemove")).on("mouseup",this.mouseupProxy=t.proxy(this,"mouseup")).on("selectstart",this.preventDefault),this.isListening=!0,this.trigger("listenStart",e))},computeCoords:function(){this.coordMap.build(),this.computeScrollBounds()},mousemove:function(t){var e,n;this.isDragging||(e=this.options.distance||1,n=Math.pow(t.pageX-this.mouseX0,2)+Math.pow(t.pageY-this.mouseY0,2),n>=e*e&&this.startDrag(t)),this.isDragging&&this.drag(t)},startDrag:function(t){var e;this.isListening||this.startListening(),this.isDragging||(this.isDragging=!0,this.trigger("dragStart",t),e=this.getCell(t),e&&this.cellOver(e,!0))},drag:function(t){var e;this.isDragging&&(e=this.getCell(t),J(e,this.cell)||(this.cell&&this.cellOut(),e&&this.cellOver(e)),this.dragScroll(t))},cellOver:function(t){this.cell=t,this.date=t.date,this.trigger("cellOver",t,t.date)},cellOut:function(){this.cell&&(this.trigger("cellOut",this.cell),this.cell=null,this.date=null)},mouseup:function(t){this.stopDrag(t),this.stopListening(t)},stopDrag:function(t){this.isDragging&&(this.stopScrolling(),this.trigger("dragStop",t),this.isDragging=!1)},stopListening:function(e){this.isListening&&(this.scrollEl&&(this.scrollEl.off("scroll",this.scrollHandlerProxy),this.scrollHandlerProxy=null),t(document).off("mousemove",this.mousemoveProxy).off("mouseup",this.mouseupProxy).off("selectstart",this.preventDefault),this.mousemoveProxy=null,this.mouseupProxy=null,this.isListening=!1,this.trigger("listenStop",e),this.origCell=this.cell=null,this.origDate=this.date=null)},getCell:function(t){return this.coordMap.getCell(t.pageX,t.pageY)},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))},preventDefault:function(t){t.preventDefault()},computeScrollBounds:function(){var t,e=this.scrollEl;e&&(t=e.offset(),this.scrollBounds={top:t.top,left:t.left,bottom:t.top+e.outerHeight(),right:t.left+e.outerWidth()})},dragScroll:function(t){var e,n,i,r,s=this.scrollSensitivity,o=this.scrollBounds,l=0,a=0;o&&(e=(s-(t.pageY-o.top))/s,n=(s-(o.bottom-t.pageY))/s,i=(s-(t.pageX-o.left))/s,r=(s-(o.right-t.pageX))/s,e>=0&&1>=e?l=-1*e*this.scrollSpeed:n>=0&&1>=n&&(l=n*this.scrollSpeed),i>=0&&1>=i?a=-1*i*this.scrollSpeed:r>=0&&1>=r&&(a=r*this.scrollSpeed)),this.setScrollVel(l,a)},setScrollVel:function(e,n){this.scrollTopVel=e,this.scrollLeftVel=n,this.constrainScrollVel(),!this.scrollTopVel&&!this.scrollLeftVel||this.scrollIntervalId||(this.scrollIntervalId=setInterval(t.proxy(this,"scrollIntervalFunc"),this.scrollIntervalMs))},constrainScrollVel:function(){var t=this.scrollEl;0>this.scrollTopVel?0>=t.scrollTop()&&(this.scrollTopVel=0):this.scrollTopVel>0&&t.scrollTop()+t[0].clientHeight>=t[0].scrollHeight&&(this.scrollTopVel=0),0>this.scrollLeftVel?0>=t.scrollLeft()&&(this.scrollLeftVel=0):this.scrollLeftVel>0&&t.scrollLeft()+t[0].clientWidth>=t[0].scrollWidth&&(this.scrollLeftVel=0)},scrollIntervalFunc:function(){var t=this.scrollEl,e=this.scrollIntervalMs/1e3;this.scrollTopVel&&t.scrollTop(t.scrollTop()+this.scrollTopVel*e),this.scrollLeftVel&&t.scrollLeft(t.scrollLeft()+this.scrollLeftVel*e),this.constrainScrollVel(),this.scrollTopVel||this.scrollLeftVel||this.stopScrolling()},stopScrolling:function(){this.scrollIntervalId&&(clearInterval(this.scrollIntervalId),this.scrollIntervalId=null,this.computeCoords())},scrollHandler:function(){this.scrollIntervalId||this.computeCoords()}},te.prototype={options:null,sourceEl:null,el:null,parentEl:null,top0:null,left0:null,mouseY0:null,mouseX0:null,topDelta:null,leftDelta:null,mousemoveProxy:null,isFollowing:!1,isHidden:!1,isAnimating:!1,start:function(e){this.isFollowing||(this.isFollowing=!0,this.mouseY0=e.pageY,this.mouseX0=e.pageX,this.topDelta=0,this.leftDelta=0,this.isHidden||this.updatePosition(),t(document).on("mousemove",this.mousemoveProxy=t.proxy(this,"mousemove")))},stop:function(e,n){function i(){this.isAnimating=!1,r.destroyEl(),this.top0=this.left0=null,n&&n()}var r=this,s=this.options.revertDuration;this.isFollowing&&!this.isAnimating&&(this.isFollowing=!1,t(document).off("mousemove",this.mousemoveProxy),e&&s&&!this.isHidden?(this.isAnimating=!0,this.el.animate({top:this.top0,left:this.left0},{duration:s,complete:i})):i())},getEl:function(){var t=this.el;return t||(this.sourceEl.width(),t=this.el=this.sourceEl.clone().css({position:"absolute",visibility:"",display:this.isHidden?"none":"",margin:0,right:"auto",bottom:"auto",width:this.sourceEl.width(),height:this.sourceEl.height(),opacity:this.options.opacity||"",zIndex:this.options.zIndex}).appendTo(this.parentEl)),t},destroyEl:function(){this.el&&(this.el.remove(),this.el=null)},updatePosition:function(){var t,e;this.getEl(),null===this.top0&&(this.sourceEl.width(),t=this.sourceEl.offset(),e=this.el.offsetParent().offset(),this.top0=t.top-e.top,this.left0=t.left-e.left),this.el.css({top:this.top0+this.topDelta,left:this.left0+this.leftDelta})},mousemove:function(t){this.topDelta=t.pageY-this.mouseY0,this.leftDelta=t.pageX-this.mouseX0,this.isHidden||this.updatePosition()},hide:function(){this.isHidden||(this.isHidden=!0,this.el&&this.el.hide())},show:function(){this.isHidden&&(this.isHidden=!1,this.updatePosition(),this.getEl().show())}},ee.prototype={view:null,cellHtml:"",rowHtml:function(t,e){var n,i,r=this.view,s=this.getHtmlRenderer("cell",t),o="";for(e=e||0,n=0;r.colCnt>n;n++)i=r.cellToDate(e,n),o+=s(e,n,i);return o=this.bookendCells(o,t,e),""+o+""},bookendCells:function(t,e,n){var i=this.view,r=this.getHtmlRenderer("intro",e)(n||0),s=this.getHtmlRenderer("outro",e)(n||0),o=i.opt("isRTL"),l=o?s:r,a=o?r:s;return"string"==typeof t?l+t+a:t.prepend(l).append(a)},getHtmlRenderer:function(t,e){var n,i,r,s,o=this.view;return n=t+"Html",e&&(i=e+z(t)+"Html"),i&&(s=o[i])?r=o:i&&(s=this[i])?r=this:(s=o[n])?r=o:(s=this[n])&&(r=this),"function"==typeof s?function(){return s.apply(r,arguments)||""}:function(){return s||""}}},ne.prototype=M(ee.prototype),t.extend(ne.prototype,{el:null,coordMap:null,cellDuration:null,elsByFill:null,render:function(){this.bindHandlers()},destroy:function(){},buildCoords:function(){},getCellDate:function(){},getCellDayEl:function(){},rangeToSegs:function(){},bindHandlers:function(){var e=this;this.el.on("mousedown",function(n){t(n.target).is(".fc-event-container *, .fc-more")||t(n.target).closest(".fc-popover").length||e.dayMousedown(n)}),this.bindSegHandlers()},dayMousedown:function(t){var e,n,i,r=this,s=this.view,o=s.calendar,l=s.opt("selectable"),a=null,c=new Q(this.coordMap,{scroll:s.opt("dragScroll"),dragStart:function(){s.unselect()},cellOver:function(t,s){c.origDate&&(i=r.getCellDayEl(t),a=[s,c.origDate].sort(x),e=a[0],n=a[1].clone().add(r.cellDuration),l&&(o.isSelectionAllowedInRange(e,n)?r.renderSelection(e,n):(a=null,f())))},cellOut:function(){a=null,r.destroySelection(),g()},listenStop:function(t){a&&(a[0].isSame(a[1])&&s.trigger("dayClick",i[0],e,t),l&&s.reportSelection(e,n,t)),g()}});c.mousedown(t)},renderDrag:function(){},destroyDrag:function(){},renderResize:function(){},destroyResize:function(){},renderRangeHelper:function(t,e,n){var i,r=this.view;!e&&r.opt("forceEventDuration")&&(e=r.calendar.getDefaultEventEnd(!t.hasTime(),t)),i=n?M(n.event):{},i.start=t,i.end=e,i.allDay=!(t.hasTime()||e&&e.hasTime()),i.className=(i.className||[]).concat("fc-helper"),n||(i.editable=!1),this.renderHelper(i,n)},renderHelper:function(){},destroyHelper:function(){},renderSelection:function(t,e){this.renderHighlight(t,e)},destroySelection:function(){this.destroyHighlight()},renderHighlight:function(t,e){this.renderFill("highlight",this.rangeToSegs(t,e))},destroyHighlight:function(){this.destroyFill("highlight")},highlightSegClasses:function(){return["fc-highlight"]},renderFill:function(){},destroyFill:function(t){var e=this.elsByFill[t];e&&(e.remove(),delete this.elsByFill[t])},renderFillSegEls:function(e,n){var i,r=this,s=this[e+"SegEl"],o="",l=[];if(n.length){for(i=0;n.length>i;i++)o+=this.fillSegHtml(e,n[i]);t(o).each(function(e,i){var o=n[e],a=t(i);s&&(a=s.call(r,o,a)),a&&(a=t(a),a.is(r.fillSegTag)&&(o.el=a,l.push(o)))})}return l},fillSegTag:"div",fillSegHtml:function(t,e){var n=this[t+"SegClasses"],i=this[t+"SegStyles"],r=n?n.call(this,e):[],s=i?i.call(this,e):"";return"<"+this.fillSegTag+(r.length?' class="'+r.join(" ")+'"':"")+(s?' style="'+s+'"':"")+" />"},headHtml:function(){return'
'+""+""+this.rowHtml("head")+""+"
"+"
"},headCellHtml:function(t,e,n){var i=this.view,r=i.calendar,s=i.opt("columnFormat");return''+F(r.formatDate(n,s))+""},bgCellHtml:function(t,e,n){var i=this.view,r=this.getDayClasses(n);return r.unshift("fc-day",i.widgetContentClass),''},getDayClasses:function(t){var e=this.view,n=e.calendar.getNow().stripTime(),i=["fc-"+Ye[t.day()]];return"month"===e.name&&t.month()!=e.intervalStart.month()&&i.push("fc-other-month"),t.isSame(n,"day")?i.push("fc-today",e.highlightStateClass):n>t?i.push("fc-past"):i.push("fc-future"),i}}),t.extend(ne.prototype,{mousedOverSeg:null,isDraggingSeg:!1,isResizingSeg:!1,segs:null,renderEvents:function(t){var e,n,i=this.eventsToSegs(t),r=[],s=[];for(e=0;i.length>e;e++)n=i[e],ie(n.event)?r.push(n):s.push(n);r=this.renderBgSegs(r)||r,s=this.renderFgSegs(s)||s,this.segs=r.concat(s)},destroyEvents:function(){this.triggerSegMouseout(),this.destroyFgSegs(),this.destroyBgSegs(),this.segs=null},getSegs:function(){return this.segs||[]},renderFgSegs:function(){},destroyFgSegs:function(){},renderFgSegEls:function(e,n){var i,r=this.view,s="",o=[];if(e.length){for(i=0;e.length>i;i++)s+=this.fgSegHtml(e[i],n);t(s).each(function(n,i){var s=e[n],l=r.resolveEventEl(s.event,t(i));l&&(l.data("fc-seg",s),s.el=l,o.push(s))})}return o},fgSegHtml:function(){},renderBgSegs:function(t){return this.renderFill("bgEvent",t)},destroyBgSegs:function(){this.destroyFill("bgEvent")},bgEventSegEl:function(t,e){return this.view.resolveEventEl(t.event,e)},bgEventSegClasses:function(t){var e=t.event,n=e.source||{};return["fc-bgevent"].concat(e.className,n.className||[])},bgEventSegStyles:function(t){var e=this.view,n=t.event,i=n.source||{},r=n.color,s=i.color,o=e.opt("eventColor"),l=n.backgroundColor||r||i.backgroundColor||s||e.opt("eventBackgroundColor")||o;return l?"background-color:"+l:""},businessHoursSegClasses:function(){return["fc-nonbusiness","fc-bgevent"]},bindSegHandlers:function(){var e=this,n=this.view;t.each({mouseenter:function(t,n){e.triggerSegMouseover(t,n)},mouseleave:function(t,n){e.triggerSegMouseout(t,n)},click:function(t,e){return n.trigger("eventClick",this,t.event,e)},mousedown:function(i,r){t(r.target).is(".fc-resizer")&&n.isEventResizable(i.event)?e.segResizeMousedown(i,r):n.isEventDraggable(i.event)&&e.segDragMousedown(i,r)}},function(n,i){e.el.on(n,".fc-event-container > *",function(n){var r=t(this).data("fc-seg");return!r||e.isDraggingSeg||e.isResizingSeg?void 0:i.call(this,r,n)})})},triggerSegMouseover:function(t,e){this.mousedOverSeg||(this.mousedOverSeg=t,this.view.trigger("eventMouseover",t.el[0],t.event,e))},triggerSegMouseout:function(t,e){e=e||{},this.mousedOverSeg&&(t=t||this.mousedOverSeg,this.mousedOverSeg=null,this.view.trigger("eventMouseout",t.el[0],t.event,e))},segDragMousedown:function(t,e){var n,i,r=this,s=this.view,o=s.calendar,l=t.el,a=t.event,c=new te(t.el,{parentEl:s.el,opacity:s.opt("dragOpacity"),revertDuration:s.opt("dragRevertDuration"),zIndex:2}),d=new Q(s.coordMap,{distance:5,scroll:s.opt("dragScroll"),listenStart:function(t){c.hide(),c.start(t)},dragStart:function(e){r.triggerSegMouseout(t,e),r.isDraggingSeg=!0,s.hideEvent(a),s.trigger("eventDragStart",l[0],a,e,{})},cellOver:function(e,l){var u=t.cellDate||d.origDate,h=r.computeDraggedEventDates(t,u,l);n=h.start,i=h.end,o.isEventAllowedInRange(a,n,h.visibleEnd)?s.renderDrag(n,i,t)?c.hide():c.show():(n=null,c.show(),f())},cellOut:function(){n=null,s.destroyDrag(),c.show(),g()},dragStop:function(t){var e=n&&!n.isSame(a.start);c.stop(!e,function(){r.isDraggingSeg=!1,s.destroyDrag(),s.showEvent(a),s.trigger("eventDragStop",l[0],a,t,{}),e&&s.eventDrop(l[0],a,n,t)}),g()},listenStop:function(){c.stop()}});d.mousedown(e)},computeDraggedEventDates:function(t,e,n){var i,r,s,o,l,a=this.view,c=t.event,d=c.start,u=a.calendar.getEventEnd(c);return n.hasTime()===e.hasTime()?(i=C(n,e),r=d.clone().add(i),s=null===c.end?null:u.clone().add(i),o=c.allDay):(r=n,s=null,o=!n.hasTime()),l=s||a.calendar.getDefaultEventEnd(o,r),{start:r,end:s,visibleEnd:l}},segResizeMousedown:function(t,e){function n(){r.destroyResize(),s.showEvent(a)}var i,r=this,s=this.view,o=s.calendar,l=t.el,a=t.event,c=a.start,d=s.calendar.getEventEnd(a),u=null;i=new Q(this.coordMap,{distance:5,scroll:s.opt("dragScroll"),dragStart:function(e){r.triggerSegMouseout(t,e),r.isResizingSeg=!0,s.trigger("eventResizeStart",l[0],a,e,{})},cellOver:function(e,i){i.isBefore(c)&&(i=c),u=i.clone().add(r.cellDuration),o.isEventAllowedInRange(a,c,u)?u.isSame(d)?(u=null,n()):(r.renderResize(c,u,t),s.hideEvent(a)):(u=null,n(),f())},cellOut:function(){u=null,n(),g()},dragStop:function(t){r.isResizingSeg=!1,n(),g(),s.trigger("eventResizeStop",l[0],a,t,{}),u&&s.eventResize(l[0],a,u,t)}}),i.mousedown(e)},getSegClasses:function(t,e,n){var i=t.event,r=["fc-event",t.isStart?"fc-start":"fc-not-start",t.isEnd?"fc-end":"fc-not-end"].concat(i.className,i.source?i.source.className:[]);return e&&r.push("fc-draggable"),n&&r.push("fc-resizable"),r},getEventSkinCss:function(t){var e=this.view,n=t.source||{},i=t.color,r=n.color,s=e.opt("eventColor"),o=t.backgroundColor||i||n.backgroundColor||r||e.opt("eventBackgroundColor")||s,l=t.borderColor||i||n.borderColor||r||e.opt("eventBorderColor")||s,a=t.textColor||n.textColor||e.opt("eventTextColor"),c=[];return o&&c.push("background-color:"+o),l&&c.push("border-color:"+l),a&&c.push("color:"+a),c.join(";")},eventsToSegs:function(t,e){var n,i=this.eventsToRanges(t),r=[];for(n=0;i.length>n;n++)r.push.apply(r,this.eventRangeToSegs(i[n],e));return r},eventsToRanges:function(e){var n=this,i=oe(e),r=[];return t.each(i,function(t,e){e.length&&r.push.apply(r,re(e[0])?n.eventsToInverseRanges(e):n.eventsToNormalRanges(e))}),r},eventsToNormalRanges:function(t){var e,n,i,r,s=this.view.calendar,o=[];for(e=0;t.length>e;e++)n=t[e],i=n.start.clone().stripZone(),r=s.getEventEnd(n).stripZone(),o.push({event:n,start:i,end:r,eventStartMS:+i,eventDurationMS:r-i});return o},eventsToInverseRanges:function(t){var e,n,i=this.view,r=i.start.clone().stripZone(),s=i.end.clone().stripZone(),o=this.eventsToNormalRanges(t),l=[],a=t[0],c=r;for(o.sort(le),e=0;o.length>e;e++)n=o[e],n.start>c&&l.push({event:a,start:c,end:n.start}),c=n.end;return s>c&&l.push({event:a,start:c,end:s}),l},eventRangeToSegs:function(t,e){var n,i,r;for(n=e?e(t.start,t.end):this.rangeToSegs(t.start,t.end),i=0;n.length>i;i++)r=n[i],r.event=t.event,r.eventStartMS=t.eventStartMS,r.eventDurationMS=t.eventDurationMS;return n}}),ce.prototype=M(ne.prototype),t.extend(ce.prototype,{numbersVisible:!1,cellDuration:e.duration({days:1}),bottomCoordPadding:0,rowEls:null,dayEls:null,helperEls:null,render:function(e){var n,i=this.view,r="";for(n=0;i.rowCnt>n;n++)r+=this.dayRowHtml(n,e);this.el.html(r),this.rowEls=this.el.find(".fc-row"),this.dayEls=this.el.find(".fc-day"),this.dayEls.each(function(e,n){var r=i.cellToDate(Math.floor(e/i.colCnt),e%i.colCnt);i.trigger("dayRender",null,r,t(n))}),ne.prototype.render.call(this)},destroy:function(){this.destroySegPopover()},dayRowHtml:function(t,e){var n=this.view,i=["fc-row","fc-week",n.widgetContentClass];return e&&i.push("fc-rigid"),'
'+'
'+""+this.rowHtml("day",t)+"
"+"
"+'
'+""+(this.numbersVisible?""+this.rowHtml("number",t)+"":"")+"
"+"
"+"
"},dayCellHtml:function(t,e,n){return this.bgCellHtml(t,e,n)},buildCoords:function(e,n){var i,r,s,o=this.view.colCnt;this.dayEls.slice(0,o).each(function(e,o){i=t(o),r=i.offset().left,e&&(s[1]=r),s=[r],n[e]=s}),s[1]=r+i.outerWidth(),this.rowEls.each(function(n,o){i=t(o),r=i.offset().top,n&&(s[1]=r),s=[r],e[n]=s}),s[1]=r+i.outerHeight()+this.bottomCoordPadding},getCellDate:function(t){return this.view.cellToDate(t)},getCellDayEl:function(t){return this.dayEls.eq(t.row*this.view.colCnt+t.col)},rangeToSegs:function(t,e){return this.view.rangeToSegments(t,e)},renderDrag:function(t,e,n){var i;return this.renderHighlight(t,e||this.view.calendar.getDefaultEventEnd(!0,t)),n&&!n.el.closest(this.el).length?(this.renderRangeHelper(t,e,n),i=this.view.opt("dragOpacity"),void 0!==i&&this.helperEls.css("opacity",i),!0):void 0},destroyDrag:function(){this.destroyHighlight(),this.destroyHelper()},renderResize:function(t,e,n){this.renderHighlight(t,e),this.renderRangeHelper(t,e,n)},destroyResize:function(){this.destroyHighlight(),this.destroyHelper()},renderHelper:function(e,n){var i,r=[],s=this.eventsToSegs([e]);s=this.renderFgSegEls(s),i=this.renderSegRows(s),this.rowEls.each(function(e,s){var o,l=t(s),a=t('
');o=n&&n.row===e?n.el.position().top:l.find(".fc-content-skeleton tbody").position().top,a.css("top",o).find("table").append(i[e].tbodyEl),l.append(a),r.push(a[0])}),this.helperEls=t(r)},destroyHelper:function(){this.helperEls&&(this.helperEls.remove(),this.helperEls=null)},fillSegTag:"td",renderFill:function(e,n){var i,r,s,o=[];for(n=this.renderFillSegEls(e,n),i=0;n.length>i;i++)r=n[i],s=this.renderFillRow(e,r),this.rowEls.eq(r.row).append(s),o.push(s[0]);return this.elsByFill[e]=t(o),n},renderFillRow:function(e,n){var i,r,s=this.view.colCnt,o=n.leftCol,l=n.rightCol+1;return i=t('
'+"
"+"
"),r=i.find("tr"),o>0&&r.append(''),r.append(n.el.attr("colspan",l-o)),s>l&&r.append(''),this.bookendCells(r,e),i}}),t.extend(ce.prototype,{rowStructs:null,destroyEvents:function(){this.destroySegPopover(),ne.prototype.destroyEvents.apply(this,arguments)},getSegs:function(){return ne.prototype.getSegs.call(this).concat(this.popoverSegs||[])},renderBgSegs:function(e){var n=t.grep(e,function(t){return t.event.allDay});return ne.prototype.renderBgSegs.call(this,n)},renderFgSegs:function(e){var n;return e=this.renderFgSegEls(e),n=this.rowStructs=this.renderSegRows(e),this.rowEls.each(function(e,i){t(i).find(".fc-content-skeleton > table").append(n[e].tbodyEl)}),e},destroyFgSegs:function(){for(var t,e=this.rowStructs||[];t=e.pop();)t.tbodyEl.remove();this.rowStructs=null},renderSegRows:function(t){var e,n,i=[];for(e=this.groupSegRows(t),n=0;e.length>n;n++)i.push(this.renderSegRow(n,e[n]));return i},fgSegHtml:function(t,e){var n,i=this.view,r=i.opt("isRTL"),s=t.event,o=i.isEventDraggable(s),l=!e&&s.allDay&&t.isEnd&&i.isEventResizable(s),a=this.getSegClasses(t,o,l),c=this.getEventSkinCss(s),d="";return a.unshift("fc-day-grid-event"),!s.allDay&&t.isStart&&(d=''+F(i.getEventTimeText(s))+""),n=''+(F(s.title||"")||" ")+"",'"+'
'+(r?n+" "+d:d+" "+n)+"
"+(l?'
':"")+""},renderSegRow:function(e,n){function i(e){for(;e>o;)d=(y[r-1]||[])[o],d?d.attr("rowspan",parseInt(d.attr("rowspan")||1,10)+1):(d=t(""),l.append(d)),v[r][o]=d,y[r][o]=d,o++}var r,s,o,l,a,c,d,u=this.view,h=u.colCnt,f=this.buildSegLevels(n),g=Math.max(1,f.length),p=t(""),m=[],v=[],y=[];for(r=0;g>r;r++){if(s=f[r],o=0,l=t(""),m.push([]),v.push([]),y.push([]),s)for(a=0;s.length>a;a++){for(c=s[a],i(c.leftCol),d=t('').append(c.el),c.leftCol!=c.rightCol?d.attr("colspan",c.rightCol-c.leftCol+1):y[r][o]=d;c.rightCol>=o;)v[r][o]=d,m[r][o]=c,o++;l.append(d)}i(h),this.bookendCells(l,"eventSkeleton"),p.append(l)}return{row:e,tbodyEl:p,cellMatrix:v,segMatrix:m,segLevels:f,segs:n}},buildSegLevels:function(t){var e,n,i,r=[];for(t.sort(ae),e=0;t.length>e;e++){for(n=t[e],i=0;r.length>i&&de(n,r[i]);i++);n.level=i,(r[i]||(r[i]=[])).push(n)}for(i=0;r.length>i;i++)r[i].sort(ue);return r},groupSegRows:function(t){var e,n=this.view,i=[];for(e=0;n.rowCnt>e;e++)i.push([]);for(e=0;t.length>e;e++)i[t[e].row].push(t[e]);return i}}),t.extend(ce.prototype,{segPopover:null,popoverSegs:null,destroySegPopover:function(){this.segPopover&&this.segPopover.hide()},limitRows:function(t){var e,n,i=this.rowStructs||[];for(e=0;i.length>e;e++)this.unlimitRow(e),n=t?"number"==typeof t?t:this.computeRowLevelLimit(e):!1,n!==!1&&this.limitRow(e,n)},computeRowLevelLimit:function(t){var e,n,i=this.rowEls.eq(t),r=i.height(),s=this.rowStructs[t].tbodyEl.children();for(e=0;s.length>e;e++)if(n=s.eq(e).removeClass("fc-limited"),n.position().top+n.outerHeight()>r)return e;return!1},limitRow:function(e,n){function i(i){for(;i>T;)r={row:e,col:T},d=S.getCellSegs(r,n),d.length&&(f=o[n-1][T],w=S.renderMoreLink(r,d),y=t("
").append(w),f.append(y),D.push(y[0])),T++}var r,s,o,l,a,c,d,u,h,f,g,p,m,v,y,w,S=this,b=this.view,E=this.rowStructs[e],D=[],T=0;if(n&&E.segLevels.length>n){for(s=E.segLevels[n-1],o=E.cellMatrix,l=E.tbodyEl.children().slice(n).addClass("fc-limited").get(),a=0;s.length>a;a++){for(c=s[a],i(c.leftCol),h=[],u=0;c.rightCol>=T;)r={row:e,col:T},d=this.getCellSegs(r,n),h.push(d),u+=d.length,T++;if(u){for(f=o[n-1][c.leftCol],g=f.attr("rowspan")||1,p=[],m=0;h.length>m;m++)v=t('').attr("rowspan",g),d=h[m],r={row:e,col:c.leftCol+m},w=this.renderMoreLink(r,[c].concat(d)),y=t("
").append(w),v.append(y),p.push(v[0]),D.push(v[0]);f.addClass("fc-limited").after(t(p)),l.push(f[0])}}i(b.colCnt),E.moreEls=t(D),E.limitedEls=t(l)}},unlimitRow:function(t){var e=this.rowStructs[t];e.moreEls&&(e.moreEls.remove(),e.moreEls=null),e.limitedEls&&(e.limitedEls.removeClass("fc-limited"),e.limitedEls=null)},renderMoreLink:function(e,n){var i=this,r=this.view;return t('').text(this.getMoreLinkText(n.length)).on("click",function(s){var o=r.opt("eventLimitClick"),l=r.cellToDate(e),a=t(this),c=i.getCellDayEl(e),d=i.getCellSegs(e),u=i.resliceDaySegs(d,l),h=i.resliceDaySegs(n,l);"function"==typeof o&&(o=r.trigger("eventLimitClick",null,{date:l,dayEl:c,moreEl:a,segs:u,hiddenSegs:h},s)),"popover"===o?i.showSegPopover(l,e,a,u):"string"==typeof o&&r.calendar.zoomTo(l,o)})},showSegPopover:function(t,e,n,i){var r,s,o=this,l=this.view,a=n.parent();r=1==l.rowCnt?this.view.el:this.rowEls.eq(e.row),s={className:"fc-more-popover",content:this.renderSegPopoverContent(t,i),parentEl:this.el,top:r.offset().top,autoHide:!0,viewportConstrain:l.opt("popoverViewportConstrain"),hide:function(){o.segPopover.destroy(),o.segPopover=null,o.popoverSegs=null}},l.opt("isRTL")?s.right=a.offset().left+a.outerWidth()+1:s.left=a.offset().left-1,this.segPopover=new q(s),this.segPopover.show()},renderSegPopoverContent:function(e,n){var i,r=this.view,s=r.opt("theme"),o=e.format(r.opt("dayPopoverFormat")),l=t('
'+''+''+F(o)+""+'
'+"
"+'
'+'
'+"
"),a=l.find(".fc-event-container");for(n=this.renderFgSegEls(n,!0),this.popoverSegs=n,i=0;n.length>i;i++)n[i].cellDate=e,a.append(n[i].el);return l},resliceDaySegs:function(e,n){var i=t.map(e,function(t){return t.event}),r=n.clone().stripTime(),s=r.clone().add(1,"days");return this.eventsToSegs(i,function(t,e){var n=D(t,e,r,s);return n?[n]:[]})},getMoreLinkText:function(t){var e=this.view,n=e.opt("eventLimitText");return"function"==typeof n?n(t):"+"+t+" "+n},getCellSegs:function(t,e){for(var n,i=this.rowStructs[t.row].segMatrix,r=e||0,s=[];i.length>r;)n=i[r][t.col],n&&s.push(n),r++;return s}}),he.prototype=M(ne.prototype),t.extend(he.prototype,{slotDuration:null,snapDuration:null,minTime:null,maxTime:null,dayEls:null,slatEls:null,slatTops:null,helperEl:null,businessHourSegs:null,render:function(){this.processOptions(),this.el.html(this.renderHtml()),this.dayEls=this.el.find(".fc-day"),this.slatEls=this.el.find(".fc-slats tr"),this.computeSlatTops(),this.renderBusinessHours(),ne.prototype.render.call(this)},renderBusinessHours:function(){var t=this.view.calendar.getBusinessHoursEvents();this.businessHourSegs=this.renderFill("businessHours",this.eventsToSegs(t),"bgevent")},renderHtml:function(){return'
'+this.rowHtml("slotBg")+"
"+"
"+'
'+""+this.slatRowHtml()+"
"+"
"},slotBgCellHtml:function(t,e,n){return this.bgCellHtml(t,e,n)},slatRowHtml:function(){for(var t,n,i,r=this.view,s=r.calendar,o=r.opt("isRTL"),l="",a=0===this.slotDuration.asMinutes()%15,c=e.duration(+this.minTime);this.maxTime>c;)t=r.start.clone().time(c),n=t.minutes(),i='"+(a&&n?"":""+F(s.formatDate(t,r.opt("axisFormat")))+"")+"",l+=""+(o?"":i)+''+(o?i:"")+"",c.add(this.slotDuration);return l},processOptions:function(){var t=this.view,n=t.opt("slotDuration"),i=t.opt("snapDuration");n=e.duration(n),i=i?e.duration(i):n,this.slotDuration=n,this.snapDuration=i,this.cellDuration=i,this.minTime=e.duration(t.opt("minTime")),this.maxTime=e.duration(t.opt("maxTime"))},rangeToSegs:function(t,e){var n,i,r,s,o,l=this.view,a=[];for(t=t.clone().stripZone(),e=e.clone().stripZone(),i=0;l.colCnt>i;i++)r=l.cellToDate(0,i),s=r.clone().time(this.minTime),o=r.clone().time(this.maxTime),n=D(t,e,s,o),n&&(n.col=i,a.push(n));return a},resize:function(){this.computeSlatTops(),this.updateSegVerticals()},buildCoords:function(n,i){var r,s,o=this.view.colCnt,l=this.el.offset().top,a=e.duration(+this.minTime),c=null;for(this.dayEls.slice(0,o).each(function(e,n){r=t(n),s=r.offset().left,c&&(c[1]=s),c=[s],i[e]=c}),c[1]=s+r.outerWidth(),c=null;this.maxTime>a;)s=l+this.computeTimeTop(a),c&&(c[1]=s),c=[s],n.push(c),a.add(this.snapDuration);c[1]=l+this.computeTimeTop(a)},getCellDate:function(t){var e=this.view,n=e.calendar;return n.rezoneDate(e.cellToDate(0,t.col).time(this.minTime+this.snapDuration*t.row))},getCellDayEl:function(t){return this.dayEls.eq(t.col)},computeDateTop:function(t,n){return this.computeTimeTop(e.duration(t.clone().stripZone()-n.clone().stripTime()))},computeTimeTop:function(t){var e,n,i,r,s=(t-this.minTime)/this.slotDuration;return s=Math.max(0,s),s=Math.min(this.slatEls.length,s),e=Math.floor(s),n=s-e,i=this.slatTops[e],n?(r=this.slatTops[e+1],i+(r-i)*n):i},computeSlatTops:function(){var e,n=[];this.slatEls.each(function(i,r){e=t(r).position().top,n.push(e)}),n.push(e+this.slatEls.last().outerHeight()),this.slatTops=n},renderDrag:function(t,e,n){var i;return n?(this.renderRangeHelper(t,e,n),i=this.view.opt("dragOpacity"),void 0!==i&&this.helperEl.css("opacity",i),!0):(this.renderHighlight(t,e||this.view.calendar.getDefaultEventEnd(!1,t)),void 0)},destroyDrag:function(){this.destroyHelper(),this.destroyHighlight()},renderResize:function(t,e,n){this.renderRangeHelper(t,e,n)},destroyResize:function(){this.destroyHelper()},renderHelper:function(e,n){var i,r,s,o,l=this.eventsToSegs([e]);for(l=this.renderFgSegEls(l),i=this.renderSegTable(l),r=0;l.length>r;r++)s=l[r],n&&n.col===s.col&&(o=n.el,s.el.css({left:o.css("left"),right:o.css("right"),"margin-left":o.css("margin-left"),"margin-right":o.css("margin-right")}));this.helperEl=t('
').append(i).appendTo(this.el)},destroyHelper:function(){this.helperEl&&(this.helperEl.remove(),this.helperEl=null)},renderSelection:function(t,e){this.view.opt("selectHelper")?this.renderRangeHelper(t,e):this.renderHighlight(t,e)},destroySelection:function(){this.destroyHelper(),this.destroyHighlight()},renderFill:function(e,n,i){var r,s,o,l,a,c,d,u,h,f,g=this.view;if(n.length){for(n=this.renderFillSegEls(e,n),r=this.groupSegCols(n),i=i||e.toLowerCase(),s=t('
'+"
"+"
"),o=s.find("tr"),l=0;r.length>l;l++)if(a=r[l],c=t("").appendTo(o),a.length)for(d=t('
').appendTo(c),u=g.cellToDate(0,l),h=0;a.length>h;h++)f=a[h],d.append(f.el.css({top:this.computeDateTop(f.start,u),bottom:-this.computeDateTop(f.end,u)}));this.bookendCells(o,e),this.el.append(s),this.elsByFill[e]=s}return n}}),t.extend(he.prototype,{eventSkeletonEl:null,renderFgSegs:function(e){return e=this.renderFgSegEls(e),this.el.append(this.eventSkeletonEl=t('
').append(this.renderSegTable(e))),e},destroyFgSegs:function(){this.eventSkeletonEl&&(this.eventSkeletonEl.remove(),this.eventSkeletonEl=null)},renderSegTable:function(e){var n,i,r,s,o,l,a=t("
"),c=a.find("tr");for(n=this.groupSegCols(e),this.computeSegVerticals(e),s=0;n.length>s;s++){for(o=n[s],fe(o),l=t('
'),i=0;o.length>i;i++)r=o[i],r.el.css(this.generateSegPositionCss(r)),30>r.bottom-r.top&&r.el.addClass("fc-short"),l.append(r.el);c.append(t("").append(l))}return this.bookendCells(c,"eventSkeleton"),a +},updateSegVerticals:function(){var t,e=(this.segs||[]).concat(this.businessHourSegs||[]);for(this.computeSegVerticals(e),t=0;e.length>t;t++)e[t].el.css(this.generateSegVerticalCss(e[t]))},computeSegVerticals:function(t){var e,n;for(e=0;t.length>e;e++)n=t[e],n.top=this.computeDateTop(n.start,n.start),n.bottom=this.computeDateTop(n.end,n.start)},fgSegHtml:function(t,e){var n,i,r,s=this.view,o=t.event,l=s.isEventDraggable(o),a=!e&&t.isEnd&&s.isEventResizable(o),c=this.getSegClasses(t,l,a),d=this.getEventSkinCss(o);return c.unshift("fc-time-grid-event"),s.isMultiDayEvent(o)?(t.isStart||t.isEnd)&&(n=s.getEventTimeText(t.start,t.end),i=s.getEventTimeText(t.start,t.end,"LT"),r=s.getEventTimeText(t.start,null)):(n=s.getEventTimeText(o),i=s.getEventTimeText(o,"LT"),r=s.getEventTimeText(o.start,null)),'"+'
'+(n?'
"+""+F(n)+""+"
":"")+(o.title?'
'+F(o.title)+"
":"")+"
"+'
'+(a?'
':"")+""},generateSegPositionCss:function(t){var e,n,i=this.view,r=i.opt("isRTL"),s=i.opt("slotEventOverlap"),o=t.backwardCoord,l=t.forwardCoord,a=this.generateSegVerticalCss(t);return s&&(l=Math.min(1,o+2*(l-o))),r?(e=1-l,n=o):(e=o,n=1-l),a.zIndex=t.level+1,a.left=100*e+"%",a.right=100*n+"%",s&&t.forwardPressure&&(a[r?"marginLeft":"marginRight"]=20),a},generateSegVerticalCss:function(t){return{top:t.top,bottom:-t.bottom}},groupSegCols:function(t){var e,n=this.view,i=[];for(e=0;n.colCnt>e;e++)i.push([]);for(e=0;t.length>e;e++)i[t[e].col].push(t[e]);return i}}),be.prototype={calendar:null,coordMap:null,el:null,start:null,end:null,intervalStart:null,intervalEnd:null,rowCnt:null,colCnt:null,isSelected:!1,scrollerEl:null,scrollTop:null,widgetHeaderClass:null,widgetContentClass:null,highlightStateClass:null,documentMousedownProxy:null,documentDragStartProxy:null,init:function(){var e=this.opt("theme")?"ui":"fc";this.widgetHeaderClass=e+"-widget-header",this.widgetContentClass=e+"-widget-content",this.highlightStateClass=e+"-state-highlight",this.documentMousedownProxy=t.proxy(this,"documentMousedown"),this.documentDragStartProxy=t.proxy(this,"documentDragStart")},render:function(){this.updateSize(),this.trigger("viewRender",this,this,this.el),t(document).on("mousedown",this.documentMousedownProxy).on("dragstart",this.documentDragStartProxy)},destroy:function(){this.unselect(),this.trigger("viewDestroy",this,this,this.el),this.destroyEvents(),this.el.empty(),t(document).off("mousedown",this.documentMousedownProxy).off("dragstart",this.documentDragStartProxy)},incrementDate:function(){},updateSize:function(t){t&&this.recordScroll(),this.updateHeight(),this.updateWidth()},updateWidth:function(){},updateHeight:function(){var t=this.calendar;this.setHeight(t.getSuggestedViewHeight(),t.isHeightAuto())},setHeight:function(){},computeScrollerHeight:function(t){var e,n=this.el.add(this.scrollerEl);return n.css({position:"relative",left:-1}),e=this.el.outerHeight()-this.scrollerEl.height(),n.css({position:"",left:""}),t-e},recordScroll:function(){this.scrollerEl&&(this.scrollTop=this.scrollerEl.scrollTop())},restoreScroll:function(){null!==this.scrollTop&&this.scrollerEl.scrollTop(this.scrollTop)},renderEvents:function(){this.segEach(function(t){this.trigger("eventAfterRender",t.event,t.event,t.el)}),this.trigger("eventAfterAllRender")},destroyEvents:function(){this.segEach(function(t){this.trigger("eventDestroy",t.event,t.event,t.el)})},resolveEventEl:function(e,n){var i=this.trigger("eventRender",e,e,n);return i===!1?n=null:i&&i!==!0&&(n=t(i)),n},showEvent:function(t){this.segEach(function(t){t.el.css("visibility","")},t)},hideEvent:function(t){this.segEach(function(t){t.el.css("visibility","hidden")},t)},segEach:function(t,e){var n,i=this.getSegs();for(n=0;i.length>n;n++)e&&i[n].event._id!==e._id||t.call(this,i[n])},getSegs:function(){},renderDrag:function(){},destroyDrag:function(){},documentDragStart:function(e){var n,i,r,s,o,l=this,a=this.calendar,c=null,d=null,u=null;this.opt("droppable")&&(n=t(e.target),i=this.opt("dropAccept"),(t.isFunction(i)?i.call(n[0],n):n.is(i))&&(r=Ee(n),s=r.eventProps,o=new Q(this.coordMap,{cellOver:function(e,n){c=n,d=r.duration?c.clone().add(r.duration):null,u=d||a.getDefaultEventEnd(!c.hasTime(),c),s&&t.extend(s,{start:c,end:d}),a.isExternalDragAllowedInRange(c,u,s)?l.renderDrag(c,u):(c=null,f())},cellOut:function(){c=null,l.destroyDrag(),g()}}),t(document).one("dragstop",function(t,e){var i;l.destroyDrag(),g(),c&&(r.startTime&&!c.hasTime()&&c.time(r.startTime),l.trigger("drop",n[0],c,t,e),s&&(i=a.renderEvent(s,r.stick),l.trigger("eventReceive",null,i[0])))}),o.startDrag(e)))},select:function(t,e,n){this.unselect(n),this.renderSelection(t,e),this.reportSelection(t,e,n)},renderSelection:function(){},reportSelection:function(t,e,n){this.isSelected=!0,this.trigger("select",null,t,e,n)},unselect:function(t){this.isSelected&&(this.isSelected=!1,this.destroySelection(),this.trigger("unselect",null,t))},destroySelection:function(){},documentMousedown:function(e){var n;this.isSelected&&this.opt("unselectAuto")&&E(e)&&(n=this.opt("unselectCancel"),n&&t(e.target).closest(n).length||this.unselect(e))}},_e.dataAttrPrefix="",De.prototype=M(be.prototype),t.extend(De.prototype,{dayGrid:null,dayNumbersVisible:!1,weekNumbersVisible:!1,weekNumberWidth:null,headRowEl:null,render:function(t,e,n){this.rowCnt=t,this.colCnt=e,this.dayNumbersVisible=n,this.weekNumbersVisible=this.opt("weekNumbers"),this.dayGrid.numbersVisible=this.dayNumbersVisible||this.weekNumbersVisible,this.el.addClass("fc-basic-view").html(this.renderHtml()),this.headRowEl=this.el.find("thead .fc-row"),this.scrollerEl=this.el.find(".fc-day-grid-container"),this.dayGrid.coordMap.containerEl=this.scrollerEl,this.dayGrid.el=this.el.find(".fc-day-grid"),this.dayGrid.render(this.hasRigidRows()),be.prototype.render.call(this)},destroy:function(){this.dayGrid.destroy(),be.prototype.destroy.call(this)},renderHtml:function(){return'"+""+""+""+""+'"+""+""+"
'+this.dayGrid.headHtml()+"
'+'
'+'
'+"
"+"
"},headIntroHtml:function(){return this.weekNumbersVisible?'"+""+F(this.opt("weekNumberTitle"))+""+"":void 0},numberIntroHtml:function(t){return this.weekNumbersVisible?'"+""+this.calendar.calculateWeekNumber(this.cellToDate(t,0))+""+"":void 0},dayIntroHtml:function(){return this.weekNumbersVisible?'":void 0},introHtml:function(){return this.weekNumbersVisible?'":void 0},numberCellHtml:function(t,e,n){var i;return this.dayNumbersVisible?(i=this.dayGrid.getDayClasses(n),i.unshift("fc-day-number"),''+n.date()+""):""},weekNumberStyleAttr:function(){return null!==this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},hasRigidRows:function(){var t=this.opt("eventLimit");return t&&"number"!=typeof t},updateWidth:function(){this.weekNumbersVisible&&(this.weekNumberWidth=v(this.el.find(".fc-week-number")))},setHeight:function(t,e){var n,i=this.opt("eventLimit");w(this.scrollerEl),h(this.headRowEl),this.dayGrid.destroySegPopover(),i&&"number"==typeof i&&this.dayGrid.limitRows(i),n=this.computeScrollerHeight(t),this.setGridHeight(n,e),i&&"number"!=typeof i&&this.dayGrid.limitRows(i),!e&&y(this.scrollerEl,n)&&(u(this.headRowEl,b(this.scrollerEl)),n=this.computeScrollerHeight(t),this.scrollerEl.height(n),this.restoreScroll())},setGridHeight:function(t,e){e?m(this.dayGrid.rowEls):p(this.dayGrid.rowEls,t,!0)},renderEvents:function(t){this.dayGrid.renderEvents(t),this.updateHeight(),be.prototype.renderEvents.call(this,t)},getSegs:function(){return this.dayGrid.getSegs()},destroyEvents:function(){be.prototype.destroyEvents.call(this),this.recordScroll(),this.dayGrid.destroyEvents()},renderDrag:function(t,e,n){return this.dayGrid.renderDrag(t,e,n)},destroyDrag:function(){this.dayGrid.destroyDrag()},renderSelection:function(t,e){this.dayGrid.renderSelection(t,e)},destroySelection:function(){this.dayGrid.destroySelection()}}),r({fixedWeekCount:!0}),Ge.month=Te,Te.prototype=M(De.prototype),t.extend(Te.prototype,{name:"month",incrementDate:function(t,e){return t.clone().stripTime().add(e,"months").startOf("month")},render:function(t){var e;this.intervalStart=t.clone().stripTime().startOf("month"),this.intervalEnd=this.intervalStart.clone().add(1,"months"),this.start=this.intervalStart.clone(),this.start=this.skipHiddenDays(this.start),this.start.startOf("week"),this.start=this.skipHiddenDays(this.start),this.end=this.intervalEnd.clone(),this.end=this.skipHiddenDays(this.end,-1,!0),this.end.add((7-this.end.weekday())%7,"days"),this.end=this.skipHiddenDays(this.end,-1,!0),e=Math.ceil(this.end.diff(this.start,"weeks",!0)),this.isFixedWeeks()&&(this.end.add(6-e,"weeks"),e=6),this.title=this.calendar.formatDate(this.intervalStart,this.opt("titleFormat")),De.prototype.render.call(this,e,this.getCellsPerWeek(),!0)},setGridHeight:function(t,e){e=e||"variable"===this.opt("weekMode"),e&&(t*=this.rowCnt/6),p(this.dayGrid.rowEls,t,!e)},isFixedWeeks:function(){var t=this.opt("weekMode");return t?"fixed"===t:this.opt("fixedWeekCount")}}),Ge.basicWeek=Ce,Ce.prototype=M(De.prototype),t.extend(Ce.prototype,{name:"basicWeek",incrementDate:function(t,e){return t.clone().stripTime().add(e,"weeks").startOf("week")},render:function(t){this.intervalStart=t.clone().stripTime().startOf("week"),this.intervalEnd=this.intervalStart.clone().add(1,"weeks"),this.start=this.skipHiddenDays(this.intervalStart),this.end=this.skipHiddenDays(this.intervalEnd,-1,!0),this.title=this.calendar.formatRange(this.start,this.end.clone().subtract(1),this.opt("titleFormat")," — "),De.prototype.render.call(this,1,this.getCellsPerWeek(),!1)}}),Ge.basicDay=He,He.prototype=M(De.prototype),t.extend(He.prototype,{name:"basicDay",incrementDate:function(t,e){var n=t.clone().stripTime().add(e,"days");return n=this.skipHiddenDays(n,0>e?-1:1)},render:function(t){this.start=this.intervalStart=t.clone().stripTime(),this.end=this.intervalEnd=this.start.clone().add(1,"days"),this.title=this.calendar.formatDate(this.start,this.opt("titleFormat")),De.prototype.render.call(this,1,1,!1)}}),r({allDaySlot:!0,allDayText:"all-day",scrollTime:"06:00:00",slotDuration:"00:30:00",axisFormat:xe,timeFormat:{agenda:ke},minTime:"00:00:00",maxTime:"24:00:00",slotEventOverlap:!0});var Ue=5;Me.prototype=M(be.prototype),t.extend(Me.prototype,{timeGrid:null,dayGrid:null,axisWidth:null,noScrollRowEls:null,bottomRuleEl:null,bottomRuleHeight:null,render:function(e){this.rowCnt=1,this.colCnt=e,this.el.addClass("fc-agenda-view").html(this.renderHtml()),this.scrollerEl=this.el.find(".fc-time-grid-container"),this.timeGrid.coordMap.containerEl=this.scrollerEl,this.timeGrid.el=this.el.find(".fc-time-grid"),this.timeGrid.render(),this.bottomRuleEl=t('
').appendTo(this.timeGrid.el),this.dayGrid&&(this.dayGrid.el=this.el.find(".fc-day-grid"),this.dayGrid.render(),this.dayGrid.bottomCoordPadding=this.dayGrid.el.next("hr").outerHeight()),this.noScrollRowEls=this.el.find(".fc-row:not(.fc-scroller *)"),be.prototype.render.call(this),this.resetScroll()},destroy:function(){this.timeGrid.destroy(),this.dayGrid&&this.dayGrid.destroy(),be.prototype.destroy.call(this)},renderHtml:function(){return'"+""+""+""+""+'"+""+""+"
'+this.timeGrid.headHtml()+"
'+(this.dayGrid?'

':"")+'
'+'
'+"
"+"
"},headIntroHtml:function(){var t,e,n,i;return this.opt("weekNumbers")?(t=this.cellToDate(0,0),e=this.calendar.calculateWeekNumber(t),n=this.opt("weekNumberTitle"),i=this.opt("isRTL")?e+n:n+e,'"+""+F(i)+""+""):'"},dayIntroHtml:function(){return'"+""+(this.opt("allDayHtml")||F(this.opt("allDayText")))+""+""},slotBgIntroHtml:function(){return'"},introHtml:function(){return'"},axisStyleAttr:function(){return null!==this.axisWidth?'style="width:'+this.axisWidth+'px"':""},updateSize:function(t){t&&this.timeGrid.resize(),be.prototype.updateSize.call(this,t)},updateWidth:function(){this.axisWidth=v(this.el.find(".fc-axis"))},setHeight:function(t,e){var n,i;null===this.bottomRuleHeight&&(this.bottomRuleHeight=this.bottomRuleEl.outerHeight()),this.bottomRuleEl.hide(),this.scrollerEl.css("overflow",""),w(this.scrollerEl),h(this.noScrollRowEls),this.dayGrid&&(this.dayGrid.destroySegPopover(),n=this.opt("eventLimit"),n&&"number"!=typeof n&&(n=Ue),n&&this.dayGrid.limitRows(n)),e||(i=this.computeScrollerHeight(t),y(this.scrollerEl,i)?(u(this.noScrollRowEls,b(this.scrollerEl)),i=this.computeScrollerHeight(t),this.scrollerEl.height(i),this.restoreScroll()):(this.scrollerEl.height(i).css("overflow","hidden"),this.bottomRuleEl.show()))},resetScroll:function(){function t(){n.scrollerEl.scrollTop(r)}var n=this,i=e.duration(this.opt("scrollTime")),r=this.timeGrid.computeTimeTop(i);r=Math.ceil(r),r&&r++,t(),setTimeout(t,0)},renderEvents:function(t){var e,n,i=[],r=[],s=[];for(n=0;t.length>n;n++)t[n].allDay?i.push(t[n]):r.push(t[n]);e=this.timeGrid.renderEvents(r),this.dayGrid&&(s=this.dayGrid.renderEvents(i)),this.updateHeight(),be.prototype.renderEvents.call(this,t)},getSegs:function(){return this.timeGrid.getSegs().concat(this.dayGrid?this.dayGrid.getSegs():[])},destroyEvents:function(){be.prototype.destroyEvents.call(this),this.recordScroll(),this.timeGrid.destroyEvents(),this.dayGrid&&this.dayGrid.destroyEvents()},renderDrag:function(t,e,n){return t.hasTime()?this.timeGrid.renderDrag(t,e,n):this.dayGrid?this.dayGrid.renderDrag(t,e,n):void 0},destroyDrag:function(){this.timeGrid.destroyDrag(),this.dayGrid&&this.dayGrid.destroyDrag()},renderSelection:function(t,e){t.hasTime()||e.hasTime()?this.timeGrid.renderSelection(t,e):this.dayGrid&&this.dayGrid.renderSelection(t,e)},destroySelection:function(){this.timeGrid.destroySelection(),this.dayGrid&&this.dayGrid.destroySelection()}}),Ge.agendaWeek=Re,Re.prototype=M(Me.prototype),t.extend(Re.prototype,{name:"agendaWeek",incrementDate:function(t,e){return t.clone().stripTime().add(e,"weeks").startOf("week")},render:function(t){this.intervalStart=t.clone().stripTime().startOf("week"),this.intervalEnd=this.intervalStart.clone().add(1,"weeks"),this.start=this.skipHiddenDays(this.intervalStart),this.end=this.skipHiddenDays(this.intervalEnd,-1,!0),this.title=this.calendar.formatRange(this.start,this.end.clone().subtract(1),this.opt("titleFormat")," — "),Me.prototype.render.call(this,this.getCellsPerWeek())}}),Ge.agendaDay=Pe,Pe.prototype=M(Me.prototype),t.extend(Pe.prototype,{name:"agendaDay",incrementDate:function(t,e){var n=t.clone().stripTime().add(e,"days");return n=this.skipHiddenDays(n,0>e?-1:1)},render:function(t){this.start=this.intervalStart=t.clone().stripTime(),this.end=this.intervalEnd=this.start.clone().add(1,"days"),this.title=this.calendar.formatDate(this.start,this.opt("titleFormat")),Me.prototype.render.call(this,1)}})}); \ No newline at end of file diff --git a/static/js/plugins/fullcalendar/moment.min.js b/static/js/plugins/fullcalendar/moment.min.js new file mode 100644 index 000000000..8b54f130f --- /dev/null +++ b/static/js/plugins/fullcalendar/moment.min.js @@ -0,0 +1,7 @@ +//! moment.js +//! version : 2.8.3 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +(function(a){function b(a,b,c){switch(arguments.length){case 2:return null!=a?a:b;case 3:return null!=a?a:null!=b?b:c;default:throw new Error("Implement me")}}function c(a,b){return zb.call(a,b)}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function e(a){tb.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+a)}function f(a,b){var c=!0;return m(function(){return c&&(e(a),c=!1),b.apply(this,arguments)},b)}function g(a,b){qc[a]||(e(b),qc[a]=!0)}function h(a,b){return function(c){return p(a.call(this,c),b)}}function i(a,b){return function(c){return this.localeData().ordinal(a.call(this,c),b)}}function j(){}function k(a,b){b!==!1&&F(a),n(this,a),this._d=new Date(+a._d)}function l(a){var b=y(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=tb.localeData(),this._bubble()}function m(a,b){for(var d in b)c(b,d)&&(a[d]=b[d]);return c(b,"toString")&&(a.toString=b.toString),c(b,"valueOf")&&(a.valueOf=b.valueOf),a}function n(a,b){var c,d,e;if("undefined"!=typeof b._isAMomentObject&&(a._isAMomentObject=b._isAMomentObject),"undefined"!=typeof b._i&&(a._i=b._i),"undefined"!=typeof b._f&&(a._f=b._f),"undefined"!=typeof b._l&&(a._l=b._l),"undefined"!=typeof b._strict&&(a._strict=b._strict),"undefined"!=typeof b._tzm&&(a._tzm=b._tzm),"undefined"!=typeof b._isUTC&&(a._isUTC=b._isUTC),"undefined"!=typeof b._offset&&(a._offset=b._offset),"undefined"!=typeof b._pf&&(a._pf=b._pf),"undefined"!=typeof b._locale&&(a._locale=b._locale),Ib.length>0)for(c in Ib)d=Ib[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function o(a){return 0>a?Math.ceil(a):Math.floor(a)}function p(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&A(a[d])!==A(b[d]))&&g++;return g+f}function x(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=jc[a]||kc[b]||b}return a}function y(a){var b,d,e={};for(d in a)c(a,d)&&(b=x(d),b&&(e[b]=a[d]));return e}function z(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}tb[b]=function(e,f){var g,h,i=tb._locale[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=tb().utc().set(d,a);return i.call(tb._locale,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function A(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function B(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function C(a,b,c){return hb(tb([a,11,31+b-c]),b,c).week}function D(a){return E(a)?366:365}function E(a){return a%4===0&&a%100!==0||a%400===0}function F(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[Bb]<0||a._a[Bb]>11?Bb:a._a[Cb]<1||a._a[Cb]>B(a._a[Ab],a._a[Bb])?Cb:a._a[Db]<0||a._a[Db]>23?Db:a._a[Eb]<0||a._a[Eb]>59?Eb:a._a[Fb]<0||a._a[Fb]>59?Fb:a._a[Gb]<0||a._a[Gb]>999?Gb:-1,a._pf._overflowDayOfYear&&(Ab>b||b>Cb)&&(b=Cb),a._pf.overflow=b)}function G(a){return null==a._isValid&&(a._isValid=!isNaN(a._d.getTime())&&a._pf.overflow<0&&!a._pf.empty&&!a._pf.invalidMonth&&!a._pf.nullInput&&!a._pf.invalidFormat&&!a._pf.userInvalidated,a._strict&&(a._isValid=a._isValid&&0===a._pf.charsLeftOver&&0===a._pf.unusedTokens.length)),a._isValid}function H(a){return a?a.toLowerCase().replace("_","-"):a}function I(a){for(var b,c,d,e,f=0;f0;){if(d=J(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&w(e,c,!0)>=b-1)break;b--}f++}return null}function J(a){var b=null;if(!Hb[a]&&Jb)try{b=tb.locale(),require("./locale/"+a),tb.locale(b)}catch(c){}return Hb[a]}function K(a,b){return b._isUTC?tb(a).zone(b._offset||0):tb(a).local()}function L(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function M(a){var b,c,d=a.match(Nb);for(b=0,c=d.length;c>b;b++)d[b]=pc[d[b]]?pc[d[b]]:L(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function N(a,b){return a.isValid()?(b=O(b,a.localeData()),lc[b]||(lc[b]=M(b)),lc[b](a)):a.localeData().invalidDate()}function O(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Ob.lastIndex=0;d>=0&&Ob.test(a);)a=a.replace(Ob,c),Ob.lastIndex=0,d-=1;return a}function P(a,b){var c,d=b._strict;switch(a){case"Q":return Zb;case"DDDD":return _b;case"YYYY":case"GGGG":case"gggg":return d?ac:Rb;case"Y":case"G":case"g":return cc;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?bc:Sb;case"S":if(d)return Zb;case"SS":if(d)return $b;case"SSS":if(d)return _b;case"DDD":return Qb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Ub;case"a":case"A":return b._locale._meridiemParse;case"X":return Xb;case"Z":case"ZZ":return Vb;case"T":return Wb;case"SSSS":return Tb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?$b:Pb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Pb;case"Do":return Yb;default:return c=new RegExp(Y(X(a.replace("\\","")),"i"))}}function Q(a){a=a||"";var b=a.match(Vb)||[],c=b[b.length-1]||[],d=(c+"").match(hc)||["-",0,0],e=+(60*d[1])+A(d[2]);return"+"===d[0]?-e:e}function R(a,b,c){var d,e=c._a;switch(a){case"Q":null!=b&&(e[Bb]=3*(A(b)-1));break;case"M":case"MM":null!=b&&(e[Bb]=A(b)-1);break;case"MMM":case"MMMM":d=c._locale.monthsParse(b),null!=d?e[Bb]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[Cb]=A(b));break;case"Do":null!=b&&(e[Cb]=A(parseInt(b,10)));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=A(b));break;case"YY":e[Ab]=tb.parseTwoDigitYear(b);break;case"YYYY":case"YYYYY":case"YYYYYY":e[Ab]=A(b);break;case"a":case"A":c._isPm=c._locale.isPM(b);break;case"H":case"HH":case"h":case"hh":e[Db]=A(b);break;case"m":case"mm":e[Eb]=A(b);break;case"s":case"ss":e[Fb]=A(b);break;case"S":case"SS":case"SSS":case"SSSS":e[Gb]=A(1e3*("0."+b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=Q(b);break;case"dd":case"ddd":case"dddd":d=c._locale.weekdaysParse(b),null!=d?(c._w=c._w||{},c._w.d=d):c._pf.invalidWeekday=b;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":a=a.substr(0,1);case"gggg":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=A(b));break;case"gg":case"GG":c._w=c._w||{},c._w[a]=tb.parseTwoDigitYear(b)}}function S(a){var c,d,e,f,g,h,i;c=a._w,null!=c.GG||null!=c.W||null!=c.E?(g=1,h=4,d=b(c.GG,a._a[Ab],hb(tb(),1,4).year),e=b(c.W,1),f=b(c.E,1)):(g=a._locale._week.dow,h=a._locale._week.doy,d=b(c.gg,a._a[Ab],hb(tb(),g,h).year),e=b(c.w,1),null!=c.d?(f=c.d,g>f&&++e):f=null!=c.e?c.e+g:g),i=ib(d,e,f,h,g),a._a[Ab]=i.year,a._dayOfYear=i.dayOfYear}function T(a){var c,d,e,f,g=[];if(!a._d){for(e=V(a),a._w&&null==a._a[Cb]&&null==a._a[Bb]&&S(a),a._dayOfYear&&(f=b(a._a[Ab],e[Ab]),a._dayOfYear>D(f)&&(a._pf._overflowDayOfYear=!0),d=db(f,0,a._dayOfYear),a._a[Bb]=d.getUTCMonth(),a._a[Cb]=d.getUTCDate()),c=0;3>c&&null==a._a[c];++c)a._a[c]=g[c]=e[c];for(;7>c;c++)a._a[c]=g[c]=null==a._a[c]?2===c?1:0:a._a[c];a._d=(a._useUTC?db:cb).apply(null,g),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()+a._tzm)}}function U(a){var b;a._d||(b=y(a._i),a._a=[b.year,b.month,b.day,b.hour,b.minute,b.second,b.millisecond],T(a))}function V(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function W(a){if(a._f===tb.ISO_8601)return void $(a);a._a=[],a._pf.empty=!0;var b,c,d,e,f,g=""+a._i,h=g.length,i=0;for(d=O(a._f,a._locale).match(Nb)||[],b=0;b0&&a._pf.unusedInput.push(f),g=g.slice(g.indexOf(c)+c.length),i+=c.length),pc[e]?(c?a._pf.empty=!1:a._pf.unusedTokens.push(e),R(e,c,a)):a._strict&&!c&&a._pf.unusedTokens.push(e);a._pf.charsLeftOver=h-i,g.length>0&&a._pf.unusedInput.push(g),a._isPm&&a._a[Db]<12&&(a._a[Db]+=12),a._isPm===!1&&12===a._a[Db]&&(a._a[Db]=0),T(a),F(a)}function X(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function Y(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Z(a){var b,c,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;fg)&&(e=g,c=b));m(a,c||b)}function $(a){var b,c,d=a._i,e=dc.exec(d);if(e){for(a._pf.iso=!0,b=0,c=fc.length;c>b;b++)if(fc[b][1].exec(d)){a._f=fc[b][0]+(e[6]||" ");break}for(b=0,c=gc.length;c>b;b++)if(gc[b][1].exec(d)){a._f+=gc[b][0];break}d.match(Vb)&&(a._f+="Z"),W(a)}else a._isValid=!1}function _(a){$(a),a._isValid===!1&&(delete a._isValid,tb.createFromInputFallback(a))}function ab(a,b){var c,d=[];for(c=0;ca&&h.setFullYear(a),h}function db(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function eb(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function fb(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function gb(a,b,c){var d=tb.duration(a).abs(),e=yb(d.as("s")),f=yb(d.as("m")),g=yb(d.as("h")),h=yb(d.as("d")),i=yb(d.as("M")),j=yb(d.as("y")),k=e0,k[4]=c,fb.apply({},k)}function hb(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=tb(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function ib(a,b,c,d,e){var f,g,h=db(a,0,1).getUTCDay();return h=0===h?7:h,c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:D(a-1)+g}}function jb(b){var c=b._i,d=b._f;return b._locale=b._locale||tb.localeData(b._l),null===c||d===a&&""===c?tb.invalid({nullInput:!0}):("string"==typeof c&&(b._i=c=b._locale.preparse(c)),tb.isMoment(c)?new k(c,!0):(d?u(d)?Z(b):W(b):bb(b),new k(b)))}function kb(a,b){var c,d;if(1===b.length&&u(b[0])&&(b=b[0]),!b.length)return tb();for(c=b[0],d=1;d=0?"+":"-";return b+p(Math.abs(a),6)},gg:function(){return p(this.weekYear()%100,2)},gggg:function(){return p(this.weekYear(),4)},ggggg:function(){return p(this.weekYear(),5)},GG:function(){return p(this.isoWeekYear()%100,2)},GGGG:function(){return p(this.isoWeekYear(),4)},GGGGG:function(){return p(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return A(this.milliseconds()/100)},SS:function(){return p(A(this.milliseconds()/10),2)},SSS:function(){return p(this.milliseconds(),3)},SSSS:function(){return p(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+p(A(a/60),2)+":"+p(A(a)%60,2)},ZZ:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+p(A(a/60),2)+p(A(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},qc={},rc=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];nc.length;)vb=nc.pop(),pc[vb+"o"]=i(pc[vb],vb);for(;oc.length;)vb=oc.pop(),pc[vb+vb]=h(pc[vb],2);pc.DDDD=h(pc.DDD,3),m(j.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(a){return this._months[a.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a){var b,c,d;for(this._monthsParse||(this._monthsParse=[]),b=0;12>b;b++)if(this._monthsParse[b]||(c=tb.utc([2e3,b]),d="^"+this.months(c,"")+"|^"+this.monthsShort(c,""),this._monthsParse[b]=new RegExp(d.replace(".",""),"i")),this._monthsParse[b].test(a))return b},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=tb([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM D, YYYY LT"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"p"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(a,b){var c=this._calendar[a];return"function"==typeof c?c.apply(b):c},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("%d",a)},_ordinal:"%d",preparse:function(a){return a},postformat:function(a){return a},week:function(a){return hb(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),tb=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=b,g._f=c,g._l=e,g._strict=f,g._isUTC=!1,g._pf=d(),jb(g)},tb.suppressDeprecationWarnings=!1,tb.createFromInputFallback=f("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i)}),tb.min=function(){var a=[].slice.call(arguments,0);return kb("isBefore",a)},tb.max=function(){var a=[].slice.call(arguments,0);return kb("isAfter",a)},tb.utc=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._useUTC=!0,g._isUTC=!0,g._l=e,g._i=b,g._f=c,g._strict=f,g._pf=d(),jb(g).utc()},tb.unix=function(a){return tb(1e3*a)},tb.duration=function(a,b){var d,e,f,g,h=a,i=null;return tb.isDuration(a)?h={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(h={},b?h[b]=a:h.milliseconds=a):(i=Lb.exec(a))?(d="-"===i[1]?-1:1,h={y:0,d:A(i[Cb])*d,h:A(i[Db])*d,m:A(i[Eb])*d,s:A(i[Fb])*d,ms:A(i[Gb])*d}):(i=Mb.exec(a))?(d="-"===i[1]?-1:1,f=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*d},h={y:f(i[2]),M:f(i[3]),d:f(i[4]),h:f(i[5]),m:f(i[6]),s:f(i[7]),w:f(i[8])}):"object"==typeof h&&("from"in h||"to"in h)&&(g=r(tb(h.from),tb(h.to)),h={},h.ms=g.milliseconds,h.M=g.months),e=new l(h),tb.isDuration(a)&&c(a,"_locale")&&(e._locale=a._locale),e},tb.version=wb,tb.defaultFormat=ec,tb.ISO_8601=function(){},tb.momentProperties=Ib,tb.updateOffset=function(){},tb.relativeTimeThreshold=function(b,c){return mc[b]===a?!1:c===a?mc[b]:(mc[b]=c,!0)},tb.lang=f("moment.lang is deprecated. Use moment.locale instead.",function(a,b){return tb.locale(a,b)}),tb.locale=function(a,b){var c;return a&&(c="undefined"!=typeof b?tb.defineLocale(a,b):tb.localeData(a),c&&(tb.duration._locale=tb._locale=c)),tb._locale._abbr},tb.defineLocale=function(a,b){return null!==b?(b.abbr=a,Hb[a]||(Hb[a]=new j),Hb[a].set(b),tb.locale(a),Hb[a]):(delete Hb[a],null)},tb.langData=f("moment.langData is deprecated. Use moment.localeData instead.",function(a){return tb.localeData(a)}),tb.localeData=function(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return tb._locale;if(!u(a)){if(b=J(a))return b;a=[a]}return I(a)},tb.isMoment=function(a){return a instanceof k||null!=a&&c(a,"_isAMomentObject")},tb.isDuration=function(a){return a instanceof l};for(vb=rc.length-1;vb>=0;--vb)z(rc[vb]);tb.normalizeUnits=function(a){return x(a)},tb.invalid=function(a){var b=tb.utc(0/0);return null!=a?m(b._pf,a):b._pf.userInvalidated=!0,b},tb.parseZone=function(){return tb.apply(null,arguments).parseZone()},tb.parseTwoDigitYear=function(a){return A(a)+(A(a)>68?1900:2e3)},m(tb.fn=k.prototype,{clone:function(){return tb(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var a=tb(this).utc();return 00:!1},parsingFlags:function(){return m({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(a){return this.zone(0,a)},local:function(a){return this._isUTC&&(this.zone(0,a),this._isUTC=!1,a&&this.add(this._dateTzOffset(),"m")),this},format:function(a){var b=N(this,a||tb.defaultFormat);return this.localeData().postformat(b)},add:s(1,"add"),subtract:s(-1,"subtract"),diff:function(a,b,c){var d,e,f,g=K(a,this),h=6e4*(this.zone()-g.zone());return b=x(b),"year"===b||"month"===b?(d=432e5*(this.daysInMonth()+g.daysInMonth()),e=12*(this.year()-g.year())+(this.month()-g.month()),f=this-tb(this).startOf("month")-(g-tb(g).startOf("month")),f-=6e4*(this.zone()-tb(this).startOf("month").zone()-(g.zone()-tb(g).startOf("month").zone())),e+=f/d,"year"===b&&(e/=12)):(d=this-g,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-h)/864e5:"week"===b?(d-h)/6048e5:d),c?e:o(e)},from:function(a,b){return tb.duration({to:this,from:a}).locale(this.locale()).humanize(!b)},fromNow:function(a){return this.from(tb(),a)},calendar:function(a){var b=a||tb(),c=K(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this))},isLeapYear:function(){return E(this.year())},isDST:function(){return this.zone()+a):+this.clone().startOf(b)>+tb(a).startOf(b)},isBefore:function(a,b){return b=x("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=tb.isMoment(a)?a:tb(a),+a>+this):+this.clone().startOf(b)<+tb(a).startOf(b)},isSame:function(a,b){return b=x(b||"millisecond"),"millisecond"===b?(a=tb.isMoment(a)?a:tb(a),+this===+a):+this.clone().startOf(b)===+K(a,this).startOf(b)},min:f("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(a){return a=tb.apply(null,arguments),this>a?this:a}),max:f("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(a){return a=tb.apply(null,arguments),a>this?this:a}),zone:function(a,b){var c,d=this._offset||0;return null==a?this._isUTC?d:this._dateTzOffset():("string"==typeof a&&(a=Q(a)),Math.abs(a)<16&&(a=60*a),!this._isUTC&&b&&(c=this._dateTzOffset()),this._offset=a,this._isUTC=!0,null!=c&&this.subtract(c,"m"),d!==a&&(!b||this._changeInProgress?t(this,tb.duration(d-a,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,tb.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(a){return a=a?tb(a).zone():0,(this.zone()-a)%60===0},daysInMonth:function(){return B(this.year(),this.month())},dayOfYear:function(a){var b=yb((tb(this).startOf("day")-tb(this).startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=hb(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")},isoWeekYear:function(a){var b=hb(this,1,4).year;return null==a?b:this.add(a-b,"y")},week:function(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")},isoWeek:function(a){var b=hb(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")},weekday:function(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return C(this.year(),1,4)},weeksInYear:function(){var a=this.localeData()._week;return C(this.year(),a.dow,a.doy)},get:function(a){return a=x(a),this[a]()},set:function(a,b){return a=x(a),"function"==typeof this[a]&&this[a](b),this},locale:function(b){var c;return b===a?this._locale._abbr:(c=tb.localeData(b),null!=c&&(this._locale=c),this)},lang:f("moment().lang() is deprecated. Use moment().localeData() instead.",function(b){return b===a?this.localeData():this.locale(b)}),localeData:function(){return this._locale},_dateTzOffset:function(){return 15*Math.round(this._d.getTimezoneOffset()/15)}}),tb.fn.millisecond=tb.fn.milliseconds=ob("Milliseconds",!1),tb.fn.second=tb.fn.seconds=ob("Seconds",!1),tb.fn.minute=tb.fn.minutes=ob("Minutes",!1),tb.fn.hour=tb.fn.hours=ob("Hours",!0),tb.fn.date=ob("Date",!0),tb.fn.dates=f("dates accessor is deprecated. Use date instead.",ob("Date",!0)),tb.fn.year=ob("FullYear",!0),tb.fn.years=f("years accessor is deprecated. Use year instead.",ob("FullYear",!0)),tb.fn.days=tb.fn.day,tb.fn.months=tb.fn.month,tb.fn.weeks=tb.fn.week,tb.fn.isoWeeks=tb.fn.isoWeek,tb.fn.quarters=tb.fn.quarter,tb.fn.toJSON=tb.fn.toISOString,m(tb.duration.fn=l.prototype,{_bubble:function(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;g.milliseconds=d%1e3,a=o(d/1e3),g.seconds=a%60,b=o(a/60),g.minutes=b%60,c=o(b/60),g.hours=c%24,e+=o(c/24),h=o(pb(e)),e-=o(qb(h)),f+=o(e/30),e%=30,h+=o(f/12),f%=12,g.days=e,g.months=f,g.years=h},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return o(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*A(this._months/12)},humanize:function(a){var b=gb(this,!a,this.localeData());return a&&(b=this.localeData().pastFuture(+this,b)),this.localeData().postformat(b)},add:function(a,b){var c=tb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=tb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=x(a),this[a.toLowerCase()+"s"]()},as:function(a){var b,c;if(a=x(a),"month"===a||"year"===a)return b=this._days+this._milliseconds/864e5,c=this._months+12*pb(b),"month"===a?c:c/12;switch(b=this._days+qb(this._months/12),a){case"week":return b/7+this._milliseconds/6048e5;case"day":return b+this._milliseconds/864e5;case"hour":return 24*b+this._milliseconds/36e5;case"minute":return 24*b*60+this._milliseconds/6e4;case"second":return 24*b*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+a)}},lang:tb.fn.lang,locale:tb.fn.locale,toIsoString:f("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"},localeData:function(){return this._locale}}),tb.duration.fn.toString=tb.duration.fn.toISOString;for(vb in ic)c(ic,vb)&&rb(vb.toLowerCase());tb.duration.fn.asMilliseconds=function(){return this.as("ms")},tb.duration.fn.asSeconds=function(){return this.as("s")},tb.duration.fn.asMinutes=function(){return this.as("m")},tb.duration.fn.asHours=function(){return this.as("h")},tb.duration.fn.asDays=function(){return this.as("d")},tb.duration.fn.asWeeks=function(){return this.as("weeks")},tb.duration.fn.asMonths=function(){return this.as("M")},tb.duration.fn.asYears=function(){return this.as("y")},tb.locale("en",{ordinal:function(a){var b=a%10,c=1===A(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th"; +return a+c}}),Jb?module.exports=tb:"function"==typeof define&&define.amd?(define("moment",function(a,b,c){return c.config&&c.config()&&c.config().noGlobal===!0&&(xb.moment=ub),tb}),sb(!0)):sb()}).call(this); \ No newline at end of file diff --git a/static/js/plugins/iCheck/icheck.min.js b/static/js/plugins/iCheck/icheck.min.js new file mode 100644 index 000000000..9b826fb7e --- /dev/null +++ b/static/js/plugins/iCheck/icheck.min.js @@ -0,0 +1,11 @@ +/*! iCheck v1.0.2 by Damir Sultanov, http://git.io/arlzeA, MIT Licensed */ +(function(f){function A(a,b,d){var c=a[0],g=/er/.test(d)?_indeterminate:/bl/.test(d)?n:k,e=d==_update?{checked:c[k],disabled:c[n],indeterminate:"true"==a.attr(_indeterminate)||"false"==a.attr(_determinate)}:c[g];if(/^(ch|di|in)/.test(d)&&!e)x(a,g);else if(/^(un|en|de)/.test(d)&&e)q(a,g);else if(d==_update)for(var f in e)e[f]?x(a,f,!0):q(a,f,!0);else if(!b||"toggle"==d){if(!b)a[_callback]("ifClicked");e?c[_type]!==r&&q(a,g):x(a,g)}}function x(a,b,d){var c=a[0],g=a.parent(),e=b==k,u=b==_indeterminate, + v=b==n,s=u?_determinate:e?y:"enabled",F=l(a,s+t(c[_type])),B=l(a,b+t(c[_type]));if(!0!==c[b]){if(!d&&b==k&&c[_type]==r&&c.name){var w=a.closest("form"),p='input[name="'+c.name+'"]',p=w.length?w.find(p):f(p);p.each(function(){this!==c&&f(this).data(m)&&q(f(this),b)})}u?(c[b]=!0,c[k]&&q(a,k,"force")):(d||(c[b]=!0),e&&c[_indeterminate]&&q(a,_indeterminate,!1));D(a,e,b,d)}c[n]&&l(a,_cursor,!0)&&g.find("."+C).css(_cursor,"default");g[_add](B||l(a,b)||"");g.attr("role")&&!u&&g.attr("aria-"+(v?n:k),"true"); + g[_remove](F||l(a,s)||"")}function q(a,b,d){var c=a[0],g=a.parent(),e=b==k,f=b==_indeterminate,m=b==n,s=f?_determinate:e?y:"enabled",q=l(a,s+t(c[_type])),r=l(a,b+t(c[_type]));if(!1!==c[b]){if(f||!d||"force"==d)c[b]=!1;D(a,e,s,d)}!c[n]&&l(a,_cursor,!0)&&g.find("."+C).css(_cursor,"pointer");g[_remove](r||l(a,b)||"");g.attr("role")&&!f&&g.attr("aria-"+(m?n:k),"false");g[_add](q||l(a,s)||"")}function E(a,b){if(a.data(m)){a.parent().html(a.attr("style",a.data(m).s||""));if(b)a[_callback](b);a.off(".i").unwrap(); + f(_label+'[for="'+a[0].id+'"]').add(a.closest(_label)).off(".i")}}function l(a,b,f){if(a.data(m))return a.data(m).o[b+(f?"":"Class")]}function t(a){return a.charAt(0).toUpperCase()+a.slice(1)}function D(a,b,f,c){if(!c){if(b)a[_callback]("ifToggled");a[_callback]("ifChanged")[_callback]("if"+t(f))}}var m="iCheck",C=m+"-helper",r="radio",k="checked",y="un"+k,n="disabled";_determinate="determinate";_indeterminate="in"+_determinate;_update="update";_type="type";_click="click";_touch="touchbegin.i touchend.i"; + _add="addClass";_remove="removeClass";_callback="trigger";_label="label";_cursor="cursor";_mobile=/ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent);f.fn[m]=function(a,b){var d='input[type="checkbox"], input[type="'+r+'"]',c=f(),g=function(a){a.each(function(){var a=f(this);c=a.is(d)?c.add(a):c.add(a.find(d))})};if(/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(a))return a=a.toLowerCase(),g(this),c.each(function(){var c= + f(this);"destroy"==a?E(c,"ifDestroyed"):A(c,!0,a);f.isFunction(b)&&b()});if("object"!=typeof a&&a)return this;var e=f.extend({checkedClass:k,disabledClass:n,indeterminateClass:_indeterminate,labelHover:!0},a),l=e.handle,v=e.hoverClass||"hover",s=e.focusClass||"focus",t=e.activeClass||"active",B=!!e.labelHover,w=e.labelHoverClass||"hover",p=(""+e.increaseArea).replace("%","")|0;if("checkbox"==l||l==r)d='input[type="'+l+'"]';-50>p&&(p=-50);g(this);return c.each(function(){var a=f(this);E(a);var c=this, + b=c.id,g=-p+"%",d=100+2*p+"%",d={position:"absolute",top:g,left:g,display:"block",width:d,height:d,margin:0,padding:0,background:"#fff",border:0,opacity:0},g=_mobile?{position:"absolute",visibility:"hidden"}:p?d:{position:"absolute",opacity:0},l="checkbox"==c[_type]?e.checkboxClass||"icheckbox":e.radioClass||"i"+r,z=f(_label+'[for="'+b+'"]').add(a.closest(_label)),u=!!e.aria,y=m+"-"+Math.random().toString(36).substr(2,6),h='
")[_callback]("ifCreated").parent().append(e.insert);d=f('').css(d).appendTo(h);a.data(m,{o:e,s:a.attr("style")}).css(g);e.inheritClass&&h[_add](c.className||"");e.inheritID&&b&&h.attr("id",m+"-"+b);"static"==h.css("position")&&h.css("position","relative");A(a,!0,_update);if(z.length)z.on(_click+".i mouseover.i mouseout.i "+_touch,function(b){var d=b[_type],e=f(this);if(!c[n]){if(d==_click){if(f(b.target).is("a"))return; + A(a,!1,!0)}else B&&(/ut|nd/.test(d)?(h[_remove](v),e[_remove](w)):(h[_add](v),e[_add](w)));if(_mobile)b.stopPropagation();else return!1}});a.on(_click+".i focus.i blur.i keyup.i keydown.i keypress.i",function(b){var d=b[_type];b=b.keyCode;if(d==_click)return!1;if("keydown"==d&&32==b)return c[_type]==r&&c[k]||(c[k]?q(a,k):x(a,k)),!1;if("keyup"==d&&c[_type]==r)!c[k]&&x(a,k);else if(/us|ur/.test(d))h["blur"==d?_remove:_add](s)});d.on(_click+" mousedown mouseup mouseover mouseout "+_touch,function(b){var d= + b[_type],e=/wn|up/.test(d)?t:v;if(!c[n]){if(d==_click)A(a,!1,!0);else{if(/wn|er|in/.test(d))h[_add](e);else h[_remove](e+" "+t);if(z.length&&B&&e==v)z[/ut|nd/.test(d)?_remove:_add](w)}if(_mobile)b.stopPropagation();else return!1}})})}})(window.jQuery||window.Zepto); diff --git a/static/js/plugins/metisMenu/jquery.metisMenu.js b/static/js/plugins/metisMenu/jquery.metisMenu.js new file mode 100644 index 000000000..3c9499c50 --- /dev/null +++ b/static/js/plugins/metisMenu/jquery.metisMenu.js @@ -0,0 +1,120 @@ +/* + * metismenu - v1.1.3 + * Easy menu jQuery plugin for Twitter Bootstrap 3 + * https://github.com/onokumus/metisMenu + * + * Made by Osman Nuri Okumus + * Under MIT License + */ +;(function($, window, document, undefined) { + + var pluginName = "metisMenu", + defaults = { + toggle: true, + doubleTapToGo: false + }; + + function Plugin(element, options) { + this.element = $(element); + this.settings = $.extend({}, defaults, options); + this._defaults = defaults; + this._name = pluginName; + this.init(); + } + + Plugin.prototype = { + init: function() { + + var $this = this.element, + $toggle = this.settings.toggle, + obj = this; + + if (this.isIE() <= 9) { + $this.find("li.active").has("ul").children("ul").collapse("show"); + $this.find("li").not(".active").has("ul").children("ul").collapse("hide"); + } else { + $this.find("li.active").has("ul").children("ul").addClass("collapse in"); + $this.find("li").not(".active").has("ul").children("ul").addClass("collapse"); + } + + //add the "doubleTapToGo" class to active items if needed + if (obj.settings.doubleTapToGo) { + $this.find("li.active").has("ul").children("a").addClass("doubleTapToGo"); + } + + $this.find("li").has("ul").children("a").on("click" + "." + pluginName, function(e) { + e.preventDefault(); + + //Do we need to enable the double tap + if (obj.settings.doubleTapToGo) { + + //if we hit a second time on the link and the href is valid, navigate to that url + if (obj.doubleTapToGo($(this)) && $(this).attr("href") !== "#" && $(this).attr("href") !== "") { + e.stopPropagation(); + document.location = $(this).attr("href"); + return; + } + } + + $(this).parent("li").toggleClass("active").children("ul").collapse("toggle"); + + if ($toggle) { + $(this).parent("li").siblings().removeClass("active").children("ul.in").collapse("hide"); + } + + }); + }, + + isIE: function() { //https://gist.github.com/padolsey/527683 + var undef, + v = 3, + div = document.createElement("div"), + all = div.getElementsByTagName("i"); + + while ( + div.innerHTML = "", + all[0] + ) { + return v > 4 ? v : undef; + } + }, + + //Enable the link on the second click. + doubleTapToGo: function(elem) { + var $this = this.element; + + //if the class "doubleTapToGo" exists, remove it and return + if (elem.hasClass("doubleTapToGo")) { + elem.removeClass("doubleTapToGo"); + return true; + } + + //does not exists, add a new class and return false + if (elem.parent().children("ul").length) { + //first remove all other class + $this.find(".doubleTapToGo").removeClass("doubleTapToGo"); + //add the class on the current element + elem.addClass("doubleTapToGo"); + return false; + } + }, + + remove: function() { + this.element.off("." + pluginName); + this.element.removeData(pluginName); + } + + }; + + $.fn[pluginName] = function(options) { + this.each(function () { + var el = $(this); + if (el.data(pluginName)) { + el.data(pluginName).remove(); + } + el.data(pluginName, new Plugin(this, options)); + }); + return this; + }; + +})(jQuery, window, document); \ No newline at end of file diff --git a/static/js/plugins/pace/pace.min.js b/static/js/plugins/pace/pace.min.js new file mode 100644 index 000000000..9f7c7dc9b --- /dev/null +++ b/static/js/plugins/pace/pace.min.js @@ -0,0 +1,2 @@ +/*! pace 0.5.1 */ +(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W=[].slice,X={}.hasOwnProperty,Y=function(a,b){function c(){this.constructor=a}for(var d in b)X.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},Z=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};for(t={catchupTime:500,initialRate:.03,minTime:500,ghostTime:500,maxProgressPerFrame:10,easeFactor:1.25,startOnPageLoad:!0,restartOnPushState:!0,restartOnRequestAfter:500,target:"body",elements:{checkInterval:100,selectors:["body"]},eventLag:{minSamples:10,sampleCount:3,lagThreshold:3},ajax:{trackMethods:["GET"],trackWebSockets:!0,ignoreURLs:[]}},B=function(){var a;return null!=(a="undefined"!=typeof performance&&null!==performance?"function"==typeof performance.now?performance.now():void 0:void 0)?a:+new Date},D=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,s=window.cancelAnimationFrame||window.mozCancelAnimationFrame,null==D&&(D=function(a){return setTimeout(a,50)},s=function(a){return clearTimeout(a)}),F=function(a){var b,c;return b=B(),(c=function(){var d;return d=B()-b,d>=33?(b=B(),a(d,function(){return D(c)})):setTimeout(c,33-d)})()},E=function(){var a,b,c;return c=arguments[0],b=arguments[1],a=3<=arguments.length?W.call(arguments,2):[],"function"==typeof c[b]?c[b].apply(c,a):c[b]},u=function(){var a,b,c,d,e,f,g;for(b=arguments[0],d=2<=arguments.length?W.call(arguments,1):[],f=0,g=d.length;g>f;f++)if(c=d[f])for(a in c)X.call(c,a)&&(e=c[a],null!=b[a]&&"object"==typeof b[a]&&null!=e&&"object"==typeof e?u(b[a],e):b[a]=e);return b},p=function(a){var b,c,d,e,f;for(c=b=0,e=0,f=a.length;f>e;e++)d=a[e],c+=Math.abs(d),b++;return c/b},w=function(a,b){var c,d,e;if(null==a&&(a="options"),null==b&&(b=!0),e=document.querySelector("[data-pace-"+a+"]")){if(c=e.getAttribute("data-pace-"+a),!b)return c;try{return JSON.parse(c)}catch(f){return d=f,"undefined"!=typeof console&&null!==console?console.error("Error parsing inline pace options",d):void 0}}},g=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];cP;P++)J=T[P],C[J]===!0&&(C[J]=t[J]);i=function(a){function b(){return U=b.__super__.constructor.apply(this,arguments)}return Y(b,a),b}(Error),b=function(){function a(){this.progress=0}return a.prototype.getElement=function(){var a;if(null==this.el){if(a=document.querySelector(C.target),!a)throw new i;this.el=document.createElement("div"),this.el.className="pace pace-active",document.body.className=document.body.className.replace(/pace-done/g,""),document.body.className+=" pace-running",this.el.innerHTML='
\n
\n
\n
',null!=a.firstChild?a.insertBefore(this.el,a.firstChild):a.appendChild(this.el)}return this.el},a.prototype.finish=function(){var a;return a=this.getElement(),a.className=a.className.replace("pace-active",""),a.className+=" pace-inactive",document.body.className=document.body.className.replace("pace-running",""),document.body.className+=" pace-done"},a.prototype.update=function(a){return this.progress=a,this.render()},a.prototype.destroy=function(){try{this.getElement().parentNode.removeChild(this.getElement())}catch(a){i=a}return this.el=void 0},a.prototype.render=function(){var a,b;return null==document.querySelector(C.target)?!1:(a=this.getElement(),a.children[0].style.width=""+this.progress+"%",(!this.lastRenderedProgress||this.lastRenderedProgress|0!==this.progress|0)&&(a.children[0].setAttribute("data-progress-text",""+(0|this.progress)+"%"),this.progress>=100?b="99":(b=this.progress<10?"0":"",b+=0|this.progress),a.children[0].setAttribute("data-progress",""+b)),this.lastRenderedProgress=this.progress)},a.prototype.done=function(){return this.progress>=100},a}(),h=function(){function a(){this.bindings={}}return a.prototype.trigger=function(a,b){var c,d,e,f,g;if(null!=this.bindings[a]){for(f=this.bindings[a],g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(c.call(this,b));return g}},a.prototype.on=function(a,b){var c;return null==(c=this.bindings)[a]&&(c[a]=[]),this.bindings[a].push(b)},a}(),O=window.XMLHttpRequest,N=window.XDomainRequest,M=window.WebSocket,v=function(a,b){var c,d,e,f;f=[];for(d in b.prototype)try{e=b.prototype[d],null==a[d]&&"function"!=typeof e?f.push(a[d]=e):f.push(void 0)}catch(g){c=g}return f},z=[],Pace.ignore=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?W.call(arguments,1):[],z.unshift("ignore"),c=b.apply(null,a),z.shift(),c},Pace.track=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?W.call(arguments,1):[],z.unshift("track"),c=b.apply(null,a),z.shift(),c},I=function(a){var b;if(null==a&&(a="GET"),"track"===z[0])return"force";if(!z.length&&C.ajax){if("socket"===a&&C.ajax.trackWebSockets)return!0;if(b=a.toUpperCase(),Z.call(C.ajax.trackMethods,b)>=0)return!0}return!1},j=function(a){function b(){var a,c=this;b.__super__.constructor.apply(this,arguments),a=function(a){var b;return b=a.open,a.open=function(d,e){return I(d)&&c.trigger("request",{type:d,url:e,request:a}),b.apply(a,arguments)}},window.XMLHttpRequest=function(b){var c;return c=new O(b),a(c),c},v(window.XMLHttpRequest,O),null!=N&&(window.XDomainRequest=function(){var b;return b=new N,a(b),b},v(window.XDomainRequest,N)),null!=M&&C.ajax.trackWebSockets&&(window.WebSocket=function(a,b){var d;return d=null!=b?new M(a,b):new M(a),I("socket")&&c.trigger("request",{type:"socket",url:a,protocols:b,request:d}),d},v(window.WebSocket,M))}return Y(b,a),b}(h),Q=null,x=function(){return null==Q&&(Q=new j),Q},H=function(a){var b,c,d,e;for(e=C.ajax.ignoreURLs,c=0,d=e.length;d>c;c++)if(b=e[c],"string"==typeof b){if(-1!==a.indexOf(b))return!0}else if(b.test(a))return!0;return!1},x().on("request",function(b){var c,d,e,f,g;return f=b.type,e=b.request,g=b.url,H(g)?void 0:Pace.running||C.restartOnRequestAfter===!1&&"force"!==I(f)?void 0:(d=arguments,c=C.restartOnRequestAfter||0,"boolean"==typeof c&&(c=0),setTimeout(function(){var b,c,g,h,i,j;if(b="socket"===f?e.readyState<2:0<(h=e.readyState)&&4>h){for(Pace.restart(),i=Pace.sources,j=[],c=0,g=i.length;g>c;c++){if(J=i[c],J instanceof a){J.watch.apply(J,d);break}j.push(void 0)}return j}},c))}),a=function(){function a(){var a=this;this.elements=[],x().on("request",function(){return a.watch.apply(a,arguments)})}return a.prototype.watch=function(a){var b,c,d,e;return d=a.type,b=a.request,e=a.url,H(e)?void 0:(c="socket"===d?new m(b):new n(b),this.elements.push(c))},a}(),n=function(){function a(a){var b,c,d,e,f,g,h=this;if(this.progress=0,null!=window.ProgressEvent)for(c=null,a.addEventListener("progress",function(a){return h.progress=a.lengthComputable?100*a.loaded/a.total:h.progress+(100-h.progress)/2}),g=["load","abort","timeout","error"],d=0,e=g.length;e>d;d++)b=g[d],a.addEventListener(b,function(){return h.progress=100});else f=a.onreadystatechange,a.onreadystatechange=function(){var b;return 0===(b=a.readyState)||4===b?h.progress=100:3===a.readyState&&(h.progress=50),"function"==typeof f?f.apply(null,arguments):void 0}}return a}(),m=function(){function a(a){var b,c,d,e,f=this;for(this.progress=0,e=["error","open"],c=0,d=e.length;d>c;c++)b=e[c],a.addEventListener(b,function(){return f.progress=100})}return a}(),d=function(){function a(a){var b,c,d,f;for(null==a&&(a={}),this.elements=[],null==a.selectors&&(a.selectors=[]),f=a.selectors,c=0,d=f.length;d>c;c++)b=f[c],this.elements.push(new e(b))}return a}(),e=function(){function a(a){this.selector=a,this.progress=0,this.check()}return a.prototype.check=function(){var a=this;return document.querySelector(this.selector)?this.done():setTimeout(function(){return a.check()},C.elements.checkInterval)},a.prototype.done=function(){return this.progress=100},a}(),c=function(){function a(){var a,b,c=this;this.progress=null!=(b=this.states[document.readyState])?b:100,a=document.onreadystatechange,document.onreadystatechange=function(){return null!=c.states[document.readyState]&&(c.progress=c.states[document.readyState]),"function"==typeof a?a.apply(null,arguments):void 0}}return a.prototype.states={loading:0,interactive:50,complete:100},a}(),f=function(){function a(){var a,b,c,d,e,f=this;this.progress=0,a=0,e=[],d=0,c=B(),b=setInterval(function(){var g;return g=B()-c-50,c=B(),e.push(g),e.length>C.eventLag.sampleCount&&e.shift(),a=p(e),++d>=C.eventLag.minSamples&&a=100&&(this.done=!0),b===this.last?this.sinceLastUpdate+=a:(this.sinceLastUpdate&&(this.rate=(b-this.last)/this.sinceLastUpdate),this.catchup=(b-this.progress)/C.catchupTime,this.sinceLastUpdate=0,this.last=b),b>this.progress&&(this.progress+=this.catchup*a),c=1-Math.pow(this.progress/100,C.easeFactor),this.progress+=c*this.rate*a,this.progress=Math.min(this.lastProgress+C.maxProgressPerFrame,this.progress),this.progress=Math.max(0,this.progress),this.progress=Math.min(100,this.progress),this.lastProgress=this.progress,this.progress},a}(),K=null,G=null,q=null,L=null,o=null,r=null,Pace.running=!1,y=function(){return C.restartOnPushState?Pace.restart():void 0},null!=window.history.pushState&&(S=window.history.pushState,window.history.pushState=function(){return y(),S.apply(window.history,arguments)}),null!=window.history.replaceState&&(V=window.history.replaceState,window.history.replaceState=function(){return y(),V.apply(window.history,arguments)}),k={ajax:a,elements:d,document:c,eventLag:f},(A=function(){var a,c,d,e,f,g,h,i;for(Pace.sources=K=[],g=["ajax","elements","document","eventLag"],c=0,e=g.length;e>c;c++)a=g[c],C[a]!==!1&&K.push(new k[a](C[a]));for(i=null!=(h=C.extraSources)?h:[],d=0,f=i.length;f>d;d++)J=i[d],K.push(new J(C));return Pace.bar=q=new b,G=[],L=new l})(),Pace.stop=function(){return Pace.trigger("stop"),Pace.running=!1,q.destroy(),r=!0,null!=o&&("function"==typeof s&&s(o),o=null),A()},Pace.restart=function(){return Pace.trigger("restart"),Pace.stop(),Pace.start()},Pace.go=function(){var a;return Pace.running=!0,q.render(),a=B(),r=!1,o=F(function(b,c){var d,e,f,g,h,i,j,k,m,n,o,p,s,t,u,v;for(k=100-q.progress,e=o=0,f=!0,i=p=0,t=K.length;t>p;i=++p)for(J=K[i],n=null!=G[i]?G[i]:G[i]=[],h=null!=(v=J.elements)?v:[J],j=s=0,u=h.length;u>s;j=++s)g=h[j],m=null!=n[j]?n[j]:n[j]=new l(g),f&=m.done,m.done||(e++,o+=m.tick(b));return d=o/e,q.update(L.tick(b,d)),q.done()||f||r?(q.update(100),Pace.trigger("done"),setTimeout(function(){return q.finish(),Pace.running=!1,Pace.trigger("hide")},Math.max(C.ghostTime,Math.max(C.minTime-(B()-a),0)))):c()})},Pace.start=function(a){u(C,a),Pace.running=!0;try{q.render()}catch(b){i=b}return document.querySelector(".pace")?(Pace.trigger("start"),Pace.go()):setTimeout(Pace.start,50)},"function"==typeof define&&define.amd?define(function(){return Pace}):"object"==typeof exports?module.exports=Pace:C.startOnPageLoad&&Pace.start()}).call(this); \ No newline at end of file diff --git a/static/js/plugins/peity/jquery.peity.min.js b/static/js/plugins/peity/jquery.peity.min.js new file mode 100644 index 000000000..085b72507 --- /dev/null +++ b/static/js/plugins/peity/jquery.peity.min.js @@ -0,0 +1,13 @@ +// Peity jQuery plugin version 2.0.3 +// (c) 2014 Ben Pickles +// +// http://benpickles.github.io/peity +// +// Released under MIT license. +(function(e,q,h){var o=function(a,b){var c=q.createElementNS("http://www.w3.org/2000/svg",a);e.each(b,function(a,b){c.setAttribute(a,b)});return c},t="createElementNS"in q&&o("svg",{}).createSVGRect,r=1/(window.devicePixelRatio||1),j=e.fn.peity=function(a,b){t&&this.each(function(){var c=e(this),d=c.data("peity");if(d)a&&(d.type=a),e.extend(d.opts,b);else{var f=j.defaults[a],g={};e.each(c.data(),function(a,b){a in f&&(g[a]=b)});var h=e.extend({},f,g,b),d=new s(c,a,h);c.change(function(){d.draw()}).data("peity", + d)}d.draw()});return this},s=function(a,b,c){this.$el=a;this.type=b;this.opts=c},m=s.prototype;m.draw=function(){j.graphers[this.type].call(this,this.opts)};m.fill=function(){var a=this.opts.fill,b=a;e.isFunction(b)||(b=function(b,d){return a[d%a.length]});return b};m.prepare=function(a,b){var c;this.svg?c=e(this.svg).empty():(this.svg=o("svg",{"class":"peity"}),this.$el.hide().after(this.svg),c=e(this.svg).data("peity",this));this.svg.setAttribute("height",b);this.svg.setAttribute("width",a);return c}; + m.values=function(){return e.map(this.$el.text().split(this.opts.delimiter),function(a){return parseFloat(a)})};j.defaults={};j.graphers={};j.register=function(a,b,c){this.defaults[a]=b;this.graphers[a]=c};j.register("pie",{delimiter:null,diameter:16,fill:["#ff9900","#fff4dd","#ffc66e"]},function(a){if(!a.delimiter){var b=this.$el.text().match(/[^0-9\.]/);a.delimiter=b?b[0]:","}b=this.values();if("/"==a.delimiter)var c=b[0],b=[c,h.max(0,b[1]-c)];for(var d=0,c=b.length,f=0;de?1:0,1,q,r,"Z"].join(" ")});i=l}k.setAttribute("fill",j.call(this,n,d,b));this.svg.appendChild(k)}}});j.register("line",{delimiter:",",fill:"#c6d9fd",height:16,max:null, + min:0,stroke:"#4d89f9",strokeWidth:1,width:32},function(a){var b=this.values();1==b.length&&b.push(b[0]);for(var c=h.max.apply(h,b.concat([a.max])),d=h.min.apply(h,b.concat([a.min])),f=this.prepare(a.width,a.height),g=f.width(),f=f.height()-a.strokeWidth,e=g/(b.length-1),c=c-d,j=0==c?f:f/c,m=f+d*j,c=[0,m],i=0;i=d&&0k&&(l+=k,k=-k);n=o("rect",{fill:m.call(this,n,i,b),x:i*g,y:l,width:g-a,height:k});this.svg.appendChild(n)}})})(jQuery,document,Math); diff --git a/static/js/plugins/slimscroll/jquery.slimscroll.js b/static/js/plugins/slimscroll/jquery.slimscroll.js new file mode 100644 index 000000000..2ea5b0801 --- /dev/null +++ b/static/js/plugins/slimscroll/jquery.slimscroll.js @@ -0,0 +1,464 @@ +/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la) + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * + * Version: 1.3.0 + * + */ +(function($) { + + jQuery.fn.extend({ + slimScroll: function(options) { + + var defaults = { + + // width in pixels of the visible scroll area + width : 'auto', + + // height in pixels of the visible scroll area + height : '250px', + + // width in pixels of the scrollbar and rail + size : '7px', + + // scrollbar color, accepts any hex/color value + color: '#000', + + // scrollbar position - left/right + position : 'right', + + // distance in pixels between the side edge and the scrollbar + distance : '1px', + + // default scroll position on load - top / bottom / $('selector') + start : 'top', + + // sets scrollbar opacity + opacity : .4, + + // enables always-on mode for the scrollbar + alwaysVisible : false, + + // check if we should hide the scrollbar when user is hovering over + disableFadeOut : false, + + // sets visibility of the rail + railVisible : false, + + // sets rail color + railColor : '#333', + + // sets rail opacity + railOpacity : .2, + + // whether we should use jQuery UI Draggable to enable bar dragging + railDraggable : true, + + // defautlt CSS class of the slimscroll rail + railClass : 'slimScrollRail', + + // defautlt CSS class of the slimscroll bar + barClass : 'slimScrollBar', + + // defautlt CSS class of the slimscroll wrapper + wrapperClass : 'slimScrollDiv', + + // check if mousewheel should scroll the window if we reach top/bottom + allowPageScroll : false, + + // scroll amount applied to each mouse wheel step + wheelStep : 20, + + // scroll amount applied when user is using gestures + touchScrollStep : 200, + + // sets border radius + borderRadius: '7px', + + // sets border radius of the rail + railBorderRadius : '7px' + }; + + var o = $.extend(defaults, options); + + // do it for every element that matches selector + this.each(function(){ + + var isOverPanel, isOverBar, isDragg, queueHide, touchDif, + barHeight, percentScroll, lastScroll, + divS = '
', + minBarHeight = 30, + releaseScroll = false; + + // used in event handlers and for better minification + var me = $(this); + + // ensure we are not binding it again + if (me.parent().hasClass(o.wrapperClass)) + { + // start from last bar position + var offset = me.scrollTop(); + + // find bar and rail + bar = me.parent().find('.' + o.barClass); + rail = me.parent().find('.' + o.railClass); + + getBarHeight(); + + // check if we should scroll existing instance + if ($.isPlainObject(options)) + { + // Pass height: auto to an existing slimscroll object to force a resize after contents have changed + if ( 'height' in options && options.height == 'auto' ) { + me.parent().css('height', 'auto'); + me.css('height', 'auto'); + var height = me.parent().parent().height(); + me.parent().css('height', height); + me.css('height', height); + } + + if ('scrollTo' in options) + { + // jump to a static point + offset = parseInt(o.scrollTo); + } + else if ('scrollBy' in options) + { + // jump by value pixels + offset += parseInt(o.scrollBy); + } + else if ('destroy' in options) + { + // remove slimscroll elements + bar.remove(); + rail.remove(); + me.unwrap(); + return; + } + + // scroll content by the given offset + scrollContent(offset, false, true); + } + + return; + } + + // optionally set height to the parent's height + o.height = (o.height == 'auto') ? me.parent().height() : o.height; + + // wrap content + var wrapper = $(divS) + .addClass(o.wrapperClass) + .css({ + position: 'relative', + overflow: 'hidden', + width: o.width, + height: o.height + }); + + // update style for the div + me.css({ + overflow: 'hidden', + width: o.width, + height: o.height + }); + + // create scrollbar rail + var rail = $(divS) + .addClass(o.railClass) + .css({ + width: o.size, + height: '100%', + position: 'absolute', + top: 0, + display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none', + 'border-radius': o.railBorderRadius, + background: o.railColor, + opacity: o.railOpacity, + zIndex: 90 + }); + + // create scrollbar + var bar = $(divS) + .addClass(o.barClass) + .css({ + background: o.color, + width: o.size, + position: 'absolute', + top: 0, + opacity: o.opacity, + display: o.alwaysVisible ? 'block' : 'none', + 'border-radius' : o.borderRadius, + BorderRadius: o.borderRadius, + MozBorderRadius: o.borderRadius, + WebkitBorderRadius: o.borderRadius, + zIndex: 99 + }); + + // set position + var posCss = (o.position == 'right') ? { right: o.distance } : { left: o.distance }; + rail.css(posCss); + bar.css(posCss); + + // wrap it + me.wrap(wrapper); + + // append to parent div + me.parent().append(bar); + me.parent().append(rail); + + // make it draggable and no longer dependent on the jqueryUI + if (o.railDraggable){ + bar.bind("mousedown", function(e) { + var $doc = $(document); + isDragg = true; + t = parseFloat(bar.css('top')); + pageY = e.pageY; + + $doc.bind("mousemove.slimscroll", function(e){ + currTop = t + e.pageY - pageY; + bar.css('top', currTop); + scrollContent(0, bar.position().top, false);// scroll content + }); + + $doc.bind("mouseup.slimscroll", function(e) { + isDragg = false;hideBar(); + $doc.unbind('.slimscroll'); + }); + return false; + }).bind("selectstart.slimscroll", function(e){ + e.stopPropagation(); + e.preventDefault(); + return false; + }); + } + + // on rail over + rail.hover(function(){ + showBar(); + }, function(){ + hideBar(); + }); + + // on bar over + bar.hover(function(){ + isOverBar = true; + }, function(){ + isOverBar = false; + }); + + // show on parent mouseover + me.hover(function(){ + isOverPanel = true; + showBar(); + hideBar(); + }, function(){ + isOverPanel = false; + hideBar(); + }); + + // support for mobile + me.bind('touchstart', function(e,b){ + if (e.originalEvent.touches.length) + { + // record where touch started + touchDif = e.originalEvent.touches[0].pageY; + } + }); + + me.bind('touchmove', function(e){ + // prevent scrolling the page if necessary + if(!releaseScroll) + { + e.originalEvent.preventDefault(); + } + if (e.originalEvent.touches.length) + { + // see how far user swiped + var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep; + // scroll content + scrollContent(diff, true); + touchDif = e.originalEvent.touches[0].pageY; + } + }); + + // set up initial height + getBarHeight(); + + // check start position + if (o.start === 'bottom') + { + // scroll content to bottom + bar.css({ top: me.outerHeight() - bar.outerHeight() }); + scrollContent(0, true); + } + else if (o.start !== 'top') + { + // assume jQuery selector + scrollContent($(o.start).position().top, null, true); + + // make sure bar stays hidden + if (!o.alwaysVisible) { bar.hide(); } + } + + // attach scroll events + attachWheel(); + + function _onWheel(e) + { + // use mouse wheel only when mouse is over + if (!isOverPanel) { return; } + + var e = e || window.event; + + var delta = 0; + if (e.wheelDelta) { delta = -e.wheelDelta/120; } + if (e.detail) { delta = e.detail / 3; } + + var target = e.target || e.srcTarget || e.srcElement; + if ($(target).closest('.' + o.wrapperClass).is(me.parent())) { + // scroll content + scrollContent(delta, true); + } + + // stop window scroll + if (e.preventDefault && !releaseScroll) { e.preventDefault(); } + if (!releaseScroll) { e.returnValue = false; } + } + + function scrollContent(y, isWheel, isJump) + { + releaseScroll = false; + var delta = y; + var maxTop = me.outerHeight() - bar.outerHeight(); + + if (isWheel) + { + // move bar with mouse wheel + delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight(); + + // move bar, make sure it doesn't go out + delta = Math.min(Math.max(delta, 0), maxTop); + + // if scrolling down, make sure a fractional change to the + // scroll position isn't rounded away when the scrollbar's CSS is set + // this flooring of delta would happened automatically when + // bar.css is set below, but we floor here for clarity + delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta); + + // scroll the scrollbar + bar.css({ top: delta + 'px' }); + } + + // calculate actual scroll amount + percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight()); + delta = percentScroll * (me[0].scrollHeight - me.outerHeight()); + + if (isJump) + { + delta = y; + var offsetTop = delta / me[0].scrollHeight * me.outerHeight(); + offsetTop = Math.min(Math.max(offsetTop, 0), maxTop); + bar.css({ top: offsetTop + 'px' }); + } + + // scroll content + me.scrollTop(delta); + + // fire scrolling event + me.trigger('slimscrolling', ~~delta); + + // ensure bar is visible + showBar(); + + // trigger hide when scroll is stopped + hideBar(); + } + + function attachWheel() + { + if (window.addEventListener) + { + this.addEventListener('DOMMouseScroll', _onWheel, false ); + this.addEventListener('mousewheel', _onWheel, false ); + this.addEventListener('MozMousePixelScroll', _onWheel, false ); + } + else + { + document.attachEvent("onmousewheel", _onWheel) + } + } + + function getBarHeight() + { + // calculate scrollbar height and make sure it is not too small + barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight); + bar.css({ height: barHeight + 'px' }); + + // hide scrollbar if content is not long enough + var display = barHeight == me.outerHeight() ? 'none' : 'block'; + bar.css({ display: display }); + } + + function showBar() + { + // recalculate bar height + getBarHeight(); + clearTimeout(queueHide); + + // when bar reached top or bottom + if (percentScroll == ~~percentScroll) + { + //release wheel + releaseScroll = o.allowPageScroll; + + // publish approporiate event + if (lastScroll != percentScroll) + { + var msg = (~~percentScroll == 0) ? 'top' : 'bottom'; + me.trigger('slimscroll', msg); + } + } + else + { + releaseScroll = false; + } + lastScroll = percentScroll; + + // show only when required + if(barHeight >= me.outerHeight()) { + //allow window scroll + releaseScroll = true; + return; + } + bar.stop(true,true).fadeIn('fast'); + if (o.railVisible) { rail.stop(true,true).fadeIn('fast'); } + } + + function hideBar() + { + // only hide when options allow it + if (!o.alwaysVisible) + { + queueHide = setTimeout(function(){ + if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg) + { + bar.fadeOut('slow'); + rail.fadeOut('slow'); + } + }, 1000); + } + } + + }); + + // maintain chainability + return this; + } + }); + + jQuery.fn.extend({ + slimscroll: jQuery.fn.slimScroll + }); + +})(jQuery); diff --git a/static/js/plugins/slimscroll/jquery.slimscroll.min.js b/static/js/plugins/slimscroll/jquery.slimscroll.min.js new file mode 100644 index 000000000..26220d6b2 --- /dev/null +++ b/static/js/plugins/slimscroll/jquery.slimscroll.min.js @@ -0,0 +1,16 @@ +/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la) + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * + * Version: 1.3.0 + * + */ +(function(f){jQuery.fn.extend({slimScroll:function(h){var a=f.extend({width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:0.2,railDraggable:!0,railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,wheelStep:20,touchScrollStep:200,borderRadius:"7px",railBorderRadius:"7px"},h);this.each(function(){function r(d){if(s){d=d|| +window.event;var c=0;d.wheelDelta&&(c=-d.wheelDelta/120);d.detail&&(c=d.detail/3);f(d.target||d.srcTarget||d.srcElement).closest("."+a.wrapperClass).is(b.parent())&&m(c,!0);d.preventDefault&&!k&&d.preventDefault();k||(d.returnValue=!1)}}function m(d,f,h){k=!1;var e=d,g=b.outerHeight()-c.outerHeight();f&&(e=parseInt(c.css("top"))+d*parseInt(a.wheelStep)/100*c.outerHeight(),e=Math.min(Math.max(e,0),g),e=0=b.outerHeight()?k=!0:(c.stop(!0,!0).fadeIn("fast"),a.railVisible&&g.stop(!0,!0).fadeIn("fast"))}function p(){a.alwaysVisible||(A=setTimeout(function(){a.disableFadeOut&&s||(x||y)||(c.fadeOut("slow"),g.fadeOut("slow"))},1E3))}var s,x,y,A,z,u,l,B,D=30,k=!1,b=f(this);if(b.parent().hasClass(a.wrapperClass)){var n=b.scrollTop(), +c=b.parent().find("."+a.barClass),g=b.parent().find("."+a.railClass);w();if(f.isPlainObject(h)){if("height"in h&&"auto"==h.height){b.parent().css("height","auto");b.css("height","auto");var q=b.parent().parent().height();b.parent().css("height",q);b.css("height",q)}if("scrollTo"in h)n=parseInt(a.scrollTo);else if("scrollBy"in h)n+=parseInt(a.scrollBy);else if("destroy"in h){c.remove();g.remove();b.unwrap();return}m(n,!1,!0)}}else{a.height="auto"==a.height?b.parent().height():a.height;n=f("
").addClass(a.wrapperClass).css({position:"relative", +overflow:"hidden",width:a.width,height:a.height});b.css({overflow:"hidden",width:a.width,height:a.height});var g=f("
").addClass(a.railClass).css({width:a.size,height:"100%",position:"absolute",top:0,display:a.alwaysVisible&&a.railVisible?"block":"none","border-radius":a.railBorderRadius,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=f("
").addClass(a.barClass).css({background:a.color,width:a.size,position:"absolute",top:0,opacity:a.opacity,display:a.alwaysVisible? +"block":"none","border-radius":a.borderRadius,BorderRadius:a.borderRadius,MozBorderRadius:a.borderRadius,WebkitBorderRadius:a.borderRadius,zIndex:99}),q="right"==a.position?{right:a.distance}:{left:a.distance};g.css(q);c.css(q);b.wrap(n);b.parent().append(c);b.parent().append(g);a.railDraggable&&c.bind("mousedown",function(a){var b=f(document);y=!0;t=parseFloat(c.css("top"));pageY=a.pageY;b.bind("mousemove.slimscroll",function(a){currTop=t+a.pageY-pageY;c.css("top",currTop);m(0,c.position().top,!1)}); +b.bind("mouseup.slimscroll",function(a){y=!1;p();b.unbind(".slimscroll")});return!1}).bind("selectstart.slimscroll",function(a){a.stopPropagation();a.preventDefault();return!1});g.hover(function(){v()},function(){p()});c.hover(function(){x=!0},function(){x=!1});b.hover(function(){s=!0;v();p()},function(){s=!1;p()});b.bind("touchstart",function(a,b){a.originalEvent.touches.length&&(z=a.originalEvent.touches[0].pageY)});b.bind("touchmove",function(b){k||b.originalEvent.preventDefault();b.originalEvent.touches.length&& +(m((z-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0),z=b.originalEvent.touches[0].pageY)});w();"bottom"===a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),m(0,!0)):"top"!==a.start&&(m(f(a.start).position().top,null,!0),a.alwaysVisible||c.hide());C()}});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery); \ No newline at end of file diff --git a/static/js/validator/images/loading.gif b/static/js/validator/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e5bace6e654c094f212632e8692e78c55ba3119 GIT binary patch literal 457 zcmZ?wbhEHb|By@uyNTm~>u{Lk&@8WQa67~pE8XTZz| z6jc1l!phFT%Af;M0MgFDtR1n7;rE7vqD_-hd&1XVkxtjWm15_l{x`66)s*<;& zIqgd8kM9qDI}uGk4+95Kzf{C7!QW>b6+?mvNj_N;l!eUOQPRYGhrlUC+cJ5Gf0Obl#L*GNa~ zva;*3mB?mn;M`ci=eV&jJgnhV*urUtjF8kbz|~7}a9zFEz1K6FBcG>yqd@C6(eTfv zQl(*PFTk$nLguXo?en0eC1jXueEIkY6wZ z&;ndwW%=4bpgPV1kH}&M2Cg|E%=qQfeIc-B*NBqf{Irtt#G+IN$CUh}R0X%pqSW&I zqU>S?=U}rJdp7j|)y?*FaSXBOy&7~{=#T=BPqw^PMyptq`Tzg(Clv)OlRI> zvdo;Nqps_9Z0VYZ3YrDM-)?g*_G*}!zQ}UvqPw~hA%9ZNzKP*_xcT<_9WQ>|wCPvO z_->K2AV!Z literal 0 HcmV?d00001 diff --git a/static/js/validator/images/validator_simple.png b/static/js/validator/images/validator_simple.png new file mode 100644 index 0000000000000000000000000000000000000000..2470db588f40f6834e7573d4187b51067fa56b76 GIT binary patch literal 1075 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!3-oPT6RhUDdu7)&kzm{j@u9YA22X5ZVT`U zasB`Q|EJ%NzJLGz<;SOwUw-_3`||0Vx7R-}e*XOJz1KJHzPfSkd-mn8l~+D4xbQ9W z@69uRuAR7c_todgtr#eUB&Xcw@Blox;|a0Vl6K z*!)uW)P)Bdp1ZGq#rNaTwlyy~S3YsvcmC|sC(6s7vi;bz=I8FEOP(?>exSbafz-S^ zwzKam9X@dG`_{$3HqTmiwsYnU+u8RRrrhKBv3_dTRhNl3#3tWl=)I==V)de)s|;P2 zMZ2%CbzT&2zrxvg!Qk=o1-)lAo6alMoztv8V>WqTee*f7y3b+@7d)tutxgj=vo%ZLtsJKlmk?U9^*D-&n40}}>{kk;lQEAfJ>gJ~f!5_1IZso?j z%y7Mt8T=x_+SKj zS>x+@*46NulkyICn+x_DTb)fWTgxA@)!J*SazR| zDNig)WpGT%PfAsA%PdMQ&o9a@R&WkBd$DIz4={21dAc};So9_*EZ_?0)6zP-EwSnI z&D67RzAl;3dG(ysopGP zE?ly3-Qx#m-RAuM%PJue^hrX(%PJ|dp(ZZUPEs^CSi5>7L$X*BkB5m#7u&_NUuCx{ zsITby-0 zH)mXOFfeX*BjXbLE4sZJ%%6-mOGw<>Eg|trYqz76&zI7*5)Qv=_dMz}Ix?S1#~ok3r0`oNeKj`N qP{6^&$j+^2XXwVjXlM79f#D;Yo5||O`#6Cyz~JfX=d#Wzp$Pz$`cQ@d literal 0 HcmV?d00001 diff --git a/static/js/validator/jquery.validator.js b/static/js/validator/jquery.validator.js new file mode 100644 index 000000000..20a83dc9e --- /dev/null +++ b/static/js/validator/jquery.validator.js @@ -0,0 +1,5 @@ +/*! nice Validator 0.7.3 + * (c) 2012-2014 Jony Zhang , MIT Licensed + * http://niceue.com/validator/ + */ +!function(e,t){"use strict";function i(n,s){var r=this;return!r instanceof i?new i(n,s):(r.$el=e(n),r._init(n,s),t)}function n(e,t){var i=t?t===!0?this:t:n.prototype;if(z(e))for(var s in e)i[s]=r(e[s])}function s(e,t){var i=t?t===!0?this:t:s.prototype;if(z(e))for(var n in e){if(!e[n])return;i[n]=e[n]}}function r(t){switch(e.type(t)){case"function":return t;case"array":return function(e){return t[0].test(e.value)||t[1]||!1};case"regexp":return function(e){return t.test(e.value)}}}function a(t){var i="";return e.map(t.split(" "),function(e){i+=","+("#"===e.charAt(0)?e:'[name="'+e+'"]')}),i.substring(1)}function l(t){var i;if(t&&t.tagName){switch(t.tagName){case"INPUT":case"SELECT":case"TEXTAREA":case"BUTTON":case"FIELDSET":i=t.form||e(t).closest("."+k);break;case"FORM":i=t;break;default:i=e(t).closest("."+k)}return e(i).data(h)||e(i)[h]().data(h)}}function u(e){var t,i=e.currentTarget;i.form&&null===K(i.form,q)&&(t=l(i),t?(t._parse(i),t["_"+e.type](e)):K(i,V,null))}function o(i,n){var s=e.trim(K(i,V+"-"+n));if(s)return s=Function("return "+s)(),s?r(s):t}function d(e,t,i,n){var s=t.msg,r=t._r;return z(s)&&(s=s[r]),Q(s)||(s=K(e,A+"-"+r)||K(e,A)||i||(n?Q(n)?n:n[r]:"")),s}function c(e){var t;return e&&(t=H.exec(e)),t?t[1]:""}function f(e){return"INPUT"===e.tagName&&"checkbox"===e.type||"radio"===e.type}function g(e){return Date.parse(e.replace(/\.|\-/g,"/"))}var p,m,h="validator",v="."+h,y=".rule",_=".field",b=".form",k="nice-"+h,w="n-ok",M="n-error",O="n-tip",$="n-loading",x="msg-box",C="aria-required",F="aria-invalid",V="data-rule",A="data-msg",R="data-tip",T="data-ok",S="data-target",E="data-inputstatus",q="novalidate",N=":verifiable",j=/(!?)\s?(\w+)(?:\[\s*(.*?\]?)\s*\]|\(\s*(.*?\)?)\s*\))?\s*(;|\||&)?/g,D=/(\w+)(?:\[\s*(.*?\]?)\s*\]|\(\s*(.*?\)?)\s*\))?/,I=/(?:([^:;\(\[]*):)?(.*)/,U=/[^\x00-\xff]/g,H=/^.*(top|right|bottom|left).*$/,L=/(?:(post|get):)?(.+)/i,P=/<|>/g,W=e.noop,B=e.proxy,X=e.isFunction,J=e.isArray,Q=function(e){return"string"==typeof e},z=function(e){return e&&"[object Object]"===Object.prototype.toString.call(e)},G=!window.XMLHttpRequest,K=function(e,i,n){return n===t?e.getAttribute(i):(null===n?e.removeAttribute(i):e.setAttribute(i,""+n),t)},Y=window.console||{log:W,info:W},Z={debug:0,timely:1,theme:"default",ignore:"",focusInvalid:!0,beforeSubmit:W,validClass:"n-valid",invalidClass:"n-invalid",msgWrapper:"span",msgMaker:function(e){var t,i={error:M,ok:w,tip:O,loading:$}[e.type];return t='',t+=e.arrow+e.icon+''+e.msg+"",t+=""},msgIcon:'',msgArrow:"",msgClass:"",defaultMsg:"{0} is not valid.",loadingMsg:"Validating..."},et={"default":{formClass:"n-default",msgClass:"n-right",showOk:""}};e.fn[h]=function(t){var n=this,s=arguments;return n.is(":input")?n:(!n.is("form")&&(n=this.find("form")),!n.length&&(n=this),n.each(function(){var n=e(this).data(h);if(n)if(Q(t)){if("_"===t.charAt(0))return;n[t].apply(n,Array.prototype.slice.call(s,1))}else t&&(n._reset(!0),n._init(this,t));else new i(this,t)}),this)},e.fn.isValid=function(e,t){var i,n,s=l(this[0]),r=X(e);return s?(s.checkOnly=!!t,n=s.options,i=s._multiValidate(this.is(":input")?this:this.find(N),function(t){t||!n.focusInvalid||s.checkOnly||s.$el.find(":input["+F+"]:first").focus(),r&&e.call(null,t),s.checkOnly=!1}),r?this:i):!0},e.expr[":"].verifiable=function(e){var t=e.nodeName.toLowerCase();return("input"===t&&!{submit:1,button:1,reset:1,image:1}[e.type]||"select"===t||"textarea"===t)&&e.disabled===!1},i.prototype={_init:function(i,r){var l,u,o,d=this;if(X(r)&&(r={valid:r}),r=r||{},o=K(i,"data-"+h+"-option"),o=o&&"{"===o.charAt(0)?Function("return "+o)():{},u=et[r.theme||o.theme||Z.theme],l=d.options=e.extend({},Z,u,o,d.options,r),d.rules=new n(l.rules,!0),d.messages=new s(l.messages,!0),d.elements=d.elements||{},d.deferred={},d.errors={},d.fields={},d._initFields(l.fields),J(l.groups)&&e.map(l.groups,function(i){return Q(i.fields)&&X(i.callback)?(i.$elems=d.$el.find(a(i.fields)),e.map(i.fields.split(" "),function(e){d.fields[e]=d.fields[e]||{},d.fields[e].group=i}),t):null}),d.msgOpt={type:"error",pos:c(l.msgClass),wrapper:l.msgWrapper,cls:l.msgClass,style:l.msgStyle,icon:l.msgIcon,arrow:l.msgArrow,show:l.msgShow,hide:l.msgHide},d.isAjaxSubmit=!1,l.valid||!e.trim(K(i,"action")))d.isAjaxSubmit=!0;else{var f=e[e._data?"_data":"data"](i,"events");f&&f.valid&&e.map(f.valid,function(e){return-1!==e.namespace.indexOf("form")?1:null}).length&&(d.isAjaxSubmit=!0)}d.$el.data(h)||(d.$el.data(h,d).addClass(k+" "+l.formClass).on("submit"+v+" validate"+v,B(d,"_submit")).on("reset"+v,B(d,"_reset")).on("showtip"+v,B(d,"_showTip")).on("focusin"+v+" click"+v+" showtip"+v,N,B(d,"_focusin")).on("focusout"+v+" validate"+v,N,B(d,"_focusout")),l.timely>=2&&d.$el.on("keyup"+v+" paste"+v,N,B(d,"_focusout")).on("click"+v,":radio,:checkbox",B(d,"_focusout")).on("change"+v,'select,input[type="file"]',B(d,"_focusout")),d._novalidate=K(i,q),K(i,q,q))},_initFields:function(t){var i=this;z(t)&&e.each(t,function(e,t){if(null===t){var n=i.elements[e];n&&i._resetElement(n,!0),delete i.fields[e]}else i.fields[e]=Q(t)?{rule:t}:t}),i.$el.find(N).each(function(){i._parse(this)})},_parse:function(e){var t,i=this,n=e.name,s=K(e,V);s&&K(e,V,null),(e.id&&"#"+e.id in i.fields||!e.name)&&(n="#"+e.id),n&&(t=i.fields[n]||{},t.key=n,t.old={},t.rule=t.rule||s||"",t.rule&&(t.rule.match(/match|checked/)&&(t.must=!0),-1!==t.rule.indexOf("required")&&(t.required=!0,K(e,C,!0)),("timely"in t&&!t.timely||!i.options.timely)&&K(e,"notimely",!0),Q(t.target)&&K(e,S,t.target),Q(t.tip)&&K(e,R,t.tip),i.fields[n]=i._parseRule(t)))},_parseRule:function(e){var i=I.exec(e.rule),n=this.options;if(i)return e._i=0,i[1]&&(e.display=i[1]),!e.display&&n.display&&(e.display=n.display),i[2]&&(e.rules=[],i[2].replace(j,function(){var i=arguments;i[3]=i[3]||i[4],e.rules.push({not:"!"===i[1],method:i[2],params:i[3]?i[3].split(", "):t,or:"|"===i[5]})})),e},_multiValidate:function(i,n){var s=this,r=s.options;return s.verifying=!0,s.isValid=!0,r.ignore&&(i=i.not(r.ignore)),i.each(function(e,i){var n=s.getField(i);return n&&(s._validate(i,n),!s.isValid&&r.stopOnError)?!1:t}),e.when.apply(null,e.map(s.deferred,function(e){return e})).done(function(){n.call(s,s.isValid),s.verifying=!1}),e.isEmptyObject(s.deferred)?s.isValid:t},_submit:function(t){var i=this,n=i.options,s=t.target,r="submit"===t.type;t.preventDefault(),m&&~(m=!1)||i.submiting||"validate"===t.type&&i.$el[0]!==s||n.beforeSubmit.call(i,s)===!1||(n.debug&&Y.log("\n"+t.type),i._reset(),i.submiting=!0,i._multiValidate(i.$el.find(N),function(t){var a,l=t||2===n.debug?"valid":"invalid";t||(n.focusInvalid&&i.$el.find(":input["+F+'="true"]:first').focus(),a=e.map(i.errors,function(e){return e})),i.submiting=!1,X(n[l])&&n[l].call(i,s,a),i.$el.trigger(l+b,[s,a]),t&&!i.isAjaxSubmit&&r&&(m=!0,p&&p.name&&i.$el.append(''),s.submit())}))},_reset:function(e){var t=this;t.errors={},e&&t.$el.find(N).each(function(e,i){t._resetElement(i)})},_resetElement:function(t,i){var n=this.options;e(t).removeClass(n.validClass+" "+n.invalidClass),this.hideMsg(t),i&&K(t,C,null)},_focusin:function(t){var i,n=this,s=n.options,r=t.target;n.verifying||("showtip"!==t.type&&"error"===K(r,E)&&s.focusCleanup&&(e(r).removeClass(s.invalidClass),n.hideMsg(r)),i=K(r,R),i&&n.showMsg(r,{type:"tip",msg:i}))},_focusout:function(t){var i,n,s=this,r=s.options,a=t.target,l=t.type,u={click:1,change:1,paste:1},o=0;if(!u[l]){if("validate"===l)n=!0;else{if(K(a,"notimely"))return;if(r.timely>=2&&"keyup"!==l)return}if(r.ignore&&e(a).is(r.ignore))return;if("keyup"===l){var d=t.keyCode,c={8:1,9:1,16:1,32:1,46:1};if(9===d&&!a.value)return;if(48>d&&!c[d])return;o=r.timely>=100?r.timely:500}}i=s.getField(a),i&&(o?(i._t&&clearTimeout(i._t),i._t=setTimeout(function(){s._validate(a,i,n)},o)):s._validate(a,i,n))},_showTip:function(e){var t=this;t.$el[0]===e.target&&t.$el.find(N+"["+R+"]").each(function(){t.showMsg(this,{msg:K(this,R),type:"tip"})})},_validatedField:function(t,i,n){var s=this,r=s.options,a=n.isValid=i.isValid=!!n.isValid,l=a?"valid":"invalid";n.key=i.key,n.rule=i._r,a?n.type="ok":(s.submiting&&(s.errors[i.key]=n.msg),s.isValid=!1),i.old.value=t.value,i.old.id=t.id,s.elements[i.key]=n.element=t,s.$el[0].isValid=a?s.isFormValid():a,X(i[l])&&i[l].call(s,t,n),e(t).attr(F,a?null:!0).removeClass(a?r.invalidClass:r.validClass).addClass(n.skip?"":a?r.validClass:r.invalidClass).trigger(l+_,[n,s]),s.$el.triggerHandler("validation",[n,s]),s.checkOnly||(i.msgMaker||r.msgMaker)&&s[n.showOk||n.msg?"showMsg":"hideMsg"](t,n,i)},_validatedRule:function(i,n,s,r){n=n||o.getField(i),r=r||{};var a,l,u,o=this,c=o.options,f=n._r,g=!1;if(null===s)return o._validatedField(i,n,{isValid:!0,skip:!0}),t;if(s===!0||s===t||""===s?g=!0:Q(s)?a=s:z(s)&&(s.error?a=s.error:(a=s.ok,g=!0)),n.rules&&(l=n.rules[n._i],l.not&&(a=t,g="required"===f||!g),l.or))if(g)for(;n._i "+(g||r.msg||g)),u||g&&n._i=+l&&+u>=e)return!0;d=d.concat(a)}else if(l&&!u){if(c&&e>=+l)return!0;d.push(l),o="gte"}else if(!l&&u){if(c&&+u>=e)return!0;d.push(u),o="lte"}}else{if(e===+l)return!0;d.push(l),o="eq"}return r&&(n&&r[o+n]&&(o+=n),d[0]=r[o]),s.renderMsg.apply(null,d)}},renderMsg:function(){var e=arguments,t=e[0],i=e.length;if(t){for(;--i;)t=t.replace("{"+i+"}",e[i]);return t}},_getDisplay:function(e,t){return Q(t)?t:X(t)?t.call(this,e):""},_getMsgOpt:function(t){return e.extend({},this.msgOpt,Q(t)?{msg:t}:t)},_getMsgDOM:function(t,i){var n,s,r,a=e(t);if(a.is(":input")?(r=i.target||K(t,S),r&&(r=X(r)?r.call(this,t):this.$el.find(r),r.length&&(r.is(":input")?t=r.get(0):n=r)),n||(s=!f(t)&&t.id?t.id:t.name,n=this.$el.find(i.wrapper+"."+x+'[for="'+s+'"]'))):n=a,!n.length)if(a=this.$el.find(r||t),n=e("<"+i.wrapper+">").attr({"class":x+(i.cls?" "+i.cls:""),style:i.style||"","for":s}),f(t)){var l=a.parent();n.appendTo(l.is("label")?l.parent():l)}else n[i.pos&&"right"!==i.pos?"insertBefore":"insertAfter"](a);return n},showMsg:function(t,i,n){var s,r=this,a=r.options;if(i=r._getMsgOpt(i),(i.msg||i.showOk)&&(t=e(t).get(0),e(t).is(N)&&(K(t,E,i.type),n=n||r.getField(t),n&&(i.style=n.msgStyle||i.style,i.cls=n.msgClass||i.cls,i.wrapper=n.msgWrapper||i.wrapper,i.target=n.target||a.target)),s=(n||{}).msgMaker||a.msgMaker)){var l=r._getMsgDOM(t,i),u=l[0].className;!H.test(u)&&l.addClass(i.cls),G&&"bottom"===i.pos&&(l[0].style.marginTop=e(t).outerHeight()+"px"),l.html(s.call(r,i))[0].style.display="",X(i.show)&&i.show.call(r,l,i.type)}},hideMsg:function(t,i,n){var s=this,r=s.options;t=e(t).get(0),i=s._getMsgOpt(i),e(t).is(N)&&(K(t,E,null),K(t,F,null),n=n||s.getField(t),n&&(i.wrapper=n.msgWrapper||i.wrapper,i.target=n.target||r.target));var a=s._getMsgDOM(t,i);a.length&&(X(i.hide)?i.hide.call(s,a,i.type):a[0].style.display="none")},mapMsg:function(t){var i=this;e.each(t,function(e,t){var n=i.elements[e]||i.$el.find(':input[name="'+e+'"]')[0];i.showMsg(n,t)})},setMsg:function(e){new s(e,this.messages)},setRule:function(t){new n(t,this.rules),e.map(this.fields,function(e){e.old={}})},getField:function(e){var t,i=this;return t=e.id&&"#"+e.id in i.fields||!e.name?"#"+e.id:e.name,K(e,V)&&i._parse(e),i.fields[t]},setField:function(e,t){var i={};Q(e)?i[e]=t:z(e)&&(i=e),this._initFields(i)},isFormValid:function(){var e=this.fields;for(var t in e)if(!e[t].isValid)return e[t].isValid;return!0},holdSubmit:function(e){this.submiting=e===t||e},cleanUp:function(){this._reset(1)},destroy:function(){this._reset(1),this.$el.off(v).removeData(h),K(this.$el[0],q,this._novalidate)}},e(document).on("focusin",":input["+V+"]",function(e){u(e)}).on("click","input,button",function(e){var t=this,i=t.name;if(t.form)if("submit"===t.type)p=t,null!==K(t,q)&&(m=!0);else if(i&&f(t)){var n=t.form.elements[i];n.length&&(n=n[0]),K(n,V)&&u(e)}}).on("submit validate","form",function(t){if(null===K(this,q)){var i,n=e(this);n.data(h)||(i=n[h]().data(h),e.isEmptyObject(i.fields)?(K(this,q,q),n.off(v).removeData(h)):i._submit(t))}}),new n({required:function(t,i){var n=e.trim(t.value),s=!0;if(i)if(1===i.length){if(!n&&!this.test(t,i[0]))return K(t,C,null),null;K(t,C,!0)}else"not"===i[0]&&e.map(i.slice(1),function(t){n===e.trim(t)&&(s=!1)});return s&&!!n},integer:function(e,t){var i,n="0|",s="[1-9]\\d*",r=t?t[0]:"*";switch(r){case"+":i=s;break;case"-":i="-"+s;break;case"+0":i=n+s;break;case"-0":i=n+"-"+s;break;default:i=n+"-?"+s}return i="^(?:"+i+")$",RegExp(i).test(e.value)||this.messages.integer[r]},match:function(t,i,n){if(i){var s,r,a,l,u,o,d,c=this,f="eq";if(1===i.length?a=i[0]:(f=i[0],a=i[1]),u="#"===a.charAt(0)?a:':input[name="'+a+'"]',o=c.$el.find(u)[0]){if(d=c.getField(o),s=t.value,r=o.value,n._match||(c.$el.on("valid"+_+v,u,function(){e(t).trigger("validate")}),n._match=d._match=1),!n.required&&""===s&&""===r)return null;if(i[2]&&("date"===i[2]?(s=g(s),r=g(r)):"time"===i[2]&&(s=+s.replace(":",""),r=+r.replace(":",""))),"eq"!==f&&!isNaN(+s)&&isNaN(+r))return!0;switch(l=c.messages.match[f].replace("{1}",c._getDisplay(t,d.display||a)),f){case"lt":return+r>+s||l;case"lte":return+r>=+s||l;case"gte":return+s>=+r||l;case"gt":return+s>+r||l;case"neq":return s!==r||l;default:return s===r||l}}}},range:function(e,t){return this.getRangeMsg(+e.value,t,"range")},checked:function(t,i,n){if(f(t)){var s,r,a=this;return r=a.$el.find('input[name="'+t.name+'"]').filter(function(){var t=this;return!s&&f(t)&&(s=t),!t.disabled&&t.checked&&e(t).is(":visible")}).length,i?a.getRangeMsg(r,i,"checked"):!!r||d(s,n,"")||a.messages.required}},length:function(e,t){var i=e.value,n=(t[1]?i.replace(U,"xx"):i).length;return this.getRangeMsg(n,t,"length",t[1]?"_2":"")},remote:function(t,i){if(i){var n,s=this,r=L.exec(i[0]),a=r[2],l=(r[1]||"POST").toUpperCase(),u={};return u[t.name]=t.value,i[1]&&e.map(i.slice(1),function(t){var i,n=t.split(":");t=e.trim(n[0]),i=e.trim(n[1]||"")||t,u[t]=s.$el.find("#"===i.charAt(0)?i:':input[name="'+i+'"]').val()}),u=e.param(u),"POST"===l&&(n=a.indexOf("?"),-1!==n&&(u+="&"+a.substring(n+1,a.length),a=a.substring(0,n))),e.ajax({url:a,type:l,data:u,cache:!1})}},filter:function(e,t){e.value=e.value.replace(t?RegExp("["+t[0]+"]","gm"):P,"")}}),i.config=function(t){e.each(t,function(e,t){"rules"===e?new n(t):"messages"===e?new s(t):Z[e]=t})},i.setTheme=function(t,i){z(t)?e.each(t,function(e,t){et[e]=t}):Q(t)&&z(i)&&(et[t]=i)},e[h]=i}(jQuery); diff --git a/static/js/validator/zh_CN.js b/static/js/validator/zh_CN.js new file mode 100644 index 000000000..ba320330d --- /dev/null +++ b/static/js/validator/zh_CN.js @@ -0,0 +1,156 @@ +/********************************* + * Themes, rules, and i18n support + * Locale: Chinese; 中文 + *********************************/ +(function(factory) { + if (typeof define === 'function') { + define(function(require, exports, module){ + var $ = require('jquery'); + $._VALIDATOR_URI = module.uri; + require('../src/jquery.validator')($); + factory($); + }); + } else { + factory(jQuery); + } +}(function($) { + /* Global configuration + */ + $.validator.config({ + //stopOnError: false, + //theme: 'yellow_right', + defaultMsg: "{0}格式不正确", + loadingMsg: "正在验证...", + + // Custom rules + rules: { + digits: [/^\d+$/, "请输入数字"] + ,letters: [/^[a-z]+$/i, "{0}只能输入字母"] + ,tel: [/^(?:(?:0\d{2,3}[\- ]?[1-9]\d{6,7})|(?:[48]00[\- ]?[1-9]\d{6}))$/, "电话格式不正确"] + ,mobile: [/^1[3-9]\d{9}$/, "手机号格式不正确"] + ,email: [/^[\w\+\-]+(\.[\w\+\-]+)*@[a-z\d\-]+(\.[a-z\d\-]+)*\.([a-z]{2,4})$/i, "邮箱格式不正确"] + ,qq: [/^[1-9]\d{4,}$/, "QQ号格式不正确"] + ,date: [/^\d{4}-\d{1,2}-\d{1,2}$/, "请输入正确的日期,例:yyyy-mm-dd"] + ,time: [/^([01]\d|2[0-3])(:[0-5]\d){1,2}$/, "请输入正确的时间,例:14:30或14:30:00"] + ,ID_card: [/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[A-Z])$/, "请输入正确的身份证号码"] + ,url: [/^(https?|ftp):\/\/[^\s]+$/i, "网址格式不正确"] + ,postcode: [/^[1-9]\d{5}$/, "邮政编码格式不正确"] + ,chinese: [/^[\u0391-\uFFE5]+$/, "请输入中文"] + ,username: [/^\w{3,12}$/, "请输入3-12位数字、字母、下划线"] + ,password: [/^[0-9a-zA-Z]{6,16}$/, "密码由6-16位数字、字母组成"] + ,accept: function (element, params){ + if (!params) return true; + var ext = params[0]; + return (ext === '*') || + (new RegExp(".(?:" + (ext || "png|jpg|jpeg|gif") + ")$", "i")).test(element.value) || + this.renderMsg("只接受{1}后缀", ext.replace('|', ',')); + } + + } + }); + + /* Default error messages + */ + $.validator.config({ + messages: { + required: "{0}不能为空", + remote: "{0}已被使用", + integer: { + '*': "请输入整数", + '+': "请输入正整数", + '+0': "请输入正整数或0", + '-': "请输入负整数", + '-0': "请输入负整数或0" + }, + match: { + eq: "{0}与{1}不一致", + neq: "{0}与{1}不能相同", + lt: "{0}必须小于{1}", + gt: "{0}必须大于{1}", + lte: "{0}必须小于或等于{1}", + gte: "{0}必须大于或等于{1}" + }, + range: { + rg: "请输入{1}到{2}的数", + gte: "请输入大于或等于{1}的数", + lte: "请输入小于或等于{1}的数" + }, + checked: { + eq: "请选择{1}项", + rg: "请选择{1}到{2}项", + gte: "请至少选择{1}项", + lte: "请最多选择{1}项" + }, + length: { + eq: "请输入{1}个字符", + rg: "请输入{1}到{2}个字符", + gte: "请至少输入{1}个字符", + lte: "请最多输入{1}个字符", + eq_2: "", + rg_2: "", + gte_2: "", + lte_2: "" + } + } + }); + + /* Themes + */ + var TPL_ARROW = ''; + $.validator.setTheme({ + 'simple_right': { + formClass: 'n-simple', + msgClass: 'n-right' + }, + 'simple_bottom': { + formClass: 'n-simple', + msgClass: 'n-bottom' + }, + 'yellow_top': { + formClass: 'n-yellow', + msgClass: 'n-top', + msgArrow: TPL_ARROW + }, + 'yellow_right': { + formClass: 'n-yellow', + msgClass: 'n-right', + msgArrow: TPL_ARROW + }, + 'yellow_right_effect': { + formClass: 'n-yellow', + msgClass: 'n-right', + msgArrow: TPL_ARROW, + msgShow: function($msgbox, type){ + var $el = $msgbox.children(); + if ($el.is(':animated')) return; + if (type === 'error') { + $el.css({ + left: '20px', + opacity: 0 + }).delay(100).show().stop().animate({ + left: '-4px', + opacity: 1 + }, 150).animate({ + left: '3px' + }, 80).animate({ + left: 0 + }, 80); + } else { + $el.css({ + left: 0, + opacity: 1 + }).fadeIn(200); + } + }, + msgHide: function($msgbox, type){ + var $el = $msgbox.children(); + $el.stop().delay(100).show().animate({ + left: '20px', + opacity: 0 + }, 300, function(){ + $msgbox.hide(); + }); + } + } + }); +})); \ No newline at end of file diff --git a/stopserver b/stopserver deleted file mode 100755 index 45a1452be..000000000 --- a/stopserver +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -pids=$(ps axu | grep -E '(manage.py|log_handler|index.js)' | grep -v 'grep' | awk '{ print $2 }') -for pid in $pids;do - kill -15 $pid -done diff --git a/templates/404.html b/templates/404.html new file mode 100644 index 000000000..4e4389e56 --- /dev/null +++ b/templates/404.html @@ -0,0 +1,43 @@ + + + + + + + + + Jumpserver | 404 Error + + + + + + + + + + + + +
+

404

+

Page Not Found

+
+ Sorry, but the page you are looking for has note been found. Try checking the URL for error, then hit the refresh button on your browser or try found something else in our app. +
+
+ +
+ +
+
+
+ + + + + + + + + diff --git a/templates/500.html b/templates/500.html new file mode 100644 index 000000000..895e3fc18 --- /dev/null +++ b/templates/500.html @@ -0,0 +1,39 @@ + + + + + + + + + Jumpserver | 500 Error + + + + + + + + + + + + +
+

500

+

Internal Server Error

+ +
+ The server encountered something unexpected that didn't allow it to complete the request. We apologize.
+ You can go back to main page:
Dashboard +
+
+ + + + + + + + + diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 000000000..729ec6fb7 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,33 @@ + + + + + + + + + Jumpserver | 开源跳板机系统 + + + {% include 'link_css.html' %} + {% include 'head_script.html' %} + + + + + + +
+ {% include 'nav.html' %} +
+
+ {% include 'nav_bar_header.html' %} +
+ {% block content %}{% endblock %} + {% include 'footer.html' %} +
+
+ + + {% include 'foot_script.html' %} + diff --git a/templates/download.html b/templates/download.html new file mode 100644 index 000000000..461daf6cf --- /dev/null +++ b/templates/download.html @@ -0,0 +1,39 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
下载文件
+ +
+
+

下载文件可联系管理员在服务器安装lrzsz,使用sz命令下载。

+
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/templates/error.html b/templates/error.html new file mode 100644 index 000000000..702d7b4b6 --- /dev/null +++ b/templates/error.html @@ -0,0 +1,51 @@ + + + + + + + + + Jumpserver | 500 Error + + + + + + + + + + + + +
+

Error

+

{{ message }}

+

+
+ The server encountered something unexpected that didn't allow it to complete the request. We apologize.
+ You can go back to main page:
首页 +
+
+ + + + + + + + + diff --git a/templates/filter_ajax_api.html b/templates/filter_ajax_api.html new file mode 100644 index 000000000..0698300a9 --- /dev/null +++ b/templates/filter_ajax_api.html @@ -0,0 +1,9 @@ +{% for object in contact_list %} + {% ifequal attr "asset" %} + + {% else %} + + {% endifequal %} + + +{% endfor %} \ No newline at end of file diff --git a/templates/foot_script.html b/templates/foot_script.html new file mode 100644 index 000000000..df145a912 --- /dev/null +++ b/templates/foot_script.html @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/footer.html b/templates/footer.html new file mode 100644 index 000000000..00305471b --- /dev/null +++ b/templates/footer.html @@ -0,0 +1,8 @@ + diff --git a/templates/head_script.html b/templates/head_script.html new file mode 100644 index 000000000..ef5f7a190 --- /dev/null +++ b/templates/head_script.html @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 000000000..3b8312182 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,408 @@ +{% extends 'base.html' %} +{% load mytags %} +{% load humanize %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+ Users +
用户总数
+
+
+

{{ users.count}}

+
{{ percent_user }}
+ All user +
+
+
+
+
+
+ Hosts +
主机总数
+
+
+

{{ hosts.count }}

+
{{ percent_host }}
+ All host +
+
+
+ +
+
+
+ Online +
实时在线用户
+
+
+

+
{{ percent_online_user }}
+ Online user +
+
+
+ +
+
+
+ Connected +
已连接服务器
+
+
+

+
{{ percent_online_host }}
+ Connected host +
+
+
+
+
+
+

活跃用户TOP5

+ 过去一周共有{{ week_users }}位用户登录{{ week_hosts }}次服务器. +
    + {% for data in user_top_five %} +
  • + + {{ data.times }}次/周 + + {{ forloop.counter }} {{ data.user }} +
  • + {% endfor %} +
+
+
+
+
+ +
+
+
+
+
权限申请
+ +
+
+

权限申请记录

+ 最近十条权限申请记录信息. +
+
+
+ {% if perm_apply_10 %} + {% for perm in perm_apply_10 %} +
+
+ {% ifequal perm.status 0 %} + {{ perm.date_add|naturaltime }} + {% else %} + {{ perm.date_add|naturaltime }} + {% endifequal %} + {{ perm.applyer }} +
申请 {{ perm.bisgroup|ast_to_list }} 主机组权限
+
申请 {{ perm.asset|ast_to_list }} 主机权限
+ {{ perm.date_add }} +
+
+ {% endfor %} + {% else %} +

(暂无)

+ {% endif %} +
+
+
+
+
+
+
+
最近十次登录
+
+ 10 Messages +
+
+
+

登录记录

+ 最近十次登录记录. +
+
+
+
+ {% if login_10 %} + {% for login in login_10 %} +
+ + image + +
+ {% ifequal login.is_finished 0 %} + {{ login.start_time|naturaltime }} + {% else %} + {{ login.start_time|naturaltime }} + {% endifequal %} + {{ login.user }} 登录了{{ login.host }}
+ {{ login.start_time }} + +
+
+ {% endfor %} + + + + {% else %} +

(暂无)

+ {% endif %} +
+
+
+
+
+ +
+
+
+
一周Top10用户
+ +
+
+

一周Top10用户

+ 一周Top10用户登录次数及最近一次登录记录. +
+
+ {% if user_top_ten %} + {% for data in user_top_ten %} +
+
+
+ + {{ data.user }} +
+ {{ data.times }}次 +
+
+

最近一次登录

+

{{ data.last.host }}

+

于{{ data.last.start_time |date:"Y-m-d H:i:s" }}

+
+
+
+ {% endfor %} + {% else %} +

(暂无)

+ {% endif %} +
+
+
+ + + + + + + +
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/index_cu.html b/templates/index_cu.html new file mode 100644 index 000000000..116613fab --- /dev/null +++ b/templates/index_cu.html @@ -0,0 +1,162 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
使用说明
+ +
+ +
+ 迎使用Jumpserver跳板机系统, + 首先需要 下载 登录跳板机的SSH密钥文件,然后导入到工具或者ssh命令指定密钥文件(确保密钥文件权限600),输入收到的密钥密码,登录跳板机。 + 登录后根据提示进行操作。跳板机web界面支持修改密码、个人信息和上传下载文件等功能,可以向管理员申请权限。 +
+
+ +
+
+
已授权主机
+
+
总共:{{ host_count }}
+ + + + + + + + + + +
+
+ +
+ + {% for host_five in new_posts %} + + {% for host in host_five %} + + {% endfor %} + + {% endfor %} +
{{ host.ip }}
+ {% ifequal host_count 0 %} + (空) + {% endifequal %} +
+
+
+ +
+
+
+ {{ user.name }} +
+ + + + + + + + + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID{{ user.id }}
用户名{{ user.username }}
姓名{{ user.name }}
角色{{ user.id | get_role }}
部门{{ user.dept.name }}
Email{{ user.email }}
激活{{ user.is_active|bool2str }}
添加日期{{ user.date_joined|date:"Y-m-d H:i:s" }}
最后登录{{ user.last_login|date:"Y-m-d H:i:s" }}
所在用户组 + + {% for group in user.group.all %} + + + + {% endfor %} +
{{ group.name }}
+
+
+
+
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/dept_host_ajax.html b/templates/jasset/dept_host_ajax.html new file mode 100644 index 000000000..be529cfc7 --- /dev/null +++ b/templates/jasset/dept_host_ajax.html @@ -0,0 +1,3 @@ +{% for host in hosts %} + +{% endfor %} \ No newline at end of file diff --git a/templates/jasset/group_add.html b/templates/jasset/group_add.html new file mode 100644 index 000000000..be6c7b91d --- /dev/null +++ b/templates/jasset/group_add.html @@ -0,0 +1,206 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + + +
+
+
+
+
+
填写主机组基本信息
+ +
+ + + + + +
+ {% if emg %} +
{{ emg }}
+ {% endif %} + {% if smg %} +
{{ smg }}
+ {% endif %} +
+
+
+
+ + {% ifequal session_role_id 2 %} +
+
+ +
+ +
+
+ {% endifequal %} + + {% ifequal session_role_id 1 %} +
+
+ + +
+
+ {% endifequal %} + +
+
+ +
+ +
+
+
+
+ +
+
+ + +
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+
+ +
+
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/group_detail.html b/templates/jasset/group_detail.html new file mode 100644 index 000000000..0f31d3cf6 --- /dev/null +++ b/templates/jasset/group_detail.html @@ -0,0 +1,203 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
主机组{{ group.name }}详细信息列表
+ +
+ +
+
+ 添加主机 + 提示: 此页面删除只从本主机组中剔除主机 +
+ +
+ + + + + + + + + + + + + + + + + {% for post in contacts.object_list %} + + + + + + + + + + + + + {% endfor %} + +
IP地址 端口号 登录方式 所属IDC 所属业务组 是否激活 添加时间 备注 操作
{{ post.ip }} {{ post.port }} {{ post.login_type|get_login_type }} {{ post.idc.name }} {{ post.bis_group.all | group_str2 }} {{ post.is_active|bool2str }} {{ post.date_added|date:"Y-m-d H:i:s" }} {{ post.comment }} + 详情 + 编辑 + 删除 +
+
+
+ + +
+
+
+
    + {% if keyword %} + {% if contacts.has_previous %} + + {% else %} + + {% endif %} + {% ifequal show_first 1 %} +
  • 1...
  • + {% endifequal %} + {% for page in page_range %} + {% ifequal current_page page %} +
  • {{ page }}
  • + {% else %} +
  • {{ page }}
  • + {% endifequal %} + {% endfor %} + {% ifequal show_end 1 %} +
  • ...{{ p.num_pages }}
  • + {% endifequal %} + {% if contacts.has_next %} + + {% else %} + + {% endif %} + + {% else %} + {% if contacts.has_previous %} + + {% else %} + + {% endif %} + {% ifequal show_first 1 %} +
  • 1...
  • + {% endifequal %} + {% for page in page_range %} + {% ifequal current_page page %} +
  • {{ page }}
  • + {% else %} +
  • {{ page }}
  • + {% endifequal %} + {% endfor %} + {% ifequal show_end 1 %} +
  • ...{{ p.num_pages }}
  • + {% endifequal %} + {% if contacts.has_next %} + + {% else %} + + {% endif %} + {% endif %} +
+
+
+
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/group_edit.html b/templates/jasset/group_edit.html new file mode 100644 index 000000000..2f142a2e3 --- /dev/null +++ b/templates/jasset/group_edit.html @@ -0,0 +1,174 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + + +
+
+
+
+
+
填写主机组基本信息
+ +
+ + + + + +
+ {% if emg %} +
{{ emg }}
+ {% endif %} + {% if smg %} +
{{ smg }}
+ {% endif %} +
+
+
+
+ +
+
+ + +
+
+ +
+
+ +
+ +
+
+
+
+ +
+
+ + +
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+
+ +
+
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/group_list.html b/templates/jasset/group_list.html new file mode 100644 index 000000000..b171df382 --- /dev/null +++ b/templates/jasset/group_list.html @@ -0,0 +1,117 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
主机组详细信息列表
+ +
+
+
+ 添加主机组 + +
+ +
+ + + + + + + + + + + + + {% for post in contacts.object_list %} + + + + + {% ifequal session_role_id 2 %} + + {% else %} + + {% endifequal %} + + + + {% endfor %} + +
主机组名 所属部门 主机数量 备注 操作
{{ post.name }} {{ post.dept.name }} {{ post.asset_set.count }} {{ post|get_group_count:dept }} {{ post.comment }} + 详情 + 编辑 + 删除 +
+
+
+ + +
+ {% include 'paginator.html' %} +
+
+
+
+
+
+
+ + + +{% endblock %} diff --git a/templates/jasset/host_add.html b/templates/jasset/host_add.html new file mode 100644 index 000000000..bbfa730b5 --- /dev/null +++ b/templates/jasset/host_add.html @@ -0,0 +1,207 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} +
+
+
+
+
+
填写主机基本信息
+ +
+ +
+
+ +
+
+
+ {% if emg %} +
{{ emg }}
+ {% endif %} + {% if smg %} +
{{ smg }}
+ {% endif %} +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ + +
+ +
+
+ +
+ +
+
+ + {% ifequal session_role_id 2 %} +
+
+ +
+ +
+
+ {% endifequal %} + + {% ifequal session_role_id 1 %} +
+
+ +
+
+ {% endifequal %} + +
+
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/host_add_multi.html b/templates/jasset/host_add_multi.html new file mode 100644 index 000000000..122ca2ec3 --- /dev/null +++ b/templates/jasset/host_add_multi.html @@ -0,0 +1,68 @@ +{% extends 'base.html' %} +{% block content %} +{% include 'nav_cat_bar.html' %} +
+
+
+
+
+
填写主机基本信息
+ +
+ +
+
+ +
+
+ {% if emg %} +
{{ emg }}
+ {% endif %} + {% if smg %} +
{{ smg }}
+ {% endif %} +

请严格按照文本框内主机信息格式填写, 多台主机回车换行, 具体格式如下:

+

IP地址 端口号 登录方式 IDC名 所属主机组 所属部门 激活/禁用 备注

+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/host_detail.html b/templates/jasset/host_detail.html new file mode 100644 index 000000000..399fe5250 --- /dev/null +++ b/templates/jasset/host_detail.html @@ -0,0 +1,221 @@ +{% extends 'base.html' %} +{% load mytags %} + + +{% block content %} + {% include 'nav_cat_bar.html' %} +
+
+
+
+
+ {{ post.ip }} +
+ + + + + + + + + + +
+
+
+

主机详细信息

+ 此主机详细信息. +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IP{{ post.ip }}
端口{{ post.port }}
登录方式{{ post.login_type|get_login_type }}
IDC{{ post.idc.name }}
部门 + + {% for dept in post.dept.all %} + + + + {% endfor %} +
{{ dept.name }}
+
主机组 + + {% for group in post.bis_group.all %} + + + + {% endfor %} +
{{ group.name }}
+
激活{{ post.is_active|bool2str }}
添加日期{{ post.date_added|date:"Y-m-d H:i:s" }}
备注{{ post.comment }}
+
+
+
+
+
+
+
+
+
拥有权限的用户
+
+ + + + + + + + + + +
+
+
+

主机所有授权的用户

+ 包含了此主机所有授权的用户. +
+
+
+
+ + {% if user_permed_list %} + {% for user in user_permed_list %} + + + + + + {% endfor %} + {% else %} +

(暂无)

+ {% endif %} +
{{ user.name }}{{ user.dept.name }}详情
+
+
+
+
+
+ +
+
+
+
最近一周登录记录
+
+ + + + + + + + + + +
+
+
+

最近一周登录记录

+ 此主机最近一周用户登录信息. +
+
+ {% if log %} + {% for l in log %} +
+
+
+ + {{ l.user }} +
+ {{l.dept_name}} +
+
+

详细信息

+

来源IP: {{ l.remote_ip }}

+

开始: {{ l.start_time |date:"Y-m-d H:i:s" }}

+

结束: {{ l.end_time |date:"Y-m-d H:i:s" }}

+
+
+
+ {% endfor %} + + +
+
+
+
+
+ + + + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/host_edit.html b/templates/jasset/host_edit.html new file mode 100644 index 000000000..f568a92c1 --- /dev/null +++ b/templates/jasset/host_edit.html @@ -0,0 +1,228 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} +
+
+
+
+
+
填写主机基本信息
+ +
+ +
+ {% if emg %} +
{{ emg }}
+ {% endif %} + {% if smg %} +
{{ smg }}
+ {% endif %} +
+
+
+
+ +
+
+
+
+ +
+
+
+ {% for t, type in login_types.items %} + {% ifequal t post.login_type %} +
+ {% else %} +
+ {% endifequal %} + {% endfor %} +
+ + {% ifequal post.login_type 'M' %} +
+
+
+
+ +
+
+
+
+ {% endifequal %} +
+ +
+
+ +
+ +
+
+ + {% ifequal session_role_id 2 %} +
+
+ +
+ +
+
+ {% endifequal %} + + {% ifequal session_role_id 1 %} +
+
+ +
+
+ {% endifequal %} + +
+
+ +
+ +
+
+ +
+
+
+ {% for a,active in actives.items %} + {% ifequal a post.is_active %} +
+ {% else %} +
+ {% endifequal %} + {% endfor %} +
+
+ +
+
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+ + + + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/host_list.html b/templates/jasset/host_list.html new file mode 100644 index 000000000..8617e2958 --- /dev/null +++ b/templates/jasset/host_list.html @@ -0,0 +1,192 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
主机详细信息列表
+ +
+ +
+
+ 添加 + +
+ +
+ + + + + + + + + + + + + + + + + {% for post in contacts.object_list %} + + + + + + + + + + + + + + + {% endfor %} + +
IP地址 端口号 登录方式 所属IDC 所属部门 所属主机组 是否激活 备注 操作
{{ post.ip }} {{ post.port }} {{ post.login_type|get_login_type }} {{ post.idc.name }} {{ post.dept.all | group_str2 }}{{ post.bis_group.all | group_str2_all }} {{ post.is_active|bool2str }} {{ post.comment }} + 详情 + {% ifnotequal session_role_id 0 %} + 编辑 + 删除 + {% endifnotequal %} +
+
+
+ + +
+ {% include 'paginator.html' %} +
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/host_list_common.html b/templates/jasset/host_list_common.html new file mode 100644 index 000000000..3ea78f019 --- /dev/null +++ b/templates/jasset/host_list_common.html @@ -0,0 +1,172 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
主机详细信息列表
+ +
+ +
+
+ 点击别名栏修改主机别名, 可在跳板机上使用别名直接登录. + +
+ +
+ + + + + + + + + + + + + + + + + {% for post in contacts.object_list %} + + + + + + + + + + + + + {% endfor %} + +
IP地址 端口号 登录方式 所属IDC 所属部门 所属主机组 别名 备注 操作
{{ post.ip }} {{ post.port }} {{ post.login_type|get_login_type }} {{ post.idc.name }} {{ post.dept.all | group_str2 }}{{ post.bis_group.all | group_str2_all }} {{ post|get_user_alias:user_id }} {{ post.comment }} + 详情 +
+
+
+ +
+ {% include 'paginator.html' %} +
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/host_list_nop.html b/templates/jasset/host_list_nop.html new file mode 100644 index 000000000..eb1e3dd34 --- /dev/null +++ b/templates/jasset/host_list_nop.html @@ -0,0 +1,177 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
主机详细信息列表
+ +
+ +
+
+ 添加 + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + {% for post in posts %} + + + + + + + + + + + + + {% endfor %} + +
IP地址 端口号 登录方式 所属IDC 所属部门 所属主机组 是否激活 备注 操作
{{ post.ip }} {{ post.port }} {{ post.login_type|get_login_type }} {{ post.idc.name }} {{ post.dept.all | group_str2 }}{{ post.bis_group.all | group_str2_all }} {{ post.is_active|bool2str }} {{ post.comment }} + 详情 + {% ifnotequal session_role_id 0 %} + 编辑 + 删除 + {% endifnotequal %} +
+
+
+ + +
+ +
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/host_search.html b/templates/jasset/host_search.html new file mode 100644 index 000000000..38ed8c1ad --- /dev/null +++ b/templates/jasset/host_search.html @@ -0,0 +1,169 @@ +{% load mytags %} + + + + + + + + + + {% ifnotequal session_role_id 0 %} + + {% else %} + + {% endifnotequal %} + + + + + + + {% for post in contacts.object_list %} + + + + + + + + {% ifnotequal session_role_id 0 %} + + {% else %} + + {% endifnotequal %} + + + + + {% endfor %} + +
IP地址 端口号 登录方式 所属IDC 所属业务组 是否激活 别名 添加时间 备注 操作
{{ post.ip }} {{ post.port }} {{ post.login_type|get_login_type }} {{ post.idc.name }} {{ post.bis_group.all | group_str2 }} {{ post.is_active|bool2str }} {{ post|get_user_alias:user_id }} {{ post.date_added|date:"Y-m-d H:i:s" }} {{ post.comment }} + 详情 + {% ifnotequal session_role_id 0 %} + 编辑 + 删除 + {% endifnotequal %} +
+
+
+ + +
+
+
+
    + + {% if contacts.has_previous %} + + {% else %} + + {% endif %} + {% ifequal show_first 1 %} +
  • 1...
  • + {% endifequal %} + {% for page in page_range %} + {% ifequal current_page page %} +
  • {{ page }}
  • + {% else %} +
  • {{ page }}
  • + {% endifequal %} + {% endfor %} + {% ifequal show_end 1 %} +
  • ...{{ p.num_pages }}
  • + {% endifequal %} + {% if contacts.has_next %} + + {% else %} + + {% endif %} +
+
+
+ +
+ + diff --git a/templates/jasset/idc_add.html b/templates/jasset/idc_add.html new file mode 100644 index 000000000..5c184e7e2 --- /dev/null +++ b/templates/jasset/idc_add.html @@ -0,0 +1,79 @@ +{% extends 'base.html' %} +{% block content %} +{% include 'nav_cat_bar.html' %} +
+
+
+
+
+
填写IDC基本信息
+ +
+ +
+ {% if emg %} +
{{ emg }}
+ {% endif %} + {% if smg %} +
{{ smg }}
+ {% endif %} +
+
+
+
+ +
+
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/idc_detail.html b/templates/jasset/idc_detail.html new file mode 100644 index 000000000..acc072590 --- /dev/null +++ b/templates/jasset/idc_detail.html @@ -0,0 +1,211 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
IDC {{ idc.name }} 详细信息列表
+ +
+ +
+ {% if emg %} +
{{ emg }}
+ {% endif %} + {% if smg %} +
{{ smg }}
+ {% endif %} + + +
+ + + + + + + + + + + + + + + + + {% for post in contacts.object_list %} + + + + + + + + + + + + + {% endfor %} + +
IP地址 端口号 登录方式 所属IDC 所属业务组 是否激活 添加时间 备注 操作
{{ post.ip }} {{ post.port }} {{ post.login_type|get_login_type }} {{ post.idc.name }} {{ post.dept.all | group_str2 }}{{ post.bis_group.all | group_str2_all }} {{ post.is_active|bool2str }} {{ post.comment }} + 详情 + {% ifnotequal session_role_id 0 %} + 编辑 + 删除 + {% endifnotequal %} +
+
+
+ + +
+
+
+
    + {% if keyword %} + {% if contacts.has_previous %} + + {% else %} + + {% endif %} + {% ifequal show_first 1 %} +
  • 1...
  • + {% endifequal %} + {% for page in page_range %} + {% ifequal current_page page %} +
  • {{ page }}
  • + {% else %} +
  • {{ page }}
  • + {% endifequal %} + {% endfor %} + {% ifequal show_end 1 %} +
  • ...{{ p.num_pages }}
  • + {% endifequal %} + {% if contacts.has_next %} + + {% else %} + + {% endif %} + + {% else %} + {% if contacts.has_previous %} + + {% else %} + + {% endif %} + {% ifequal show_first 1 %} +
  • 1...
  • + {% endifequal %} + {% for page in page_range %} + {% ifequal current_page page %} +
  • {{ page }}
  • + {% else %} +
  • {{ page }}
  • + {% endifequal %} + {% endfor %} + {% ifequal show_end 1 %} +
  • ...{{ p.num_pages }}
  • + {% endifequal %} + {% if contacts.has_next %} + + {% else %} + + {% endif %} + {% endif %} +
+
+
+
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/idc_edit.html b/templates/jasset/idc_edit.html new file mode 100644 index 000000000..0751a4114 --- /dev/null +++ b/templates/jasset/idc_edit.html @@ -0,0 +1,109 @@ +{% extends 'base.html' %} +{% block content %} +{% include 'nav_cat_bar.html' %} +
+
+
+
+
+
填写IDC基本信息
+ +
+ +
+ {% if emg %} +
{{ emg }}
+ {% endif %} + {% if smg %} +
{{ smg }}
+ {% endif %} +
+
+
+ + +
+
+ +
+
+
+
+ +
+
+ +
+ +
+
+
+ + +
+
+
+
+ +
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/idc_list.html b/templates/jasset/idc_list.html new file mode 100644 index 000000000..e1f5dd465 --- /dev/null +++ b/templates/jasset/idc_list.html @@ -0,0 +1,125 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
IDC详细信息列表
+ +
+
+
+ {% ifequal session_role_id 2 %} + 添加IDC + {% endifequal %} + +
+ +
+ + + + {% ifequal session_role_id 2 %} + + {% endifequal %} + + + + + + + + {% for post in contacts.object_list %} + + {% ifequal session_role_id 2 %} + + {% endifequal %} + + {% ifequal session_role_id 2 %} + + {% else %} + + {% endifequal %} + + + + {% endfor %} + +
机房名 主机数量 备注 操作
{{ post.name }} {{ post.asset_set.count }} {{ post|get_idc_count:dept }} {{ post.comment }} + 详情 + {% ifequal session_role_id 2 %} + 编辑 + 删除 + {% endifequal %} +
+
+
+ {% ifequal session_role_id 2 %} + + + {% endifequal %} +
+ {% include 'paginator.html' %} +
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jasset/jasset.html b/templates/jasset/jasset.html new file mode 100644 index 000000000..e92bd8edd --- /dev/null +++ b/templates/jasset/jasset.html @@ -0,0 +1,10 @@ + + + + + 资产管理 + + +

welocome!

+ + \ No newline at end of file diff --git a/templates/jasset/jlist_ip.html b/templates/jasset/jlist_ip.html new file mode 100644 index 000000000..f41dd01c8 --- /dev/null +++ b/templates/jasset/jlist_ip.html @@ -0,0 +1,106 @@ +{% load mytags %} + + + {% include 'link_css.html' %} + {% include 'head_script.html' %} + + + + + +
+
+

{{ offset }}主机详情

+ + + + + + + + + + + + + + + + + + + + + + + +
IP地址 端口号 登录方式 所属IDC 所属业务组 添加时间 备注
{{ post.ip }} {{ post.port }} {{ post.login_type|get_login_type }} {{ post.idc.name }} {% for group in post.bis_group.all %} {{ group }} {% endfor %} {{ post.date_added|date:"Y-m-d H:i:s" }} {{ post.comment }}
+

{{ offset }}主机用户权限详情

+ + + + + + + + + + + +
用户名
+ {% for user in user_permed_list %} + {{ user.name }} + {% endfor %} +
+ +

最近一周登录详情

+ + + + + + + + + + + {% for l in log %} + + + + + + + {% endfor %} + +
用户名 登录时间 退出时间 详情
{{ l.user }} {{ l.start_time|date:"Y-m-d H:i:s" }} {{ l.end_time|date:"Y-m-d H:i:s" }} + 命令统计 +
+
+
+ + + + + \ No newline at end of file diff --git a/templates/jasset/show_all_ajax.html b/templates/jasset/show_all_ajax.html new file mode 100644 index 000000000..c26b405cb --- /dev/null +++ b/templates/jasset/show_all_ajax.html @@ -0,0 +1,7 @@ +{% load mytags %} +{% ifequal env 'group' %} + {{ host.bis_group.all|group_dept_all }} +{% endifequal %} +{% ifequal env 'dept' %} + {{ host.dept.all|group_dept_all }} +{% endifequal %} \ No newline at end of file diff --git a/templates/jasset/test.html b/templates/jasset/test.html new file mode 100644 index 000000000..6ece5b502 --- /dev/null +++ b/templates/jasset/test.html @@ -0,0 +1,30 @@ + + \ No newline at end of file diff --git a/templates/jlog/log_offline.html b/templates/jlog/log_offline.html new file mode 100644 index 000000000..30d4511eb --- /dev/null +++ b/templates/jlog/log_offline.html @@ -0,0 +1,159 @@ +{% extends 'base.html' %} +{% block content %} +{% include 'nav_cat_bar.html' %} + + +
+
+
+
+
+
用户日志详细信息列表
+ +
+ +
+
+ +
+
+
+ + + + + + + + {% ifnotequal session_role_id 0 %} + + {% endifnotequal %} + + + + + + + {% for post in contacts.object_list %} + + + + + + {% ifnotequal session_role_id 0 %} + + {% endifnotequal %} + + + + {% endfor %} + +
用户名 所属部门 登录主机 来源IP 命令统计 登录时间 结束时间
{{ post.user }} {{ post.dept_name }} {{ post.host }} {{ post.remote_ip }} 命令统计 {{ post.start_time|date:"Y-m-d H:i:s"}} {{ post.end_time|date:"Y-m-d H:i:s" }}
+
+
+
+ {% include 'paginator.html' %} +
+
+
+
+
+
+
+ + +{##} + +{% endblock %} \ No newline at end of file diff --git a/templates/jlog/log_online.html b/templates/jlog/log_online.html new file mode 100644 index 000000000..2ae318d88 --- /dev/null +++ b/templates/jlog/log_online.html @@ -0,0 +1,218 @@ +{% extends 'base.html' %} +{% block content %} +{% include 'nav_cat_bar.html' %} + + +
+
+
+
+
+
用户日志详细信息列表
+ +
+ +
+
+ +
+
+
+ + + + + + + + {% ifnotequal session_role_id 0 %} + + + {% endifnotequal %} + + + + + + {% for post in contacts.object_list %} + + + + + + {% ifnotequal session_role_id 0 %} + + + {% endifnotequal %} + + + {% endfor %} + +
用户名 所属部门 登录主机 来源IP 实时监控 阻断 登录时间
{{ post.user }} {{ post.dept_name }} {{ post.host }} {{ post.remote_ip }} 监控 {{ post.start_time|date:"Y-m-d H:i:s" }}
+
+
+ {% include 'paginator.html' %} +
+
+
+
+
+
+
+ + + + +{% endblock %} \ No newline at end of file diff --git a/templates/jlog/log_search.html b/templates/jlog/log_search.html new file mode 100644 index 000000000..e3698b6a4 --- /dev/null +++ b/templates/jlog/log_search.html @@ -0,0 +1,33 @@ +
+ + + + + + + + + + + + + + + {% for post in contacts.object_list %} + + + + + + + + + + {% endfor %} + +
用户名 所属部门 登录主机 来源IP 命令统计 登录时间 结束时间
{{ post.user }} {{ post.dept_name }} {{ post.host }} {{ post.remote_ip }} 命令统计 {{ post.start_time|date:"Y-m-d H:i:s"}} {{ post.end_time|date:"Y-m-d H:i:s" }}
+
+
+ {% include 'paginator.html' %} +
+
\ No newline at end of file diff --git a/templates/jlog/user_history.html b/templates/jlog/user_history.html new file mode 100644 index 000000000..4e166b52e --- /dev/null +++ b/templates/jlog/user_history.html @@ -0,0 +1,163 @@ +{% extends 'base.html' %} +{% block content %} +{% include 'nav_cat_bar.html' %} + + +
+
+
+
+
+
用户{{ username }}日志详细信息列表
+ +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + {% for post in contacts.object_list %} + + + + + + + + + + {% endfor %} + +
用户名 所属部门 登录主机 来源IP 登录时间 结束时间
{{ post.user }} {{ post.dept_name }} {{ post.host }} {{ post.remote_ip }} {{ post.start_time|date:"Y-m-d H:i:s"}} {{ post.end_time|date:"Y-m-d H:i:s" }}
+
+
+
+ {% include 'paginator.html' %} +
+
+
+
+
+
+
+ + +{##} + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/dept_perm_edit.html b/templates/jperm/dept_perm_edit.html new file mode 100644 index 000000000..7d9c8247f --- /dev/null +++ b/templates/jperm/dept_perm_edit.html @@ -0,0 +1,179 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + + +
+
+
+
+
+
部门授权编辑
+ +
+ + + + + +
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if msg %} +
{{ msg }}
+ {% endif %} +
+
+ +
+ + +
+
+ +
+ +
+ +
+ +
+
+
+
+ +
+
+ + +
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+
+
+ +
+
+
+ + +
+
+
+
+ +
+
+
+
+
+ + + + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/dept_perm_list.html b/templates/jperm/dept_perm_list.html new file mode 100644 index 000000000..92d467d89 --- /dev/null +++ b/templates/jperm/dept_perm_list.html @@ -0,0 +1,104 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
查看部门
+ +
+ +
+
+ 添加部门 + +
+ + + + + + + + + + + + + + {% for dept in contacts.object_list %} + + + + + + + + {% endfor %} + +
部门名称部门成员数目授权主机数目备注操作
{{ dept.name }} {{ dept.id | dept_user_num }} {{ dept.id | dept_asset_num }} {{ dept.comment }} +{# 主机#} + 授权编辑 +
+
+
+
+ Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries +
+
+ {% include 'paginator.html' %} +
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_add.html b/templates/jperm/perm_add.html new file mode 100644 index 000000000..727d45d03 --- /dev/null +++ b/templates/jperm/perm_add.html @@ -0,0 +1,176 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
主机授权添加
+ +
+ +
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if msg %} +
{{ msg }}
+ {% endif %} +
+
+ +
+ + 取个名字方便辨识 +
+
+
+ +
+ +
+
+ +
+
+ + +
+
+ + +
+
+ +
+
+ +
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+
+ +
+
+ +
+ +
+
+
+
+ +
+
+
+ + +
+
+
+
+ +
+
+
+
+
+ + + + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_apply.html b/templates/jperm/perm_apply.html new file mode 100644 index 000000000..167a9574e --- /dev/null +++ b/templates/jperm/perm_apply.html @@ -0,0 +1,187 @@ +{% extends 'base.html' %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
填写要申请主机的基本信息
+
+ + + + + + + + + + +
+
+ + + + + +
+ {% if emg %} +
{{ emg }}
+ {% endif %} + {% if smg %} +
{{ smg }}
+ {% endif %} +
+ {% csrf_token %} +
+
+
+ +
+
+
+
+ +
+
+
+ + {% for da in dept_da %} + + {% endfor %} +
+
+ +
+
+ +
+ +
+
+ +
+
+ +
+ +
+
+
+
+ +
+
+ + +
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+
+ + +
+
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+
+ + +{% endblock content %} \ No newline at end of file diff --git a/templates/jperm/perm_apply_exec.html b/templates/jperm/perm_apply_exec.html new file mode 100644 index 000000000..6e9580210 --- /dev/null +++ b/templates/jperm/perm_apply_exec.html @@ -0,0 +1,31 @@ +{% extends 'base.html' %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+

+
+
+
+
+
+ + + +{% endblock content %} \ No newline at end of file diff --git a/templates/jperm/perm_apply_info.html b/templates/jperm/perm_apply_info.html new file mode 100644 index 000000000..716b76f15 --- /dev/null +++ b/templates/jperm/perm_apply_info.html @@ -0,0 +1,55 @@ +{% load mytags %} + + + + + + + + + + + + + + +
+

{{ post.applyer }}权限申请详情

+
+
+
+
申请人
+
所属部门
+
申请主机组
+
申请主机
+ {% for i in post.asset|ast_to_list_1 %} +
Null
+ {% endfor %} +
批准人
+
申请时间
+
批准时间
+
备注
+
+
+
+
+
+
{{ post.applyer }}
+
{{ post.dept }}
+
{% for i in post.bisgroup|ast_to_list_1 %} {{ i }} {% endfor %}
+ {% for i in post.asset|ast_to_list_1 %} +
{{ i }}
+ {% endfor %} +
Null
+
{{ post.approver }}1
+
{{ post.date_add|date:"Y-m-d H:i:s"}}
+
{{ post.date_end|date:"Y-m-d H:i:s" }}1
+
{{ post.comment }}
+
+
+
+ + \ No newline at end of file diff --git a/templates/jperm/perm_apply_search.html b/templates/jperm/perm_apply_search.html new file mode 100644 index 000000000..7f62da3aa --- /dev/null +++ b/templates/jperm/perm_apply_search.html @@ -0,0 +1,40 @@ +{% load mytags %} +
+ + + + + + + + + + + + + + + + {% for post in contacts.object_list %} + + + + + + + + + + + {% endfor %} + +
申请人 所属部门 申请主机组 申请主机 批准人 申请时间 备注 详情
{{ post.applyer }} {{ post.dept }} {{ post.bisgroup|ast_to_list }} {{ post.asset|ast_to_list }} {{ post.approver }} {{ post.date_add|date:"Y-m-d H:i:s"}} {{ post.comment }} + 详情 +
+
+
+
+ {% include 'paginator.html' %} +
+
+
\ No newline at end of file diff --git a/templates/jperm/perm_asset_detail.html b/templates/jperm/perm_asset_detail.html new file mode 100644 index 000000000..8be1ece6b --- /dev/null +++ b/templates/jperm/perm_asset_detail.html @@ -0,0 +1,61 @@ +{% extends 'base.html' %} +{% load mytags %} + +{% block content %} + {% include 'nav_cat_bar.html' %} +
+
+ +
+
+
+
授权主机详情
+ +
+
+ + + + + + + + + + {% for asset in assets_list %} + + + + + + {% endfor %} + +
IPIDC主机组
{{ asset.ip }}{{ asset.idc.name }} + {% for group in asset.bis_group.all|filter_private %} + {{ group }} + {% endfor %} +
+
+
+
+ +
+
+ +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_detail.html b/templates/jperm/perm_detail.html new file mode 100644 index 000000000..b772e4613 --- /dev/null +++ b/templates/jperm/perm_detail.html @@ -0,0 +1,118 @@ +{% extends 'base.html' %} +{% load mytags %} + +{% block content %} + {% include 'nav_cat_bar.html' %} +
+
+
+
+
+
授权主机/组
+ +
+
+

用户

+ 组下用户. +
+
+
+
+
+ + {{ user_group.name }} +
+ 共: {{ group_user_num }} 用户 +
+
+

{{ user_group.comment }}

+

+ {% for user in users %} + {{ user.name }}
+ {% endfor %} +

+

+
+
+
+ {% if not user|get_user_asset_group %} + (无) + {% endif %} +
+
+
+ +
+
+
+
授权主机/组
+ +
+
+

授权主机/组

+ 这里包含了用户所有的主机组和组下的主机. +
+
+ {% for group in asset_groups %} +
+
+
+ + {{ group.name }} +
+ 共: {{ group | group_asset_list_count }}台 +
+
+

{{ group.comment }}

+

+ {% for asset in group|group_asset_list %} + {{ asset.ip }}
+ {% endfor %} +

+

+
+
+
+ {% endfor %} + {% if not user|get_user_asset_group %} + (暂无) + {% endif %} +
+
+
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_edit.html b/templates/jperm/perm_edit.html new file mode 100644 index 000000000..1b2377bac --- /dev/null +++ b/templates/jperm/perm_edit.html @@ -0,0 +1,130 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
主机授权修改
+ +
+ +
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if msg %} +
{{ msg }}
+ {% endif %} +
+
+ +
+ + +
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+
+
+ +
+
+
+ + +
+
+
+
+ +
+
+
+
+
+ + + + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_edit_bak.html b/templates/jperm/perm_edit_bak.html new file mode 100644 index 000000000..cba2d4155 --- /dev/null +++ b/templates/jperm/perm_edit_bak.html @@ -0,0 +1,138 @@ +{% extends 'base.html' %} +{% load mytags %} + +{% block content %} + + + {% include 'nav_cat_bar.html' %} +
+
+
+
+ +
+
授权编辑表单 Edit perm of Group
+ +
+ +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + +
+
+ +
+
+ +
+

未授权主机组

+
+ + +
+
+ +
+
+ + +
+
+ +

授权主机

+
+ +
+
+
+
+
+
+ + +
+
+
+
+ +
+
+
+
+
+ +{# #} + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_list.html b/templates/jperm/perm_list.html new file mode 100644 index 000000000..23b6818df --- /dev/null +++ b/templates/jperm/perm_list.html @@ -0,0 +1,108 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
查看小组
+ +
+ +
+
+ 添加小组 + +
+ + + + + + + + + + + + + + + {% for group in contacts.object_list %} + + + + + + + + + + {% endfor %} + +
组名所属部门成员数目授权主机组数目授权主机数目备注操作
{{ group.name }} {{ group.dept.name }} {{ group.id | member_count }} {{ group.id | ugrp_perm_agrp_count }} {{ group.id | ugrp_perm_asset_count }} {{ group.comment }} + 详情 + 授权编辑 +
+
+
+
+ Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries +
+
+ {% include 'paginator.html' %} +
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_list_ajax.html b/templates/jperm/perm_list_ajax.html new file mode 100644 index 000000000..64a15a0f2 --- /dev/null +++ b/templates/jperm/perm_list_ajax.html @@ -0,0 +1,132 @@ +{% load mytags %} +{% ifequal tab 'tab1' %} + + + + + + + + + + + + {% for group in contacts.object_list %} + + + + + + + + {% endfor %} + +
组名 + 类型 + 成员数量授权数量操作
{{ group.name }} {{ group.type|group_type_to_str }} {{ group.id|member_count }} {{ group.id|perm_count }} + 详情 + 编辑 + 删除 +
+
+
+
+ Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries +
+
+
+
+
    + {% if contacts.has_previous %} + + {% else %} + + {% endif %} + {% for page in p.page_range %} + {% ifequal offset1 page %} +
  • {{ page }}
  • + {% else %} +
  • {{ page }}
  • + {% endifequal %} + {% endfor %} + {% if contacts.has_next %} + + {% else %} + + {% endif %} +
+
+
+
+{% else %} + + + + + + + + + + + + {% for user in contacts2.object_list %} + + + + + + + + {% endfor %} + +
用户角色属组主机数量操作
{{ user.name }} {{ user.id | get_role }} {{ user.username | groups_str }} {{ user.id | perm_asset_count }} + 详情 +
+
+
+
+ Showing {{ contacts2.start_index }} to {{ contacts2.end_index }} of {{ p2.count }} entries +
+
+
+
+
    + {% if contacts2.has_previous %} + + {% else %} + + {% endif %} + {% for page in p2.page_range %} + {% ifequal offset1 page %} +
  • {{ page }}
  • + {% else %} +
  • {{ page }}
  • + {% endifequal %} + {% endfor %} + {% if contacts2.has_next %} + + {% else %} + + {% endif %} +
+
+
+
+{% endifequal %} \ No newline at end of file diff --git a/templates/jperm/perm_log.html b/templates/jperm/perm_log.html new file mode 100644 index 000000000..3b71002e6 --- /dev/null +++ b/templates/jperm/perm_log.html @@ -0,0 +1,93 @@ +{% extends 'base.html' %} +{% block content %} +{% include 'nav_cat_bar.html' %} +
+
+
+
+
+
用户权限申请详细信息列表
+ +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + {% for post in contacts.object_list %} + + + + + + + + + + + + + {% endfor %} + +
申请人 所属部门 申请主机组 申请主机 申请时间 批准时间 备注
{{ post.applyer }} {{ post.dept }} {{ post.bisgroup }} {{ post.asset }} {{ post.date_add|date:"Y-m-d H:i:s"}} {{ post.date_end|date:"Y-m-d H:i:s" }} {{ post.comment }}
+
+
+
+ {% include 'paginator.html' %} +
+
+
+
+
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_log_offline.html b/templates/jperm/perm_log_offline.html new file mode 100644 index 000000000..8b1250277 --- /dev/null +++ b/templates/jperm/perm_log_offline.html @@ -0,0 +1,127 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} +
+
+
+
+
+
用户权限申请详细信息列表
+ +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + {% for post in contacts.object_list %} + + + + + + + + + + + {% endfor %} + +
申请人 所属部门 申请主机组 申请主机 批准人 申请时间 备注 详情
{{ post.applyer }} {{ post.dept }} {{ post.bisgroup|ast_to_list }} {{ post.asset|ast_to_list }} {{ post.approver }} {{ post.date_add|date:"Y-m-d H:i:s"}} {{ post.comment }} + 详情 +
+
+
+
+ {% include 'paginator.html' %} +
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_log_online.html b/templates/jperm/perm_log_online.html new file mode 100644 index 000000000..cda6b07c3 --- /dev/null +++ b/templates/jperm/perm_log_online.html @@ -0,0 +1,128 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} +
+
+
+
+
+
用户权限申请详细信息列表
+ +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + {% for post in contacts.object_list %} + + + + + + + + + + {% endfor %} + +
申请人 所属部门 申请主机组 申请主机 申请时间 备注 操作
{{ post.applyer }} {{ post.dept }} {{ post.bisgroup|ast_to_list }} {{ post.asset|ast_to_list }} {{ post.date_add|date:"Y-m-d H:i:s"}} {{ post.comment }} + 详情 + {% ifnotequal session_role_id 0 %} + 确认 + 删除 + {% endifnotequal %} +
+
+
+
+ {% include 'paginator.html' %} +
+
+
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/perm_user_detail.html b/templates/jperm/perm_user_detail.html new file mode 100644 index 000000000..3a17821a4 --- /dev/null +++ b/templates/jperm/perm_user_detail.html @@ -0,0 +1,240 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
用户授权详情
+ +
+ +
+
+
+
+ +
+
+ +
+ +
+
+ + + + + + + + + + + + {% for perm in contacts.object_list %} + + + + + + + + {% endfor %} + +
名称用户组主机组备注操作
{{ perm.name }} + {% for user_group in perm.user_group.all %} + {{ user_group.name }} + {% endfor %} + + {% for asset_group in perm.asset_group.all %} + {{ asset_group.name }} + {% endfor %} + {{ perm.comment }} + 详情 + 编辑 + 删除 +
+
+
+
+ Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries +
+
+
+
+
    + {% if contacts.has_previous %} + + {% else %} + + {% endif %} + {% for page in page_range %} + {% ifequal current_page page %} +
  • {{ page }}
  • + {% else %} +
  • {{ page }}
  • + {% endifequal %} + {% endfor %} + {% if contacts.has_next %} + + {% else %} + + {% endif %} +
+
+
+
+
+ +
+{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# {% for user in contacts2.object_list %}#} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# {% endfor %}#} +{# #} +{#
用户角色属组主机数量操作
{{ user.name }} {{ user.id | get_role }} {{ user.username | groups_str }} {{ user.id | perm_asset_count }} #} +{# 详情#} +{#
#} +{#
#} +{#
#} +{#
#} +{# Showing {{ contacts2.start_index }} to {{ contacts2.end_index }} of {{ p2.count }} entries#} +{#
#} +{#
#} +{#
#} +{#
#} +{#
    #} +{# {% if contacts2.has_previous %}#} +{# #} +{# {% else %}#} +{# #} +{# {% endif %}#} +{# {% for page in page_range2 %}#} +{# {% ifequal current_page page %}#} +{#
  • {{ page }}
  • #} +{# {% else %}#} +{#
  • {{ page }}
  • #} +{# {% endifequal %}#} +{# {% endfor %}#} +{# {% if contacts2.has_next %}#} +{# #} +{# {% else %}#} +{# #} +{# {% endif %}#} +{#
#} +{#
#} +{#
#} +{#
#} + +
+
+ +
+ +
+ + + +
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/sudo_add.html b/templates/jperm/sudo_add.html new file mode 100644 index 000000000..0087da321 --- /dev/null +++ b/templates/jperm/sudo_add.html @@ -0,0 +1,226 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
Sudo授权添加
+ +
+ +
+ + +
+ +
+
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if msg %} +
{{ msg }}
+ {% endif %} +
+
+ +
+ + 取个名字方便辨识,只支持英文 +
+
+
+ +
+ +
+ + + 允许以哪个用户允许sudo,逗号分隔,默认root + +
+
+
+ +
+ +
+
+ +
+
+ + +
+
+ + +
+
+ +
+
+ +
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+
+ + +
+
+ +
+ +
+
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+
+
+
+ + + + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/sudo_cmd_add.html b/templates/jperm/sudo_cmd_add.html new file mode 100644 index 000000000..9f9e8990e --- /dev/null +++ b/templates/jperm/sudo_cmd_add.html @@ -0,0 +1,148 @@ +{% extends 'base.html' %} + +{% block content %} + {% include 'nav_cat_bar.html' %} +
+
+
+
+
+
填写基本信息
+ +
+
+
+ + +
+ +
+
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if msg %} +
{{ msg }}
+ {% endif %} +
+ +
+ + +
+
+ {% ifequal session_role_id 2 %} +
+
+ +
+ +
+
+ {% endifequal %} +
+
+ +
+ + + 输入命令一行一个 + +
+
+
+
+ +
+ +
+
+ +
+
+
+ + +
+
+ +
+
+
+
+
+
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/sudo_cmd_detail.html b/templates/jperm/sudo_cmd_detail.html new file mode 100644 index 000000000..26a7b8e72 --- /dev/null +++ b/templates/jperm/sudo_cmd_detail.html @@ -0,0 +1,48 @@ +{% load mytags %} + + + {% include 'link_css.html' %} + + + + + +
+
+ {% if cmd_group_name %} +

{{ cmd_group.name }} 命令详情

+ {% endif %} +
+ + + {% if cmd_group_name %} + + + + + + + + + + + + + + {% endif %} + + + + +
ID名称部门
{{ cmd_group.id }}{{ cmd_group.name }}{{ cmd_group.dept.name }}
命令: + {{ cmds_str }} +
+
+
+ + \ No newline at end of file diff --git a/templates/jperm/sudo_cmd_list.html b/templates/jperm/sudo_cmd_list.html new file mode 100644 index 000000000..f7c2d9652 --- /dev/null +++ b/templates/jperm/sudo_cmd_list.html @@ -0,0 +1,140 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
查看命令分组
+ +
+ +
+
+ + +
+
+
+ + + + + + + + + + + + + {% for group in contacts.object_list %} + + + + + + + + {% endfor %} + +
组名命令部门备注操作
{{ group.name }} {{ group.cmd | string_length:50 }} {{ group.dept.name }} {{ group.comment }} + 详情 + 编辑 + 删除 +
+
+
+
+
+
+
+
+ Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries +
+
+
+
+
    + {% if contacts.has_previous %} + + {% else %} + + {% endif %} + {% for page in p.page_range %} + {% ifequal offset1 page %} +
  • {{ page }}
  • + {% else %} +
  • {{ page }}
  • + {% endifequal %} + {% endfor %} + {% if contacts.has_next %} + + {% else %} + + {% endif %} +
+
+
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/sudo_detail.html b/templates/jperm/sudo_detail.html new file mode 100644 index 000000000..c732a4b37 --- /dev/null +++ b/templates/jperm/sudo_detail.html @@ -0,0 +1,170 @@ +{% extends 'base.html' %} +{% load mytags %} + +{% block content %} + {% include 'nav_cat_bar.html' %} +
+
+
+
+
+
授权主机/组
+ +
+
+

用户

+ 组下用户. +
+
+
+
+
+ + {{ user_group.name }} +
+ 共: {{ group_user_num }} 用户 +
+
+

{{ user_group.comment }}

+

+ {% for user in users %} + {{ user.name }}
+ {% endfor %} +

+

+
+
+
+ {% if not users %} + (暂无) + {% endif %} +
+
+
+ +
+
+
+
授权主机/组
+ +
+
+

授权主机/组

+ 这里包含了sudo授权所有的主机组和组下的主机. +
+
+ {% for group in asset_groups %} +
+
+
+ + {{ group.name }} +
+ 共: {{ group | group_asset_list_count }}台 +
+
+

{{ group.comment }}

+

+ {% for asset in group|group_asset_list %} + {{ asset.ip }}
+ {% endfor %} +

+

+
+
+
+ {% endfor %} + {% if not asset_groups %} + (暂无) + {% endif %} +
+
+
+ +
+
+
+
授权命令/组
+ +
+
+ {% for cmd_group in cmd_groups %} +
+
+
+ + {{ cmd_group.name }} +
+ 共: {{ cmd_group.id|sudo_cmd_count }} 个 +
+
+

{{ group.comment }}

+

+ {% for cmd in cmd_group|cmd_group_split %} + {{ cmd }}
+ {% endfor %} +

+

+
+
+
+ {% endfor %} + {% if not cmd_groups %} + (暂无) + {% endif %} +
+
+
+ +
+
+ +{% endblock %} \ No newline at end of file diff --git a/templates/jperm/sudo_edit.html b/templates/jperm/sudo_edit.html new file mode 100644 index 000000000..69b957739 --- /dev/null +++ b/templates/jperm/sudo_edit.html @@ -0,0 +1,155 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
Sudo授权编辑
+ +
+ +
+
+ + +
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if msg %} +
{{ msg }}
+ {% endif %} +
+
+ +
+ + + + 允许以哪个用户允许sudo,逗号分隔,默认root + +
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+
+ + +
+
+ +
+ +
+
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+{% endblock %} + diff --git a/templates/jperm/sudo_list.html b/templates/jperm/sudo_list.html new file mode 100644 index 000000000..ab9116e7a --- /dev/null +++ b/templates/jperm/sudo_list.html @@ -0,0 +1,129 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
Sudo授权列表
+ +
+ +
+ +
+
+ +
+ +
+
+
+ + + + + + + + + + + + + + + {% for group in contacts.object_list %} + + + + + + + + + + + {% endfor %} + +
组名所属部门成员数目授权主机组数目授权主机数目sudo命令备注操作
{{ group.name }} {{ group.dept.name }} {{ group.id | member_count }} {{ group.id | ugrp_sudo_agrp_count }} {{ group.id | ugrp_sudo_asset_count }} {{ group.id | sudo_cmd_count }} {{ group.comment }} + 详情 + sudo授权 +
+
+
+
+ Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries +
+
+ {% include 'paginator.html' %} +
+
+
+
+
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/juser/chg_info.html b/templates/juser/chg_info.html new file mode 100644 index 000000000..1658d6a4b --- /dev/null +++ b/templates/juser/chg_info.html @@ -0,0 +1,132 @@ +{% extends 'base.html' %} +{% load mytags %} + + +{% block content %} + {% include 'nav_cat_bar.html' %} +
+
+
+
+
+
编辑用户信息
+ +
+
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if msg %} +
{{ msg }}
+ {% endif %} +
+
+ +
+
+
+ +
+ +
+
+
+
+ +
+ + + 登陆web的密码 + +
+
+
+
+ +
+ + + 登陆 Jumpserver 使用的SSH密钥的密码,更改密钥密码需要重新下载密钥 + +
+
+
+ +
+ +
+ +
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+ + + + +{% endblock %} \ No newline at end of file diff --git a/templates/juser/dept_add.html b/templates/juser/dept_add.html new file mode 100644 index 000000000..799336f81 --- /dev/null +++ b/templates/juser/dept_add.html @@ -0,0 +1,133 @@ +{% extends 'base.html' %} + +{% block content %} + {% include 'nav_cat_bar.html' %} +
+
+
+
+
+
填写基本信息
+ +
+
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if msg %} +
{{ msg }}
+ {% endif %} +
+ +
+ {% if error %} + + {% else %} + + {% endif %} +
+ +
+ +{#
#} +{#
#} +{# #} +{#
#} +{# #} +{#
#} +{#
#} +{#
#} +{# #} +{# #} +{#
#} +{#
#} +{#
#} +{#
#} +{# #} +{#
#} +{#
#} +{#
#} +
+
+ +
+ {% if error %} + + {% else %} + + {% endif %} +
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/templates/juser/dept_detail.html b/templates/juser/dept_detail.html new file mode 100644 index 000000000..81aab3f79 --- /dev/null +++ b/templates/juser/dept_detail.html @@ -0,0 +1,116 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
查看部门
+ +
+ +
+
+ 添加部门 + 删除所选 + +
+ + + + + + + + + + + + + + + {% for dept in contacts.object_list %} + + + + + + + + + + {% endfor %} + +
+ + 部门名称小组数目成员数目主机数目备注操作
+ + {{ dept.name }} {{ dept.id | dept_group_num }} {{ dept.id | dept_user_num}} {{ dept.id | dept_asset_num}} {{ dept.comment }} + 详情 + 编辑 + 删除 +
+
+
+
+ Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries +
+
+ {% include 'paginator.html' %} +
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/juser/dept_edit.html b/templates/juser/dept_edit.html new file mode 100644 index 000000000..5ade4bad8 --- /dev/null +++ b/templates/juser/dept_edit.html @@ -0,0 +1,133 @@ +{% extends 'base.html' %} + +{% block content %} + {% include 'nav_cat_bar.html' %} +
+
+
+
+
+
修改信息
+ +
+
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if msg %} +
{{ msg }}
+ {% endif %} +
+ +
+ + +
+ +
+ +
+
+ +
+ + + 用户部门是唯一的 + +
+
+
+ + +
+
+
+
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/templates/juser/dept_list.html b/templates/juser/dept_list.html new file mode 100644 index 000000000..82bf9d539 --- /dev/null +++ b/templates/juser/dept_list.html @@ -0,0 +1,126 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
查看部门
+ +
+ +
+
+ 添加部门 + 删除所选 + +
+ + + + + + + + + + + + + + + {% for dept in contacts.object_list %} + + + + + + + + + + {% endfor %} + +
+ + 部门名称小组数目成员数目主机数目备注操作
+ + {{ dept.name }} {{ dept.id | dept_group_num }} {{ dept.id | dept_user_num}} {{ dept.id | dept_asset_num}} {{ dept.comment }} +{# 详情#} + {% ifequal session_role_id 2 %} + 编辑 + 删除 + {% else %} + 编辑 + 删除 + {% endifequal %} +
+
+
+
+ Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries +
+
+ {% include 'paginator.html' %} +
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/juser/dept_user_ajax.html b/templates/juser/dept_user_ajax.html new file mode 100644 index 000000000..3d73f4eae --- /dev/null +++ b/templates/juser/dept_user_ajax.html @@ -0,0 +1,3 @@ +{% for user in users %} + +{% endfor %} \ No newline at end of file diff --git a/templates/juser/group_add.html b/templates/juser/group_add.html new file mode 100644 index 000000000..c6867e08c --- /dev/null +++ b/templates/juser/group_add.html @@ -0,0 +1,152 @@ +{% extends 'base.html' %} + +{% block content %} + {% include 'nav_cat_bar.html' %} +
+
+
+
+
+
填写基本信息
+ +
+
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if msg %} +
{{ msg }}
+ {% endif %} +
+ +
+ +
+
+ {% ifequal session_role_id 2 %} +
+
+ +
+ +
+
+ {% endifequal %} +
+
+ +
+ +
+
+
+ + +
+
+
+
+ +
+
+
+
+
+ +
+ +
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/templates/juser/group_add_ajax.html b/templates/juser/group_add_ajax.html new file mode 100644 index 000000000..e842df809 --- /dev/null +++ b/templates/juser/group_add_ajax.html @@ -0,0 +1,4 @@ +{% for user in users %} + +{% endfor %} + diff --git a/templates/juser/group_detail.html b/templates/juser/group_detail.html new file mode 100644 index 000000000..6046a3b82 --- /dev/null +++ b/templates/juser/group_detail.html @@ -0,0 +1,43 @@ +{% load mytags %} + + + {% include 'link_css.html' %} + + + + + +
+
+

{{ group.name }} 组中成员

+
+ + + + + + + + + + + {% for user in users %} + + + + + + {% endfor %} + + + +
用户名姓名角色
{{ user.username }}{{ user.name }}{{ user.id|get_role }}
+
+
+ + \ No newline at end of file diff --git a/templates/juser/group_edit.html b/templates/juser/group_edit.html new file mode 100644 index 000000000..bd31d7abb --- /dev/null +++ b/templates/juser/group_edit.html @@ -0,0 +1,160 @@ +{% extends 'base.html' %} + +{% block content %} + {% include 'nav_cat_bar.html' %} +
+
+
+
+
+
填写基本信息
+ +
+
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if msg %} +
{{ msg }}
+ {% endif %} +
+ +
+ + +
+
+ {% ifequal session_role_id 2 %} +
+
+ +
+ +
+
+ {% endifequal %} +
+
+ +
+ +
+
+
+ + +
+
+
+
+ +
+
+
+
+
+ +
+ +
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/templates/juser/group_list.html b/templates/juser/group_list.html new file mode 100644 index 000000000..0da320d67 --- /dev/null +++ b/templates/juser/group_list.html @@ -0,0 +1,112 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
查看小组
+ +
+ +
+
+ 添加小组 + 删除所选 + +
+ + + + + + + + + + + + + + {% for group in contacts.object_list %} + + + + + + + + + {% endfor %} + +
+ + 组名所属部门成员数目备注操作
+ + {{ group.name }} {{ group.dept.name }} {{ group.id | member_count }} {{ group.comment }} + 编辑 + 删除 +
+
+
+
+ Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries +
+
+ {% include 'paginator.html' %} +
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/juser/profile.html b/templates/juser/profile.html new file mode 100644 index 000000000..7be33cce4 --- /dev/null +++ b/templates/juser/profile.html @@ -0,0 +1,82 @@ +{% load mytags %} + + + {% include 'link_css.html' %} + + + + + +
+
+

{{ user.name }} 用户详情

+
+ + + + + + + + + + + +{# #} +{# #} + + + + + + + + + + + + +{# #} +{# #} + + + + + + + + + + + +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +
ID用户名姓名角色部门Email激活添加时间最后登录
{{ user.id }}{{ user.username }}{{ user.name }}{{ user.id | get_role }}{{ user.dept.name }}{{ user.email }}{{ user.is_active|bool2str }}{{ user.date_joined }}{{ user.last_login }}
添加日期: {{ user.date_joined }}最后登录: {{ user.last_login }}
用户组: + {% for group in user.group.all %} + {{ group.name }} + {% endfor %} +
授权主机组:#} +{# {% for group in user|get_user_asset_group %}#} +{# {{ group.name }}#} +{# {% endfor %}#} +{#
授权主机组#} +{# {% for asset_group in asset_group_permed %}#} +{# {{ asset_group.name }}#} +{# {% endfor %}#} +{#
+
+
+ + \ No newline at end of file diff --git a/templates/juser/user_add.html b/templates/juser/user_add.html new file mode 100644 index 000000000..2a097fae8 --- /dev/null +++ b/templates/juser/user_add.html @@ -0,0 +1,212 @@ +{% extends 'base.html' %} +{% load mytags %} + + +{% block content %} + {% include 'nav_cat_bar.html' %} +
+
+
+
+
+
填写基本信息
+ +
+
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if msg %} +
{{ msg }}
+ {% endif %} +
+ +
+ +
+
+{#
#} +{#
#} +{# #} +{#
#} +{# #} +{# #} +{# 登陆web的密码#} +{# #} +{#
#} +{#
#} +{#
#} +{#
#} +{# #} +{#
#} +{# #} +{# #} +{# 登陆 Jumpserver 使用的SSH密钥的密码#} +{# #} +{#
#} +{#
#} +
+
+ +
+ +
+
+ {% ifequal session_role_id 2 %} +
+
+ +
+ +
+
+ {% endifequal %} +
+
+ +
+ +
+
+ {% ifequal session_role_id 2 %} +
+
+ +
+ +
+
+ {% endifequal %} +
+
+ +
+ +
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+ + + + +{% endblock %} \ No newline at end of file diff --git a/templates/juser/user_detail.html b/templates/juser/user_detail.html new file mode 100644 index 000000000..883085ed8 --- /dev/null +++ b/templates/juser/user_detail.html @@ -0,0 +1,212 @@ +{% extends 'base.html' %} +{% load mytags %} + + +{% block content %} + {% include 'nav_cat_bar.html' %} +
+
+
+
+
+ {{ user.name }} +
+ + + + + + + + + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID{{ user.id }}
用户名{{ user.username }}
姓名{{ user.name }}
角色{{ user.id | get_role }}
部门{{ user.dept.name }}
Email{{ user.email }}
激活{{ user.is_active|bool2str }}
添加日期{{ user.date_joined|date:"Y-m-d H:i:s" }}
最后登录{{ user.last_login|date:"Y-m-d H:i:s" }}
所在用户组 + + {% for group in user.group.all %} + + + + {% endfor %} +
{{ group.name }}
+
+
+
+
+
+
+
+
+
+
授权主机/组
+ +
+
+

用户的所有授权主机

+ 这里包含了用户所有的主机组和组下的主机. +
+
+ {% for group in user|get_user_asset_group %} +
+
+
+ + {{ group.name }} +
+ 共: {{ group | group_asset_list_count }}台 +
+
+

{{ group.comment }}

+

+ {% for asset in group|group_asset_list %} + {{ asset.ip }}
+ {% endfor %} +

+

+
+
+
+ {% endfor %} + {% if not user|get_user_asset_group %} + (无) + {% endif %} +
+
+
+ +
+
+
+
登录记录
+
+ 最近登录 +
+
+
+
+
+ {% for log in logs_last %} +
+ + image + +
+ {{ log.start_time|time_delta }} + {{ log.user }} 登录了 {{ log.host }}.
+ {{ log.start_time|date:"Y-m-d H:i:s" }} +
+
+ {% endfor %} + {% if not logs_last %} + (暂无) + {% endif %} +
+ {% if logs_num > 10 %} + + {% endif %} +
+ + + +
+
+ +
+ +
+
+ + + + +{% endblock %} \ No newline at end of file diff --git a/templates/juser/user_edit.html b/templates/juser/user_edit.html new file mode 100644 index 000000000..c8ad656a3 --- /dev/null +++ b/templates/juser/user_edit.html @@ -0,0 +1,219 @@ +{% extends 'base.html' %} +{% load mytags %} + + +{% block content %} + {% include 'nav_cat_bar.html' %} +
+
+
+
+
+
编辑用户信息
+ +
+
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if msg %} +
{{ msg }}
+ {% endif %} +
+ +
+ + +
+
+
+
+ +
+ + + 登陆web的密码 + +
+
+
+
+ +
+ + + 登陆 Jumpserver 使用的SSH密钥的密码,更改密钥密码需要重新下载密钥 + +
+
+
+
+ +
+ +
+
+
+ {% ifequal session_role_id 2 %} +
+ +
+ +
+
+
+ {% endifequal %} +
+ +
+ +
+
+ {% ifequal session_role_id 2 %} +
+
+ +
+ +
+
+ {% endifequal %} +
+
+ +
+ +
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+ + + + +{% endblock %} \ No newline at end of file diff --git a/templates/juser/user_list.html b/templates/juser/user_list.html new file mode 100644 index 000000000..f9ef7c017 --- /dev/null +++ b/templates/juser/user_list.html @@ -0,0 +1,139 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
查看用户
+ +
+ +
+
+ 添加用户 + 删除所选 + +
+ + + + + + + + + + + + + + + + + {% for user in contacts.object_list %} + + + + + + + + + + + + {% endfor %} + +
+ + 用户名姓名部门小组角色激活下载密钥操作
+ + {{ user.username }} {{ user.name }} {{ user.dept.name }} {{ user.group.all | group_str2 }} {{ user.id | get_role }}{{ user.is_active|bool2str }}下载 + 详情 + {% ifequal session_role_id 2 %} + 编辑 + 删除 + {% else %} + 编辑 + 删除 + {% endifequal %} +
+
+
+
+ Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries +
+
+ {% include 'paginator.html' %} +
+
+
+
+
+
+ + + +{% endblock %} diff --git a/templates/link_css.html b/templates/link_css.html new file mode 100644 index 000000000..c5abfaabc --- /dev/null +++ b/templates/link_css.html @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/templates/login.html b/templates/login.html new file mode 100644 index 000000000..00b070ddd --- /dev/null +++ b/templates/login.html @@ -0,0 +1,47 @@ + + + + + + + 登录 | JumpServer + + + + + + + + +
+
+
+

+
+ {% if error %} +
{{ error }}
+ {% endif %} +

Welcome to JumpServer

+
+
+ +
+
+ +
+ + + Forgot password? Contact Administrator. +
+

Copyright Jumpserver.org Organization © 2014-2015

+
+
+ + + + + + + + + diff --git a/templates/nav.html b/templates/nav.html new file mode 100644 index 000000000..7a9874fc2 --- /dev/null +++ b/templates/nav.html @@ -0,0 +1,151 @@ +{% ifequal session_role_id 2 %} + +{% endifequal %} +{% ifequal session_role_id 1 %} + +{% endifequal %} + +{% ifequal session_role_id 0 %} + +{% endifequal %} \ No newline at end of file diff --git a/templates/nav_bar_header.html b/templates/nav_bar_header.html new file mode 100644 index 000000000..d676b1bed --- /dev/null +++ b/templates/nav_bar_header.html @@ -0,0 +1,61 @@ +{% load humanize %} +{% load mytags %} + \ No newline at end of file diff --git a/templates/nav_cat_bar.html b/templates/nav_cat_bar.html new file mode 100644 index 000000000..78c02e9c1 --- /dev/null +++ b/templates/nav_cat_bar.html @@ -0,0 +1,22 @@ +
+
+

{{ header_title }}

+ +
+
+
+
diff --git a/templates/nav_li_profile.html b/templates/nav_li_profile.html new file mode 100644 index 000000000..47c8dcd70 --- /dev/null +++ b/templates/nav_li_profile.html @@ -0,0 +1,47 @@ +{% load mytags %} + + + diff --git a/templates/paginator.html b/templates/paginator.html new file mode 100644 index 000000000..653e89045 --- /dev/null +++ b/templates/paginator.html @@ -0,0 +1,72 @@ +
+
+
    + {% if keyword %} + {% if contacts.has_previous %} + + {% else %} + + {% endif %} + {% ifequal show_first 1 %} +
  • 1...
  • + {% endifequal %} + {% for page in page_range %} + {% ifequal current_page page %} +
  • {{ page }}
  • + {% else %} +
  • {{ page }}
  • + {% endifequal %} + {% endfor %} + {% ifequal show_end 1 %} +
  • ...{{ p.num_pages }}
  • + {% endifequal %} + {% if contacts.has_next %} + + {% else %} + + {% endif %} + + {% else %} + {% if contacts.has_previous %} + + {% else %} + + {% endif %} + {% ifequal show_first 1 %} +
  • 1...
  • + {% endifequal %} + {% for page in page_range %} + {% ifequal current_page page %} +
  • {{ page }}
  • + {% else %} +
  • {{ page }}
  • + {% endifequal %} + {% endfor %} + {% ifequal show_end 1 %} +
  • ...{{ p.num_pages }}
  • + {% endifequal %} + {% if contacts.has_next %} + + {% else %} + + {% endif %} + {% endif %} +
+
+
diff --git a/templates/skin_config.html b/templates/skin_config.html new file mode 100644 index 000000000..2c219ccf0 --- /dev/null +++ b/templates/skin_config.html @@ -0,0 +1,209 @@ +
+
+
+ +
+
+
Configuration
+
+ + Collapse menu + + +
+
+ + +
+
+
+
+ + Fixed sidebar + + +
+
+ + +
+
+
+
+ + Top navbar + + +
+
+ + +
+
+
+
+ + Boxed layout + + +
+
+ + +
+
+
+
+ + Fixed footer + + +
+
+ + +
+
+
+ +
Skins
+ + + +
+
+
+ \ No newline at end of file diff --git a/templates/success.html b/templates/success.html new file mode 100644 index 000000000..d824e613b --- /dev/null +++ b/templates/success.html @@ -0,0 +1,39 @@ + + + + + + + + + Jumpserver | Success + + + + + + + + + + + + +
+

成功

+

{{ msg }}

+ +
+ The server success response the request. Congratulations.
+ You can go back to main page:
首页 +
+
+ + + + + + + + + diff --git a/templates/test.html b/templates/test.html new file mode 100644 index 000000000..3bcdd3174 --- /dev/null +++ b/templates/test.html @@ -0,0 +1,74 @@ + + + + + + +{##} + + + + +

+ 这是段落中的粗体文本。 +

hello

+ +

+ + + + + + + diff --git a/templates/upload.html b/templates/upload.html new file mode 100644 index 000000000..a235d11b2 --- /dev/null +++ b/templates/upload.html @@ -0,0 +1,101 @@ +{% extends 'base.html' %} +{% load mytags %} +{% block content %} +{% include 'nav_cat_bar.html' %} + +
+
+
+
+
+
上传文件
+ +
+
+
+
+
+ +
+ +
+
+
+
+
上传文件到后端服务器的/tmp下,请注意查看
+
+
+
+
+
+
+ + + + + +{% endblock %} \ No newline at end of file diff --git a/webroot/AutoSa/.idea/.name b/webroot/AutoSa/.idea/.name deleted file mode 100644 index ce6809acb..000000000 --- a/webroot/AutoSa/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -AutoSa \ No newline at end of file diff --git a/webroot/AutoSa/.idea/AutoSa.iml b/webroot/AutoSa/.idea/AutoSa.iml deleted file mode 100644 index fed19458a..000000000 --- a/webroot/AutoSa/.idea/AutoSa.iml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/webroot/AutoSa/.idea/dataSources.ids b/webroot/AutoSa/.idea/dataSources.ids deleted file mode 100644 index 272c3562c..000000000 --- a/webroot/AutoSa/.idea/dataSources.ids +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/webroot/AutoSa/.idea/dataSources.xml b/webroot/AutoSa/.idea/dataSources.xml deleted file mode 100644 index 74d15ddf4..000000000 --- a/webroot/AutoSa/.idea/dataSources.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - sqlite.xerial - com.mysql.jdbc.Driver - jdbc:mysql://172.10.10.9/jumpserver - root - dfd8dfcfdfcedfc2dfcbdfde - - - - - diff --git a/webroot/AutoSa/.idea/encodings.xml b/webroot/AutoSa/.idea/encodings.xml deleted file mode 100644 index 7c62b52a1..000000000 --- a/webroot/AutoSa/.idea/encodings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/webroot/AutoSa/.idea/misc.xml b/webroot/AutoSa/.idea/misc.xml deleted file mode 100644 index 0e219b1ba..000000000 --- a/webroot/AutoSa/.idea/misc.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/webroot/AutoSa/.idea/modules.xml b/webroot/AutoSa/.idea/modules.xml deleted file mode 100644 index d41ea4d44..000000000 --- a/webroot/AutoSa/.idea/modules.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/webroot/AutoSa/.idea/scopes/scope_settings.xml b/webroot/AutoSa/.idea/scopes/scope_settings.xml deleted file mode 100644 index 0d5175ca0..000000000 --- a/webroot/AutoSa/.idea/scopes/scope_settings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/webroot/AutoSa/.idea/vcs.xml b/webroot/AutoSa/.idea/vcs.xml deleted file mode 100644 index d2d96f225..000000000 --- a/webroot/AutoSa/.idea/vcs.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/webroot/AutoSa/.idea/workspace.xml b/webroot/AutoSa/.idea/workspace.xml deleted file mode 100644 index f7814c55f..000000000 --- a/webroot/AutoSa/.idea/workspace.xml +++ /dev/null @@ -1,931 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1402282329426 - 1402282329426 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webroot/AutoSa/Assets/models.py b/webroot/AutoSa/Assets/models.py deleted file mode 100644 index 52c6f05ac..000000000 --- a/webroot/AutoSa/Assets/models.py +++ /dev/null @@ -1,27 +0,0 @@ -from django.db import models -from UserManage.models import User - - -class IDC(models.Model): - name = models.CharField(max_length=20) - - def __unicode__(self): - return self.name - - -class Assets(models.Model): - id = models.AutoField(primary_key=True) - ip = models.CharField(max_length=20) - port = models.IntegerField(max_length=5) - idc = models.ForeignKey(IDC) - comment = models.CharField(max_length=100, blank=True, null=True) - - def __unicode__(self): - return '%s ' % self.ip - - -class AssetsUser(models.Model): - uid = models.ForeignKey(User) - aid = models.ForeignKey(Assets) - - diff --git a/webroot/AutoSa/Assets/views.py b/webroot/AutoSa/Assets/views.py deleted file mode 100644 index 91ea44a21..000000000 --- a/webroot/AutoSa/Assets/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/webroot/AutoSa/AutoSa/context_processors.py b/webroot/AutoSa/AutoSa/context_processors.py deleted file mode 100644 index 8d3be3c1e..000000000 --- a/webroot/AutoSa/AutoSa/context_processors.py +++ /dev/null @@ -1,7 +0,0 @@ -#coding:utf-8 - - -def name_proc(request): - name = request.session.get('username') - admin = request.session.get('admin') - return {'name': name, 'admin': admin} \ No newline at end of file diff --git a/webroot/AutoSa/AutoSa/templatetags/mytags.py b/webroot/AutoSa/AutoSa/templatetags/mytags.py deleted file mode 100644 index b267711b0..000000000 --- a/webroot/AutoSa/AutoSa/templatetags/mytags.py +++ /dev/null @@ -1,12 +0,0 @@ -import time -from django import template - -register = template.Library() - - -@register.filter(name='stamp2str') -def stamp2str(value): - try: - return time.strftime('%Y/%m/%d %H:%M:%S', time.localtime(value)) - except AttributeError: - return '0000/00/00 00:00:00' diff --git a/webroot/AutoSa/AutoSa/urls.py b/webroot/AutoSa/AutoSa/urls.py deleted file mode 100644 index f6ca92c95..000000000 --- a/webroot/AutoSa/AutoSa/urls.py +++ /dev/null @@ -1,40 +0,0 @@ -from django.conf.urls import patterns, include, url - -from django.contrib import admin -from AutoSa import views -admin.autodiscover() - -urlpatterns = patterns('', - # Examples: - # url(r'^$', 'AutoSa.views.home', name='home'), - # url(r'^blog/', include('blog.urls')), - - url(r'^admin/', include(admin.site.urls)), - (r'^install/', views.install), - (r'^$', views.index), - (r'^login/$', views.login), - (r'^logout/$', views.logout), - (r'^showUser/$', views.showUser), - (r'^addUser/$', views.addUser), - (r'^chgUser/$', views.chgUser), - (r'^showGroup/$', views.showGroup), - (r'^addGroup/$', views.addGroup), - (r'^chgGroup/$', views.chgGroup), - (r'^showIDC/$', views.showIDC), - (r'^addIDC/$', views.addIDC), - (r'^chgIDC/$', views.chgIDC), - (r'^showSudo/$', views.showSudo), - (r'^chgSudo/$', views.chgSudo), - (r'^showAssets/$', views.showAssets), - (r'^addAssets/$', views.addAssets), - (r'^showPerm/$', views.showPerm), - (r'^addPerm/$', views.addPerm), - (r'^downKey/$', views.downKey), - (r'^chgPass/$', views.chgPass), - (r'^chgKey/$', views.chgKey), - (r'^upFile/$', views.upFile), - (r'^downFile/$', views.downFile), - (r'^logView/$', views.logView), - (r'^logHistory/$', views.logHistory), - (r'^killSession/$', views.killSession), -) diff --git a/webroot/AutoSa/AutoSa/views.py b/webroot/AutoSa/AutoSa/views.py deleted file mode 100644 index ea87a8bc8..000000000 --- a/webroot/AutoSa/AutoSa/views.py +++ /dev/null @@ -1,1134 +0,0 @@ -#coding: utf-8 - -from django.http import HttpResponse -from django.template import RequestContext -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect -from UserManage.models import User, Group, Logs, Pid -from Assets.models import Assets, AssetsUser, IDC -import subprocess -from Crypto.Cipher import AES -from binascii import b2a_hex, a2b_hex -import random -import ConfigParser -import os -import ldap -import ldap.modlist as modlist -import crypt -import hashlib -from UserManage.forms import UserAddForm, GroupAddForm -import paramiko -from django.core.servers.basehttp import FileWrapper -from AutoSa.settings import CONF_DIR -from django.core.paginator import Paginator, InvalidPage, EmptyPage -import time -import datetime - - -cf = ConfigParser.ConfigParser() -cf.read('%s/jumpserver.conf' % CONF_DIR) - -key = cf.get('jumpserver', 'key') -rsa_dir = os.path.join(CONF_DIR, 'keys') -ldap_host = cf.get('jumpserver', 'ldap_host') -ldap_base_dn = cf.get('jumpserver', 'ldap_base_dn') -admin_cn = cf.get('jumpserver', 'admin_cn') -admin_pass = cf.get('jumpserver', 'admin_pass') -log_dir = os.path.join(CONF_DIR, 'logs') -web_socket_host = cf.get('jumpserver', 'web_socket_host') - - -def keygen(num): - """生成随机密码""" - seed = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - salt_list = [] - for i in range(num): - salt_list.append(random.choice(seed)) - salt = ''.join(salt_list) - return salt - - -def bash(cmd): - """执行bash命令""" - return subprocess.call(cmd, shell=True) - - -def md5_crypt(string): - return hashlib.new("md5", string).hexdigest() - - -class PyCrypt(object): - """对称加密解密""" - def __init__(self, key): - self.key = key - self.mode = AES.MODE_CBC - - def encrypt(self, text): - cryptor = AES.new(self.key, self.mode, b'0000000000000000') - length = 16 - count = len(text) - if count < length: - add = (length - count) - text += ('\0' * add) - elif count > length: - add = (length - (count % length)) - text += ('\0' * add) - ciphertext = cryptor.encrypt(text) - return b2a_hex(ciphertext) - - def decrypt(self, text): - cryptor = AES.new(self.key, self.mode, b'0000000000000000') - plain_text = cryptor.decrypt(a2b_hex(text)) - return plain_text.rstrip('\0') - - -def rsa_gen(username, key_pass, rsa_dir=rsa_dir): - rsa_file = '%s/%s' % (rsa_dir, username) - pub_file = '%s.pub' % rsa_file - authorized_file = '/home/%s/.ssh/authorized_keys' % username - if os.path.exists(rsa_file): - os.unlink(rsa_file) - ret = bash('ssh-keygen -t rsa -f %s -P %s &> /dev/null && echo "######## rsa_gen Ok."' % (rsa_file, key_pass)) - if not ret: - try: - if not os.path.isdir('/home/%s/.ssh' % username): - os.mkdir('/home/%s/.ssh' % username) - pub = open(pub_file, 'r') - authorized = open(authorized_file, 'w') - authorized.write(pub.read()) - pub.close() - authorized.close() - except Exception: - return 1 - else: - return 0 - - -class LDAPMgmt(): - def __init__(self, - ldap_host=ldap_host, - ldap_base_dn=ldap_base_dn, - admin_cn=admin_cn, - admin_pass=admin_pass): - self.ldap_host = ldap_host - self.ldap_base_dn = ldap_base_dn - self.admin_cn = admin_cn - self.admin_pass = admin_pass - self.conn = ldap.initialize(ldap_host) - self.conn.set_option(ldap.OPT_REFERRALS, 0) - self.conn.protocol_version = ldap.VERSION3 - self.conn.simple_bind_s(admin_cn, admin_pass) - - def list(self, filter, scope=ldap.SCOPE_SUBTREE, attr=None): - result = {} - try: - ldap_result = self.conn.search_s(self.ldap_base_dn, scope, filter, attr) - for entry in ldap_result: - name, data = entry - for k, v in data.items(): - print '%s: %s' % (k, v) - result[k] = v - return result - except ldap.LDAPError, e: - print e - - def add(self, dn, attrs): - try: - ldif = modlist.addModlist(attrs) - self.conn.add_s(dn, ldif) - except ldap.LDAPError, e: - print e - - def modify(self, dn, attrs): - try: - attr_s = [] - for k, v in attrs.items(): - attr_s.append((2, k, v)) - self.conn.modify_s(dn, attr_s) - except ldap.LDAPError, e: - print e - - def delete(self, dn): - try: - self.conn.delete_s(dn) - except ldap.LDAPError, e: - print e - - -def gen_sha512(salt, password): - return crypt.crypt(password, '$6$%s$' % salt) - - -def group_member(username): - member = [] - user = User.objects.get(username=username) - for group in user.group.all(): - member.extend(group.user_set.all()) - return list(set(member)) - - -def user_assets(username): - assets = [] - user = User.objects.get(username=username) - for asset in user.assetsuser_set.all(): - assets.append(asset.aid) - return assets - - -def login_required(func): - """要求登录的装饰器""" - def _deco(request, *args, **kwargs): - if not request.session.get('username'): - return HttpResponseRedirect('/login/') - return func(request, *args, **kwargs) - return _deco - - -def admin_required(func): - """要求用户是admin的装饰器""" - def _deco(request, *args, **kwargs): - if request.session.get('admin') < 1: - return HttpResponseRedirect('/') - return func(request, *args, **kwargs) - return _deco - - -def superuser_required(func): - """要求用户是superuser""" - def _deco(request, *args, **kwargs): - if request.session.get('admin') != 2: - return HttpResponseRedirect('/') - return func(request, *args, **kwargs) - return _deco - - -def is_admin_role(request): - if request.session.get('admin') > 0: - return True - else: - return False - - -def is_admin_user(request): - if request.session.get('admin') == 1: - return True - else: - return False - - -def is_super_user(request): - if request.session.get('admin') == 2: - return True - else: - return False - - -def install(request): - user = User.objects.filter(username='admin') - if user: - error = '已经安装,请出重复安装.' - return render_to_response('info.html', {'error': error}) - else: - u = User( - id=800, - username='admin', - password=md5_crypt('admin'), - key_pass=md5_crypt('admin'), - name='admin', - is_admin=False, - is_superuser=True, - ldap_password=md5_crypt('admin')) - u.save() - msg = '安装成功' - return render_to_response('info.html', {'msg': msg}) - - -def login(request): - """登录界面""" - if request.session.get('username'): - return HttpResponseRedirect('/') - if request.method == 'GET': - return render_to_response('login.html') - else: - username = request.POST.get('username') - password = request.POST.get('password') - user = User.objects.filter(username=username) - if user: - user = user[0] - if md5_crypt(password) == user.password: - request.session['username'] = username - if user.is_admin: - request.session['admin'] = 1 - elif user.is_superuser: - request.session['admin'] = 2 - else: - request.session['admin'] = 0 - return HttpResponseRedirect('/') - else: - error = '密码错误,请重新输入。' - else: - error = '用户不存在。' - return render_to_response('login.html', {'error': error}) - - -def logout(request): - """注销登录调用""" - if request.session.get('username'): - del request.session['username'] - del request.session['admin'] - return HttpResponseRedirect('/login/') - - -@login_required -def downKey(request): - """下载key""" - username = request.session.get('username') - if request.session.get('admin') == 1: - user = User.objects.get(username=username) - if user in group_member(username): - username = request.GET.get('username') - elif request.session.get('admin') == 2: - username = request.GET.get('username') - - filename = '%s/%s' % (rsa_dir, username) - try: - f = open(filename) - except IOError: - error = u'密钥文件不存在' - return render_to_response('info.html', {'error': error}) - data = f.read() - f.close() - response = HttpResponse(data, content_type='application/octet-stream') - response['Content-Disposition'] = 'attachment; filename=%s.rsa' % username - return response - - -@login_required -def index(request): - """主页""" - username = request.session.get('username') - name = User.objects.filter(username=username) - assets = [] - if name: - user_assets = AssetsUser.objects.filter(uid=name[0]) - if user_assets: - for user_asset in user_assets: - assets.append(user_asset.aid) - return render_to_response('index.html', {'index': 'active', 'assets': assets}, - context_instance=RequestContext(request)) - - -@admin_required -def showUser(request): - """查看所有用户""" - info = '' - error = '' - - if is_super_user(request): - users_all = User.objects.all() - else: - users_all = group_member(request.session.get('username')) - - paginator = Paginator(users_all, 20) - - try: - page = int(request.GET.get('page', 1)) - except ValueError: - page = 1 - - try: - users = paginator.page(page) - except (EmptyPage, InvalidPage): - users = paginator.page(paginator.num_pages) - - if request.method == 'POST': - selected_user = request.REQUEST.getlist('selected') - if selected_user: - for user_id in selected_user: - # 从数据库中删除 - try: - user = User.objects.get(id=user_id) - if user.is_admin or user.is_superuser: - if is_admin_user(request): - return HttpResponseRedirect('/showUser/') - username = user.username - user.delete() - except Exception, e: - error = u'数据库中用户删除错误' + unicode(e) - - # 在bash中删除 - bash_del = bash("userdel -r %s" % username) - if bash_del != 0: - error = u'bash中用户删除错误' - - # 从LDAP中删除 - try: - ldap_del = LDAPMgmt() - user_dn = "uid=%s,ou=People,%s" % (username, ldap_base_dn) - group_dn = "cn=%s,ou=Group,%s" % (username, ldap_base_dn) - sudo_dn = 'cn=%s,ou=Sudoers,%s' % (username, ldap_base_dn) - ldap_del.delete(user_dn) - ldap_del.delete(group_dn) - ldap_del.delete(sudo_dn) - except Exception, e: - error = u'ldap中用户删除错误' + unicode(e) - - if not error: - info = '用户删除成功' - - return render_to_response('showUser.html', - {'users': users, - 'info': info, - 'error': error, - 'user_menu': 'active'}, - context_instance=RequestContext(request)) - - -@admin_required -def addUser(request): - """添加用户""" - msg = '' - form = UserAddForm() - jm = PyCrypt(key) - - if request.method == 'POST': - form = UserAddForm(request.POST) - if form.is_valid(): - user = form.cleaned_data - username = user['username'] - password = user['password'] - key_pass = user['key_pass'] - name = user['name'] - is_admin = user['is_admin'] - is_superuser = user['is_superuser'] - ldap_password = keygen(16) - group_post = user['group'] - groups = [] - - # 如果用户是admin,那么不能委任其他admin或者超级用户 - if is_admin_user(request): - is_admin = False - is_superuser = False - - # 组 - for group_name in group_post: - groups.append(Group.objects.get(name=group_name)) - - # 数据中保存用户,如果失败就返回 - u = User( - username=username, - password=md5_crypt(password), - key_pass=jm.encrypt(key_pass), - name=name, - is_admin=is_admin, - is_superuser=is_superuser, - ldap_password=jm.encrypt(ldap_password)) - try: - u.save() - u.group = groups - u.save() - except Exception, e: - error = u'数据库插入用户错误' + unicode(e) - return render_to_response('addUser.html', {'user_menu': 'active', 'form': form, 'error': error}, - context_instance=RequestContext(request)) - - # 系统中添加用户 - ret_add = bash('useradd %s' % username) - ret_passwd = bash('echo %s | passwd --stdin %s' % (password, username)) - ret_rsa = rsa_gen(username, key_pass) - - if [ret_add, ret_passwd, ret_rsa].count(0) < 3: - error = u'跳板机添加用户失败' - bash('userdel -r %s' % username) - u.delete() - return render_to_response('addUser.html', {'user_menu': 'active', 'form': form, 'error': error}, - context_instance=RequestContext(request)) - - # 添加到ldap中 - user_dn = "uid=%s,ou=People,%s" % (username, ldap_base_dn) - password_sha512 = gen_sha512(keygen(6), ldap_password) - user_attr = { - 'uid': [str(username)], - 'cn': [str(username)], - 'objectClass': ['account', 'posixAccount', 'top', 'shadowAccount'], - 'userPassword': ['{crypt}%s' % password_sha512], - 'shadowLastChange': ['16328'], - 'shadowMin': ['0'], - 'shadowMax': ['99999'], - 'shadowWarning': ['7'], - 'loginShell': ['/bin/bash'], - 'uidNumber': [str(u.id)], - 'gidNumber': [str(u.id)], - 'homeDirectory': [str('/home/%s' % username)]} - - group_dn = "cn=%s,ou=Group,%s" % (username, ldap_base_dn) - group_attr = { - 'objectClass': ['posixGroup', 'top'], - 'cn': [str(username)], - 'userPassword': ['{crypt}x'], - 'gidNumber': [str(u.id)] - } - - sudo_dn = 'cn=%s,ou=Sudoers,%s' % (username, ldap_base_dn) - sudo_attr = { - 'objectClass': ['top'], - 'objectClass': ['sudoRole'], - 'cn': ['%s' % str(username)], - 'sudoCommand': ['/bin/pwd'], - 'sudoHost': ['192.168.1.1'], - 'sudoOption': ['!authenticate'], - 'sudoRunAsUser': ['root'], - 'sudoUser': ['%s' % str(username)] - } - ldap_conn = LDAPMgmt() - try: - ldap_conn.add(user_dn, user_attr) - ldap_conn.add(group_dn, group_attr) - ldap_conn.add(sudo_dn, sudo_attr) - except Exception, e: - error = u'添加ladp用户失败' + unicode(e) - try: - bash('userdel -r %s' % username) - u.delete() - ldap_conn.delete(user_dn) - ldap_conn.delete(group_dn) - ldap_conn.delete(sudo_dn) - except Exception: - pass - return render_to_response('addUser.html', {'user_menu': 'active', 'form': form, 'error': error}, - context_instance=RequestContext(request)) - - msg = u'添加用户成功' - return render_to_response('addUser.html', {'user_menu': 'active', 'form': form, 'msg': msg}, - context_instance=RequestContext(request)) - - -@admin_required -def chgUser(request): - """修改用户信息""" - error = '' - msg = '' - - if request.method == "GET": - username = request.GET.get('username') - if not username: - return HttpResponseRedirect('/showUser/') - user = User.objects.get(username=username) - ori_is_admin = "checked" if user.is_admin else '' - ori_is_superuser = 'checked' if user.is_superuser else '' - all_groups = Group.objects.all() - - return render_to_response('chgUser.html', - {'user': user, 'user_menu': 'active', 'is_admin': ori_is_admin, - 'is_superuser': ori_is_superuser, 'groups': all_groups}, - context_instance=RequestContext(request)) - else: - username = request.POST.get('username') - name = request.POST.get('name') - is_admin = request.POST.get('is_admin') - is_superuser = request.POST.get('is_superuser') - group_post = request.REQUEST.getlist('group') - groups = [] - user = User.objects.get(username=username) - - # 属组的获取 - for group_name in group_post: - groups.append(Group.objects.get(name=group_name)) - - # 如果用户是admin,那么不能委任其他admin或者超级用户 - if is_admin_user(request): - is_admin = False - is_superuser = False - else: - is_admin = True if is_admin else False - is_superuser = True if is_superuser else False - - if '' in [username, name, group_post]: - error = u'带*内容不能为空' - - if error: - return render_to_response('info.html', {'error': error}) - - u = User.objects.get(username=username) - u.name = name - u.is_admin = is_admin - u.is_superuser = is_superuser - u.group = groups - - u.save() - msg = u'修改用户信息成功' - return render_to_response('info.html', {'msg': msg}) - - -@superuser_required -def addGroup(request): - error = '' - msg = '' - if request.method == 'POST': - group_name = request.POST.get('name') - if group_name: - group = Group(name=group_name) - group.save() - msg = u'%s 属组添加成功' % group_name - else: - error = u'不能为空' - return render_to_response('addGroup.html', - {'error': error, 'msg': msg, 'user_menu': 'active'}, - context_instance=RequestContext(request)) - - -@superuser_required -def showGroup(request): - error = '' - msg = '' - groups = Group.objects.all() - if request.method == 'POST': - selected_group = request.REQUEST.getlist('selected') - if selected_group: - for group_id in selected_group: - group = Group.objects.get(id=group_id) - group.delete() - msg = '删除成功' - else: - error = '请选择删除的组' - - return render_to_response('showGroup.html', {'error': error, 'msg': msg, 'groups': groups, 'user_menu': 'active'}, - context_instance=RequestContext(request)) - - -@superuser_required -def chgGroup(request): - error = '' - msg = '' - if request.method == 'GET': - group_id = request.GET.get('id', None) - if group_id: - group = Group.objects.get(id=group_id) - else: - return HttpResponseRedirect('/showGroup/') - else: - group_id = request.POST.get('id') - group_name = request.POST.get('name') - - if not group_name: - error = u'不能为空' - return render_to_response('info.html', {'error': error}) - else: - group = Group.objects.get(id=group_id) - group.name = group_name - group.save() - msg = u'修改成功' - - return render_to_response('chgGroup.html', {'group': group, 'error': error, 'msg': msg, 'user_menu': 'active'}, - context_instance=RequestContext(request)) - - -@superuser_required -def showIDC(request): - error = '' - msg = '' - idcs = IDC.objects.all() - - if request.method == 'POST': - selected_idc = request.REQUEST.getlist('selected') - if selected_idc: - for idc_id in selected_idc: - idc = IDC.objects.get(id=idc_id) - idc.delete() - msg = '删除成功' - - return render_to_response('showIDC.html', - {'idcs': idcs, 'error': error, 'msg': msg, 'asset_menu': 'active'}, - context_instance=RequestContext(request)) - - -@superuser_required -def chgIDC(request): - error = '' - msg = '' - if request.method == 'GET': - idc_id = request.GET.get('id', None) - if not idc_id: - return HttpResponseRedirect('/showIDC/') - else: - idc = IDC.objects.get(id=idc_id) - else: - idc_id = request.POST.get('id') - idc_name = request.POST.get('name') - if not idc_name: - error = u'不能为空' - return render_to_response('info.html', {'error': error}) - else: - idc = Group.objects.get(id=idc_id) - idc.name = idc_name - idc.save() - msg = u'修改成功' - - return render_to_response('chgGroup.html', {'idc': idc, 'error': error, 'msg': msg, 'asset_menu': 'active'}, - context_instance=RequestContext(request)) - - -@superuser_required -def addIDC(request): - error = '' - msg = '' - if request.method == 'POST': - idc_name = request.POST.get('name') - if idc_name: - idc = IDC(name=idc_name) - idc.save() - msg = u'%s IDC添加成功' % idc_name - else: - error = u'不能为空' - return render_to_response('addIDC.html', - {'error': error, 'msg': msg, 'user_menu': 'active'}, - context_instance=RequestContext(request)) - -@admin_required -def showSudo(request): - if request.method == 'GET': - username = request.GET.get('username') - if not username: - return HttpResponseRedirect('/showUser/') - l = LDAPMgmt() - result = l.list('entryDN=cn=%s,ou=Sudoers,%s' % (str(username), ldap_base_dn), attr=['sudoHost', 'sudoCommand']) - sudoHost = result.get('sudoHost') - sudoCommand = result.get('sudoCommand') - return render_to_response('showSudo.html', - {'username': username, - 'sudoHost': sudoHost, - 'sudoCommand': sudoCommand, - 'user_menu': 'active'}, - context_instance=RequestContext(request)) - -@admin_required -def chgSudo(request): - if request.method == 'GET': - username = request.GET.get('username') - if not username: - return HttpResponseRedirect('/showUser/') - return render_to_response('chgSudo.html', - {'username': username, - 'user_menu': 'active', - }, - context_instance=RequestContext(request)) - else: - l = LDAPMgmt() - username = request.POST.get('username') - user_dn = 'cn=%s,ou=Sudoers,%s' % (str(username), ldap_base_dn) - msg = '' - if request.POST.get('add_host') or request.POST.get('del_host'): - host = request.POST.get('add_host') if request.POST.get('add_host') else request.POST.get('del_host') - hosts = str(host).split(',') - ori_hosts = l.list('entryDN=cn=%s,ou=Sudoers,%s' % - (str(username), ldap_base_dn), attr=['sudoHost']).get('sudoHost') - - if request.POST.get('add_host'): - if not ori_hosts: - ori_hosts = [] - ori_hosts.extend(hosts) - new_hosts = list(set(ori_hosts)) - else: - new_hosts = list(set(ori_hosts) - set(hosts)) - l.modify(user_dn, {'sudoHost': new_hosts}) - - msg = '修改sudo主机成功' % hosts - - if request.POST.get('add_cmd') or request.POST.get('del_cmd'): - cmd = request.POST.get('add_cmd') if request.POST.get('add_cmd') else request.POST.get('del_cmd') - cmds = str(cmd).split(',') - ori_cmds = l.list('entryDN=cn=%s,ou=Sudoers,%s' % - (str(username), ldap_base_dn), attr=['sudoCommand']).get('sudoCommand') - if request.POST.get('add_cmd'): - if not ori_cmds: - ori_cmds = [] - ori_cmds.extend(cmds) - new_cmds = list(set(ori_cmds)) - else: - new_cmds = list(set(ori_cmds) - set(cmds)) - - l.modify(user_dn, {'sudoCommand': new_cmds}) - msg = '修改sudo命令成功' - - if msg: - return render_to_response('info.html', - {'msg': msg}) - else: - return HttpResponseRedirect('/chgSudo/?username=%s' % username) - - - -@admin_required -def showAssets(request): - """查看服务器""" - info = '' - if request.session.get('admin') < 2: - assets_all = [] - username = request.session.get('username') - user = User.objects.get(username=username) - for asset in user.assetsuser_set.all(): - assets_all.append(asset.aid) - else: - assets_all = Assets.objects.all().order_by('ip') - paginator = Paginator(assets_all, 20) - - try: - page = int(request.GET.get('page', 1)) - except ValueError: - page = 1 - - try: - assets = paginator.page(page) - except (EmptyPage, InvalidPage): - assets = paginator.page(paginator.num_pages) - - if request.method == 'POST': - if request.session.get('admin') < 2: - return HttpResponseRedirect('/showAssets/') - assets_del = request.REQUEST.getlist('selected') - for asset_id in assets_del: - asset_del = Assets.objects.get(id=asset_id) - asset_del.delete() - info = '主机信息删除成功!' - return render_to_response('showAssets.html', {'assets': assets, 'info': info, 'asset_menu': 'active'}, - context_instance=RequestContext(request)) - - -@superuser_required -def addAssets(request): - """添加服务器""" - error = '' - msg = '' - idcs = IDC.objects.all() - if request.method == 'POST': - ip = request.POST.get('ip') - port = request.POST.get('port') - idc = request.POST.get('idc') - comment = request.POST.get('comment') - - if '' in (ip, port, idc): - error = '带*号内容不能为空。' - elif Assets.objects.filter(ip=ip): - error = '主机已存在。' - if not error: - idc = IDC.objects.get(id=idc) - asset = Assets(ip=ip, port=port, idc=idc, comment=comment) - asset.save() - msg = u'%s 添加成功' % ip - - return render_to_response('addAssets.html', {'msg': msg, 'error': error, 'idcs': idcs, 'asset_menu': 'active'}, - context_instance=RequestContext(request)) - - -@admin_required -def showPerm(request): - """查看权限""" - if is_super_user(request): - users = User.objects.all() - else: - users = group_member(request.session.get('username')) - - if request.method == 'POST': - assets_del = request.REQUEST.getlist('selected') - username = request.POST.get('username') - user = User.objects.get(username=username) - - for asset_id in assets_del: - asset = Assets.objects.get(id=int(asset_id)) - asset_user_del = AssetsUser.objects.get(uid=user, aid=asset) - asset_user_del.delete() - return HttpResponseRedirect('/showPerm/?username=%s' % username) - - elif request.method == 'GET': - if request.GET.get('username'): - username = request.GET.get('username') - user = User.objects.get(username=username) - assets_user = AssetsUser.objects.filter(uid=user.id) - return render_to_response('perms.html', - {'user': user, 'assets': assets_user, 'perm_menu': 'active'}, - context_instance=RequestContext(request)) - return render_to_response('showPerm.html', {'users': users, 'perm_menu': 'active'}, - context_instance=RequestContext(request)) - - -@admin_required -def addPerm(request): - """增加授权""" - if is_super_user(request): - users = User.objects.all() - else: - users = group_member(request.session.get('username')) - - have_assets = [] - if request.method == 'POST': - username = request.POST.get('username') - assets_id = request.REQUEST.getlist('asset') - user = User.objects.get(username=username) - for asset_id in assets_id: - asset = Assets.objects.get(id=asset_id) - asset_user = AssetsUser(uid=user, aid=asset) - asset_user.save() - return HttpResponseRedirect('/addPerm/?username=%s' % username) - - elif request.method == 'GET': - if request.GET.get('username'): - username = request.GET.get('username') - user = User.objects.get(username=username) - assets_user = AssetsUser.objects.filter(uid=user.id) - for asset_user in assets_user: - have_assets.append(asset_user.aid) - - if request.session.get('admin') == 2: - all_assets = Assets.objects.all() - else: - all_assets = user_assets(request.session.get('username')) - other_assets = list(set(all_assets) - set(have_assets)) - return render_to_response('addUserPerm.html', - {'user': user, 'assets': other_assets, 'perm_menu': 'active'}, - context_instance=RequestContext(request)) - - return render_to_response('addPerm.html', - {'users': users, 'perm_menu': 'active'}, - context_instance=RequestContext(request)) - - -@login_required -def chgPass(request): - """修改登录密码""" - error = '' - msg = '' - is_self = False - - if request.method == 'GET': - if is_admin_role(request): - username = request.GET.get('username') - else: - username = request.session.get('username') - is_self = True - - return render_to_response('chgPass.html', - {'username': username, 'is_self': is_self, 'user_menu': 'active'}, - context_instance=RequestContext(request)) - else: - username = request.POST.get('username') - user = User.objects.get(username=username) - password = request.POST.get('password') - password_again = request.POST.get('password_again') - - if not is_admin_role(request): - oldpass = request.POST.get('oldpass') - if md5_crypt(oldpass) != user.password: - error = '原来密码不正确' - - if password != password_again: - error = '密码不匹配' - - if error: - return render_to_response('info.html', {'error': error}) - - user.password = md5_crypt(password) - user.save() - - return render_to_response('info.html', {'msg': '修改密码成功'}) - - -@login_required -def chgKey(request): - """修改密钥密码""" - error = '' - msg = '' - is_self = False - - if request.method == 'GET': - if is_admin_role(request): - username = request.GET.get('username') - else: - username = request.session.get('username') - is_self = True - - return render_to_response('chgKey.html', - {'username': username, 'is_self': is_self, 'user_menu': 'active'}, - context_instance=RequestContext(request)) - else: - username = request.POST.get('username') - user = User.objects.get(username=username) - password = request.POST.get('password') - password_again = request.POST.get('password_again') - jm = PyCrypt(key) - - if not is_admin_role(request): - oldpass = request.POST.get('oldpass') - if jm.encrypt(oldpass) != user.key_pass: - error = '原来密码不正确' - - if password != password_again: - error = '密码不匹配' - - if len(password) < 5: - error = '密码长度需要>5' - - if error: - return render_to_response('info.html', {'error': error}) - - keyfile = '%s/%s' % (rsa_dir, username) - ret = bash('ssh-keygen -p -P %s -N %s -f %s' % (jm.decrypt(user.key_pass), password, keyfile)) - if ret != 0: - error = '更改私钥密码错误' - return render_to_response('info.html', {'error': error}) - user.key_pass = jm.encrypt(password) - user.save() - - return render_to_response('info.html', {'msg': '修改密码成功'}) - - -@login_required -def upFile(request): - username = request.session.get('username') - msg = '' - error = '' - upload_dir = '/tmp/upload/%s' % username - if request.method == 'POST': - host = request.POST.get('host') - path = request.POST.get('path') - upload_file = request.FILES.get('file', None) - - if upload_file: - if not os.path.exists(upload_dir): - os.makedirs(upload_dir) - filename = '%s/%s' % (upload_dir, upload_file.name) - f = open(filename, 'wb') - for chunk in upload_file.chunks(): - f.write(chunk) - f.close() - asset = Assets.objects.get(ip=host) - if asset: - port = asset.port - jm = PyCrypt(key) - user = User.objects.get(username=username) - try: - t = paramiko.Transport((host, port)) - t.connect(username=username, password=jm.decrypt(user.ldap_password)) - sftp = paramiko.SFTPClient.from_transport(t) - sftp.put(filename, '%s/%s' % (path, upload_file.name)) - msg = u'上传成功,位于 %s主机,位置 %s.' % (host, path) - uplog_dir = os.path.join(log_dir, 'upload') - if not os.path.isdir(uplog_dir): - os.mkdir(uplog_dir) - filename = os.path.join(uplog_dir, '%s.log' % time.strftime('%Y%m%d')) - f = open(filename, 'a') - f.write('DateTime: %s User: %s Host: %s File: %s\n' % - (time.strftime('%Y/%m/%d %H:%M:%S'), username, host, path)) - f.close() - except paramiko.AuthenticationException: - error = u'密码不对 或者 你用的admin用户' - - return render_to_response('info.html', {'msg': msg, 'error': error}) - else: - return render_to_response('info.html', {'error': u"上传失败"}) - - return render_to_response('upFile.html', - {'username': username}, - context_instance=RequestContext(request)) - - -@login_required -def downFile(request): - username = request.session.get('username') - if request.method == 'POST': - host = request.POST.get('host') - path = request.POST.get('path') - download_dir = '/tmp/download/%s' % username - download_file = '%s/%s' % (download_dir, os.path.basename(path)) - if not os.path.exists(download_dir): - os.makedirs(download_dir) - asset = Assets.objects.get(ip=host) - jm = PyCrypt(key) - port = asset.port - user = User.objects.get(username=username) - t = paramiko.Transport((host, port)) - t.connect(username=username, password=jm.decrypt(user.ldap_password)) - sftp = paramiko.SFTPClient.from_transport(t) - sftp.get(path, download_file) - if os.path.isfile(download_file): - downlog_dir = os.path.join(log_dir, 'download') - if not os.path.isdir(downlog_dir): - os.mkdir(downlog_dir) - filename = os.path.join(downlog_dir, '%s.log' % time.strftime('%Y%m%d')) - f = open(filename, 'a') - f.write('DateTime: %s User: %s Host: %s File: %s\n' % - (time.strftime('%Y/%m/%d %H:%M:%S'), username, host, path)) - f.close() - wrapper = FileWrapper(open(download_file)) - response = HttpResponse(wrapper, content_type='application/octet-stream') - response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(path) - return response - - return render_to_response('downFile.html', - {'username': username}, - context_instance=RequestContext(request)) - - -@admin_required -def logView(request): - thirtyDayAgo = (datetime.datetime.now() - datetime.timedelta(30)) - thirtyDayAgoStamp = int(time.mktime(thirtyDayAgo.timetuple())) - logs_all = Logs.objects.filter(start_time__gt=thirtyDayAgoStamp).order_by("-id") - paginator = Paginator(logs_all, 20) - - try: - page = int(request.GET.get('page', 1)) - except ValueError: - page = 1 - - try: - logs = paginator.page(page) - except (EmptyPage, InvalidPage): - logs = paginator.page(paginator.num_pages) - - return render_to_response('logView.html', - {'logs': logs, 'web_socket_host': web_socket_host}, - context_instance=RequestContext(request)) - - -@admin_required -def logHistory(request): - if request.method == 'GET': - logid = request.GET.get('id', 0) - log = Logs.objects.filter(id=int(logid)) - if log: - log = log[0] - log_his = "%s.his" % log.logfile - if os.path.isfile(log_his): - f = open(log_his) - content = f.read() - return HttpResponse(content) - - -@admin_required -def killSession(request): - if request.method == 'GET': - logid = request.GET.get('id', 0) - pid = Pid.objects.filter(logid=logid) - if pid: - pid = pid[0] - os.kill(pid.cpid, 9) - return render_to_response('info.html', {'msg': u'结束会话成功,返回中.'}) - - - - - - - - - - - - - - - - - - - diff --git a/webroot/AutoSa/UserManage/forms.py b/webroot/AutoSa/UserManage/forms.py deleted file mode 100644 index 9c376d0ee..000000000 --- a/webroot/AutoSa/UserManage/forms.py +++ /dev/null @@ -1,48 +0,0 @@ -# coding: utf-8 - -from django import forms -from UserManage.models import Group - - -class GroupAddForm(forms.Form): - name = forms.CharField(max_length=30) - - -class UserAddForm(forms.Form): - username = forms.CharField(max_length=30, - widget=forms.TextInput( - attrs={'class': 'form-control', 'placeholder': '用户名'})) - password = forms.CharField(max_length=30, - widget=forms.PasswordInput( - attrs={'class': 'form-control', 'placeholder': '密码'})) - password_again = forms.CharField(max_length=30, - widget=forms.PasswordInput( - attrs={'class': 'form-control', 'placeholder': '确认密码'})) - key_pass = forms.CharField(max_length=30, min_length=6, - widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': '密钥密码'})) - key_pass_again = forms.CharField(max_length=30, - widget=forms.PasswordInput( - attrs={'class': 'form-control', 'placeholder': '确认密码'})) - name = forms.CharField(max_length=30, - widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': '姓名'})) - group = forms.ModelMultipleChoiceField(queryset=Group.objects.all(), - widget=forms.SelectMultiple(attrs={'class': 'form-control'})) - is_admin = forms.BooleanField(required=False) - is_superuser = forms.BooleanField(required=False) - - def clean_password_again(self): - password = self.cleaned_data['password'] - password_again = self.cleaned_data['password_again'] - - if password != password_again: - raise forms.ValidationError(u'密码二次输入不一致. ') - return password_again - - def clean_key_pass_again(self): - key_pass = self.data['key_pass'] - key_pass_again = self.data['key_pass_again'] - if key_pass != key_pass_again: - raise forms.ValidationError(u'密码二次输入不一致. ') - if len(key_pass) < 6: - raise forms.ValidationError(u'密码二次输入不一致. ') - return key_pass_again \ No newline at end of file diff --git a/webroot/AutoSa/UserManage/models.py b/webroot/AutoSa/UserManage/models.py deleted file mode 100644 index 1d17012ae..000000000 --- a/webroot/AutoSa/UserManage/models.py +++ /dev/null @@ -1,48 +0,0 @@ -from django.db import models - - -class Group(models.Model): - name = models.CharField(max_length=50, unique=True) - - def __unicode__(self): - return self.name - - -class User(models.Model): - username = models.CharField(max_length=50, unique=True) - password = models.CharField(max_length=100) - key_pass = models.CharField(max_length=100) - name = models.CharField(max_length=50) - group = models.ManyToManyField(Group) - is_admin = models.BooleanField(default=False) - is_superuser = models.BooleanField(default=False) - ldap_password = models.CharField(max_length=100, null=False) - email = models.EmailField(max_length=50, null=True, blank=True) - - def __unicode__(self): - return self.username - - -class Logs(models.Model): - user = models.CharField(max_length=50) - host = models.CharField(max_length=20) - logfile = models.CharField(max_length=1000) - finish = models.SmallIntegerField(max_length=4, default=0) - ppid = models.IntegerField() - start_time = models.IntegerField() - end_time = models.IntegerField(default=0) - - def __unicode__(self): - return self.logfile - - -class Pid(models.Model): - """ - ppid : parent pid - cpid: child pid - """ - ppid = models.IntegerField() - cpid = models.IntegerField() - logid = models.IntegerField() - start_time = models.IntegerField() - diff --git a/webroot/AutoSa/UserManage/views.py b/webroot/AutoSa/UserManage/views.py deleted file mode 100644 index 91ea44a21..000000000 --- a/webroot/AutoSa/UserManage/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/webroot/AutoSa/__init__.py b/webroot/AutoSa/__init__.py deleted file mode 100644 index 35b4ebd59..000000000 --- a/webroot/AutoSa/__init__.py +++ /dev/null @@ -1 +0,0 @@ -#coding:utf-8 diff --git a/webroot/AutoSa/log_handler.py b/webroot/AutoSa/log_handler.py deleted file mode 100755 index f84ab7bbe..000000000 --- a/webroot/AutoSa/log_handler.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/python -#coding: utf-8 - -import os -import sys -import time - -cur_dir = os.path.dirname(__file__) -sys.path.append('%s/webroot/AutoSa/' % cur_dir) -os.environ['DJANGO_SETTINGS_MODULE'] = 'AutoSa.settings' - -import django -django.setup() -from UserManage.models import Logs, Pid - - -def log_hanler(logid): - log = Logs.objects.filter(id=logid) - if log: - log = log[0] - filename = log.logfile - if os.path.isfile(filename): - ret1 = os.system('cat %s | grep "DateTime" > %s.his' % (filename, filename)) - ret2 = os.system('cat %s | grep "\[.*@.*\][\$\#]" >> %s.his' % (filename, filename)) - ret3 = os.system('cat %s | grep "EndTime" >> %s.his' % (filename, filename)) - if (ret1 + ret2 + ret3) == 0: - print 'Handler %s ok.' % filename - - -def set_finish(id): - logs = Logs.objects.filter(id=id, finish=0) - if logs: - structtime_start = time.localtime() - timestamp_end = int(time.mktime(structtime_start)) - log = logs[0] - log.finish = 1 - log.end_time = timestamp_end - log.save() - - -def kill_pid(pid): - try: - os.kill(pid, 9) - except OSError: - pass - - -def pid_exist(pid): - pid_dir = "/proc/%s" % pid - if os.path.isdir(pid_dir): - return True - else: - return False - - -def del_pid(pid_id): - pid = Pid.objects.filter(id=pid_id) - if pid: - pid[0].delete() - - -def get_pids(): - pids = [] - pids_obj = Pid.objects.all() - for pid_obj in pids_obj: - pids.append((pid_obj.id, pid_obj.ppid, pid_obj.cpid, pid_obj.logid, pid_obj.start_time)) - return pids - - -def run(): - for pid_id, ppid, cpid, logid, start_time in get_pids(): - if pid_exist(cpid): - if pid_exist(ppid): - structtime_start = time.localtime() - timestamp_end = int(time.mktime(structtime_start)) - if timestamp_end - start_time > 7200: - kill_pid(ppid) - kill_pid(cpid) - del_pid(pid_id) - set_finish(logid) - log_hanler(logid) - else: - kill_pid(cpid) - del_pid(pid_id) - set_finish(logid) - log_hanler(logid) - else: - del_pid(pid_id) - set_finish(logid) - log_hanler(logid) - - -if __name__ == '__main__': - while True: - run() - time.sleep(0.5) diff --git a/webroot/AutoSa/static/css/bootstrap-dialog.css b/webroot/AutoSa/static/css/bootstrap-dialog.css deleted file mode 100644 index 32a001d07..000000000 --- a/webroot/AutoSa/static/css/bootstrap-dialog.css +++ /dev/null @@ -1,120 +0,0 @@ -.bootstrap-dialog { - -} -.bootstrap-dialog .modal-header { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} -.bootstrap-dialog .bootstrap-dialog-title { - color: #fff; - display: inline-block; -} -.bootstrap-dialog.type-default .bootstrap-dialog-title { - color: #333; -} -.bootstrap-dialog.size-normal .bootstrap-dialog-title { - font-size: 16px; -} -.bootstrap-dialog.size-large .bootstrap-dialog-title { - font-size: 24px; -} -.bootstrap-dialog .bootstrap-dialog-close-button { - float: right; - filter:alpha(opacity=90); - -moz-opacity:0.9; - -khtml-opacity: 0.9; - opacity: 0.9; -} -.bootstrap-dialog.size-normal .bootstrap-dialog-close-button { - font-size: 20px; -} -.bootstrap-dialog.size-large .bootstrap-dialog-close-button { - font-size: 30px; -} -.bootstrap-dialog .bootstrap-dialog-close-button:hover { - cursor: pointer; - filter: alpha(opacity=100); - -moz-opacity: 1; - -khtml-opacity: 1; - opacity: 1; -} -.bootstrap-dialog.size-normal .bootstrap-dialog-message { - font-size: 14px; -} -.bootstrap-dialog.size-large .bootstrap-dialog-message { - font-size: 18px; -} -.bootstrap-dialog.type-default .modal-header { - background-color: #fff; -} -.bootstrap-dialog.type-info .modal-header { - background-color: #5bc0de; -} -.bootstrap-dialog.type-primary .modal-header { - background-color: #428bca; -} -.bootstrap-dialog.type-success .modal-header { - background-color: #5cb85c; -} -.bootstrap-dialog.type-warning .modal-header { - background-color: #f0ad4e; -} -.bootstrap-dialog.type-danger .modal-header { - background-color: #d9534f; -} -.bootstrap-dialog .bootstrap-dialog-button-icon { - margin-right: 3px; -} - -/** - * Icon animation - * Copied from font-awesome: http://fontawesome.io/ - **/ -.icon-spin { - display: inline-block; - -moz-animation: spin 2s infinite linear; - -o-animation: spin 2s infinite linear; - -webkit-animation: spin 2s infinite linear; - animation: spin 2s infinite linear; -} -@-moz-keyframes spin { - 0% { - -moz-transform: rotate(0deg); -} -100% { - -moz-transform: rotate(359deg); -} -} -@-webkit-keyframes spin { - 0% { - -webkit-transform: rotate(0deg); -} -100% { - -webkit-transform: rotate(359deg); -} -} -@-o-keyframes spin { - 0% { - -o-transform: rotate(0deg); -} -100% { - -o-transform: rotate(359deg); -} -} -@-ms-keyframes spin { - 0% { - -ms-transform: rotate(0deg); -} -100% { - -ms-transform: rotate(359deg); -} -} -@keyframes spin { - 0% { - transform: rotate(0deg); -} -100% { - transform: rotate(359deg); -} -} -/** End of icon animation **/ \ No newline at end of file diff --git a/webroot/AutoSa/static/css/bootstrap-theme.css b/webroot/AutoSa/static/css/bootstrap-theme.css deleted file mode 100644 index df2d3d967..000000000 --- a/webroot/AutoSa/static/css/bootstrap-theme.css +++ /dev/null @@ -1,397 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -.btn-default, -.btn-primary, -.btn-success, -.btn-info, -.btn-warning, -.btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.btn-default:active, -.btn-primary:active, -.btn-success:active, -.btn-info:active, -.btn-warning:active, -.btn-danger:active, -.btn-default.active, -.btn-primary.active, -.btn-success.active, -.btn-info.active, -.btn-warning.active, -.btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn:active, -.btn.active { - background-image: none; -} - -.btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%); - background-repeat: repeat-x; - border-color: #dbdbdb; - border-color: #ccc; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-default:hover, -.btn-default:focus { - background-color: #e0e0e0; - background-position: 0 -15px; -} - -.btn-default:active, -.btn-default.active { - background-color: #e0e0e0; - border-color: #dbdbdb; -} - -.btn-primary { - background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); - background-repeat: repeat-x; - border-color: #2b669a; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:focus { - background-color: #2d6ca2; - background-position: 0 -15px; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #2d6ca2; - border-color: #2b669a; -} - -.btn-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); - background-repeat: repeat-x; - border-color: #3e8f3e; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:focus { - background-color: #419641; - background-position: 0 -15px; -} - -.btn-success:active, -.btn-success.active { - background-color: #419641; - border-color: #3e8f3e; -} - -.btn-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); - background-repeat: repeat-x; - border-color: #e38d13; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:focus { - background-color: #eb9316; - background-position: 0 -15px; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #eb9316; - border-color: #e38d13; -} - -.btn-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); - background-repeat: repeat-x; - border-color: #b92c28; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:focus { - background-color: #c12e2a; - background-position: 0 -15px; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #c12e2a; - border-color: #b92c28; -} - -.btn-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); - background-repeat: repeat-x; - border-color: #28a4c9; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:focus { - background-color: #2aabd2; - background-position: 0 -15px; -} - -.btn-info:active, -.btn-info.active { - background-color: #2aabd2; - border-color: #28a4c9; -} - -.thumbnail, -.img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - background-color: #e8e8e8; - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - background-color: #357ebd; - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); -} - -.navbar-default { - background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); - background-repeat: repeat-x; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); -} - -.navbar-default .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); -} - -.navbar-brand, -.navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); -} - -.navbar-inverse { - background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.navbar-inverse .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #222222 0%, #282828 100%); - background-image: linear-gradient(to bottom, #222222 0%, #282828 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); -} - -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar-static-top, -.navbar-fixed-top, -.navbar-fixed-bottom { - border-radius: 0; -} - -.alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.alert-success { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - background-repeat: repeat-x; - border-color: #b2dba1; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); -} - -.alert-info { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - background-repeat: repeat-x; - border-color: #9acfea; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); -} - -.alert-warning { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - background-repeat: repeat-x; - border-color: #f5e79e; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); -} - -.alert-danger { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - background-repeat: repeat-x; - border-color: #dca7a7; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); -} - -.progress { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); -} - -.progress-bar { - background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); -} - -.progress-bar-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); -} - -.progress-bar-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); -} - -.progress-bar-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); -} - -.progress-bar-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); -} - -.list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); -} - -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - text-shadow: 0 -1px 0 #3071a9; - background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); - background-repeat: repeat-x; - border-color: #3278b3; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); -} - -.panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.panel-default > .panel-heading { - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); -} - -.panel-primary > .panel-heading { - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); -} - -.panel-success > .panel-heading { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); -} - -.panel-info > .panel-heading { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); -} - -.panel-warning > .panel-heading { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); -} - -.panel-danger > .panel-heading { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); -} - -.well { - background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - background-repeat: repeat-x; - border-color: #dcdcdc; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); -} \ No newline at end of file diff --git a/webroot/AutoSa/static/css/bootstrap-theme.min.css b/webroot/AutoSa/static/css/bootstrap-theme.min.css deleted file mode 100644 index c7b6d39b4..000000000 --- a/webroot/AutoSa/static/css/bootstrap-theme.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe0e0e0',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);background-repeat:repeat-x;border-color:#2b669a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff2d6ca2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff419641',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffeb9316',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);background-repeat:repeat-x;border-color:#b92c28;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc12e2a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2aabd2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff3f3f3',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff282828',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} \ No newline at end of file diff --git a/webroot/AutoSa/static/css/bootstrap.css b/webroot/AutoSa/static/css/bootstrap.css deleted file mode 100644 index 377dff300..000000000 --- a/webroot/AutoSa/static/css/bootstrap.css +++ /dev/null @@ -1,7118 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -/*! normalize.css v2.1.3 | MIT License | git.io/normalize */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; -} - -audio, -canvas, -video { - display: inline-block; -} - -audio:not([controls]) { - display: none; - height: 0; -} - -[hidden], -template { - display: none; -} - -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -body { - margin: 0; -} - -a { - background: transparent; -} - -a:focus { - outline: thin dotted; -} - -a:active, -a:hover { - outline: 0; -} - -h1 { - margin: 0.67em 0; - font-size: 2em; -} - -abbr[title] { - border-bottom: 1px dotted; -} - -b, -strong { - font-weight: bold; -} - -dfn { - font-style: italic; -} - -hr { - height: 0; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -mark { - color: #000; - background: #ff0; -} - -code, -kbd, -pre, -samp { - font-family: monospace, serif; - font-size: 1em; -} - -pre { - white-space: pre-wrap; -} - -q { - quotes: "\201C" "\201D" "\2018" "\2019"; -} - -small { - font-size: 80%; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - border: 0; -} - -svg:not(:root) { - overflow: hidden; -} - -figure { - margin: 0; -} - -fieldset { - padding: 0.35em 0.625em 0.75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} - -legend { - padding: 0; - border: 0; -} - -button, -input, -select, -textarea { - margin: 0; - font-family: inherit; - font-size: 100%; -} - -button, -input { - line-height: normal; -} - -button, -select { - text-transform: none; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -button[disabled], -html input[disabled] { - cursor: default; -} - -input[type="checkbox"], -input[type="radio"] { - padding: 0; - box-sizing: border-box; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 2cm .5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - select { - background: #fff !important; - } - .navbar { - display: none; - } - .table td, - .table th { - background-color: #fff !important; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} - -*, -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -html { - font-size: 62.5%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.428571429; - color: #333333; - background-color: #ffffff; -} - -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -a { - color: #428bca; - text-decoration: none; -} - -a:hover, -a:focus { - color: #2a6496; - text-decoration: underline; -} - -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -img { - vertical-align: middle; -} - -.img-responsive { - display: block; - height: auto; - max-width: 100%; -} - -.img-rounded { - border-radius: 6px; -} - -.img-thumbnail { - display: inline-block; - height: auto; - max-width: 100%; - padding: 4px; - line-height: 1.428571429; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -.img-circle { - border-radius: 50%; -} - -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} - -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-weight: 500; - line-height: 1.1; - color: inherit; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #999999; -} - -h1, -h2, -h3 { - margin-top: 20px; - margin-bottom: 10px; -} - -h1 small, -h2 small, -h3 small, -h1 .small, -h2 .small, -h3 .small { - font-size: 65%; -} - -h4, -h5, -h6 { - margin-top: 10px; - margin-bottom: 10px; -} - -h4 small, -h5 small, -h6 small, -h4 .small, -h5 .small, -h6 .small { - font-size: 75%; -} - -h1, -.h1 { - font-size: 36px; -} - -h2, -.h2 { - font-size: 30px; -} - -h3, -.h3 { - font-size: 24px; -} - -h4, -.h4 { - font-size: 18px; -} - -h5, -.h5 { - font-size: 14px; -} - -h6, -.h6 { - font-size: 12px; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 200; - line-height: 1.4; -} - -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} - -small, -.small { - font-size: 85%; -} - -cite { - font-style: normal; -} - -.text-muted { - color: #999999; -} - -.text-primary { - color: #428bca; -} - -.text-primary:hover { - color: #3071a9; -} - -.text-warning { - color: #8a6d3b; -} - -.text-warning:hover { - color: #66512c; -} - -.text-danger { - color: #a94442; -} - -.text-danger:hover { - color: #843534; -} - -.text-success { - color: #3c763d; -} - -.text-success:hover { - color: #2b542c; -} - -.text-info { - color: #31708f; -} - -.text-info:hover { - color: #245269; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -.text-center { - text-align: center; -} - -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} - -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} - -.list-inline > li:first-child { - padding-left: 0; -} - -dl { - margin-top: 0; - margin-bottom: 20px; -} - -dt, -dd { - line-height: 1.428571429; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 0; -} - -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } - .dl-horizontal dd:before, - .dl-horizontal dd:after { - display: table; - content: " "; - } - .dl-horizontal dd:after { - clear: both; - } - .dl-horizontal dd:before, - .dl-horizontal dd:after { - display: table; - content: " "; - } - .dl-horizontal dd:after { - clear: both; - } -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} - -blockquote p:last-child { - margin-bottom: 0; -} - -blockquote small, -blockquote .small { - display: block; - line-height: 1.428571429; - color: #999999; -} - -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small, -blockquote.pull-right .small { - text-align: right; -} - -blockquote.pull-right small:before, -blockquote.pull-right .small:before { - content: ''; -} - -blockquote.pull-right small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} - -blockquote:before, -blockquote:after { - content: ""; -} - -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.428571429; -} - -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} - -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - white-space: nowrap; - background-color: #f9f2f4; - border-radius: 4px; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.428571429; - color: #333333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #cccccc; - border-radius: 4px; -} - -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} - -.container:before, -.container:after { - display: table; - content: " "; -} - -.container:after { - clear: both; -} - -.container:before, -.container:after { - display: table; - content: " "; -} - -.container:after { - clear: both; -} - -@media (min-width: 768px) { - .container { - width: 750px; - } -} - -@media (min-width: 992px) { - .container { - width: 970px; - } -} - -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} - -.row { - margin-right: -15px; - margin-left: -15px; -} - -.row:before, -.row:after { - display: table; - content: " "; -} - -.row:after { - clear: both; -} - -.row:before, -.row:after { - display: table; - content: " "; -} - -.row:after { - clear: both; -} - -.col-xs-1, -.col-sm-1, -.col-md-1, -.col-lg-1, -.col-xs-2, -.col-sm-2, -.col-md-2, -.col-lg-2, -.col-xs-3, -.col-sm-3, -.col-md-3, -.col-lg-3, -.col-xs-4, -.col-sm-4, -.col-md-4, -.col-lg-4, -.col-xs-5, -.col-sm-5, -.col-md-5, -.col-lg-5, -.col-xs-6, -.col-sm-6, -.col-md-6, -.col-lg-6, -.col-xs-7, -.col-sm-7, -.col-md-7, -.col-lg-7, -.col-xs-8, -.col-sm-8, -.col-md-8, -.col-lg-8, -.col-xs-9, -.col-sm-9, -.col-md-9, -.col-lg-9, -.col-xs-10, -.col-sm-10, -.col-md-10, -.col-lg-10, -.col-xs-11, -.col-sm-11, -.col-md-11, -.col-lg-11, -.col-xs-12, -.col-sm-12, -.col-md-12, -.col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} - -.col-xs-1, -.col-xs-2, -.col-xs-3, -.col-xs-4, -.col-xs-5, -.col-xs-6, -.col-xs-7, -.col-xs-8, -.col-xs-9, -.col-xs-10, -.col-xs-11, -.col-xs-12 { - float: left; -} - -.col-xs-12 { - width: 100%; -} - -.col-xs-11 { - width: 91.66666666666666%; -} - -.col-xs-10 { - width: 83.33333333333334%; -} - -.col-xs-9 { - width: 75%; -} - -.col-xs-8 { - width: 66.66666666666666%; -} - -.col-xs-7 { - width: 58.333333333333336%; -} - -.col-xs-6 { - width: 50%; -} - -.col-xs-5 { - width: 41.66666666666667%; -} - -.col-xs-4 { - width: 33.33333333333333%; -} - -.col-xs-3 { - width: 25%; -} - -.col-xs-2 { - width: 16.666666666666664%; -} - -.col-xs-1 { - width: 8.333333333333332%; -} - -.col-xs-pull-12 { - right: 100%; -} - -.col-xs-pull-11 { - right: 91.66666666666666%; -} - -.col-xs-pull-10 { - right: 83.33333333333334%; -} - -.col-xs-pull-9 { - right: 75%; -} - -.col-xs-pull-8 { - right: 66.66666666666666%; -} - -.col-xs-pull-7 { - right: 58.333333333333336%; -} - -.col-xs-pull-6 { - right: 50%; -} - -.col-xs-pull-5 { - right: 41.66666666666667%; -} - -.col-xs-pull-4 { - right: 33.33333333333333%; -} - -.col-xs-pull-3 { - right: 25%; -} - -.col-xs-pull-2 { - right: 16.666666666666664%; -} - -.col-xs-pull-1 { - right: 8.333333333333332%; -} - -.col-xs-pull-0 { - right: 0; -} - -.col-xs-push-12 { - left: 100%; -} - -.col-xs-push-11 { - left: 91.66666666666666%; -} - -.col-xs-push-10 { - left: 83.33333333333334%; -} - -.col-xs-push-9 { - left: 75%; -} - -.col-xs-push-8 { - left: 66.66666666666666%; -} - -.col-xs-push-7 { - left: 58.333333333333336%; -} - -.col-xs-push-6 { - left: 50%; -} - -.col-xs-push-5 { - left: 41.66666666666667%; -} - -.col-xs-push-4 { - left: 33.33333333333333%; -} - -.col-xs-push-3 { - left: 25%; -} - -.col-xs-push-2 { - left: 16.666666666666664%; -} - -.col-xs-push-1 { - left: 8.333333333333332%; -} - -.col-xs-push-0 { - left: 0; -} - -.col-xs-offset-12 { - margin-left: 100%; -} - -.col-xs-offset-11 { - margin-left: 91.66666666666666%; -} - -.col-xs-offset-10 { - margin-left: 83.33333333333334%; -} - -.col-xs-offset-9 { - margin-left: 75%; -} - -.col-xs-offset-8 { - margin-left: 66.66666666666666%; -} - -.col-xs-offset-7 { - margin-left: 58.333333333333336%; -} - -.col-xs-offset-6 { - margin-left: 50%; -} - -.col-xs-offset-5 { - margin-left: 41.66666666666667%; -} - -.col-xs-offset-4 { - margin-left: 33.33333333333333%; -} - -.col-xs-offset-3 { - margin-left: 25%; -} - -.col-xs-offset-2 { - margin-left: 16.666666666666664%; -} - -.col-xs-offset-1 { - margin-left: 8.333333333333332%; -} - -.col-xs-offset-0 { - margin-left: 0; -} - -@media (min-width: 768px) { - .col-sm-1, - .col-sm-2, - .col-sm-3, - .col-sm-4, - .col-sm-5, - .col-sm-6, - .col-sm-7, - .col-sm-8, - .col-sm-9, - .col-sm-10, - .col-sm-11, - .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666666666666%; - } - .col-sm-10 { - width: 83.33333333333334%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666666666666%; - } - .col-sm-7 { - width: 58.333333333333336%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666666666667%; - } - .col-sm-4 { - width: 33.33333333333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.666666666666664%; - } - .col-sm-1 { - width: 8.333333333333332%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666666666666%; - } - .col-sm-pull-10 { - right: 83.33333333333334%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666666666666%; - } - .col-sm-pull-7 { - right: 58.333333333333336%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666666666667%; - } - .col-sm-pull-4 { - right: 33.33333333333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.666666666666664%; - } - .col-sm-pull-1 { - right: 8.333333333333332%; - } - .col-sm-pull-0 { - right: 0; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666666666666%; - } - .col-sm-push-10 { - left: 83.33333333333334%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666666666666%; - } - .col-sm-push-7 { - left: 58.333333333333336%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666666666667%; - } - .col-sm-push-4 { - left: 33.33333333333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.666666666666664%; - } - .col-sm-push-1 { - left: 8.333333333333332%; - } - .col-sm-push-0 { - left: 0; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666666666666%; - } - .col-sm-offset-10 { - margin-left: 83.33333333333334%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666666666666%; - } - .col-sm-offset-7 { - margin-left: 58.333333333333336%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666666666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.666666666666664%; - } - .col-sm-offset-1 { - margin-left: 8.333333333333332%; - } - .col-sm-offset-0 { - margin-left: 0; - } -} - -@media (min-width: 992px) { - .col-md-1, - .col-md-2, - .col-md-3, - .col-md-4, - .col-md-5, - .col-md-6, - .col-md-7, - .col-md-8, - .col-md-9, - .col-md-10, - .col-md-11, - .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666666666666%; - } - .col-md-10 { - width: 83.33333333333334%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666666666666%; - } - .col-md-7 { - width: 58.333333333333336%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666666666667%; - } - .col-md-4 { - width: 33.33333333333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.666666666666664%; - } - .col-md-1 { - width: 8.333333333333332%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666666666666%; - } - .col-md-pull-10 { - right: 83.33333333333334%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666666666666%; - } - .col-md-pull-7 { - right: 58.333333333333336%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666666666667%; - } - .col-md-pull-4 { - right: 33.33333333333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.666666666666664%; - } - .col-md-pull-1 { - right: 8.333333333333332%; - } - .col-md-pull-0 { - right: 0; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666666666666%; - } - .col-md-push-10 { - left: 83.33333333333334%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666666666666%; - } - .col-md-push-7 { - left: 58.333333333333336%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666666666667%; - } - .col-md-push-4 { - left: 33.33333333333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.666666666666664%; - } - .col-md-push-1 { - left: 8.333333333333332%; - } - .col-md-push-0 { - left: 0; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666666666666%; - } - .col-md-offset-10 { - margin-left: 83.33333333333334%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666666666666%; - } - .col-md-offset-7 { - margin-left: 58.333333333333336%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666666666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.666666666666664%; - } - .col-md-offset-1 { - margin-left: 8.333333333333332%; - } - .col-md-offset-0 { - margin-left: 0; - } -} - -@media (min-width: 1200px) { - .col-lg-1, - .col-lg-2, - .col-lg-3, - .col-lg-4, - .col-lg-5, - .col-lg-6, - .col-lg-7, - .col-lg-8, - .col-lg-9, - .col-lg-10, - .col-lg-11, - .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666666666666%; - } - .col-lg-10 { - width: 83.33333333333334%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666666666666%; - } - .col-lg-7 { - width: 58.333333333333336%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666666666667%; - } - .col-lg-4 { - width: 33.33333333333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.666666666666664%; - } - .col-lg-1 { - width: 8.333333333333332%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666666666666%; - } - .col-lg-pull-10 { - right: 83.33333333333334%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666666666666%; - } - .col-lg-pull-7 { - right: 58.333333333333336%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666666666667%; - } - .col-lg-pull-4 { - right: 33.33333333333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.666666666666664%; - } - .col-lg-pull-1 { - right: 8.333333333333332%; - } - .col-lg-pull-0 { - right: 0; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666666666666%; - } - .col-lg-push-10 { - left: 83.33333333333334%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666666666666%; - } - .col-lg-push-7 { - left: 58.333333333333336%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666666666667%; - } - .col-lg-push-4 { - left: 33.33333333333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.666666666666664%; - } - .col-lg-push-1 { - left: 8.333333333333332%; - } - .col-lg-push-0 { - left: 0; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666666666666%; - } - .col-lg-offset-10 { - margin-left: 83.33333333333334%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666666666666%; - } - .col-lg-offset-7 { - margin-left: 58.333333333333336%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666666666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.666666666666664%; - } - .col-lg-offset-1 { - margin-left: 8.333333333333332%; - } - .col-lg-offset-0 { - margin-left: 0; - } -} - -table { - max-width: 100%; - background-color: transparent; -} - -th { - text-align: left; -} - -.table { - width: 100%; - margin-bottom: 20px; -} - -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.428571429; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #dddddd; -} - -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} - -.table > tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table .table { - background-color: #ffffff; -} - -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} - -.table-bordered { - border: 1px solid #dddddd; -} - -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #dddddd; -} - -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} - -.table-striped > tbody > tr:nth-child(odd) > td, -.table-striped > tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} - -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { - background-color: #f5f5f5; -} - -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} - -table td[class*="col-"], -table th[class*="col-"] { - display: table-cell; - float: none; -} - -.table > thead > tr > .active, -.table > tbody > tr > .active, -.table > tfoot > tr > .active, -.table > thead > .active > td, -.table > tbody > .active > td, -.table > tfoot > .active > td, -.table > thead > .active > th, -.table > tbody > .active > th, -.table > tfoot > .active > th { - background-color: #f5f5f5; -} - -.table-hover > tbody > tr > .active:hover, -.table-hover > tbody > .active:hover > td, -.table-hover > tbody > .active:hover > th { - background-color: #e8e8e8; -} - -.table > thead > tr > .success, -.table > tbody > tr > .success, -.table > tfoot > tr > .success, -.table > thead > .success > td, -.table > tbody > .success > td, -.table > tfoot > .success > td, -.table > thead > .success > th, -.table > tbody > .success > th, -.table > tfoot > .success > th { - background-color: #dff0d8; -} - -.table-hover > tbody > tr > .success:hover, -.table-hover > tbody > .success:hover > td, -.table-hover > tbody > .success:hover > th { - background-color: #d0e9c6; -} - -.table > thead > tr > .danger, -.table > tbody > tr > .danger, -.table > tfoot > tr > .danger, -.table > thead > .danger > td, -.table > tbody > .danger > td, -.table > tfoot > .danger > td, -.table > thead > .danger > th, -.table > tbody > .danger > th, -.table > tfoot > .danger > th { - background-color: #f2dede; -} - -.table-hover > tbody > tr > .danger:hover, -.table-hover > tbody > .danger:hover > td, -.table-hover > tbody > .danger:hover > th { - background-color: #ebcccc; -} - -.table > thead > tr > .warning, -.table > tbody > tr > .warning, -.table > tfoot > tr > .warning, -.table > thead > .warning > td, -.table > tbody > .warning > td, -.table > tfoot > .warning > td, -.table > thead > .warning > th, -.table > tbody > .warning > th, -.table > tfoot > .warning > th { - background-color: #fcf8e3; -} - -.table-hover > tbody > tr > .warning:hover, -.table-hover > tbody > .warning:hover > td, -.table-hover > tbody > .warning:hover > th { - background-color: #faf2cc; -} - -@media (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-x: scroll; - overflow-y: hidden; - border: 1px solid #dddddd; - -ms-overflow-style: -ms-autohiding-scrollbar; - -webkit-overflow-scrolling: touch; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -label { - display: inline-block; - margin-bottom: 5px; - font-weight: bold; -} - -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - /* IE8-9 */ - - line-height: normal; -} - -input[type="file"] { - display: block; -} - -select[multiple], -select[size] { - height: auto; -} - -select optgroup { - font-family: inherit; - font-size: inherit; - font-style: inherit; -} - -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -input[type="number"]::-webkit-outer-spin-button, -input[type="number"]::-webkit-inner-spin-button { - height: auto; -} - -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.428571429; - color: #555555; - vertical-align: middle; -} - -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.428571429; - color: #555555; - vertical-align: middle; - background-color: #ffffff; - background-image: none; - border: 1px solid #cccccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; -} - -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); -} - -.form-control:-moz-placeholder { - color: #999999; -} - -.form-control::-moz-placeholder { - color: #999999; - opacity: 1; -} - -.form-control:-ms-input-placeholder { - color: #999999; -} - -.form-control::-webkit-input-placeholder { - color: #999999; -} - -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - cursor: not-allowed; - background-color: #eeeeee; -} - -textarea.form-control { - height: auto; -} - -.form-group { - margin-bottom: 15px; -} - -.radio, -.checkbox { - display: block; - min-height: 20px; - padding-left: 20px; - margin-top: 10px; - margin-bottom: 10px; - vertical-align: middle; -} - -.radio label, -.checkbox label { - display: inline; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} - -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - float: left; - margin-left: -20px; -} - -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} - -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} - -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -.radio[disabled], -.radio-inline[disabled], -.checkbox[disabled], -.checkbox-inline[disabled], -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"], -fieldset[disabled] .radio, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} - -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -select.input-sm { - height: 30px; - line-height: 30px; -} - -textarea.input-sm { - height: auto; -} - -.input-lg { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -select.input-lg { - height: 46px; - line-height: 46px; -} - -textarea.input-lg { - height: auto; -} - -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline { - color: #8a6d3b; -} - -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; -} - -.has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; -} - -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline { - color: #a94442; -} - -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; -} - -.has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; -} - -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline { - color: #3c763d; -} - -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; -} - -.has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; -} - -.form-control-static { - margin-bottom: 0; -} - -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} - -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - } - .form-inline select.form-control { - width: auto; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } -} - -.form-horizontal .control-label, -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} - -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} - -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} - -.form-horizontal .form-group:before, -.form-horizontal .form-group:after { - display: table; - content: " "; -} - -.form-horizontal .form-group:after { - clear: both; -} - -.form-horizontal .form-group:before, -.form-horizontal .form-group:after { - display: table; - content: " "; -} - -.form-horizontal .form-group:after { - clear: both; -} - -.form-horizontal .form-control-static { - padding-top: 7px; -} - -@media (min-width: 768px) { - .form-horizontal .control-label { - text-align: right; - } -} - -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.428571429; - text-align: center; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; -} - -.btn:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn:hover, -.btn:focus { - color: #333333; - text-decoration: none; -} - -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - pointer-events: none; - cursor: not-allowed; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn-default { - color: #333333; - background-color: #ffffff; - border-color: #cccccc; -} - -.btn-default:hover, -.btn-default:focus, -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - color: #333333; - background-color: #ebebeb; - border-color: #adadad; -} - -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - background-image: none; -} - -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #ffffff; - border-color: #cccccc; -} - -.btn-default .badge { - color: #ffffff; - background-color: #fff; -} - -.btn-primary { - color: #ffffff; - background-color: #428bca; - border-color: #357ebd; -} - -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - color: #ffffff; - background-color: #3276b1; - border-color: #285e8e; -} - -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - background-image: none; -} - -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #428bca; - border-color: #357ebd; -} - -.btn-primary .badge { - color: #428bca; - background-color: #fff; -} - -.btn-warning { - color: #ffffff; - background-color: #f0ad4e; - border-color: #eea236; -} - -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - color: #ffffff; - background-color: #ed9c28; - border-color: #d58512; -} - -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - background-image: none; -} - -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} - -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} - -.btn-danger { - color: #ffffff; - background-color: #d9534f; - border-color: #d43f3a; -} - -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - color: #ffffff; - background-color: #d2322d; - border-color: #ac2925; -} - -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - background-image: none; -} - -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} - -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} - -.btn-success { - color: #ffffff; - background-color: #5cb85c; - border-color: #4cae4c; -} - -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - color: #ffffff; - background-color: #47a447; - border-color: #398439; -} - -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - background-image: none; -} - -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} - -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} - -.btn-info { - color: #ffffff; - background-color: #5bc0de; - border-color: #46b8da; -} - -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - color: #ffffff; - background-color: #39b3d7; - border-color: #269abc; -} - -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - background-image: none; -} - -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} - -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} - -.btn-link { - font-weight: normal; - color: #428bca; - cursor: pointer; - border-radius: 0; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} - -.btn-link:hover, -.btn-link:focus { - color: #2a6496; - text-decoration: underline; - background-color: transparent; -} - -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #999999; - text-decoration: none; -} - -.btn-lg { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -.btn-sm { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-xs { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - display: none; -} - -.collapse.in { - display: block; -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -@font-face { - font-family: 'Glyphicons Halflings'; - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); -} - -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - -webkit-font-smoothing: antialiased; - font-style: normal; - font-weight: normal; - line-height: 1; - -moz-osx-font-smoothing: grayscale; -} - -.glyphicon:empty { - width: 1em; -} - -.glyphicon-asterisk:before { - content: "\2a"; -} - -.glyphicon-plus:before { - content: "\2b"; -} - -.glyphicon-euro:before { - content: "\20ac"; -} - -.glyphicon-minus:before { - content: "\2212"; -} - -.glyphicon-cloud:before { - content: "\2601"; -} - -.glyphicon-envelope:before { - content: "\2709"; -} - -.glyphicon-pencil:before { - content: "\270f"; -} - -.glyphicon-glass:before { - content: "\e001"; -} - -.glyphicon-music:before { - content: "\e002"; -} - -.glyphicon-search:before { - content: "\e003"; -} - -.glyphicon-heart:before { - content: "\e005"; -} - -.glyphicon-star:before { - content: "\e006"; -} - -.glyphicon-star-empty:before { - content: "\e007"; -} - -.glyphicon-user:before { - content: "\e008"; -} - -.glyphicon-film:before { - content: "\e009"; -} - -.glyphicon-th-large:before { - content: "\e010"; -} - -.glyphicon-th:before { - content: "\e011"; -} - -.glyphicon-th-list:before { - content: "\e012"; -} - -.glyphicon-ok:before { - content: "\e013"; -} - -.glyphicon-remove:before { - content: "\e014"; -} - -.glyphicon-zoom-in:before { - content: "\e015"; -} - -.glyphicon-zoom-out:before { - content: "\e016"; -} - -.glyphicon-off:before { - content: "\e017"; -} - -.glyphicon-signal:before { - content: "\e018"; -} - -.glyphicon-cog:before { - content: "\e019"; -} - -.glyphicon-trash:before { - content: "\e020"; -} - -.glyphicon-home:before { - content: "\e021"; -} - -.glyphicon-file:before { - content: "\e022"; -} - -.glyphicon-time:before { - content: "\e023"; -} - -.glyphicon-road:before { - content: "\e024"; -} - -.glyphicon-download-alt:before { - content: "\e025"; -} - -.glyphicon-download:before { - content: "\e026"; -} - -.glyphicon-upload:before { - content: "\e027"; -} - -.glyphicon-inbox:before { - content: "\e028"; -} - -.glyphicon-play-circle:before { - content: "\e029"; -} - -.glyphicon-repeat:before { - content: "\e030"; -} - -.glyphicon-refresh:before { - content: "\e031"; -} - -.glyphicon-list-alt:before { - content: "\e032"; -} - -.glyphicon-lock:before { - content: "\e033"; -} - -.glyphicon-flag:before { - content: "\e034"; -} - -.glyphicon-headphones:before { - content: "\e035"; -} - -.glyphicon-volume-off:before { - content: "\e036"; -} - -.glyphicon-volume-down:before { - content: "\e037"; -} - -.glyphicon-volume-up:before { - content: "\e038"; -} - -.glyphicon-qrcode:before { - content: "\e039"; -} - -.glyphicon-barcode:before { - content: "\e040"; -} - -.glyphicon-tag:before { - content: "\e041"; -} - -.glyphicon-tags:before { - content: "\e042"; -} - -.glyphicon-book:before { - content: "\e043"; -} - -.glyphicon-bookmark:before { - content: "\e044"; -} - -.glyphicon-print:before { - content: "\e045"; -} - -.glyphicon-camera:before { - content: "\e046"; -} - -.glyphicon-font:before { - content: "\e047"; -} - -.glyphicon-bold:before { - content: "\e048"; -} - -.glyphicon-italic:before { - content: "\e049"; -} - -.glyphicon-text-height:before { - content: "\e050"; -} - -.glyphicon-text-width:before { - content: "\e051"; -} - -.glyphicon-align-left:before { - content: "\e052"; -} - -.glyphicon-align-center:before { - content: "\e053"; -} - -.glyphicon-align-right:before { - content: "\e054"; -} - -.glyphicon-align-justify:before { - content: "\e055"; -} - -.glyphicon-list:before { - content: "\e056"; -} - -.glyphicon-indent-left:before { - content: "\e057"; -} - -.glyphicon-indent-right:before { - content: "\e058"; -} - -.glyphicon-facetime-video:before { - content: "\e059"; -} - -.glyphicon-picture:before { - content: "\e060"; -} - -.glyphicon-map-marker:before { - content: "\e062"; -} - -.glyphicon-adjust:before { - content: "\e063"; -} - -.glyphicon-tint:before { - content: "\e064"; -} - -.glyphicon-edit:before { - content: "\e065"; -} - -.glyphicon-share:before { - content: "\e066"; -} - -.glyphicon-check:before { - content: "\e067"; -} - -.glyphicon-move:before { - content: "\e068"; -} - -.glyphicon-step-backward:before { - content: "\e069"; -} - -.glyphicon-fast-backward:before { - content: "\e070"; -} - -.glyphicon-backward:before { - content: "\e071"; -} - -.glyphicon-play:before { - content: "\e072"; -} - -.glyphicon-pause:before { - content: "\e073"; -} - -.glyphicon-stop:before { - content: "\e074"; -} - -.glyphicon-forward:before { - content: "\e075"; -} - -.glyphicon-fast-forward:before { - content: "\e076"; -} - -.glyphicon-step-forward:before { - content: "\e077"; -} - -.glyphicon-eject:before { - content: "\e078"; -} - -.glyphicon-chevron-left:before { - content: "\e079"; -} - -.glyphicon-chevron-right:before { - content: "\e080"; -} - -.glyphicon-plus-sign:before { - content: "\e081"; -} - -.glyphicon-minus-sign:before { - content: "\e082"; -} - -.glyphicon-remove-sign:before { - content: "\e083"; -} - -.glyphicon-ok-sign:before { - content: "\e084"; -} - -.glyphicon-question-sign:before { - content: "\e085"; -} - -.glyphicon-info-sign:before { - content: "\e086"; -} - -.glyphicon-screenshot:before { - content: "\e087"; -} - -.glyphicon-remove-circle:before { - content: "\e088"; -} - -.glyphicon-ok-circle:before { - content: "\e089"; -} - -.glyphicon-ban-circle:before { - content: "\e090"; -} - -.glyphicon-arrow-left:before { - content: "\e091"; -} - -.glyphicon-arrow-right:before { - content: "\e092"; -} - -.glyphicon-arrow-up:before { - content: "\e093"; -} - -.glyphicon-arrow-down:before { - content: "\e094"; -} - -.glyphicon-share-alt:before { - content: "\e095"; -} - -.glyphicon-resize-full:before { - content: "\e096"; -} - -.glyphicon-resize-small:before { - content: "\e097"; -} - -.glyphicon-exclamation-sign:before { - content: "\e101"; -} - -.glyphicon-gift:before { - content: "\e102"; -} - -.glyphicon-leaf:before { - content: "\e103"; -} - -.glyphicon-fire:before { - content: "\e104"; -} - -.glyphicon-eye-open:before { - content: "\e105"; -} - -.glyphicon-eye-close:before { - content: "\e106"; -} - -.glyphicon-warning-sign:before { - content: "\e107"; -} - -.glyphicon-plane:before { - content: "\e108"; -} - -.glyphicon-calendar:before { - content: "\e109"; -} - -.glyphicon-random:before { - content: "\e110"; -} - -.glyphicon-comment:before { - content: "\e111"; -} - -.glyphicon-magnet:before { - content: "\e112"; -} - -.glyphicon-chevron-up:before { - content: "\e113"; -} - -.glyphicon-chevron-down:before { - content: "\e114"; -} - -.glyphicon-retweet:before { - content: "\e115"; -} - -.glyphicon-shopping-cart:before { - content: "\e116"; -} - -.glyphicon-folder-close:before { - content: "\e117"; -} - -.glyphicon-folder-open:before { - content: "\e118"; -} - -.glyphicon-resize-vertical:before { - content: "\e119"; -} - -.glyphicon-resize-horizontal:before { - content: "\e120"; -} - -.glyphicon-hdd:before { - content: "\e121"; -} - -.glyphicon-bullhorn:before { - content: "\e122"; -} - -.glyphicon-bell:before { - content: "\e123"; -} - -.glyphicon-certificate:before { - content: "\e124"; -} - -.glyphicon-thumbs-up:before { - content: "\e125"; -} - -.glyphicon-thumbs-down:before { - content: "\e126"; -} - -.glyphicon-hand-right:before { - content: "\e127"; -} - -.glyphicon-hand-left:before { - content: "\e128"; -} - -.glyphicon-hand-up:before { - content: "\e129"; -} - -.glyphicon-hand-down:before { - content: "\e130"; -} - -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} - -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} - -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} - -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} - -.glyphicon-globe:before { - content: "\e135"; -} - -.glyphicon-wrench:before { - content: "\e136"; -} - -.glyphicon-tasks:before { - content: "\e137"; -} - -.glyphicon-filter:before { - content: "\e138"; -} - -.glyphicon-briefcase:before { - content: "\e139"; -} - -.glyphicon-fullscreen:before { - content: "\e140"; -} - -.glyphicon-dashboard:before { - content: "\e141"; -} - -.glyphicon-paperclip:before { - content: "\e142"; -} - -.glyphicon-heart-empty:before { - content: "\e143"; -} - -.glyphicon-link:before { - content: "\e144"; -} - -.glyphicon-phone:before { - content: "\e145"; -} - -.glyphicon-pushpin:before { - content: "\e146"; -} - -.glyphicon-usd:before { - content: "\e148"; -} - -.glyphicon-gbp:before { - content: "\e149"; -} - -.glyphicon-sort:before { - content: "\e150"; -} - -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} - -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} - -.glyphicon-sort-by-order:before { - content: "\e153"; -} - -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} - -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} - -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} - -.glyphicon-unchecked:before { - content: "\e157"; -} - -.glyphicon-expand:before { - content: "\e158"; -} - -.glyphicon-collapse-down:before { - content: "\e159"; -} - -.glyphicon-collapse-up:before { - content: "\e160"; -} - -.glyphicon-log-in:before { - content: "\e161"; -} - -.glyphicon-flash:before { - content: "\e162"; -} - -.glyphicon-log-out:before { - content: "\e163"; -} - -.glyphicon-new-window:before { - content: "\e164"; -} - -.glyphicon-record:before { - content: "\e165"; -} - -.glyphicon-save:before { - content: "\e166"; -} - -.glyphicon-open:before { - content: "\e167"; -} - -.glyphicon-saved:before { - content: "\e168"; -} - -.glyphicon-import:before { - content: "\e169"; -} - -.glyphicon-export:before { - content: "\e170"; -} - -.glyphicon-send:before { - content: "\e171"; -} - -.glyphicon-floppy-disk:before { - content: "\e172"; -} - -.glyphicon-floppy-saved:before { - content: "\e173"; -} - -.glyphicon-floppy-remove:before { - content: "\e174"; -} - -.glyphicon-floppy-save:before { - content: "\e175"; -} - -.glyphicon-floppy-open:before { - content: "\e176"; -} - -.glyphicon-credit-card:before { - content: "\e177"; -} - -.glyphicon-transfer:before { - content: "\e178"; -} - -.glyphicon-cutlery:before { - content: "\e179"; -} - -.glyphicon-header:before { - content: "\e180"; -} - -.glyphicon-compressed:before { - content: "\e181"; -} - -.glyphicon-earphone:before { - content: "\e182"; -} - -.glyphicon-phone-alt:before { - content: "\e183"; -} - -.glyphicon-tower:before { - content: "\e184"; -} - -.glyphicon-stats:before { - content: "\e185"; -} - -.glyphicon-sd-video:before { - content: "\e186"; -} - -.glyphicon-hd-video:before { - content: "\e187"; -} - -.glyphicon-subtitles:before { - content: "\e188"; -} - -.glyphicon-sound-stereo:before { - content: "\e189"; -} - -.glyphicon-sound-dolby:before { - content: "\e190"; -} - -.glyphicon-sound-5-1:before { - content: "\e191"; -} - -.glyphicon-sound-6-1:before { - content: "\e192"; -} - -.glyphicon-sound-7-1:before { - content: "\e193"; -} - -.glyphicon-copyright-mark:before { - content: "\e194"; -} - -.glyphicon-registration-mark:before { - content: "\e195"; -} - -.glyphicon-cloud-download:before { - content: "\e197"; -} - -.glyphicon-cloud-upload:before { - content: "\e198"; -} - -.glyphicon-tree-conifer:before { - content: "\e199"; -} - -.glyphicon-tree-deciduous:before { - content: "\e200"; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px solid; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} - -.dropdown { - position: relative; -} - -.dropdown-toggle:focus { - outline: 0; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - list-style: none; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} - -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.428571429; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #ffffff; - text-decoration: none; - background-color: #428bca; - outline: 0; -} - -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999999; -} - -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.open > .dropdown-menu { - display: block; -} - -.open > a { - outline: 0; -} - -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.428571429; - color: #999999; -} - -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} - -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} - -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} - -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus { - outline: none; -} - -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} - -.btn-toolbar:before, -.btn-toolbar:after { - display: table; - content: " "; -} - -.btn-toolbar:after { - clear: both; -} - -.btn-toolbar:before, -.btn-toolbar:after { - display: table; - content: " "; -} - -.btn-toolbar:after { - clear: both; -} - -.btn-toolbar .btn-group { - float: left; -} - -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group, -.btn-toolbar > .btn-group + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} - -.btn-group > .btn:first-child { - margin-left: 0; -} - -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.btn-group > .btn-group { - float: left; -} - -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group > .btn-group:first-child > .btn:last-child, -.btn-group > .btn-group:first-child > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.btn-group > .btn-group:last-child > .btn:first-child { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} - -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn .caret { - margin-left: 0; -} - -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} - -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} - -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} - -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after { - display: table; - content: " "; -} - -.btn-group-vertical > .btn-group:after { - clear: both; -} - -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after { - display: table; - content: " "; -} - -.btn-group-vertical > .btn-group:after { - clear: both; -} - -.btn-group-vertical > .btn-group > .btn { - float: none; -} - -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} - -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-right-radius: 0; - border-bottom-left-radius: 4px; - border-top-left-radius: 0; -} - -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group-vertical > .btn-group:first-child > .btn:last-child, -.btn-group-vertical > .btn-group:first-child > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn-group:last-child > .btn:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.btn-group-justified { - display: table; - width: 100%; - border-collapse: separate; - table-layout: fixed; -} - -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; -} - -.btn-group-justified > .btn-group .btn { - width: 100%; -} - -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - display: none; -} - -.input-group { - position: relative; - display: table; - border-collapse: separate; -} - -.input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; -} - -.input-group .form-control { - width: 100%; - margin-bottom: 0; -} - -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} - -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn { - height: auto; -} - -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} - -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn { - height: auto; -} - -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} - -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} - -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} - -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555555; - text-align: center; - background-color: #eeeeee; - border: 1px solid #cccccc; - border-radius: 4px; -} - -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} - -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} - -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} - -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group-addon:first-child { - border-right: 0; -} - -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.input-group-addon:last-child { - border-left: 0; -} - -.input-group-btn { - position: relative; - white-space: nowrap; -} - -.input-group-btn:first-child > .btn { - margin-right: -1px; -} - -.input-group-btn:last-child > .btn { - margin-left: -1px; -} - -.input-group-btn > .btn { - position: relative; -} - -.input-group-btn > .btn + .btn { - margin-left: -4px; -} - -.input-group-btn > .btn:hover, -.input-group-btn > .btn:active { - z-index: 2; -} - -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav:before, -.nav:after { - display: table; - content: " "; -} - -.nav:after { - clear: both; -} - -.nav:before, -.nav:after { - display: table; - content: " "; -} - -.nav:after { - clear: both; -} - -.nav > li { - position: relative; - display: block; -} - -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} - -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > li.disabled > a { - color: #999999; -} - -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999999; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} - -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #428bca; -} - -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} - -.nav > li > a > img { - max-width: none; -} - -.nav-tabs { - border-bottom: 1px solid #dddddd; -} - -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} - -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.428571429; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #dddddd; - border-bottom-color: transparent; -} - -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} - -.nav-tabs.nav-justified > li { - float: none; -} - -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} - -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} - -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} - -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} - -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #dddddd; -} - -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #dddddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} - -.nav-pills > li { - float: left; -} - -.nav-pills > li > a { - border-radius: 4px; -} - -.nav-pills > li + li { - margin-left: 2px; -} - -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: #428bca; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} - -.nav-justified { - width: 100%; -} - -.nav-justified > li { - float: none; -} - -.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} - -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} - -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} - -.nav-tabs-justified { - border-bottom: 0; -} - -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} - -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #dddddd; -} - -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #dddddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} - -.tab-content > .tab-pane { - display: none; -} - -.tab-content > .active { - display: block; -} - -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} - -.navbar:before, -.navbar:after { - display: table; - content: " "; -} - -.navbar:after { - clear: both; -} - -.navbar:before, -.navbar:after { - display: table; - content: " "; -} - -.navbar:after { - clear: both; -} - -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} - -.navbar-header:before, -.navbar-header:after { - display: table; - content: " "; -} - -.navbar-header:after { - clear: both; -} - -.navbar-header:before, -.navbar-header:after { - display: table; - content: " "; -} - -.navbar-header:after { - clear: both; -} - -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} - -.navbar-collapse { - max-height: 340px; - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-overflow-scrolling: touch; -} - -.navbar-collapse:before, -.navbar-collapse:after { - display: table; - content: " "; -} - -.navbar-collapse:after { - clear: both; -} - -.navbar-collapse:before, -.navbar-collapse:after { - display: table; - content: " "; -} - -.navbar-collapse:after { - clear: both; -} - -.navbar-collapse.in { - overflow-y: auto; -} - -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } -} - -.container > .navbar-header, -.container > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} - -@media (min-width: 768px) { - .container > .navbar-header, - .container > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} - -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} - -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; -} - -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} - -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} - -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} - -.navbar-brand { - float: left; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} - -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} - -@media (min-width: 768px) { - .navbar > .container .navbar-brand { - margin-left: -15px; - } -} - -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} - -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} - -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} - -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} - -.navbar-nav { - margin: 7.5px -15px; -} - -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} - -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} - -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} - -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} - -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); -} - -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - } - .navbar-form select.form-control { - width: auto; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } -} - -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} - -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} - -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.navbar-nav.pull-right > li > .dropdown-menu, -.navbar-nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} - -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} - -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} - -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} - -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} - -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} - -.navbar-default .navbar-brand { - color: #777777; -} - -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} - -.navbar-default .navbar-text { - color: #777777; -} - -.navbar-default .navbar-nav > li > a { - color: #777777; -} - -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333333; - background-color: transparent; -} - -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555555; - background-color: #e7e7e7; -} - -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; -} - -.navbar-default .navbar-toggle { - border-color: #dddddd; -} - -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #dddddd; -} - -.navbar-default .navbar-toggle .icon-bar { - background-color: #cccccc; -} - -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} - -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555555; - background-color: #e7e7e7; -} - -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; - } -} - -.navbar-default .navbar-link { - color: #777777; -} - -.navbar-default .navbar-link:hover { - color: #333333; -} - -.navbar-inverse { - background-color: #222222; - border-color: #080808; -} - -.navbar-inverse .navbar-brand { - color: #999999; -} - -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .navbar-text { - color: #999999; -} - -.navbar-inverse .navbar-nav > li > a { - color: #999999; -} - -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #080808; -} - -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444444; - background-color: transparent; -} - -.navbar-inverse .navbar-toggle { - border-color: #333333; -} - -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333333; -} - -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #ffffff; -} - -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} - -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #ffffff; - background-color: #080808; -} - -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #999999; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #ffffff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444444; - background-color: transparent; - } -} - -.navbar-inverse .navbar-link { - color: #999999; -} - -.navbar-inverse .navbar-link:hover { - color: #ffffff; -} - -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} - -.breadcrumb > li { - display: inline-block; -} - -.breadcrumb > li + li:before { - padding: 0 5px; - color: #cccccc; - content: "/\00a0"; -} - -.breadcrumb > .active { - color: #999999; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} - -.pagination > li { - display: inline; -} - -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.428571429; - text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; -} - -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-bottom-left-radius: 4px; - border-top-left-radius: 4px; -} - -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} - -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - background-color: #eeeeee; -} - -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #ffffff; - cursor: default; - background-color: #428bca; - border-color: #428bca; -} - -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999999; - cursor: not-allowed; - background-color: #ffffff; - border-color: #dddddd; -} - -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; -} - -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-bottom-left-radius: 6px; - border-top-left-radius: 6px; -} - -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} - -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; -} - -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} - -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} - -.pager:before, -.pager:after { - display: table; - content: " "; -} - -.pager:after { - clear: both; -} - -.pager:before, -.pager:after { - display: table; - content: " "; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 15px; -} - -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.pager .next > a, -.pager .next > span { - float: right; -} - -.pager .previous > a, -.pager .previous > span { - float: left; -} - -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - cursor: not-allowed; - background-color: #ffffff; -} - -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #ffffff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} - -.label[href]:hover, -.label[href]:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label:empty { - display: none; -} - -.btn .label { - position: relative; - top: -1px; -} - -.label-default { - background-color: #999999; -} - -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #808080; -} - -.label-primary { - background-color: #428bca; -} - -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #3071a9; -} - -.label-success { - background-color: #5cb85c; -} - -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} - -.label-info { - background-color: #5bc0de; -} - -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} - -.label-warning { - background-color: #f0ad4e; -} - -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} - -.label-danger { - background-color: #d9534f; -} - -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} - -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #ffffff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; - border-radius: 10px; -} - -.badge:empty { - display: none; -} - -.btn .badge { - position: relative; - top: -1px; -} - -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #428bca; - background-color: #ffffff; -} - -.nav-pills > li > a > .badge { - margin-left: 3px; -} - -.jumbotron { - padding: 30px; - margin-bottom: 30px; - font-size: 21px; - font-weight: 200; - line-height: 2.1428571435; - color: inherit; - background-color: #eeeeee; -} - -.jumbotron h1, -.jumbotron .h1 { - line-height: 1; - color: inherit; -} - -.jumbotron p { - line-height: 1.4; -} - -.container .jumbotron { - border-radius: 6px; -} - -.jumbotron .container { - max-width: 100%; -} - -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} - -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.428571429; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -.thumbnail > img, -.thumbnail a > img { - display: block; - height: auto; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #428bca; -} - -.thumbnail .caption { - padding: 9px; - color: #333333; -} - -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} - -.alert h4 { - margin-top: 0; - color: inherit; -} - -.alert .alert-link { - font-weight: bold; -} - -.alert > p, -.alert > ul { - margin-bottom: 0; -} - -.alert > p + p { - margin-top: 5px; -} - -.alert-dismissable { - padding-right: 35px; -} - -.alert-dismissable .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} - -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-success hr { - border-top-color: #c9e2b3; -} - -.alert-success .alert-link { - color: #2b542c; -} - -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-info hr { - border-top-color: #a6e1ec; -} - -.alert-info .alert-link { - color: #245269; -} - -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} - -.alert-warning hr { - border-top-color: #f7e1b5; -} - -.alert-warning .alert-link { - color: #66512c; -} - -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} - -.alert-danger hr { - border-top-color: #e4b9c0; -} - -.alert-danger .alert-link { - color: #843534; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #ffffff; - text-align: center; - background-color: #428bca; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress-striped .progress-bar { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 40px 40px; -} - -.progress.active .progress-bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-bar-success { - background-color: #5cb85c; -} - -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-bar-info { - background-color: #5bc0de; -} - -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-bar-warning { - background-color: #f0ad4e; -} - -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-bar-danger { - background-color: #d9534f; -} - -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.media, -.media-body { - overflow: hidden; - zoom: 1; -} - -.media, -.media .media { - margin-top: 15px; -} - -.media:first-child { - margin-top: 0; -} - -.media-object { - display: block; -} - -.media-heading { - margin: 0 0 5px; -} - -.media > .pull-left { - margin-right: 10px; -} - -.media > .pull-right { - margin-left: 10px; -} - -.media-list { - padding-left: 0; - list-style: none; -} - -.list-group { - padding-left: 0; - margin-bottom: 20px; -} - -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #ffffff; - border: 1px solid #dddddd; -} - -.list-group-item:first-child { - border-top-right-radius: 4px; - border-top-left-radius: 4px; -} - -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} - -.list-group-item > .badge { - float: right; -} - -.list-group-item > .badge + .badge { - margin-right: 5px; -} - -a.list-group-item { - color: #555555; -} - -a.list-group-item .list-group-item-heading { - color: #333333; -} - -a.list-group-item:hover, -a.list-group-item:focus { - text-decoration: none; - background-color: #f5f5f5; -} - -a.list-group-item.active, -a.list-group-item.active:hover, -a.list-group-item.active:focus { - z-index: 2; - color: #ffffff; - background-color: #428bca; - border-color: #428bca; -} - -a.list-group-item.active .list-group-item-heading, -a.list-group-item.active:hover .list-group-item-heading, -a.list-group-item.active:focus .list-group-item-heading { - color: inherit; -} - -a.list-group-item.active .list-group-item-text, -a.list-group-item.active:hover .list-group-item-text, -a.list-group-item.active:focus .list-group-item-text { - color: #e1edf7; -} - -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} - -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} - -.panel { - margin-bottom: 20px; - background-color: #ffffff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.panel-body { - padding: 15px; -} - -.panel-body:before, -.panel-body:after { - display: table; - content: " "; -} - -.panel-body:after { - clear: both; -} - -.panel-body:before, -.panel-body:after { - display: table; - content: " "; -} - -.panel-body:after { - clear: both; -} - -.panel > .list-group { - margin-bottom: 0; -} - -.panel > .list-group .list-group-item { - border-width: 1px 0; -} - -.panel > .list-group .list-group-item:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.panel > .list-group .list-group-item:last-child { - border-bottom: 0; -} - -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} - -.panel > .table, -.panel > .table-responsive > .table { - margin-bottom: 0; -} - -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive { - border-top: 1px solid #dddddd; -} - -.panel > .table > tbody:first-child th, -.panel > .table > tbody:first-child td { - border-top: 0; -} - -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} - -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} - -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} - -.panel > .table-bordered > thead > tr:last-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:last-child > th, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-bordered > thead > tr:last-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; -} - -.panel > .table-responsive { - margin-bottom: 0; - border: 0; -} - -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-right-radius: 3px; - border-top-left-radius: 3px; -} - -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} - -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} - -.panel-title > a { - color: inherit; -} - -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #dddddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} - -.panel-group .panel { - margin-bottom: 0; - overflow: hidden; - border-radius: 4px; -} - -.panel-group .panel + .panel { - margin-top: 5px; -} - -.panel-group .panel-heading { - border-bottom: 0; -} - -.panel-group .panel-heading + .panel-collapse .panel-body { - border-top: 1px solid #dddddd; -} - -.panel-group .panel-footer { - border-top: 0; -} - -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #dddddd; -} - -.panel-default { - border-color: #dddddd; -} - -.panel-default > .panel-heading { - color: #333333; - background-color: #f5f5f5; - border-color: #dddddd; -} - -.panel-default > .panel-heading + .panel-collapse .panel-body { - border-top-color: #dddddd; -} - -.panel-default > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #dddddd; -} - -.panel-primary { - border-color: #428bca; -} - -.panel-primary > .panel-heading { - color: #ffffff; - background-color: #428bca; - border-color: #428bca; -} - -.panel-primary > .panel-heading + .panel-collapse .panel-body { - border-top-color: #428bca; -} - -.panel-primary > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #428bca; -} - -.panel-success { - border-color: #d6e9c6; -} - -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.panel-success > .panel-heading + .panel-collapse .panel-body { - border-top-color: #d6e9c6; -} - -.panel-success > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #d6e9c6; -} - -.panel-warning { - border-color: #faebcc; -} - -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} - -.panel-warning > .panel-heading + .panel-collapse .panel-body { - border-top-color: #faebcc; -} - -.panel-warning > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #faebcc; -} - -.panel-danger { - border-color: #ebccd1; -} - -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} - -.panel-danger > .panel-heading + .panel-collapse .panel-body { - border-top-color: #ebccd1; -} - -.panel-danger > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #ebccd1; -} - -.panel-info { - border-color: #bce8f1; -} - -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.panel-info > .panel-heading + .panel-collapse .panel-body { - border-top-color: #bce8f1; -} - -.panel-info > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #bce8f1; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-lg { - padding: 24px; - border-radius: 6px; -} - -.well-sm { - padding: 9px; - border-radius: 3px; -} - -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover, -.close:focus { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.5; - filter: alpha(opacity=50); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.modal-open { - overflow: hidden; -} - -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - display: none; - overflow: auto; - overflow-y: scroll; -} - -.modal.fade .modal-dialog { - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - transform: translate(0, -25%); - -webkit-transition: -webkit-transform 0.3s ease-out; - -moz-transition: -moz-transform 0.3s ease-out; - -o-transition: -o-transform 0.3s ease-out; - transition: transform 0.3s ease-out; -} - -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - transform: translate(0, 0); -} - -.modal-dialog { - position: relative; - z-index: 1050; - width: auto; - margin: 10px; -} - -.modal-content { - position: relative; - background-color: #ffffff; - border: 1px solid #999999; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - background-clip: padding-box; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; - filter: alpha(opacity=0); -} - -.modal-backdrop.in { - opacity: 0.5; - filter: alpha(opacity=50); -} - -.modal-header { - min-height: 16.428571429px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} - -.modal-header .close { - margin-top: -2px; -} - -.modal-title { - margin: 0; - line-height: 1.428571429; -} - -.modal-body { - position: relative; - padding: 20px; -} - -.modal-footer { - padding: 19px 20px 20px; - margin-top: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -@media screen and (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - } -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - font-size: 12px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.9; - filter: alpha(opacity=90); -} - -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} - -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} - -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} - -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.top-left .tooltip-arrow { - bottom: 0; - left: 5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.top-right .tooltip-arrow { - right: 5px; - bottom: 0; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.tooltip.bottom-left .tooltip-arrow { - top: 0; - left: 5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.tooltip.bottom-right .tooltip-arrow { - top: 0; - right: 5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - background-clip: padding-box; -} - -.popover.top { - margin-top: -10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-left: -10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} - -.popover-content { - padding: 9px 14px; -} - -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover .arrow { - border-width: 11px; -} - -.popover .arrow:after { - border-width: 10px; - content: ""; -} - -.popover.top .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999999; - border-top-color: rgba(0, 0, 0, 0.25); - border-bottom-width: 0; -} - -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-top-color: #ffffff; - border-bottom-width: 0; - content: " "; -} - -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999999; - border-right-color: rgba(0, 0, 0, 0.25); - border-left-width: 0; -} - -.popover.right .arrow:after { - bottom: -10px; - left: 1px; - border-right-color: #ffffff; - border-left-width: 0; - content: " "; -} - -.popover.bottom .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-bottom-color: #999999; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-top-width: 0; -} - -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-bottom-color: #ffffff; - border-top-width: 0; - content: " "; -} - -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-left-color: #999999; - border-left-color: rgba(0, 0, 0, 0.25); - border-right-width: 0; -} - -.popover.left .arrow:after { - right: 1px; - bottom: -10px; - border-left-color: #ffffff; - border-right-width: 0; - content: " "; -} - -.carousel { - position: relative; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - height: auto; - max-width: 100%; - line-height: 1; -} - -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} - -.carousel-inner > .active { - left: 0; -} - -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel-inner > .next { - left: 100%; -} - -.carousel-inner > .prev { - left: -100%; -} - -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} - -.carousel-inner > .active.left { - left: -100%; -} - -.carousel-inner > .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #ffffff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.left { - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); -} - -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); -} - -.carousel-control:hover, -.carousel-control:focus { - color: #ffffff; - text-decoration: none; - outline: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; -} - -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; -} - -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; -} - -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - margin-left: -10px; - font-family: serif; -} - -.carousel-control .icon-prev:before { - content: '\2039'; -} - -.carousel-control .icon-next:before { - content: '\203a'; -} - -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} - -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #ffffff; - border-radius: 10px; -} - -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #ffffff; -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #ffffff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); -} - -.carousel-caption .btn { - text-shadow: none; -} - -@media screen and (min-width: 768px) { - .carousel-control .glyphicons-chevron-left, - .carousel-control .glyphicons-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - margin-left: -15px; - font-size: 30px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} - -.clearfix:before, -.clearfix:after { - display: table; - content: " "; -} - -.clearfix:after { - clear: both; -} - -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} - -.pull-right { - float: right !important; -} - -.pull-left { - float: left !important; -} - -.hide { - display: none !important; -} - -.show { - display: block !important; -} - -.invisible { - visibility: hidden; -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.hidden { - display: none !important; - visibility: hidden !important; -} - -.affix { - position: fixed; -} - -@-ms-viewport { - width: device-width; -} - -.visible-xs, -tr.visible-xs, -th.visible-xs, -td.visible-xs { - display: none !important; -} - -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-xs.visible-sm { - display: block !important; - } - table.visible-xs.visible-sm { - display: table; - } - tr.visible-xs.visible-sm { - display: table-row !important; - } - th.visible-xs.visible-sm, - td.visible-xs.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-xs.visible-md { - display: block !important; - } - table.visible-xs.visible-md { - display: table; - } - tr.visible-xs.visible-md { - display: table-row !important; - } - th.visible-xs.visible-md, - td.visible-xs.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-xs.visible-lg { - display: block !important; - } - table.visible-xs.visible-lg { - display: table; - } - tr.visible-xs.visible-lg { - display: table-row !important; - } - th.visible-xs.visible-lg, - td.visible-xs.visible-lg { - display: table-cell !important; - } -} - -.visible-sm, -tr.visible-sm, -th.visible-sm, -td.visible-sm { - display: none !important; -} - -@media (max-width: 767px) { - .visible-sm.visible-xs { - display: block !important; - } - table.visible-sm.visible-xs { - display: table; - } - tr.visible-sm.visible-xs { - display: table-row !important; - } - th.visible-sm.visible-xs, - td.visible-sm.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-sm.visible-md { - display: block !important; - } - table.visible-sm.visible-md { - display: table; - } - tr.visible-sm.visible-md { - display: table-row !important; - } - th.visible-sm.visible-md, - td.visible-sm.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-sm.visible-lg { - display: block !important; - } - table.visible-sm.visible-lg { - display: table; - } - tr.visible-sm.visible-lg { - display: table-row !important; - } - th.visible-sm.visible-lg, - td.visible-sm.visible-lg { - display: table-cell !important; - } -} - -.visible-md, -tr.visible-md, -th.visible-md, -td.visible-md { - display: none !important; -} - -@media (max-width: 767px) { - .visible-md.visible-xs { - display: block !important; - } - table.visible-md.visible-xs { - display: table; - } - tr.visible-md.visible-xs { - display: table-row !important; - } - th.visible-md.visible-xs, - td.visible-md.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-md.visible-sm { - display: block !important; - } - table.visible-md.visible-sm { - display: table; - } - tr.visible-md.visible-sm { - display: table-row !important; - } - th.visible-md.visible-sm, - td.visible-md.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-md.visible-lg { - display: block !important; - } - table.visible-md.visible-lg { - display: table; - } - tr.visible-md.visible-lg { - display: table-row !important; - } - th.visible-md.visible-lg, - td.visible-md.visible-lg { - display: table-cell !important; - } -} - -.visible-lg, -tr.visible-lg, -th.visible-lg, -td.visible-lg { - display: none !important; -} - -@media (max-width: 767px) { - .visible-lg.visible-xs { - display: block !important; - } - table.visible-lg.visible-xs { - display: table; - } - tr.visible-lg.visible-xs { - display: table-row !important; - } - th.visible-lg.visible-xs, - td.visible-lg.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-lg.visible-sm { - display: block !important; - } - table.visible-lg.visible-sm { - display: table; - } - tr.visible-lg.visible-sm { - display: table-row !important; - } - th.visible-lg.visible-sm, - td.visible-lg.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-lg.visible-md { - display: block !important; - } - table.visible-lg.visible-md { - display: table; - } - tr.visible-lg.visible-md { - display: table-row !important; - } - th.visible-lg.visible-md, - td.visible-lg.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} - -.hidden-xs { - display: block !important; -} - -table.hidden-xs { - display: table; -} - -tr.hidden-xs { - display: table-row !important; -} - -th.hidden-xs, -td.hidden-xs { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-xs, - tr.hidden-xs, - th.hidden-xs, - td.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-xs.hidden-sm, - tr.hidden-xs.hidden-sm, - th.hidden-xs.hidden-sm, - td.hidden-xs.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-xs.hidden-md, - tr.hidden-xs.hidden-md, - th.hidden-xs.hidden-md, - td.hidden-xs.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-xs.hidden-lg, - tr.hidden-xs.hidden-lg, - th.hidden-xs.hidden-lg, - td.hidden-xs.hidden-lg { - display: none !important; - } -} - -.hidden-sm { - display: block !important; -} - -table.hidden-sm { - display: table; -} - -tr.hidden-sm { - display: table-row !important; -} - -th.hidden-sm, -td.hidden-sm { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-sm.hidden-xs, - tr.hidden-sm.hidden-xs, - th.hidden-sm.hidden-xs, - td.hidden-sm.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm, - tr.hidden-sm, - th.hidden-sm, - td.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-sm.hidden-md, - tr.hidden-sm.hidden-md, - th.hidden-sm.hidden-md, - td.hidden-sm.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-sm.hidden-lg, - tr.hidden-sm.hidden-lg, - th.hidden-sm.hidden-lg, - td.hidden-sm.hidden-lg { - display: none !important; - } -} - -.hidden-md { - display: block !important; -} - -table.hidden-md { - display: table; -} - -tr.hidden-md { - display: table-row !important; -} - -th.hidden-md, -td.hidden-md { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-md.hidden-xs, - tr.hidden-md.hidden-xs, - th.hidden-md.hidden-xs, - td.hidden-md.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-md.hidden-sm, - tr.hidden-md.hidden-sm, - th.hidden-md.hidden-sm, - td.hidden-md.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md, - tr.hidden-md, - th.hidden-md, - td.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-md.hidden-lg, - tr.hidden-md.hidden-lg, - th.hidden-md.hidden-lg, - td.hidden-md.hidden-lg { - display: none !important; - } -} - -.hidden-lg { - display: block !important; -} - -table.hidden-lg { - display: table; -} - -tr.hidden-lg { - display: table-row !important; -} - -th.hidden-lg, -td.hidden-lg { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-lg.hidden-xs, - tr.hidden-lg.hidden-xs, - th.hidden-lg.hidden-xs, - td.hidden-lg.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-lg.hidden-sm, - tr.hidden-lg.hidden-sm, - th.hidden-lg.hidden-sm, - td.hidden-lg.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-lg.hidden-md, - tr.hidden-lg.hidden-md, - th.hidden-lg.hidden-md, - td.hidden-lg.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-lg, - tr.hidden-lg, - th.hidden-lg, - td.hidden-lg { - display: none !important; - } -} - -.visible-print, -tr.visible-print, -th.visible-print, -td.visible-print { - display: none !important; -} - -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } - .hidden-print, - tr.hidden-print, - th.hidden-print, - td.hidden-print { - display: none !important; - } -} \ No newline at end of file diff --git a/webroot/AutoSa/static/css/bootstrap.min.css b/webroot/AutoSa/static/css/bootstrap.min.css deleted file mode 100644 index c547283bb..000000000 --- a/webroot/AutoSa/static/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#8a6d3b}.text-warning:hover{color:#66512c}.text-danger{color:#a94442}.text-danger:hover{color:#843534}.text-success{color:#3c763d}.text-success:hover{color:#2b542c}.text-info{color:#31708f}.text-info:hover{color:#245269}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#fff}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}table.hidden-xs{display:table}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,tr.hidden-xs.hidden-md,th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}table.hidden-sm{display:table}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,tr.hidden-sm.hidden-md,th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}table.hidden-md{display:table}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs,tr.hidden-md.hidden-xs,th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,tr.hidden-md.hidden-sm,th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg,tr.hidden-md.hidden-lg,th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}table.hidden-lg{display:table}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,tr.hidden-lg.hidden-md,th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/webroot/AutoSa/static/css/docs.css b/webroot/AutoSa/static/css/docs.css deleted file mode 100644 index 368053950..000000000 --- a/webroot/AutoSa/static/css/docs.css +++ /dev/null @@ -1,1198 +0,0 @@ -/*! - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Creative Commons Attribution 3.0 Unported License. For - * details, see http://creativecommons.org/licenses/by/3.0/. - */ - - -/* - * Bootstrap Documentation - * Special styles for presenting Bootstrap's documentation and code examples. - * - * Table of contents: - * - * Scaffolding - * Main navigation - * Footer - * Social buttons - * Homepage - * Page headers - * Old docs callout - * Ads - * Side navigation - * Docs sections - * Callouts - * Grid styles - * Examples - * Code snippets (highlight) - * Responsive tests - * Glyphicons - * Customizer - * Miscellaneous - */ - - -/* - * Scaffolding - * - * Update the basics of our documents to prep for docs content. - */ - -body { - position: relative; /* For scrollyspy */ - padding-top: 50px; /* Account for fixed navbar */ -} - -/* Keep code small in tables on account of limited space */ -.table code { - font-size: 13px; - font-weight: normal; -} - -/* Outline button for use within the docs */ -.btn-outline { - color: #563d7c; - background-color: #fff; - border-color: #e5e5e5; -} -.btn-outline:hover, -.btn-outline:focus, -.btn-outline:active { - color: #fff; - background-color: #563d7c; - border-color: #563d7c; -} - -/* Inverted outline button (white on dark) */ -.btn-outline-inverse { - color: #fff; - background-color: transparent; - border-color: #cdbfe3; -} -.btn-outline-inverse:hover, -.btn-outline-inverse:focus, -.btn-outline-inverse:active { - color: #563d7c; - text-shadow: none; - background-color: #fff; - border-color: #fff; -} - - -/* - * Main navigation - * - * Turn the `.navbar` at the top of the docs purple. - */ - -.bs-docs-nav { - text-shadow: 0 -1px 0 rgba(0,0,0,.15); - background-color: #563d7c; - border-color: #463265; - box-shadow: 0 1px 0 rgba(255,255,255,.1); -} -.bs-docs-nav .navbar-collapse { - border-color: #463265; -} -.bs-docs-nav .navbar-brand { - color: #fff; -} -.bs-docs-nav .navbar-nav > li > a { - color: #cdbfe3; -} -.bs-docs-nav .navbar-nav > li > a:hover { - color: #fff; -} -.bs-docs-nav .navbar-nav > .active > a, -.bs-docs-nav .navbar-nav > .active > a:hover { - color: #fff; - background-color: #463265; -} -.bs-docs-nav .navbar-toggle { - border-color: #563d7c; -} -.bs-docs-nav .navbar-toggle:hover { - background-color: #463265; - border-color: #463265; -} - - -/* - * Footer - * - * Separated section of content at the bottom of all pages, save the homepage. - */ - -.bs-footer { - padding-top: 40px; - padding-bottom: 30px; - margin-top: 100px; - color: #777; - text-align: center; - border-top: 1px solid #e5e5e5; -} -.footer-links { - margin: 10px 0; - padding-left: 0; -} -.footer-links li { - display: inline; - padding: 0 2px; -} -.footer-links li:first-child { - padding-left: 0; -} - -@media (min-width: 768px) { - .bs-footer { - text-align: left; - } - .bs-footer p { - margin-bottom: 0; - } -} - - -/* - * Social buttons - * - * Twitter and GitHub social action buttons (for homepage and footer). - */ - -.bs-social { - margin-top: 20px; - margin-bottom: 20px; - text-align: center; -} -.bs-social-buttons { - display: inline-block; - margin-bottom: 0; - padding-left: 0; - list-style: none; -} -.bs-social-buttons li { - display: inline-block; - line-height: 1; - padding: 5px 8px; -} -.bs-social-buttons .twitter-follow-button { - width: 225px !important; -} -.bs-social-buttons .twitter-share-button { - width: 98px !important; -} -/* Style the GitHub buttons via CSS instead of inline attributes */ -.github-btn { - border: 0; - overflow: hidden; -} - -@media (min-width: 768px) { - .bs-social { - text-align: left; - } - .bs-social-buttons li:first-child { - padding-left: 0; - } -} - - -/* - * Topography, yo! - * - * Apply the map background via base64 and relevant colors where we need 'em. - */ - -.bs-docs-home, -.bs-header { - color: #cdbfe3; - background-color: #563d7c; - background-image: url(data:image/png;base64,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); -} - - -/* - * Homepage - * - * Tweaks to the custom homepage and the masthead (main jumbotron). - */ - - /* Masthead (headings and download button) */ - .bs-masthead { - position: relative; - padding: 30px 15px; - text-align: center; - text-shadow: 0 1px 0 rgba(0,0,0,.15); -} -.bs-masthead h1 { - font-size: 50px; - line-height: 1; - color: #fff; -} -.bs-masthead .btn-outline-inverse { - margin: 10px; -} - -/* Links to project-level content like the repo, Expo, etc */ -.bs-masthead-links { - margin-top: 20px; - margin-bottom: 40px; - padding: 0 15px; - list-style: none; - text-align: center; -} -.bs-masthead-links li { - display: inline; -} -.bs-masthead-links li + li { - margin-left: 20px; -} -.bs-masthead-links a { - color: #fff; -} - -@media (min-width: 768px) { - .bs-masthead { - text-align: left; - padding-top: 140px; - padding-bottom: 140px; - } - .bs-masthead h1 { - font-size: 100px; - } - .bs-masthead .lead { - margin-right: 25%; - font-size: 30px; - } - .bs-masthead .btn-outline-inverse { - width: auto; - margin: 20px 5px 20px 0; - padding: 18px 24px; - font-size: 21px; - } - .bs-masthead-links { - padding: 0; - text-align: left; - } -} - - -/* - * Page headers - * - * Jumbotron-esque headers at the top of every page that's not the homepage. - */ - - -/* Page headers */ -.bs-header { - padding: 30px 15px 40px; /* side padding builds on .container 15px, so 30px */ - font-size: 16px; - text-align: center; - text-shadow: 0 1px 0 rgba(0,0,0,.15); -} -.bs-header h1 { - color: #fff; -} -.bs-header p { - font-weight: 300; - line-height: 1.5; -} -.bs-header .container { - position: relative; -} - -@media (min-width: 768px) { - .bs-header { - font-size: 21px; - text-align: left; - } - .bs-header h1 { - font-size: 60px; - line-height: 1; - } -} - -@media (min-width: 992px) { - .bs-header h1, - .bs-header p { - margin-right: 380px; - } -} - - -/* - * Carbon ads - * - * Single display ad that shows on all pages (except homepage) in page headers. - * The hella `!important` is required for any pre-set property. - */ - -.carbonad { - width: auto !important; - margin: 50px -30px -40px !important; - padding: 20px !important; - overflow: hidden; /* clearfix */ - height: auto !important; - font-size: 13px !important; - line-height: 16px !important; - text-align: left; - background: #463265 !important; - border: 0 !important; - box-shadow: inset 0 3px 5px rgba(0,0,0,.075); -} -.carbonad-img { - margin: 0 !important; -} -.carbonad-text, -.carbonad-tag { - float: none !important; - display: block !important; - width: auto !important; - height: auto !important; - margin-left: 145px !important; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !important; -} -.carbonad-text { - padding-top: 0 !important; -} -.carbonad-tag { - color: #cdbfe3 !important; - text-align: left !important; -} -.carbonad-text a, -.carbonad-tag a { - color: #fff !important; -} -.carbonad #azcarbon > img { - display: none; /* hide what I assume are tracking images */ -} - -@media (min-width: 768px) { - .carbonad { - margin: 0 !important; - border-radius: 4px; - box-shadow: inset 0 3px 5px rgba(0,0,0,.075), 0 1px 0 rgba(255,255,255,.1); - } -} - -@media (min-width: 992px) { - .carbonad { - position: absolute; - top: 20px; - right: 15px; /* 15px instead of 0 since box-sizing */ - padding: 15px !important; - width: 330px !important; - } -} - -/* Homepage variations */ -.bs-docs-home .carbonad { - margin: 0 -15px 40px !important; -} -@media (min-width: 480px) { - .bs-docs-home .carbonad { - width: 330px !important; - margin: 0 auto 40px !important; - border-radius: 4px; - } -} -@media (min-width: 768px) { - .bs-docs-home .carbonad { - float: left; - width: 330px !important; - margin: 0 0 30px !important; - } - .bs-docs-home .bs-social, - .bs-docs-home .bs-masthead-links { - margin-left: 350px; - } - .bs-docs-home .bs-social { - margin-bottom: 10px; - } - .bs-docs-home .bs-masthead-links { - margin-top: 10px; - } -} -@media (min-width: 992px) { - .bs-docs-home .carbonad { - position: static; - } -} -@media (min-width: 1170px) { - .bs-docs-home .carbonad { - margin-top: -25px !important; - } -} - - -/* - * Callout for 2.3.2 docs - * - * Only appears below page headers (not on the homepage). The homepage gets its - * own link with the masthead links. - */ - -.bs-old-docs { - padding: 15px 20px; - color: #777; - background-color: #fafafa; - border-top: 1px solid #fff; - border-bottom: 1px solid #e5e5e5; -} -.bs-old-docs strong { - color: #555; -} - - -/* - * Side navigation - * - * Scrollspy and affixed enhanced navigation to highlight sections and secondary - * sections of docs content. - */ - -/* By default it's not affixed in mobile views, so undo that */ -.bs-sidebar.affix { - position: static; -} - -/* First level of nav */ -.bs-sidenav { - margin-top: 30px; - margin-bottom: 30px; - padding-top: 10px; - padding-bottom: 10px; - text-shadow: 0 1px 0 #fff; - background-color: #f7f5fa; - border-radius: 5px; -} - -/* All levels of nav */ -.bs-sidebar .nav > li > a { - display: block; - color: #716b7a; - padding: 5px 20px; -} -.bs-sidebar .nav > li > a:hover, -.bs-sidebar .nav > li > a:focus { - text-decoration: none; - background-color: #e5e3e9; - border-right: 1px solid #dbd8e0; -} -.bs-sidebar .nav > .active > a, -.bs-sidebar .nav > .active:hover > a, -.bs-sidebar .nav > .active:focus > a { - font-weight: bold; - color: #563d7c; - background-color: transparent; - border-right: 1px solid #563d7c; -} - -/* Nav: second level (shown on .active) */ -.bs-sidebar .nav .nav { - display: none; /* Hide by default, but at >768px, show it */ - margin-bottom: 8px; -} -.bs-sidebar .nav .nav > li > a { - padding-top: 3px; - padding-bottom: 3px; - padding-left: 30px; - font-size: 90%; -} - -/* Show and affix the side nav when space allows it */ -@media (min-width: 992px) { - .bs-sidebar .nav > .active > ul { - display: block; - } - /* Widen the fixed sidebar */ - .bs-sidebar.affix, - .bs-sidebar.affix-bottom { - width: 213px; - } - .bs-sidebar.affix { - position: fixed; /* Undo the static from mobile first approach */ - top: 80px; - } - .bs-sidebar.affix-bottom { - position: absolute; /* Undo the static from mobile first approach */ - } - .bs-sidebar.affix-bottom .bs-sidenav, - .bs-sidebar.affix .bs-sidenav { - margin-top: 0; - margin-bottom: 0; - } -} -@media (min-width: 1200px) { - /* Widen the fixed sidebar again */ - .bs-sidebar.affix-bottom, - .bs-sidebar.affix { - width: 263px; - } -} - - -/* - * Docs sections - * - * Content blocks for each component or feature. - */ - -/* Space things out */ -.bs-docs-section + .bs-docs-section { - padding-top: 40px; -} - -/* Janky fix for preventing navbar from overlapping */ -h1[id] { - padding-top: 80px; - margin-top: -45px; -} - - -/* - * Callouts - * - * Not quite alerts, but custom and helpful notes for folks reading the docs. - * Requires a base and modifier class. - */ - -/* Common styles for all types */ -.bs-callout { - margin: 20px 0; - padding: 20px; - border-left: 3px solid #eee; -} -.bs-callout h4 { - margin-top: 0; - margin-bottom: 5px; -} -.bs-callout p:last-child { - margin-bottom: 0; -} - -/* Variations */ -.bs-callout-danger { - background-color: #fdf7f7; - border-color: #eed3d7; -} -.bs-callout-danger h4 { - color: #b94a48; -} -.bs-callout-warning { - background-color: #faf8f0; - border-color: #faebcc; -} -.bs-callout-warning h4 { - color: #8a6d3b; -} -.bs-callout-info { - background-color: #f4f8fa; - border-color: #bce8f1; -} -.bs-callout-info h4 { - color: #34789a; -} - - -/* - * Team members - * - * Avatars, names, and usernames for core team. - */ - -.bs-team .team-member { - color: #555; - line-height: 32px; -} -.bs-team .team-member:hover { - color: #333; - text-decoration: none; -} -.bs-team .github-btn { - float: right; - margin-top: 6px; - width: 120px; - height: 20px; -} -.bs-team img { - float: left; - width: 32px; - margin-right: 10px; - border-radius: 4px; -} - - -/* - * Grid examples - * - * Highlight the grid columns within the docs so folks can see their padding, - * alignment, sizing, etc. - */ - -.show-grid { - margin-bottom: 15px; -} -.show-grid [class^="col-"] { - padding-top: 10px; - padding-bottom: 10px; - background-color: #eee; - border: 1px solid #ddd; - background-color: rgba(86,61,124,.15); - border: 1px solid rgba(86,61,124,.2); -} - - -/* - * Examples - * - * Isolated sections of example content for each component or feature. Usually - * followed by a code snippet. - */ - -.bs-example { - position: relative; - padding: 45px 15px 15px; - margin: 0 -15px 15px; - background-color: #fafafa; - box-shadow: inset 0 3px 6px rgba(0,0,0,.05); - border-color: #e5e5e5 #eee #eee; - border-style: solid; - border-width: 1px 0; -} -/* Echo out a label for the example */ -.bs-example:after { - content: "Example"; - position: absolute; - top: 15px; - left: 15px; - font-size: 12px; - font-weight: bold; - color: #bbb; - text-transform: uppercase; - letter-spacing: 1px; -} - -/* Tweak display of the code snippets when following an example */ -.bs-example + .highlight { - margin: -15px -15px 15px; - border-radius: 0; - border-width: 0 0 1px; -} - -/* Make the examples and snippets not full-width */ -@media (min-width: 768px) { - .bs-example { - margin-left: 0; - margin-right: 0; - background-color: #fff; - border-width: 1px; - border-color: #ddd; - border-radius: 4px 4px 0 0; - box-shadow: none; - } - .bs-example + .highlight { - margin-top: -16px; - margin-left: 0; - margin-right: 0; - border-width: 1px; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - } -} - -/* Undo width of container */ -.bs-example .container { - width: auto; -} - -/* Tweak content of examples for optimum awesome */ -.bs-example > p:last-child, -.bs-example > ul:last-child, -.bs-example > ol:last-child, -.bs-example > blockquote:last-child, -.bs-example > .form-control:last-child, -.bs-example > .table:last-child, -.bs-example > .navbar:last-child, -.bs-example > .jumbotron:last-child, -.bs-example > .alert:last-child, -.bs-example > .panel:last-child, -.bs-example > .list-group:last-child, -.bs-example > .well:last-child, -.bs-example > .progress:last-child, -.bs-example > .table-responsive:last-child > .table { - margin-bottom: 0; -} -.bs-example > p > .close { - float: none; -} - -/* Typography */ -.bs-example-type .table .info { - color: #999; - vertical-align: middle; -} -.bs-example-type .table td { - padding: 15px 0; - border-color: #eee; -} -.bs-example-type .table tr:first-child td { - border-top: 0; -} -.bs-example-type h1, -.bs-example-type h2, -.bs-example-type h3, -.bs-example-type h4, -.bs-example-type h5, -.bs-example-type h6 { - margin: 0; -} - -/* Images */ -.bs-example > .img-circle, -.bs-example > .img-rounded, -.bs-example > .img-thumbnail { - margin: 5px; -} - -/* Tables */ -.bs-example > .table-responsive > .table { - background-color: #fff; -} - -/* Buttons */ -.bs-example > .btn, -.bs-example > .btn-group { - margin-top: 5px; - margin-bottom: 5px; -} -.bs-example > .btn-toolbar + .btn-toolbar { - margin-top: 10px; -} - -/* Forms */ -.bs-example-control-sizing select, -.bs-example-control-sizing input[type="text"] + input[type="text"] { - margin-top: 10px; -} -.bs-example-form .input-group { - margin-bottom: 10px; -} -.bs-example > textarea.form-control { - resize: vertical; -} - -/* List groups */ -.bs-example > .list-group { - max-width: 400px; -} - -/* Navbars */ -.bs-example .navbar:last-child { - margin-bottom: 0; -} -.bs-navbar-top-example, -.bs-navbar-bottom-example { - z-index: 1; - padding: 0; - overflow: hidden; /* cut the drop shadows off */ -} -.bs-navbar-top-example .navbar-header, -.bs-navbar-bottom-example .navbar-header { - margin-left: 0; -} -.bs-navbar-top-example .navbar-fixed-top, -.bs-navbar-bottom-example .navbar-fixed-bottom { - position: relative; - margin-left: 0; - margin-right: 0; -} -.bs-navbar-top-example { - padding-bottom: 45px; -} -.bs-navbar-top-example:after { - top: auto; - bottom: 15px; -} -.bs-navbar-top-example .navbar-fixed-top { - top: -1px; -} -.bs-navbar-bottom-example { - padding-top: 45px; -} -.bs-navbar-bottom-example .navbar-fixed-bottom { - bottom: -1px; -} -.bs-navbar-bottom-example .navbar { - margin-bottom: 0; -} -@media (min-width: 768px) { - .bs-navbar-top-example .navbar-fixed-top, - .bs-navbar-bottom-example .navbar-fixed-bottom { - position: absolute; - } - .bs-navbar-top-example { - border-radius: 0 0 4px 4px; - } - .bs-navbar-bottom-example { - border-radius: 4px 4px 0 0; - } -} - -/* Pagination */ -.bs-example .pagination { - margin-top: 10px; - margin-bottom: 10px; -} - -/* Pager */ -.bs-example > .pager { - margin-top: 0; -} - -/* Example modals */ -.bs-example-modal { - background-color: #f5f5f5; -} -.bs-example-modal .modal { - position: relative; - top: auto; - right: auto; - left: auto; - bottom: auto; - z-index: 1; - display: block; -} -.bs-example-modal .modal-dialog { - left: auto; - margin-left: auto; - margin-right: auto; -} - -/* Example dropdowns */ -.bs-example > .dropdown > .dropdown-menu { - position: static; - display: block; - margin-bottom: 5px; -} - -/* Example tabbable tabs */ -.bs-example-tabs .nav-tabs { - margin-bottom: 15px; -} - -/* Tooltips */ -.bs-example-tooltips { - text-align: center; -} -.bs-example-tooltips > .btn { - margin-top: 5px; - margin-bottom: 5px; -} - -/* Popovers */ -.bs-example-popover { - padding-bottom: 24px; - background-color: #f9f9f9; -} -.bs-example-popover .popover { - position: relative; - display: block; - float: left; - width: 260px; - margin: 20px; -} - -/* Scrollspy demo on fixed height div */ -.scrollspy-example { - position: relative; - height: 200px; - margin-top: 10px; - overflow: auto; -} - - -/* - * Code snippets - * - * Generated via Pygments and Jekyll, these are snippets of HTML, CSS, and JS. - */ - -.highlight { - display: none; /* hidden by default, until >480px */ - padding: 9px 14px; - margin-bottom: 14px; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; - border-radius: 4px; -} -.highlight pre { - padding: 0; - margin-top: 0; - margin-bottom: 0; - background-color: transparent; - border: 0; - white-space: nowrap; -} -.highlight pre code { - font-size: inherit; - color: #333; /* Effectively the base text color */ -} -.highlight pre .lineno { - display: inline-block; - width: 22px; - padding-right: 5px; - margin-right: 10px; - text-align: right; - color: #bebec5; -} - -/* Show code snippets when we have the space */ -@media (min-width: 481px) { - .highlight { - display: block; - } -} - - -/* - * Responsive tests - * - * Generate a set of tests to show the responsive utilities in action. - */ - -/* Responsive (scrollable) doc tables */ -.table-responsive .highlight pre { - white-space: normal; -} - -/* Utility classes table */ -.bs-table th small, -.responsive-utilities th small { - display: block; - font-weight: normal; - color: #999; -} -.responsive-utilities tbody th { - font-weight: normal; -} -.responsive-utilities td { - text-align: center; -} -.responsive-utilities td.is-visible { - color: #468847; - background-color: #dff0d8 !important; -} -.responsive-utilities td.is-hidden { - color: #ccc; - background-color: #f9f9f9 !important; -} - -/* Responsive tests */ -.responsive-utilities-test { - margin-top: 5px; -} -.responsive-utilities-test .col-xs-6 { - margin-bottom: 10px; -} -.responsive-utilities-test span { - padding: 15px 10px; - font-size: 14px; - font-weight: bold; - line-height: 1.1; - text-align: center; - border-radius: 4px; -} -.visible-on .col-xs-6 .hidden-xs, -.visible-on .col-xs-6 .hidden-sm, -.visible-on .col-xs-6 .hidden-md, -.visible-on .col-xs-6 .hidden-lg, -.hidden-on .col-xs-6 .hidden-xs, -.hidden-on .col-xs-6 .hidden-sm, -.hidden-on .col-xs-6 .hidden-md, -.hidden-on .col-xs-6 .hidden-lg { - color: #999; - border: 1px solid #ddd; -} -.visible-on .col-xs-6 .visible-xs, -.visible-on .col-xs-6 .visible-sm, -.visible-on .col-xs-6 .visible-md, -.visible-on .col-xs-6 .visible-lg, -.hidden-on .col-xs-6 .visible-xs, -.hidden-on .col-xs-6 .visible-sm, -.hidden-on .col-xs-6 .visible-md, -.hidden-on .col-xs-6 .visible-lg { - color: #468847; - background-color: #dff0d8; - border: 1px solid #d6e9c6; -} - - -/* - * Glyphicons - * - * Special styles for displaying the icons and their classes in the docs. - */ - -.bs-glyphicons { - padding-left: 0; - padding-bottom: 1px; - margin-bottom: 20px; - list-style: none; - overflow: hidden; -} -.bs-glyphicons li { - float: left; - width: 25%; - height: 115px; - padding: 10px; - margin: 0 -1px -1px 0; - font-size: 12px; - line-height: 1.4; - text-align: center; - border: 1px solid #ddd; -} -.bs-glyphicons .glyphicon { - margin-top: 5px; - margin-bottom: 10px; - font-size: 24px; -} -.bs-glyphicons .glyphicon-class { - display: block; - text-align: center; - word-wrap: break-word; /* Help out IE10+ with class names */ -} -.bs-glyphicons li:hover { - background-color: rgba(86,61,124,.1); -} - -@media (min-width: 768px) { - .bs-glyphicons li { - width: 12.5%; - } -} - - -/* - * Customizer - * - * Since this is so form control heavy, we have quite a few styles to customize - * the display of inputs, headings, and more. Also included are all the download - * buttons and actions. - */ - -.bs-customizer .toggle { - float: right; - margin-top: 85px; /* On account of ghetto navbar fix */ -} - -/* Headings and form contrls */ -.bs-customizer label { - margin-top: 10px; - font-weight: 500; - color: #555; -} -.bs-customizer h2 { - margin-top: 0; - margin-bottom: 5px; - padding-top: 30px; -} -.bs-customizer h3 { - margin-bottom: 0; -} -.bs-customizer h4 { - margin-top: 15px; - margin-bottom: 0; -} -.bs-customizer .bs-callout h4 { - margin-top: 0; /* lame, but due to specificity we have to duplicate */ - margin-bottom: 5px; -} -.bs-customizer input[type="text"] { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - background-color: #fafafa; -} -.bs-customizer .help-block { - font-size: 12px; - margin-bottom: 5px; -} - -/* For the variables, use regular weight */ -#less-section label { - font-weight: normal; -} - -/* Downloads */ -.bs-customize-download .btn-outline { - padding: 20px; -} - -/* Error handling */ -.bs-customizer-alert { - position: fixed; - top: 51px; - left: 0; - right: 0; - z-index: 1030; - padding: 15px 0; - color: #fff; - background-color: #d9534f; - box-shadow: inset 0 1px 0 rgba(255,255,255,.25); - border-bottom: 1px solid #b94441; -} -.bs-customizer-alert .close { - margin-top: -4px; - font-size: 24px; -} -.bs-customizer-alert p { - margin-bottom: 0; -} -.bs-customizer-alert .glyphicon { - margin-right: 5px; -} -.bs-customizer-alert pre { - margin: 10px 0 0; - color: #fff; - background-color: #a83c3a; - border-color: #973634; - box-shadow: inset 0 2px 4px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1); -} - - -/* - * Miscellaneous - * - * Odds and ends for optimum docs display. - */ - - /* About page */ - .bs-about { - font-size: 16px; - } - -/* Examples gallery: space out content better */ -.bs-examples h4 { - margin-bottom: 5px; -} -.bs-examples p { - margin-bottom: 20px; -} - -/* Pseudo :focus state for showing how it looks in the docs */ -#focusedInput { - border-color: rgba(82,168,236,.8); - outline: 0; - outline: thin dotted \9; /* IE6-9 */ - -moz-box-shadow: 0 0 8px rgba(82,168,236,.6); - box-shadow: 0 0 8px rgba(82,168,236,.6); -} - -/* Better spacing on download options in getting started */ -.bs-docs-dl-options h4 { - margin-top: 15px; - margin-bottom: 5px; -} - - diff --git a/webroot/AutoSa/static/css/main.css b/webroot/AutoSa/static/css/main.css deleted file mode 100644 index d96dcc01b..000000000 --- a/webroot/AutoSa/static/css/main.css +++ /dev/null @@ -1,133 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -/*设置全局字体*/ -body,button, input, p, select, textarea,h1 ,h2, h3, h4, h5, h6 { - font-family: "Helvetica Neue", Helvetica, STheiti, "微软雅黑", "宋体", Arial, Tahoma, sans-serif, serif;} - -/*左侧下拉菜单样式*/ - -/*左侧菜单*/ -.sidebar-menu { - border-right: 1px solid #c4c8cb; -} -/*一级菜单*/ -.menu-first { - height: 45px; - line-height: 45px; - background-color: #e9e9e9; - border-top: 1px solid #efefef; - border-bottom: 1px solid #e1e1e1; - padding: 0; - font-size: 14px; - font-weight: normal; - text-align: center; -} -/*一级菜单鼠标划过状态*/ -.menu-first:hover { - text-decoration: none; - background-color: #d6d4d5; - border-top: 1px solid #b7b7b7; - border-bottom: 1px solid #acacac; -} -/*二级菜单*/ -.menu-second li a { - background-color: #f6f6f6; - height: 31px; - line-height: 31px; - border-top: 1px solid #efefef; - border-bottom: 1px solid #efefef; - font-size: 12px; - text-align: center; -} -/*二级菜单鼠标划过样式*/ -.menu-second li a:hover { - text-decoration: none; - background-color: #66c3ec; - border-top: 1px solid #83ceed; - border-bottom: 1px solid #83ceed; - border-right: 3px solid #f8881c; - border-left: 3px solid #66c3ec; -} -/*二级菜单选中状态*/ -.menu-second-selected { - background-color: #66c3ec; - height: 31px; - line-height: 31px; - border-top: 1px solid #83ceed; - border-bottom: 1px solid #83ceed; - border-right: 3px solid #f8881c; - border-left: 3px solid #66c3ec; - text-align: center; -} - -/*覆盖bootstrap的样式*/ - .nav-list,.nav-list li a{ - padding: 0px; - margin: 0px; - } - -/*覆盖bootstrap的样式-大屏幕*/ -.screen { - padding: 10px; - margin-bottom: 10px; - font-size: 12px; - font-weight: 200; - line-height: 2.1428571435; - color: inherit; - background-color: #eeeeee; -} - -.jumbotron h1, -.jumbotron .h1 { - line-height: 1; - color: inherit; -} - -.jumbotron p { - line-height: 1.4; -} - -.container .jumbotron { - border-radius: 6px; -} - -.jumbotron .container { - max-width: 100%; -} - -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} - -.control-label { - text-align: left !important; -} - -.session_btn { - margin-right: 40px !important; - margin-top: 7px; -} - -select.add-perm { - height: 300px !important; -} - -/*li.dropdown-logout, ul.dropdown-logout { - min-width: 20px !important; - margin-right: 15px; -}*/ \ No newline at end of file diff --git a/webroot/AutoSa/static/fonts/glyphicons-halflings-regular.eot b/webroot/AutoSa/static/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 423bd5d3a20b804f596e04e5cd02fb4f16cfcbc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20290 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 diff --git a/webroot/AutoSa/static/images/b.png b/webroot/AutoSa/static/images/b.png deleted file mode 100644 index f184e6269b343014f58694093b55558dd5dde193..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84 zcmeAS@N?(olHy`uVBq!ia0vp^fG6i5I7 diff --git a/webroot/AutoSa/static/images/bg-body.gif b/webroot/AutoSa/static/images/bg-body.gif deleted file mode 100644 index 5ca214550d1e494a22bc0be116d681d4ac797a5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21720 zcmaI6>0c6v_x=qC2q+4Iii*f4A}*ogl9~ac;*MsfW`+A+noH(54Iu7IxRsR^nwFKB znw2%x0Pba_X0|yEE|obgTGrSyDIFHVQ>pVEGbKckM`1pFeY>s&ir~^C( z{9kNrY;4`S)!p6Q&CSi#)phgc%`Pr3&d$zGPEL-Fjw}|-!NI}a-rmm6j>%+h+O)~m z*4DJW^QgyrBW#r3YknMkw`=$(ag+@Kp>c!n&Ru5t9vY2Cp-{TIx;i>KNF-8QTl;^){-41A zzeM^51_A&qfc5_s{a;T2=mtA%nWxti)=^rL{Vbk!wzkZ3Rmd=^7^6((Fi3Si8hXdr zQT4R7v3xEzwInPu*2OsB4F;6qhb5cfNqB?3#<_R`&CHN!x)(<@%O?gJ5ivM|>29Kd z|4CDvG1i1;j?tGL(}a`;f8+6 zqjDMO=7v7jl_k|b4=P7h9T7^%#TEM2QT_QqN=cOwi#FX2Hz-x%y*7PWS=Hd9NSgoY4rCwz^=Y%yA=cC?S8IgK4{4R=-p3@5UR?kP4?5t3YBP(D%N|1WrUx?s2;lw~< zqyFx2RLs5|n=5xWJW@hU*2Gu@*8R;e57*J7bi(svRIxwu2SDgQe8WH*gl^RaA)x&h z286&-kCys*C5u#=I@O<{*p~S2dCb094pDPSJ~5|hT_@zgjH^(`c=&i!JzUpg2ABj6 zI&;q*CsSZFF|U`3(_kF(q!apJHqg~Nl{rdel#fvek;kUyLi{J5_!!CApE!``$AG3g z;V~-!ShYIB%Q--_!rpZG-zL3GYGI~s9llI73H{np?@JmvFAPp4#|yY{>Y4@@PPayR zIlJ46{Skkr2!T+Xwu%FRkol7$%h zL=t zoK#S8*}qDyZ${?HANa+)jJ|aD4i|C`?dlX`HC+w3r;nHh)J{Ovmhr$FdvixqJZ}e% z5x|Y^wRDBsx70nyxsY3JaEo`!vACpe9Eq^zI1Rxc=C9(fuP2XqpX)%^B0#2-r6B?1 z+Vl70bd7V$vtkKuB?tb57i&T8&4u_vny+SUJT96z*6jzOFrpFT_}XX8oKi4vQqAk@$WE_dnZi4^&Q-my_O zJ)Kk+wLX`TK|j*l722lzljHvD%3!8w=@$$G8`^DTii-7l_k&-4gw7wvfUWeOZK{qpZ)H z7}J&T4j%OD1jyHLf>OgkYiYC36d<`{KGs5DWcRX*-{&$dGt99u@OgWNvMSN#O5Inc zrg<7F*yg`P1X}LxNP%dRKd}xox%SAlNt)zd;}9Gp8ay4i@@QL6K5Fqx^qO;45i@KiQyF1u(> zljXrr6R-z4#f%6v9CfR;zK=O?L%UMB`zIN<+$69osn`C&>ornWd7GV&L8gPxC(a;7 zT>4XL4z|UaZoJPgO=Gv%2E|LZVr0)vrb&vCcyhprw}Xt9N5HDG^1Zz&qvwpT-aN!t zm@t%Vc+^m-SEhnVF54w@KO!;cl!Gn#9FSyKtMyCymXLtwQ!>43_eC;y8|Lg|0t@O< zo|2Z)FM6WLs}vQsr8j3$snbWiPSKHjoi8e8ZCi%T|Fqdx98>#u&SxtHe8??~flohM z+aJ*o2ahViL+wI)^lHT(sk=-_BBEyTwb;`LuUD(8=yIfR-5GYI@0*=8n^Rd(LTWG}-Tk zVgqFB%|7>?sI8^4BOhqU*Q&~I1^wnK&J0LF8B`PN5%4-^fE44R`O!6ngfFaM7B`tM6XI6^n6k1`;uCZ5@T?wz28-~*m8ruvbgk& z5(kNX056eAF6%r2{1)Rmz5ZFxV0-MAW5NkKdDjxku(t__)`#E%wZo z`UajlUw@iqkbO-6@ocEu{vlsu+@rP2nO_p|s=Lbi503xCS$oz^YIRECvEz?n+X4o8 z6?SRaCJD=l=v%Az9g4RhQj9e>&*Th%#aNjxl~(sJQ4AMQ!i#Z#`}DygvBi{=t+q&P z$sG|wn_{HMp>nin)G(_0r@G~}2G-fr1N zx_&Z~o8EZNvJ6J{v&tXPd?%^IGZc=oK$?ar#B*A<$DXVu$zqBmPY6@XrFEUMUL(8Fu;;k5v=Jc~r% zm0VyL+Qe-sOj+_wKu^{NhZ){lfiUx2tE$PKMrL1p`6r#GQbi+e&pT$E!|sxg>{qte zOD(hGjSnAxUYfu8l7v}M@QeIqLI=l=(Pmp47R6j};c$_G-fU1t2S7}ux1q`=EFs`x z?Q+)|j_URh7yk;GYK=0Y5;Gzi=7>6vMMj#^8jRX%7tpQ9713tt{ziqZM^p^mxT0lI zakDzRCr2V@=m{X?Oo%bns0$53XKLxGjbAbI;H$We*;S;h4iv#e#xe8QSB%6HE-*V% zT@OSKK)O!CmxTD3I?Za8S);-PvkI#c?C=sK$JT*b&%rNe;?Z^xMLWoZ9emf3>?sE@ zCOuz*wA8Ce&v=v&f!s@_T8k2`5@n(>+w)khl_|$lPpN6W zglguPlb$f&XqLBUnwQMM<3)PE%1~>{|DC(3HS<=71k|oMV;nQ~^yiS)ZD#GB(7*}f z3m9tKMAGFm+plbMGs<*3DTn<2$c+)QRr!cF2tZjfZ5O9(c-^3?IS^L{Ku!tku4?rx zVA^}EL-)IE*2rck_W0$GF`e6VAcFux1OumNFstBAZ_ha$GWxTrH>$Y zt!%5S)w4mWZeqQzplXeEyxXhW=eeSOPTS7I?P`EtvkM; zM`EF8vdgMan(^|8>nn)=9y2V|jweFG-j`u9b5PxGc-jQ%9+W&ZWkQW5JJ*w~rpVTx z$Qy<|7zdS~lRa#6FJ;T8816jsS}au{qjDX83z~-s$mT^FxT9I-ZluVa_PU4i;KES+ zGTSU@F|$Dq(p_Wd%RpPM9Ywc+P=efn6yVVL+|)<8_l)u$ocB&JJeho*dQ5GKZ^>-8 z)4RTMV0$;Fc-USx3T|#=B#F?bki53cxUSE*Pb(rQ$LuDMTEGr8pMd;1?Peg}Lnfy7 zwA+TN`43(hV^F*N9gN)*b{UCwr4*GIDt5h0V9mYKOT}stg}Y}tam($d@4w&<0T6+) zxIz_K1=cVJXjsWXwrswp2pf~>txYnjdoH|(g%4-N{(Nn0z}`CY&2k?qd!sQQ#Fub( zz;LnT;3r)3*Po(-(Eg{TAWF9p3YN!;jZ1eRmd~GZ&4Q&(Fg5v*oL-nAGpdpaydWoE z1bMI!H5@zJ6Fs2!`3Gm&sV|bUPpyD0T5XQIGB_y=GZACHhjB?|)ZI$Ifx_CIJ94lD zbO{?BEd=3KDy-CYJQ)b4b_k);cCJV5%J&j>cmW=H?U9zm_LU?K+U$ja(xv(zugi^N#H?gAP8HyS%A8#$t=+Ito$Qs-ww%irWCow$&M z09tV;ks|N97@y>lBbsHyntN1u?ffH$X9y%vHWZC*^mYp>%37T2G*qPUC3>f?;cpOA za~gDmUbNm

%*Wq#YWPfX2m8O(xN^26}$kqNI8`RSmI%CIB&-8PiuQWp=ZDS|jG@vx?4gA#ig-;maL7A^ZDu#V z;EGGq|1^;iI0t$~xh+=guP812v$V)|lZ}f5rY?GzAgpiu8kGJPa<03MJW;pMnrvs; z$okgh{Ow|p%Vqa5^y5~Y+n!*6(vG+SqA^jHD3HYj&gG!Wt-OR$c!(Xz@U%?i<~G33 zHv9vF{QIS$3*G2SLWdd2vbr_DpJ{Y@;sMeM8(u){}* zhtb@_^?9!Aqv4$chaKh)Hv(lFpkr>3w{Ea8yy}tWdnsxp4iQw39WR33UU8pv*iui- zI3%>bR<~tgbj#3ykqGVazNhNd0?<+c3sq>=wV=+g0?S&W@ALsmRt>iagsCaJSAmvx zJTtEq$T1){k4d`Oi%;%0`pATaJfn9oWnZq^D!04i&|1Piq?b&uq8Rm8IQ-L5PU^HK zeo?R&$o;|M?oZ~{rVcQ2AU12b?3~l~SP(1BI9K2IQoCnKmEKsLlszc@d;W$uws>1V zFC3?JUf_QJXj2RuWR21&M{~^8xLfc?Ax|_FzHK{>=8ha|yZbFSz%?%jaWd(8PUy|N z?aO%)&;36Sw3~+#H}<$DZ*n->qtHrx&e$tE`^)%Q`Iob{v~xMBrj)XC1qHudq-6Np zZx=B-9&Lv|hEPk7@2a@l;dUc&UjO{7+}-7ps4t&QR;5^zHy5P~XHfDMJ!OmMrxqV_ zt3S7OIkvT1+#1%}+Ui8KxnRzkF}HutKjlk%n@tl4jnhC>@fVt|g+&gTbl?;0V6Vlm z_L%N&Qwf*u5=)oKG|PMGMQZvXl;sGDb}R4V&>S=n06hUL!wdzMyr%7x3(yI!RYH_g z33S*S$;bjl%eE6mphV*BJqZAR2WS*&)XEz=D;y2d*mAZTvsZ20?gBfFx=Jf`TwcLf zD##z`cQ@2;Q9=H2*I8s%#H2Dw=op?%u?NsEA@t~T!FizJeE^oKjNzg<8%6Zz! zF}NK^STr=bZ(;gBKQ71Ga+*ed&owvotYUgP_D#8j*`rpc_{nJ!VIqQqGhZn@p|UWa z0PHB%>I)I8NL!57aVBN22`-RJLUd&ex?2dObxIp=!bxkGh!V{sSoU;v+hJfrvQ$Ga<*lL`MieuCPJ=!sR{fVzl{wH zg<>XRtaA@tk34%_Yc`>oME%VzQDS9sI#hQ-6dYm?mbaRk3jkk-1HK>8+?bf&H^d1X zv(tRi5ICs}oL&ulLJE4W1iu0k=1+~hvOB+I2Om-qJ}Ai?s+suJHn$UI`Q2v!&fNyg z-_`)#IZC>t#YMa_fzP=>-u_~hIL;0#$z3q|BhCl7_P66dKPP4&N@_F#FSr z2yRV+wGtUGi97P{G;DG_^6<{FjXNoyEkFJJZ65et0730&|D*k{Kd?>T&+7%h{_zl6 zSPSp0)sFTgz?B@bk`k$;l`Dq=Sox;WAyEoLoHI1?~(FtgrQRZ|*eT z#om?`;N;G7cXg5UTy^xYb@E{H?fV0H6(J=I2do==W%Si!+X{V~qA$H)cDuC+fb&5L zl%=v2FCyHq}!I zdepuOmu2C31c`T$GJz6q1)Lh-_~Q}K^ORPBUt8wJL^1}34&NzuiG+KO>IkBv+I?Cj zwdtlo0EVWY6ox>*ke%57df;rzQQFU}ZGN$xv4lha6*RVF^lUdvZ^TWaFFn>FL`c~` z#hzvU=*QB2z-z6*u~3(0R1bLwu5S^+T+s)`nV|H#?to&p7nNue8Obg^EgGA3Ey!)? z)w*%PzE1z2)Ey^O?@?ISfP$hJ?UQ-4JwfACPtleCC;~IA{3IH-b2k?% z9io0{Tzkf7z3()evvA*8Ev0mMOTxy9n^8v|$v1D3*LO86JN0*6J8Rr0a&x}(nRsh; zzx^ig8cXo-{@1(HG>u!cb+YNdived5=mNOy=NPW05uv@ zDJds8HaJpowNnQXhoNpBsCGBKGYA^GyVFyO?IPbV-n1jXMGAHTCyhVrw-lq1G|?bP z_Mg1!x;(vJXo9|Zn+b87i;D69XxlNR}S zM{A}1^NurU4}@iTtzRhAoaLGRw!JCw!rQaobLPh^-S_*fxPX#G~K0T*DSTrO#{Y-54!I2t@LXr^OOM)@4PAB&h_k#oUPTH0cH_c_q!wGgL2>PQ8aL-2I zI_hduCSETD3?JKm-0lQ6Ub!_|>1nn5vHZUqM6K;E9R2uyz>l@dWW)aZ=;f#EE2Pwf zT;H7pek?veooy#i-uaQm2BE@hK@+IReF5i7mTpNkY`gDoCWG8=jCbYz^?THZ)GNOW z*LCt$6v89&{#%O)^#}LMAEeVzTRgv<3IZ!cjiwoXWXut|bN%U@w$Jn?itBnFrc3;8rNdA8`0)U(3-z@t=v)Z1gd{LJYJ6ZreZ{9J$D+ zWN;=cHqpN@>k8Gts%`*$g^2c*%QZ;j(0zk()ffH)qmUN{9O>NKJG7O?yT0vk9b>lY z4mVgE_u(`T9WTvg@ej^@Du9$=HD3|uK}6ggTqF+k@N$f=meW#J&G)m1;__N8bp%5Ft412X zS<`AsO@N4d&%C!&rvBLLUgXGsjhPS!e5Ni!Rq@ zE4yNEj?M;4i=5XdJoO5nDBg_iv+%em8zB!#lwDn5TP6VQBH0Kx*N(ZgWmRA(LO*Gr zawO*s9ZwkL78|7wlr)Wzm-vCl7DCO2M^YG>}Alrnb~5h;Nd-rXqa?nE7SCsa}eJWS{mP*&2VP_F#^c*`q|qEm8yhB!wp; z{E6la`x)4Vi0m{bcD??OOut>(<#g7hL@&a5n8b;<>^H$}Dm-u|rCX8zR?dO68p6Z> z<{n;&=?Ufp9Hl!!0$o6+?&Sf@eKSvB9b%b98*ea5d#>cUo%`x`6oI6?|4B8u^gZLeAqQY{a6XZO z$(#a1mx8=lKQteL-xlf)EwGllb^Mz|`f;L*+#*tSxA8(s7(0hqCjbRbN8sWBF?RBK zXh4)`t3uAUe;N_Oy55RB~QNI#2@;FvRd_^IDG$eOE)#=exuF>U3!JhsUN5sV(w6D#)|vWi&T9$o)7b}a_1`>S_YqSF|tB^KUozedlr{gua%^SG= z?R5UShFMuGMKC>Nn3t>*30SY|T7zwb#JvtmaFIpwI;HUWmBR*CKh;&d9LAhHqN(@J z@MJJneBJbu?p{V+_9pvlP9}OIakg?z%qk!nq#( zm#uE?Yf%OM3=sX~DSqy!ndEKI$S#T`M$5k?-eh$!W^rH2@z?*gdT(?wEI zZ0zk$+mA}m&rCm**(hb2lnKaH6J(iS?~(4k%`)mK?!LC}ebFFVr;H|0(0XNC3M5)Z zvGj_0dY#I#No6VLGCJn>cef^=YSp9pfWt(z)I~;WNQ)c+L8<2|L@wPbd-+2%Thgv% zj!pp_HDj&4v{9lx4nR(ekYC9lot;bH=?fCO0`a zgHL6nO8f+{tCb1?>~H_B0Ea3xj->X7rXysp0@(!1yUSb*;4)x@?&57m^-_ zVUT_+5&yB6gd-H;+(r)7tj3;|YejfzH?L|l$i^?!$c|c_cL3d$3f-UT0x0LBc8im0 zk~@snqbl)sBvZFJ3|DDd%p~k+(SJZSU7zxu2I2$7^%Eq#J7#~ck_O}M%8z@(0Hu_8Lq7P@ zzALc9U=Njivuyyn&})whc;QX}Xo-#8UF8~ykw6^ZgzHfgarejlIo6zKxn2Lu6h-@H< zyp{+xP^$a5X<)q<_$?~#+ju3V`EZ6jc$S!n=?FHVi$PaEg5K&fSzaa+lH5G!3y&S)Erv!#lDOuS_U0YgMcs83Edn^hHSfy#-E{ z{F&_OoL1zV@mY5w9wB*TS9T?}KqVN2H|sEoWBH)dS#sKfP0cj#!QVfe>!c$07%WkY6}7SnnM) z60R-RH_)i*oVN%i9cAO1#j=X8)P4tW1CJg`1(y%28EfrZ=m3bp0-7dQvp0&2suqn(6utqk%oXw&1UQd1 zhowsGdDgV~7;SeyPw7W6_iIR) z2n-V`r-qf*AeCHRdZ4bSjLW?_WFfEr2X)ps4E4V=TBt%n=5Wlz1Wp0oFK&6_j1G1wH(yU@dg^J~=d zI+hrFlM2bjQX&A5hHGGBGRq*-Tfl~110dG+Ax0Hi$C)OFI66*){NrbQa;UgduXG#6 z>_^4M1Z7w;0DDKIQKJ<97gN4lx2bMpZ^G`m0BsTmAa?9m+7m_gu2zI=2|B6#cepG5 z>I%u-7*Z)0T_tVm^@W|%FcapO4@)gQ7$1YwKBXGcPeRYC4lSdl1;mQw@LY{(zLd{I zBHH*}z<^N^I83d@Am=YzLB589yX8O{Kqs9-WesXHJ&^y@SiS?uBags3V*(QWE0-6d zSP8J3d%21aQ9>Vk+QWB0t={()zfUgTTA~y$+B(0}MBF5rI!o+_8$QyD{{Vcv4h?IntFTxK*msk`+f}var^1+cYu%&r%lZUw&pLI=&n!~#Xu~N_at#%^NO9KFG@Jqq zc8ee`a@M#2^7Szox}om34!Y47P}Hw|^H77hBW=8?b-Xt%ZK`VRj!5`C;Fj^_Td&8t z%K;9_P7gb2pmlBaOY00k#$V9;qNv!fQ^ZMkZ&Hdsdt8}Lt_IPNZj20sJJsfM%p*e4 z8INjXx#G3cg1H~^abD2l!mh^>9m|rvbcX2p6vrgdnJjq2ieN(oB4EWm#}7QGwMD1> zan1#2aDd{2J0H6sUJ3LPLX4k=bPQain!7Pxh2GL|AJizi8yCa&3VS-RB_M(FngUsl zBdx~4Y-6u|U#JFv?VyV(+PwNQFSA8H=~iAP z0aoNWfBXi$yNu`VFNdTKL3D)J#06sy2{VAJyT9v2?3qbA`9n09@^#GcC3}~Fo-zJm zAWwHIaVQoT7T01@Aj9WX<4%eH zYckMs4|T^7BP}JLSY^sS5FHd8B|fM($R{{004z$WJk(vPT-`Scei3h+IB@7L9i$?{ z6AdnO#Je!EV*9*3g3>;$5e<0Mcqv#kEf#aj=rxIGkBp$KYy#bWY z&YR4&xT}C&VCbu=3%ZP0xD%J(+XA8qk@-oU1`DZNH5d?#u_YQQi1}yv&ap!X?n4L` zFzkMs5}w=Hc{6%DdYDfQ_Jg= zlkJbDKvr4HnTruwXYf-<= z3riL&|GHrr#yzzoaDDk0vQ0hx=@{;7VwC^IDDEqut?9KQy_3X`qUVDyzBL)C8JkFB{%Pf4iMLn9XWYh17=%fha+Pbt$ zwU+;|O1tGv{1E zs=&EbQ2vToS>ackYSNHudYth^@aX9IyBC72E*`3Azv*YGL_7=FO?EQ_G!`4!;pRf1voxaRPd=ePB3qg`N*j*Sl$_Kuc zL>?vD+`Qm)szvjyDA#e2;*m@?xoS-oCSKelH3Bwz>YafBjWF7golPJ}&>lU5dCGIn1M+ z6n!>DX$0)`6nxNq$Bpi(B>v}vlRxm{LJv)gjQdHO5I?|*0Q&&A31j=7!j`2Lv8;ag zOh139nLy`p9#n{zSKlt5jtf@B{C(!kt8w4!s#Ex3kDhb>=Ozvzr#(iV{|A$re;7J* zpu-0Fj&Q<;@^Pf}r4j|Z~O+5e@9xp4!0>!rVz7}ghFISVh zDZNG+PNrC>=dnzeqZ73K&+_|-fj$UTnf*pfjrY)MgDtV9gsZnJC%=%Dk(`-hdOW#7 z6rY|c6($!-+kVw<`88Q6&2-6+56x-L=}bwMiKX#jInhn|joLM$_}b3aW9bp;P4Pk* z{!U|hXF^kYL4IFugREID9#4%fdsm#ATw9gzQj#1I(b1tiUKLPLRhA!}vn{^wa!qET ztfNWlez`42)>I}`a)G8gJAa}lXMmm%B<-h>|J2+-!!GPCeP6ysxF#a4S+vA#Z8>jk zZZFGh*VHI2ZQ-H5XI?5Q^ZjLiJ6J5yhad^|$xWNNkg`w{kU55=R1r~F+x)+Ua|4*T zJL`p+Bcvjw?3W-ZPHFk96uxo(wG?n5LvIs0-CZaj7{}^$(A?Lfi)f)GmBusq9WwOn z8NvI4^8PEz`gUFVlr%Fz^*>wIa@`StnD^Wi6zEF5!sLO=S(eU&aoOatQeP6UY~?9$ zXZ!Y``HWrZdDX>QS&l!yb&oeu$wor05!sw)Z%XWG8HmJ1X<3YsZFC~7q{Xy+^Q`BC zG2mN%WO63E$Z)WADAFUoU!dedTso#o3f`rZ?Ku9WEn3FG7_dNwXnps%yEss+CXmLi z1(=#DVCR%@3++{71f{AQq}BHSzEWiZ2?9B2pyy&TeZ-)!#a&OecW&L=Cv)JEM4UCM zyc(Tt?ryj-mHOzQz%;u_hL+@A%t`WP)C-A(gZFNioGSS3st>es_5P02JCk0$Q6Azq z&6|;Y;G?_5uFxYwz0RBob&MuTxMGuUTw2VMq~>?p{d4biu7x9F+R{L|ff3cPM-3~CF_ zkx4M-gGW?DhrS<^fcjn?PcjpKE8v%?BG<}*$p@GBGZ_rt{mJW>6*K|?H9cLN>&oTXk*1P{JvWkAxo0`#0b%?wlNA5dlQ_bxU9k zY|vFA2D(^!H?WLpQS-RPM}|j) z366oat)tEI6&f~d$rN^x*x&z{Yy3%e@o@rK{}{;IU~B_gIygi*FM7a#Dy&2{Q_U~u zd-{V(qvhjmwBN>Lj~Q~zsdX@&OR5Nwk?Y%8uPj53`E5_{=@U#AStWe;ix}qWUukQH zryeYFvQ`^#ekR&}>-Cqf=^;*aj#x;PUa=EINw>8pnEq4*qaFoenjb;nfY;$SV-Y$c zFKcV}*O3iI*u-nEY$m}wcY(Lx|FJr>N%ZVB<6Ym;0ogXKduZ8yCS81JwdI!_JMS$p zJ3n+&JMGld@j{sZ?#(YPINUL$FX$=vc^a!5hzoznZ)?*@A2$ts8?+=l0NlFYlhzdB zt;5Mv1~#W5$%>s^EC@xZ0GN>@jZ699>fbh4LJf=jL5-8%(zTxn21mL9xJ;kPO9C+M z`MOu(_qM}pOX*Prw$d}#9@K?vO=Lb!Gyugo&S@*-3;>7&bOA<3ppH1uuh{m1Db{O( zKn%*Jt|WVvdIT&|@eyK@HV2-;&p>Li%1#PeD4$-v!dJE4CDCg^$BWNs$xsn(WN@S| zZa=I+cv#DdXdB0SYmp(khoEN_cdy4~F2j^@r?NnWVNeKi34FH%#r>-fk<@@2>%65T zH@9Fr?!XbdRmw|5>cEk~7E;SW*Zzv-Ws@oqnx74@MRt;De7#8)TLH z@GZqywY4CB0}Zw8pMOG9G;CfL);LGqhn)_fBAJ}r37THHmMB2?zn@L6PwONJ|0X;P zRCjXtTyd-@9lWPORaAWCi69`x0#zU)R$Vo+t0F2Z(-WbnV?q zHin|+1l!MtHOGCLPDTcxh09{i0EMG?%*%1g4r;5Y#_-mQj{G}=x7$oDHDUt`3(4@{ z$8nd$EfxPj-OooYS$pVw!#b#hOhH1imy)g@Fms&Y#u@qLXuf{hajq4g3f@sTfxqmk z*?9_iF`~^s+$ZRbb@Jo5sIDsp*Ou+v4k&+w(j%0JY2b;bHJQv<@j5MI zS9wH6!N$v~(vJwM4M|{cHI6<<1tu7+|1fs#Id%cv@#zObeF|r@x__V3UsIEpW62c@jxqV zk&OW9-YMxQ*EsJxb^f4%L*}rcxai_RK&RzoXS?K53ZQG3tP3p(UVBbq1#NVH8|*$` z(qrz;UoUgTLeBheC3Uc2cs)W3yBsEfwJCrdFY0H-!OiUOQ6)WEV9czbuy_OR;_xbB zC2vnbhhmRHY4p=eXRdfgKAzL?&?{eJF!&%CRdI5bb7aoz4|FA$3M5PnDY^$ByQ)AW zV6+PgoZ)r%Cm0fj+AT!sfk~RCO?9HiDqyS6QzJ5NF{*i0^Lt`+k_{t!%h zMi2}VUK$*%F%*X^wWx5lr{1>Ij&m`1S@IFhj(KxpozO6HTv%n% zr*I9cLad>+niQaBkrnT5V6=z;&pnJnGDMhB)ybaMT zT8u6O@_oE>RVbW4^w%&-w1!z#gH72`LJQXGQrJ>o!(}xw=u^2%lPdNLG{_4PFbhlv zYMNq01Q19_t|2v(>Q5}jAc5onjr4;c{ajtWA+N2!dTy~snNA!}^8@Zkm(2WBS&vFr zY88kwcv6D_fm7^b?b$u9vk`HqJ~vVXZwC6~xUqskZA%~fXy9&!&Y9#lFu4fe8>B^L z6KeP%8=0Ah%$X-6hRPtOt&ctX37AJj#{QWwuWhMq@ly7eI981$ ztUYeUnC`YEOwL=@E;xoPLMX4$3;Hpq3^I1x7reBuAQ&~iG-`Rt>V0VvxsW~vHsO`o z+o(2gM|`~`0!AEbYKtN&!K790VRJnM5lpd@da`-c5HKWyXPyG4iHIi($9k} zZwy+F@%SB6fih0e=+5AugImhMHb7YNtllBO>u$81;CG%NrI-9Z=Y6XOlsWN&*sn(epGAK-VX$^$ z2#Am7VWCxG;=}+9bY#DrOI&|!;%<-(d#QgPVmrMP7l5!zSAf%1AFq~d<@+6|67QFZ zXY$3t>7Z+KA^a{C$xEZW8^G$DM_7v{dtO{<;$B3lu)`IPIH2i25!(a)?8^(O_x|P8}~+t%15ODNz6omqD)pZcS3F zVYcX~OG2e8S_T*%Gph@JM;{se7nt&N7?Ja)y^USvb$8e3-&Y=6ZT{2BUr}UjT>;kpVuhm41kt0s5s6gw#{I4g9|#rQ;-udWw7wH*Z6@sO_;=?hVpeuvxuKrr z#0mgo;hsL7UU%(-H_<&!`ri>1og4Sl@7pIu^I*{166$RA!%xdJERs+K+R4-~Quyte z;GsKP;W(S&4mP5LZLkqiH4ZC(#-H?!$@&RCOdqLr8ApXn%=1$He_(l0mqU%V_w-*r#W{dr3v7`hchV z22Us7Uqau_2UqQ&-rY7T#Z0f}z-BQ*RaiOnj&{s_mbTA#UwF=&wmLCqarNb(?=~Jz zy(BhA>4Xz>KFn}ECdx*5W7u^;O5*Wj=1MTEBI-YggcY|-@>H^aLuE+wEl^FiG(hbSY}o+x+Q*tsvDCk zi#d=H46%uy$kg`KFxR%H4@A3Yu=pB|5gJZS-CJ3cE#(@U>HJgd?iY`nG!;c*6VdOM zp59n{`Ve%?s-s@t;?_W3m%c zt_l@b*6iv03FF#%^Nd_tjGV?z?Jwjp*Zl}2g7E=Cb2m;QFAt-HYO9*9BHB&^=hQv zru=@ow;49~-CVT|8F@7+%|p#mjgIGf{ph{k8>xog@5g&8oqqij-_Q5P3rm2*p!HOE$56QUisa!DaPTQ{k2Xg6 z5mNBCW*Z`DYh;0e@d4sd-{9MSGfQU@)Pj9H1WP|CI|F*R)7-@F5)e`8ZLjw}Wjiq~=;=*o=?74C5Lbvc5H=3e_wI6u4wvv%^_S{o*OKsfwv=33QT6QkC z?D~3iHVt}5$0K}B_P%!=A_ z`KlceafPrZ07{BLYIN_d0BqJs2LJ|5x#Y#$yXDj+<4R=KPT$i{s@G0G*?y(fW{<`u z+9Bk^-wf{MK@SD}{0!UjLo1{5=0AC)%g@ z0O5yj-;4l1$27bC145eE|G7PTS-g3~5}ie}D?<(qpYv}nbA>GM{PAY8!MByZu5m}1 z&*k44!ElwWrc%3w_$TAkDp^KofuY7Kzw2Q2G(fkQ0skAUQH z&087}Grz>`xHgBF&bCdsWkf9VRRgP|2E3A$Qec>(ulSU?ztHxmHEJDtjGyv~zKkG% zL}JUCRpXRa&$&$&q_3#SqqmO+F{;64VYim@!nBWQmx?$ zW6X4PG9z1RITKPyAIo9NtgNC7IZ8!5+|=|qO@=MV`MH(#_!|WIZwb!#wEl6Y&pa3(Mj3=Ke^n(r= zh-QzpOpC!jvIDu4RxS(8A^kglZe?^$B$gqq+zaVB2o%EI?o04;oa1l&x>3BvU%=(n-M>QkQnhw5h$!QVyL7>F%O2;S_@p=>HBHG9Be#`B(m7LNQbx=b0ogiY%07t z+LpX z#~T8LteqL2Npb;?M19E}46B^G<86xe_LZf(68b^NtXVJ{@c00oYU-pT!`1HU?mA^Ud`Q8Z;%~A|5i6yt;#oG84|bL+Og#$5z__Gu zu3(+9v7>UE_voo!oGVfJqv)3MD2RT|KVsma1RxP0f8W$w8OCv+0``uJ2Fat!*lO|DUuy zcAFB5gJPx=Bg+)Mzhj@?C%(uG<=J!^TyE?}fr8%wcHaHA48P#Am}zVk>U!g;_et$w zlf}X}9#qk>xt!1_`NO0BPGajOt|I}77M5!uNZ<*RJ;b7(YRf*s{=t)MU7kmhqUjS| zX`@2`k zyiRh6>B<43>Wv}D(j_5;`MoUS!V<30;F*fmw-kKnY5jg?QDeJRj(BEhV0BKGFsvC9kW*#kGOnB{lz&Cam zE7n6ev;lScpZvqVjje9&TyqLXbS$1)2F8ck>G?x3Q<9Qhb5wVvazwF0gx2|nM-i7t z6l{_GpQ|JmgApm&GFTne>#}iCVd_UrhU_=yY`TzI&%M>HKXNM0%bv8KMgXGCm`A*; zx}%QxPt;HuV3H3>>M%Wtx_FpGcUa4!|L8$4@72#1<=rg*U;AK9KWaDf0k&RONtA3< zyFmiZ#(!d|Kwe~nvr(2aefZ?=tXIuA_5c9BXFGf_WhNpvphl^ZR3M&=yOKB)b}FVE zZ2&oNOF@STv+A=UFV{8khT^ndVpI~qtgb9+Eedq$yMoPs`uM12yztgWQf+4y{3Cs6i+N_n)f4@me|JPY*r>=!e>;!fpnXGoEp(|V<3cUE z0fZQxI6n#kq$qTMe7c!0sM&J{M+T<$DwNJ0^XR?UkY)Ye95}JuWl@`ih@qM-7@O_0 zxMIFKF$S<>J8eRtTXQb$zuWxX1RXE8ki7j4%;w3E%+WzeO8>wGyOF3i@6nL7s*?iIcn=KF@^m_-UAZD3Cd{9b(5V9ED5AxlCw-|P` zbfSujSxl+iv*54jc5}#Ob4;{qOGN zybXiysZl`Ai^S(0vn1QkJ!aMb#@#kjF+nt^?{)GYlec=UzcI8q#Nv>IKRS3U{Vm1h zK{UkOo4bDJdC4w&8cTUn3EGBtVqIYCBkjk=kfSO>w^sgf%6H4m9Q*W#-%T?0q`I}U zzrOZ&(HEt9>FTOMZxDl&UHe9qt)O}E_8FSUBnEw^u?_%C+V}KdtLlHf7bq;uwg9<* z3C;HV&VYaC7jD*UESAuV#j2VkC=-Zi`~Y+ z5zWuK-@X&%OTAO2DtZviHcu}viX@637WBR_nuT`+%`9DdT!5Y<$_}p8nU&bE=_|m#Ucv7g=!ykF)xHdZn4RU0YTyzpQsn`aTy)i*bP?;Xn!Q#~Lm}!zN zq0XTeOmb8mO?5$MHHVkE>{~!5s#Hm0$^I1cx+NFxCsneglef21Alub1?ds8dr_{E_ zv=OKD*~a6aoPM-z(xTm%?k!>NsPLE;0kRVx;Dt5;Tk=JRI=%mBbzAMhZ{COa6pQ&B zd-cmP7-R9C+3G#Oq_@WCT|(0xz;?P3JO3h!d=e4AT_|LoI@^$qQ(hlbk0VttdIXFs2}<`?*OzLe61$k~41!=t`7W5~RZzNmn~ z=#ydu)vrOD_gn*hslOd#sCve_V&nj>I60~JR@5mDA;DW zZqWMeO2MWqAwJQw>sh(CmrTx;u4}iopnlwNmMz}VlMOj@NOCq*)|*-tvT&ypq7_U-#e;brWSTP%A=KAk z^aPw-Elm@_xmzixWSPb*kH#SHMW*I!(oL4bZJ(C%5Ew`r0O?{hiAse@P(FJS0$IkI zZ^kAv5I;Q%z|rN)n)cauXS3#WKV3fINKPp+mJ}fi5lA zaBKLM*4V;(JzH|KNPTl#MhbH=)^Q1S z#dYFI4iu}&mf^wB0x1sN2hzlNtT*+1HJ-#lq!|@gYkOaAn1~oQ^`TsjVnYpDcx6^> z%mR!8Gw4Y(W6huBNd>Z+$(lqY#5D;fuLAGflG^TQ zw!OC2Z~Id+Ru|cJ16jA*v#yf?za7!gB{IJ&tLv6srVvc)wK4%u+O>FP6C&7h2k>47 zgpY=2P~qpu&`fS#f-*jf2C-Da&yvf}8}lwAq)v(oF)h+fSADPpoItC1x>}tXEV@?< z8%K-7WcYExfC&$5$txyyw2g@zT8Hm?>*3qb4b|G*4Q=udotw8wZKqWzbA9cASMCu6 zWbRX5-cre23i8QxF&9_NoHDscm!0fri#(Qt<%z5ieQpYbC0m4LiEw1V9H53uAlUm5 z)RBbzLwvI&8BQ%xzQqYYG004{f$~i2|$c2_c7Myo9eg@P72ej zJ&;o;b76uiZ#&32g6X&t_5#6l;}!Rk$Fo2P=c-|s<1wb97)mC@eSgD-7fpL#OmN=C z>@%B4beV`d#`(HI)VHj%9R}d3{@zllB~PfLiT2gyHa+sodUU&kFTYMxgwmyy4w-rm z9wXoK7AXA>MWQSPt(MHlI0|JJVj>Eos#wF>AY0>zer4;5!{sA4J(-lI6- zE0c<3CXwusNzK*qf`5OcHU`Q$crP*=gMH*Cj|{EyK4}3hXf|G+rA67yt{54u`dhCOK>qAOJQF#jRG2PSkIs zfNA+n%G6@Nz_)vc%W07^qyH~x6Xfz>Rlx{f30t%!rbg91*)a#46zw#~}B?2r5Y z6m)O;@Z!emyG^GW4+4GQARkTUPR+ODnkBL3PMrqyO#*(ZnP(f!eH1D_7jq46S!YO4 z8>|Kmj8QIr(LewvuUpstbhINQ#KR#Gatq%aZ-4cC(#TLB2}VG`M0fur~O=-r1#&CZSXcFOv& zjC&gxr8EZ0FUWchVUyI0Kh=xQ>BThkuKQAi{gpAx9?MOReuW5mLkuDKRXPnJQ3sSB LS<-3*2oU&xDpr)i diff --git a/webroot/AutoSa/static/images/bg-button-green.gif b/webroot/AutoSa/static/images/bg-button-green.gif deleted file mode 100644 index c58a9bcc41a764961d01a7594146196fa0f68bd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmZ?wbhEHbWMU9!IKsf-HiaQ&6@%X_29K!>fpZvKCo`06WhmRuu;hYQ)FKA2=?t+; z8NwGZ6l`YjnZb~?j-g^FL+u`hka-Nb8yV8qFeEN#sM^JV2Ppnz0n6%uNRXWjtZE8P rE)!E7FBD3+UG};BIUqzJoJ$v@{?c3+ipEF

Mo0H+g<--75h>m1u|AGa(lgRgW#DGTlI={?`!J+99R&b Mp&`|Ol!L(<0QM#`!2kdN diff --git a/webroot/AutoSa/static/images/bg-form-field.gif b/webroot/AutoSa/static/images/bg-form-field.gif deleted file mode 100644 index c304dd930d69220be5635de317c472387f8b4c39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97 zcmZ?wbhEHbWM`0OSj52a=g*&?KY#xF_wV=b-@ktS`uq3q|Ns9P7#I|PvH(d21|1Lq yQp>=sma$9hpTHzf&l1yY+g<+?IC@kB_)=$y<-FckAj4gfd%xn`8=LtI4AuaJvne3} diff --git a/webroot/AutoSa/static/images/bg-login.gif b/webroot/AutoSa/static/images/bg-login.gif deleted file mode 100644 index 39f0df6a119e0b51dfb72b39f54241401fecdef6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1825 zcmbW!YfzI{8VB(6=6ypT3AtdvP=Y}S0$ocZur@&gLAFVt0wGkbPItL!0e6cDafy(I ziwL%svOw_C76UAofK!*ESfCw&fF@YmqR0w@3YxTBBKM#ng4xh^x-TpXj{NK1|k5ALTzkYA-0XSN23u0jm2Q>?D1GU9*4!@90^V& zM*^9E!;xG_x1+ZzP!fJQq|9C416|GBI^fNT%afe?l~ z0g4R4WXO6Q&;fwZwzM08e=P`Q%V>wOcfjIo4OdA31;H>1fj3gyx)rv2fRNEnTX%%p zZHi06cuFV%1?9E&Ub|a0&Z0XDjKJi~6AoCH%~aP{ytn!I`n?+T`<-vF*ufEhc$3E$ zL`KEGy?5XKcMcp(Idu5F)U@;?(qn(kk{!>^DLh$JeCorGPFE-^&zwDX{?pI?URU4H zsBUV$c=<}()vww+I=}AiyM9Bf>%aN!;N78r-WwjdKl=EI-tgm3lT*_(i%ZLb6yRaVHawUN!hrc*KaUU8CC@_JW{b`S zez}A>l8*JH;Zwp|2J5+ykdi2yye$`QRc2u8(vZcqW@+zQ-I*TRi#Q)IHtaJ#Hd=Hm zz#l`Mu08@v-(DZ15irqRL*^%-JxRs$O-=B)@IdcQtZCS%V_3F?*FZ_5f#1*;n4I+8 z7e-d4I<?%91#1sS!-m*&NQkiQ3<cTwFUnBHr0m%%0?6%tIm)!wUAr<_c=y3O=#_X`aP&(IKNjF>*IT`GXdw8s|mY zm|UX?ZuwIh=y5EeFQqpK;zx)Hy{9}bs-$MiPzgn+lFK$?{!xRCA;`sHz4anlzMGl9 zmr_J&o@_~}KAOY(8&z-S_A|09FK$EK20GJKW02n&xIB@Qw=!L{S4fbjG{1aR81T-7 ziXT=41keFDR)|I6*Ll5V(Z#?IgzH?B^Qa+R=$ zQ(*O=a(h;3Y)0X*F?##`zf^>W7Otg1n$pL8DehK)#g`=1g0f&aF^BxtTf-&C5P5vv zuFC@N&X8p;*7bbW%}I5)6&zF|Otx#!ta;E5G=~uQuJwDEDaxwqgd8BQ%tjVh_ou-p@*X~KJao~Z%vZNx6@2O& zBXEV)*FaG5KCmS=LsfaW*b2@Y=n0p6g+HiYD+}u_FP7mK9JIOW(R^CuGSSCPp=hof zmL9W$SIW;#x_2E+qLmSk&RN0A6!={Q^l**8(x~lZ&_#ZWr2bu1#K$$AK2+n&foovL zhoj8EF}4*LZ|iEQ^iPnrx*zH1u7$L&it7qgg=@a3Z4cX^cIq5QBGSfI>I_;1C$hGX z@@~qU33(Ae)Lp^jv#2-qO0FZadNNU>%6=Q=J&XTYbRnbrUub>R&Y#3WDi{0noMOIR#kFz!PQ>PGEGa-bU;Sfhe7MjNe=N|W!ZlCgdHpFpwyJ7vkbmI9yXsB!F4Rk zX2ELdN@H0hjldIFM14aF;&KrEi4}-#vj(^f?=Pz?ui1BwEwu=DolaiYT0w68$LpfJ JE??Ms|6fcc0N?-s diff --git a/webroot/AutoSa/static/images/bg-login1.gif b/webroot/AutoSa/static/images/bg-login1.gif deleted file mode 100644 index b5aa84af4d0389edbb19115f11c7b896d0073dd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13328 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 z 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 diff --git a/webroot/AutoSa/static/images/bg-menu-item-current.gif b/webroot/AutoSa/static/images/bg-menu-item-current.gif deleted file mode 100644 index f5debe458be39d6fd4919b3565ffda4c1169f483..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315 zcmZ?wbhEHbJjbBOaD)K_{{R2~@87?lKYxDz{{7pxZ=XJW`taey%a<=-ym;~G(W4zZ zc5K_WZS&^Mn>KB7bab?{v$L?UFgG_>S65e6RR!t=n}L&1{K>+|z#z(?15yF9lYw=I zf~cuy!n}-C>vCT2E6_P#l6&8vgo8Qo&w&L69y(I}CzceQ%(0pu@WkmschveDYsyZ? zO0nJDP~oE&%^bS9>TF&-^Sd22e(jgv|M+ul-TUAF-D(<|TPmAcJ36!5yL$Vo`zKDy zpFDM%SI_iW(`U|}H*xO#MV$*5FKbx3d{x`(waqKnZOqxQX=}=sZ98Lj?AkkJ-+|;k u2an7+dOY&*iPMg!&YU@S{sh~ltDZcW*KRrTbKJh~AS}ek_29N5gEasGWR{-* diff --git a/webroot/AutoSa/static/images/bg-menu-item-green.gif b/webroot/AutoSa/static/images/bg-menu-item-green.gif deleted file mode 100644 index 6709fa099357f4e6e18e36e7353f8b52d7be4e09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3349 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 BQJnw) diff --git a/webroot/AutoSa/static/images/bg-sidebar.gif b/webroot/AutoSa/static/images/bg-sidebar.gif deleted file mode 100644 index d97e978b5f33660f281f9878dab64335255ce723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32792 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 R)Vkf4IeWS|hDcma=HTLr;y)tIk;ta7 zu_vN6xFht2)0#siNuslamwx#F|G&b~zelu8RJ{}@J*sQsnrJe^+4cq#uT_A>dUgiy Xt!wnnwn>Kojbre1^>bP0l+XkK7z`$3 diff --git a/webroot/AutoSa/static/images/br.png b/webroot/AutoSa/static/images/br.png deleted file mode 100644 index 31f204fc451cd9dd5cfdadfad2d86ed0e1104882..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4IeWS|hDc29J+)AjL4m_HaN4IG z$D^BEUx=k`c-1!J#J_^urVqIKIty1DUX{oyG4)ejx5`MhFFt0jm0SWdC(DBaZ!X9M X+pW>R{=Die&^QK9S3j3^P6S)cT*XRVR3G5 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 VLeFc|EPMa}002ovPDHLkV1fxIDl7m1 diff --git a/webroot/AutoSa/static/images/icons/cross.png b/webroot/AutoSa/static/images/icons/cross.png deleted file mode 100644 index 62c181d4b03e00c588482ae24f7c57479282cd59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 540 zcmV+%0^|LOP)qSTIvr%QSzI<6Z3Z?91=;WSkxr*^dv(>O>N=&HN5mZo1fdHhvRy37?!$v3xUP$* zUJtX$B;3bGMW&uK`N}bYVfZ>qWHFPG&yJ&P8is*4$5CWzW^&WPB(Fuhk!@9`iK- diff --git a/webroot/AutoSa/static/images/icons/cross_circle.png b/webroot/AutoSa/static/images/icons/cross_circle.png deleted file mode 100644 index d4507c0712c2f902a8f6ef0b12d42b45cd0aac7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 721 zcmV;?0xtcDP)S)cT*XRVR3G5 z=gIbV%HlXt)pbz2-SM1fA(irkW3gcI;9#de8n;atCm_NKLUwg)E7g@{aUq|FUavPL z8tbd7_$ZS}F*7q+Vy+Ez+;cRYPFzZoc)w7v9UtuPgCt3|s7)WuNs1!Q$KwfoRHxAv zu(RO{hXbun2i_(U@TyXQ!C(N`Txv81R;vYqVL;b*&D#k`gCOvZ*!5Wa(Rq@!fgPWNLx4yI`;e^j+X%(a1u z*RyXJxi8IT$!}T8kM(u9i{qjrY9Ar&N4VJQm1NV*5kstt9urlWf*#{-yvH!v6wfD; zJRk70tUy7RhA}8>TBoFGl{18kcng2wxXn5SbQ(ca2(Q=eG{ELOz(dx#ZTN6%4S??_ zxC>mijzdjU3t4?^z&Hi=+;|`V`sg9{Q8KdTUjYUHZipLZT2%uX00000NkvXXu0mjf D^O!$M$+k2uA} z%||2QCbimx_EPSZIEIJ=LKQ+mAaUypP^sd;33vuxfg6ti2P9C4!~r1zh4c^ush}|% z$Diz2NeMKqDzVbfyE{AoSei&Fx2DVf*nn$m+|ck}j^}+Mxg;|4e}MJB9L%>ahQwFvbA!oE?(8aJ7nSBcB5e zi9#M}L>$58GurZ+s%G+`zYmV%B!od9(rGP!`fPa(eI_+D3=a-e6^PKxFI=hm>v7`wx;^@B;vZ|IW2@bC*^K@wDEc12+2v?RFcw z-7bWZ3z6&s$U{xhiYw?l))9P&932FCLoe1Ad;M47M?H|p5Wd?F5@gX!5CsP^hOrof zxPcnfl7Oec)3`lbuq;1%r&8j8BDx8>aX(=^N7PiHW{p`3HK-*)0A*298s`hDDZvj& z@twwu+oTQ2&1)v1w1Ha6SiEIgdPNrZ#W=<2|CextX>%S(dr8gDePxm5q&!AXoyabUIDB zTyCpgX)qY9MMXvR2%5l`OeVtxpTH8nn<^?Qj+B>|AB#jH`_|Xjm5{8UF1sZN1OoML zxBE8mE-x=nClU!#tJPc(g&?r7u%K^mZ$E3bT2E@V+WmgNU!dk2{vZt*DN$&0I-TDB z{{B{<&sQ7@g{C1Q9!#ZDS&&I4lSZ@ITx&9!4waUc?wOpNoX=*nen1Kc9>Y4+*48%S za5!4AB#8%t!62=ztx+@@{Q+^1X9hWyl$2QF@wk!4_*t>JmbtmPA)C!M($Ue;YBU-p z-l)aJMOs~5jVTlgBR}&7Vp*zKEXGtqPXDyBvN8!vdS6vlB^}jjHPzMC(!|8XdyB<# znNJ6@?y0G%fL^b+>vXyXD%7w}X;hM4x-}Y~&t?np^S0qimW0D$Ie***+ljkGzvRI| z*{M>^-xT8TtPtb?`PRS^^al%t&j9amO^u9-+)7hZ1mW?|LY((PaO;nxV7ml9)YaAT z^b*I3`koTKjoa-q!cX1_A$cIU@*fFr(rja6BZrgV+-ZC~A{uZ)lIZM|5q>r!ME7$D z9%Ag&w(wQ(wWXzn!)b7xe>4Mxxp-gfIFl?CR>`Fki88U;w+pE}#ZGffnd55M8?i37^g|(VJnuOhD)H zcxusOzo-}N0Q`osly^%7G@y8f=;HyRz299fAB0000< KMNUMnLSTZ{5^KEx diff --git a/webroot/AutoSa/static/images/icons/image_add_48.png b/webroot/AutoSa/static/images/icons/image_add_48.png deleted file mode 100644 index d022e8fb5a944e91b3def734b2e01aa8ce386d26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5131 zcmV+m6!hzfP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C2`EWKK~#9!?3zuCWLI^^f9KqD?|rX6dU`y=hX*@gd9W>6 zL+5~p%i>ivV=!2mvc#awm9DB@m8#zPpYuQGf9|Q0oHKvOOZfv|cL3Z0 za0kF00CxavwCv`KZ+`RH32^E*w|V=?C!aceQvd*;{N$$yA>5XhU%2pX>bm~z5m>L3 z((T7})&B=MuwLs1@6o?}0%rm5JR@7N5051tSLK6;`Ly@#zgus7H+?+M-$y!Ja7J{mq4F@zHUCOz#$ z92t7rbRA9C&{Pdg)6ljZP18|%&(ai?4FQ;UnD0Fqyy5-Y+lKdsnIi^IjGnmicoB>k z13nr>41^V}yeZ}kRRJ|i2%g{#bBcF;K4cPIO0+pqR~2>BQr8_-Rk4`&#X(XB zUA-ZN+)bPh+Iu~$xbF=g95H&zA}}ZegF$3i7L-NFuq-KxNKpieqK|}khN2{dHnmiB zMcvd?RYhGbSuTy}93DkdM{YL+p#E0?f_FW)y(0$0yb*)-hL@2+85s>qhQpGwEEx@l z49bFGEGc3jdXHC+(C0v#6ZMKdi+ajpam?HnIE9>A+BVSC@zwyWL8uDO6!U%JhOp+m z^@$sdG8%(ueH4nwpy)vihb5;5W47Xms1X&z0h)U$=mgq0p!11EC^$Bc=ph}6wrgqI zn!2txEu+#WvI%Ame^VI^!4ab)#y)Aw7%7U_(`YbYs~mEw7%|WikC9e(=-MCwVI_QV zh$v*2$(qQyrL8NL^ROWR6}*BuMHN&tq6w!Na}d^1iJqeH6h)vcBjaMgc09#E0zUVu zt0F4|vbO)Ej|n)$N6;Z%TGCXJg*QTw4FNd8Il-J@PBAC=^)@AXN8yd=9WgkH=qL*7 ztB?yAe&uaB@%nm6e936rK(Kpz<;trWa)h)Pjw9l2-U*pQ|tL*LWv47)$gB$x?e)Tff zuO09=Pi;^}sg_LZ8JflvcAAkD#KKd=e#hV_f+Lt>Dzt4)QyY~m@mk^}(XFf&alOZL zOPy+_)s)?9yIk6Nh0CvA=IYKB_V)I;@%nX+CsXFL1&evLSq}W@``_budPF%Ga@XlI zJowN9JowQ4oW5&|(WqoNDoNuZ&Aj5}$;<3ry^43ncSnM73A&vM7nMAOZ8) zoc+l@yVtI=v%ACIm1|6{A2OfLSS*$-=M{@(&0@aX48UuzT*8@SIyq+d$}SgQc!A+? zz<6ua3)QJD&YazboLSVpw?YVPogTAwdcc($4jbZO=>f#g|14ZX2U83LQ3?97jxvCnayfu(+Md}P`OIVFJBCZ6`=(86k7#k6TWEpl0yy z{>$2#aCk9r<7Xw^3?#$B!R$n+a-I-WQB^EBO#9=gY9{9v5+F)WnVdS>oIt>-qwZQV zLTWmy`C>yI7woU3}>M_pm+gCl*ID<>xQ&^3o$$x%^KJDR2?H5>FoO;>aN3CExQ*?W2P0b|y@z+tzb zZZp|MK5+glr?>7y?PXs3)@kYkLy(gLi%IWgRtDq@A_-k-Z)q%NU;KOSdvwGj=NC+>eT;2Bd*6R?efd9pUDYdI<1>^)>*RgZu%B@G>$1nW@?>!Hb`jEPX zY1MOl?C<9C(E=}yx}K3-Ae~wA^fO=P9m8{P``qW2S_y!cuKxlFHG9*VPrT6P z0U){&U;6NKeEgm-aP4}_blQ*lF75yK?K9Xq`;IfTsiA8f4T-bG{RB5Sd4DUulkISh zWtFj&3x-=I=gyt`{R6mg;oH5D?hJ>=hm6a>C!TqjVHoqB&-|QMZd~N^7ycXoH#S5R zNc`g8E^_5(&;EV@JpTCORusiZL_Vmh@6I{j-M+{D)$Y~&(Rh#Np7R~+Bh{c7;7%oS z0@DHj--g-q|N7#;z>6DG9#{ZJIp^0!WGCmmqpCZ=ZdFzLlgVWM zNmAl38k>qOH7Fv8s3=&mDtPm6upYb$dh#w5JbCftRTPEZOAi(lG!{x*vG#{i+teo6 zo!#!v&N^?CZBs8EeDK|!*?phyzL_^mf*^qZ2{pV7zX2dIfS4j@BnO0y$-x<^LOX9& zY6gNpCI&x1`0^%zSH@Zf9WiR?>fO^P3#Ebn138+E8(3h|+-CD%)-Qhew04Wx-cy-3 zxu=2%PWL1p+#VY)2SQMXZ3C(usez-JRR7_0{`KT+&+jb;kx8ueKFApfW&Gyo@p7|a z(t6zl$8q5Kqg*H)HyS3`jM1x?ieqrrJyBJdkkF1Wyo|^Ftf5;yU<%WNV!~d6qFi} zOeP`zm%;kl(mFC7UEr@)7QQaX!)3)2-Jo@)LLrRHh~_BI1#4qvbsm`x15tGuo2X1p zRXo>YT7rTqb>-eNTps@xj#2Km$L8NnSGdC_kU^B-&xBtg@gjhB{<>xi-p>z?9Lp9@ zWQ=`j9h2DBru}nqwpN|{xZtt5C*V!J4ctWt*|q`hMMkO@Vn=ciJ9Q37-;i|7w@*bC zg72R}yq^ZK^b5B^YD2O-GQg!6ZK?nGgYiUJSeRtR9{~mc6?HIRoA$v%00000NkvXX Hu0mjftn)|m diff --git a/webroot/AutoSa/static/images/icons/jquery.wysiwyg.gif b/webroot/AutoSa/static/images/icons/jquery.wysiwyg.gif deleted file mode 100644 index fd64e3667187ddc39aa935d44bfb273b3c82a049..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4478 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 diff --git a/webroot/AutoSa/static/images/icons/paper_content_pencil_48.png b/webroot/AutoSa/static/images/icons/paper_content_pencil_48.png deleted file mode 100644 index 1c5d322a3a00361e879dab1a5460f3571e1289ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5509 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 Hu0mjfy<57% diff --git a/webroot/AutoSa/static/images/icons/pencil.png b/webroot/AutoSa/static/images/icons/pencil.png deleted file mode 100644 index 69b9ccaee4c17d65f017a665f1aaeab8ac718e9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmV1BeoP!@%(B(f|JpEQB;-0XBaa7>fQeFx&*PD_Ka;$ngLFf3+9~2jjgaCV`BX zF1@I0|5*MDq64NQr2-?w|u%Ny6u+yH65 z`v|v2xB=gOGBE!A$Cy&kw7<4E!*t>IUktat|7UDFeC|J9jd0MG%GmSl>azbiL5#~B z4H;vBLgJv@2E-yjEC|H>K+FqDtU$~G#B5NnGXpU=IsMP@XI#DMD8uq+Z~os0^8Z3H nFw-&ohSJFF-$-iy0t6TURoMiBFYML300000NkvXXu0mjfgW=@| diff --git a/webroot/AutoSa/static/images/icons/pencil_48.png b/webroot/AutoSa/static/images/icons/pencil_48.png deleted file mode 100644 index 5473e178d66cf7f9e741675fb5944f3fcb0ad9e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4334 zcmVKLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C1`A0Qux|NWH5IjKAH`E8zDp3)tgpwiwN+l3fG-`RE&`42$2=$UEj#?U( zM5ZN>X6^V^du{K1W_Rayc)+n!C5;`&i8qozX{4DmM>@a%od2A2zB41Fl-$puaG%GT zfHeVk7+R@-40d&~iCuORfieK3_lZOkm%>Vmh6+vL{bs$K#+V0E%?o{#nC# z7HBLv3k?hmJZ%`pi$aLq%}+k1>W@D9!G{+wx~}6O6b0#d*qMxCrPE&lLM0{O?Af#Z zw(T4ag+gjH8Wnn3S*yKs=ji$;p7_rPLqpOsO`L2N&$7I@rkz2Ek<}L<#5LdVH%;?* zm6btXM@I+QY?dprm?$8+z1`8vt$lr0&yS4YIF2=}>u(f;!9zfH_2&V_PoN^$>w4ac zb@lb?7dkqaipLop9mBS5fU=Zf>~kJ`@Z(5B!@Gf+nv)N}OA=;r-J3s?#a5&7b7IB# z$CcxcO=l|p912yd(P)(EnHfe$$8hK1EXyL5Orj{l&15oaUtiy%jo(WPwaCo-zgbt| zs?lhaWHL!SK8>bn`2Bt~O~W({R83{6@V9ND^?R0=JH*e4maM_m#@dO(Csz*3!Sjw# zgIiG)1w~P?EQ>^97JzgrMK~Oel+0r88hpz`KWBa0x5}D#ROj5WqteZNjG}0$s!B4M z#B*H|iCMzoaHzAhGgcA;=HWko1jXNmoqLHu;PuMJaB8MFbVL@@|E6f!6bc0ri3E|z zmMxu~oyn3|PA|a!48`Ayl{t!&KY?e1YMiV0E3wI9>=)9_ULu`J(zs#cx@h!^L$^IL z-_9ts)OX+-eDkgsP<$;|*;jB1r;r|4DKHX(s~1&#b@hg*`RaQW;qUc}K4qxqN9~dDjVz-hrc5M*TGAn z_{0tHdBOC!j$SUQsJlDx%bv)V0zWgMqxmGkIrvDITygki^}u5ARzWa3siXQN6*YE_ zy9j?v0dN2M(A?R<`7$Z>%{i0dMd39`;2yw#rhs$5`Vn6{aCrWD_>Chfz6*PErt_Dk z2M$W1Xg7zS(or-?p!(jxFWEw#7~0|#8;^xH{2teu68Y)BVdvk!5nf$@2j05!cX7A* zm-Z5y`Ig7DV0(>P5g|2XQ%E(=?=e}$o5SC;G<&fMvA_Pd+LPkDb=#tfmp7#=n<-j5 zfrqiJt;|lAp(v{Zzo><#23{B0mM_npw@?f!gx7`K?8J6r<6dhmky0^ZNe)cROw=VC%N+PyH+BwN;!MnAj5zZ8Wl3%PJNe-CuSrSX=wd_~nl> zvs04*>^V?ewGHCWOevq<|HJc+CwBvUefx&9yEawDwDRDAso13(_9*vUH|dpxg?f5= zLcl|1e&2_xsvUjx?N45AdgOC?N-%CJAel^tfG@rIr&lflu2#3XWIyMNwOG1xN@H&i2}X&Q80Z_$H+tXnpJe1@CQ zP%Ipc3&v}3F47(e*J?GGrs+y_vAw&EJHhMdth6Ja&*SFnyI5XX1~XV#FkXXWGUT9b z+xUEG9>q!#xt$zhqz`AiMxiJQrZ->URrw7XQUiu%1O?+Y0JSM@_g}-((h}x}XK*qy zf+r&nUHENz0gnsQKnSj=LS5#-py6zlwUUwjdLObZ!{_ti>Chwi6d%^>KX7j|3)aE- zzkn-?n1*1y9ems_6{~VsM*91>`_-nduHOPWu@4IwwR%-BUW3`+Ta^t7L??X&r@mcw z;nZRpIMNC;X6t5A-w@1!0doqrMyD#DimMJ~I*AdazHm5({c{Vk2G!NY>ME<-Q-X10 zAi_il&q0g_VN@EI`sIv2*&g>N+QM>|5)?)DFKSq8^{Tb1ZLpslUSxB~*>KrC197Fh zxgzM5dN7PMjv~dw<=!?Po&t8Uj1?@Pz;^gfiL1<6+BA?nCsqEDV39?QtIk>WM}PqU X8gD*;Zn-LF00000NkvXXu0mjfwggkd diff --git a/webroot/AutoSa/static/images/logo.png b/webroot/AutoSa/static/images/logo.png deleted file mode 100644 index a0d0725c817112bcc9af3bbe7dbaa078c65b89c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27350 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 N002ovPDHLkV1j(){tEyA diff --git a/webroot/AutoSa/static/images/logo1.png b/webroot/AutoSa/static/images/logo1.png deleted file mode 100644 index 6c7eb731c9b990868c6441522cf54ee0cf349e7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11352 zcmbt4V|OK7uWhHs)V618+dj2z+o!gTQ`?-{wv9P8r|y(f`#$e)xF52UthJMsWamS6 zl4xZ`X%s{PLVLT6Kd^#_`tLl?9YuwJU?2rZh^l)TUi!iLscSrb`7hhi z^nzf+prZirk_g1m-Aw1_T+>}1o(@r6A$B@I?C{o_AmD1#Rh@q=JQM|Es)!f@IeC(- zPr>AU)^6uD3U`L*u5T9f_VyQPU%`#*)l;tT?xCNPuf^V+@Rwg0+PF(pq_MLAy!Zt9 zs09U+k5f(Ha?S%<{u#8QH(oAPgP9C6-Ax0sulpCSS*MR0f|FpH7US zMZ}}Cx(bj}4@Z$BT7Hv2O9rtr$V^eiQmCd{q?=Gm4uWn$JyhZ`_Q<@5QZhh$6&R3nOpi|dq#}~MbsgMiDUQ(wj#!fgQB&h*3#YMgWzy(G0Hf`*Q$x*>0ZC92 zSsD$J09;m(i71JCkN%DFFtnKna50%F#+A<+Z~8}47_GF5N)vk5kAE@tDl=8$siG_8 zu@v|capri87zXMz|EaAQPF2UXpOl~{J)@YGi3mTSNQ%SqrjDi1dPbv8_&0$gNzhPg zeptvfXq+XQ=+0Wo2byI28RP01V=`4bG5W7Y?l8@KEr>k$P_apdy++i2Wpt`!uQ;}N zEE0>WkdNsG4H*W+)O1+&JI$@Jhv+AwG8v3a*QtCo*%^j~=14>7gmGdh$o;K!;=fc9 z^{Js8?fLInq`PD?MJaV~rx%!b4Y9<@#_59;Sy5EZbwEe!bQdZKSQny{>y&b?cPI0> z)NoS&W``NS}!!f_%DxX=%KEdW{n2bS@ zGtywF0_2OUB@qJP)$n~%r+H@6>R2wzlEP354|h5nYVKt6B&bnh=PDB)ZYh0O_}hpN z6@sa~SLkgPl4>a6Fhu@Q!10N&X{Xw4ka78@-eCw4vAv&fb)Mu;-;#+=omqySP2`sD z6wI+xQ}UHq!svT zSXJSY7RS!mdFHV0ebpfY>!+WmDrQG59^9LY-Oxjiqhkdr2}|t1_KZ`eH{6rq$?z!= zOB^=jQVw~LRRKT?Ll#y0$DEk&it_eIu0JY8A-^H&qVw>i2GywXs4-QQCYx(A>&e37_OHJC_O;o=xZ-rl z3Nv9;LUBS4Dgf2IT*w>&3c!#GmQ`YqLRB@>*=r*S*%B~__DeAVipo2l&iU)2$wp`P z#{jAe<{yg1TcJ(T-AwnM%VA<`W%5&r!s}EyJQcX3vUq}eQf|ef zXb%z29ab_)uI@j+8Mqz;5^z8!U@#S{Hj`8N=Bn;8INCgIX~DT4z7@rzEC}`R>mId7 zTYb|O$5dPJREhz%e{|2`k`*>K2*Z`5W;yYg& zMFc0jc18$Q7;cO`_6B?faXP9Tun0ag1MIb1^U)xRdWvo(Dihmb?OrPMnvYvS(c^|Y zj;Xg)s8r-<%NrWx5YsBD?2J%|Neh*uwt~Z2BZ`|=24Y_;Kinwl4N6fTx5&B(CARXY z?J>>KxJIeItx5PD)l6UCz?TOW)O9 z`m<=#(ZdT^j0cGNC&w;TJ74*j4Kxhh;O6VH(i2y0N7@Z3U1nsX^46qlD=rPAh;WF+ zE1j6l4 zvd6#KyU(+t2EIbkb<3%_3S4cLoJH*xS9e0-&=k zU{CJ7l-M%Q3s$ebg7uYa5$m>uuHJNe*0zC)I`wkx{nXV>luet|S9&eTH31+dU9q+p z*Pe-Rjq(0c3<=T$`?}ToHQR+}6AIKJkyY~VY?$Fb-3skOdcPf3LB?%A0pV+EQTnci z=#=Xn@JLeNa&2OkAB=njv!{yj?$%&!V@Sxg42pLp?Gi3h1>Ii$L@$^cp0BqNcv`$q zh}DyoN1oPk-&q4iakqk>ljj}A41JeB_6|PqzxY@-Y98udCoOwn3r6=6$hhiw-((Q2M$y|b$BHpl>q^n9PyudmaIuN4up5T#dO-LwdYs+&fghE8o zwP<2Ci`{CWboh44o0Gdtg90Tmm`UH}u9~vo{N;(JhA|o!tm>#RBG*Ob%_SnSqpZzJ z(?&bA$NJX~OuRzNr2zS_ZSu`B!JeeDFpAOv9o2~^(o)sIKTua0xtUu5W8n1ZnYVo4V`~G6g;#=?5AaDAe&hL{$fXc5 zaq7ilYpV*QPs;vM&JZCh;1Be*O%*pj@0O44&w?F8!JNW1=N>8`gm-T7V(gXD_W34y z`1s2NqEaKEmT&F1oln^z1ID+^ltt&e^&<}PlGfFQ#d^}5HSx@h_V`|&3MN6mdsehv zb`l*ePCl@(fO$rU7iM#&1#K>!n zCu5#N9)grjo;#TbA-HS}eRO5>wXC-9dR;yfxI8_@H-i_sF(CNG|30T?2)if7{*+ zIJz&q+%-BOO>Y*DGKk^E)%6CrV*k`^(_JOTXJzYZ-z`};EO@?$;pe2aM6b|l?PKFz zxqym4V63}84Z!<5+Y9?^@XgzM>IC~N=@n`0_pbY#%2GDGKa+x6Vo@>JwP$_}Tpuh4 zk-^Q8HdHpU7Pccd#yzgn>zeC997GR+>zh1s#jNcAm*%vWTj~te%mTQ|lr=^o!!5&!g|17>l(8Q&uvoHL7 zz6^V_yb8@ro}i8fkMa^G#-rKuc`h$!U*!t1%yU2B^;gO$B(@AI^?+^IeKasg)#5lK zF^sm;P^46Br~TdNBz7VkhX-jk)3ZCy6=S#KEz&VjAA{x%nuG<%B=vKC73XgxaaJCN zxPZ=OXckMKyR#yhXRF7d#4WH54|oOZd$Ye5@1Cq*Y<5gm)wQIF>SFoyo$RdJ+n(^Z zc7nC2lT+<4#?jWN{`GsgxVTdFb(l8#sa>I@ph{;c5)eW81qmXL z?N%DZ7tQ_@seh!^&b8rsyT30V`mI=f?%dGH=P{b@Vk}~$<8nr_q_XjPKW{%1v0jV- z+s>X^3Eg~0dqB9mmWNP)!g>Jok$MwHsuq7hr>lzB{>OQx6e{~&`oGF^)Lci^s}|OP z{nu;Ep>8dCP(e5J?H`igWQyZPgLb#hk*%a()~uo3P?3H@8d~*zwZm&mj`nu!t&ezw zx{R|1<#R&Xbc%c#hXBd8(#Ig`=4nK=vM1?!oWy7jFDr8{+I6w*;_bSxayA$?2zJQI z?-`@E8X^_n2k>MQoLl&j>o3MOAg&lUxOr<09KQ*xUpTdV>~H$9fEW{SajwW?#S|jX z;`6dlXZa6rtMYXV)OH9U<%Tg&NadS4r*jzORt^nW%Bx1}=<8yG_hQ`=lt|ZKCO=20 zkrFCh0tePKFmG?N?E#a~qA}#)#?ev@)o(nO)K7-lT7e$wdSQb|vTg(dSGVfSGId9Z zwj)(liez|0sRMBQMA_+@%gNajG1)&dF$nk>L@$yA>nAK*`+>5f@AkJxIu4QRms`M1D$T=?NCReb_-%{00 z(Y#&dWSqdRajCjn_Rri280z~EygVe&ahT6nX|XL zEl_#-!T^Hbt_Jmvy$1qjGFb+wZ`t%S%W)$I?UF(M>WBQ5hmI1Ez_NDX2Vi4G zfYQe&*i~8uK;-hjxa~(tT?-5|m-Pmn>>ETIwj$TTmpQXP77?<2?r$}@vnG#j3@m;Z ztR!OCTTF%yIVO}RrS5=+FhjBSr_9|!{$i@0hUT8-wMzB3&gT$6P*R9UZhHotM;7U@ z7H;$)1+O4;8=&F+#l}fPPZyF;=egsyy1281U?AU;jq94v1sZ9dinAgyC}6qTqY8uv zGWRX{FxZz#Mb(N_kT~~9D@~jqIXq^-%cDlL-NpVj5rRAHF8>8cwf7sr70DP z-kJ)RuZ8lKW{k=)81laP#yYCjTytDGMj2+V!auH*EY1fA=i}^w={;y9l2#U)3CHve z7LxD@yLOohTXtS2Hgb`g^&A+6_l#IxE1qJ0I#$|-E_{@w;hK;(RxKNsz>qSFGk?~qT$;T&4J|;zYGh) zC~x!Cd)RKErE1=Ag`QTycjR1)(Uxl}r&0(mQY9TA+5A2jvC4?g`y@3C=a2u#UPl#R z_Mk+mOa8gg_Rt8`a$d&9P@qx1guu(RrHs`?$?hT#6V~yeUqAa!2dK*fq7((b$KvzV zphVF0its-%nae$R-#XBo`s)%eorTtY*!AqzA^M2l(HSh7-XtnqFv?zK@)T3gUF;bT zxOm+ktlGW+3~L9oM(-d4x9i#N#7S>M4HJDu`ql1UeLMepmPYI13>H813E1^2crIC? zEnF{GcLa$NZ}9cHHW(|)US>`#MD#D3IJjgN-`C08oz~IG2RjjyeCa5pD^q#d|4VN+ z732PdQ1~9JaT0Oo(TURT&pm&%8nmO7*KA>*dI7Uj!aujO9Knnv8nk)$Xq03qr|--; zC}aWYr<&(tBGvmj5{U~@(6C$^%Nq8n{X@twx4)G&p&c%nX#OVTJPJTf-^0be>j5s< zg6!Rl?GX}iHfg8^%hXHy5VL{pZ9ew^?^sD8$|^ikc)gfQ8&>8VxaBQ`y!{O(aE%}D zHFf)~ktRoxg25hJNw0So;f`)jDH37XGIL2!tk3JL;eT(m8V2V6Y<*;IFX za&L`>dOeN1r0TVNJSNg|O9K;oA)2+G<`Pe>>u~IpuvhKN+ATm$AZh?K8-3?~-Me5- zK+<`}<5BG|IqI4DG4&6&Hx_I*zkBZ%Plw#C1*`AUt`cK>ZJCe~?B`LLnVXuwk)QrFBv$kz4E2Bs6V@&B60e4@LhQ|?c+L#24Gog&KFg0!>DGUK zOptNPMxVba3X$i6jK+O`k0~%x#amCab+uI=(o}OsK&kS11s;trHc>0_b#?vsBYv6D zeoG4nyRqdwI}PuXb_@j1=0#|c2<4AQaV&bF4;luH43}T@3D5DY7+d&)g3O!EJY;({ zPI_5BG6x1)yvNJE`C7j&!pb@9NNcuSq;5a>lU|&01ANx5*!p_Owj+7kB&X1uZ8Zt2n+v<)*APxlcI`-TSnl^D)<~Bw{Ot z!CwE|;ufxLTsM*BhRp2`!mlodc0|{%uT=+_YAk4c1QOO3=j%I*BnAP z9?xXCUmZg0HU3Et2~pAbE+^?E(L20$w)Apq0Iy7Kz3dB`{jfUoZEi`hVDA6A^m*^4 z>GY70+ON#NJASot<_|;IMLO7tx~C2EBuwJMxxTy+W={{)0xTWS)5dI|V>eTD=jXI# z-2|?&IvBxyn!*l!TV?;*2V*|h1pIJ!w}#s|W2>p1-BT6 zZ!MB;_e#+xoUgh>fV#=YcoOKmmZ{vBX zD0$bkf$pxb)G*z9;TccG$$3n@G!wgaCt^8z9a}E2=rvh70lr;D{bnD+-vjPo=vjgX z7T%*c46a~wJgd_091qp@e;S0Ajpc*|5VCEe1r*H&aeFR+ul&p{4NB6~aYeW@Z7+RY zj%k`wj5>wCa=P4E%4vz`6VByX9yZF)exS>KaEPX53kj)w8ESKd>>CbUsJ{UTq6~VZjjRLTsXkqM?@kB z>fAvnT}`<>z0k7L?fdBNen#qoY5TbXbRSb#RpNd29VZRT@o`*R3%z+q7&tafR`fKr zst^nOIO#}SO(3#P5N#Rk^_i2>HVXgKpP1lxht~IO$Wdf&$=2tt342BjU3glSCEcwL z+u_k=vIY6?iRd)S+u9fXP^AJ{fhp?(z1?x=1r-^meLe)_hlM*Q)Pm z6JLT9FbjWoc;B0XxhXE08Q;g-U2bK}OffQnAEil*dl+8dd+E(VS3v4iM0g%0OnNcC zMMSW^L~!8Z^FS~jIsdpqgmyNCsFY&NQ-aa9)AoA(m{a$!j~@Q|H+krHrvnqKlO~Fi zc+?}UC*p3K+Quho98!V>!OZk>f2}oFXRul?my=>!ElGJUfmRMI5w=) zlsl(>7FRxOvFcB2SL*`A{b9o}PIH1@CQ>NT7f&{ZKW4jWDqO>kO6?+_eo6Hj9R55%MQK|?nBGw-8(c^&QP^stH4O|W61Ycpd4He*$@~!umPvNta z_WXpeBe}kK_BNd6-}VX6t2n0hCg$^)dE6W?pY&H85hnEa--(d%Kh=G7);jdpyCLMv zh!^m1jSUj( z*Ad2jJQ2GE&1C1e-pWIyykPRvrh7_RNqYzi_G-&*8>}x9ea+NCWsshr-Wv*fvai=b z1~hy4l=vGXpamzfOLH&_S_$v3u23;<;`@mGST|c+8L2jtr7JQ_0Y3d{hg$hz;|S@b{w~z_6Rx>vncn} zJ73qNE`)vg*?hjf2GiT{uH9d?9|zLM0o#qX_t^wGS}Uh(X>A0#TlXt;q|>h_BkO2b zv=Zt*AH4ij0!sP+kVZ=5a#N$h6t3hT^(p<)h*W}kdxYasvOOK%Wk3@xwP+bs!`o%$ zt@?IOlWpL1LE3w)jX^lJ0gX{@mJXmMvO6)_WN|R@TQBeUwkyq{S(WE?XuD~px#vEb{oNl2;7_m(aZG^&<|j)!f>UfllO zgiYGXaLyfZ1JS`Ie>F$RlHvQKMfc!hi_EO0t+S;rzwF}xN_Wac(&VQDcx}cr9OL{* z;<{yAA2Y>63u;_E8!&nb!;e=WZ0Tb4+go9wq71@$4asw6!uMKY4_5t1YVH*mw0(f; zduRB$YXn67dfQR{YLC=rvw_@|n=s7qc8RF2zYGw|`;TEfI`R82|qQ~7s!`Ph6`m4fWGq{{ZTz80zN)7z_W z0xi)_wsNzyqDs0sWvK1!O1IHvqJqvsyLY@l%|gTD{t4^*iYRfk`q;wg<`dyk{^zFG zQYsada1aDc2GQC*`i~CyH9X!tc&cwyp^@m(ssBxK5>yMGOL%`yF0U+a$NO}lSMK0Q z)IJA<*PrexS#N&_*w{4qVES(6(O&{emh>4d49qAynb=lt6_5y*5UTAK?VNHSZfOJv z<=U7d$zi5N*>YTsL*cMtCr4yp<)mWld0o-Ki<2+1J#SYN&8|9NjgM`$J|D$PB!?X8 zva&%~XpRjB&%VRB*@jm?IR5c+*hC-T`}gl-T_jZw&rE`BCB{MBZfEzDo`fMUW=9&6E`a$LbgzO#XQByWEV6AaR?LC{nI8}9*Hd*%%uHb*%7Hkd+;L z?EcGy6DZgm@HPE4pPfX*irs*(mvEn-NEdwRAC3CDsJ=U;l(39NScga9Z<7*~5gAD0 z!(hEZO)?l71~7~W7v=G++~+8>HW(!j7{1%{VsiUo|ypq1UL2Uae9e zbA$Dc+NCF}H41vb-SbdrhCyii#rY}f#j4TS*N}sl4`=?)hg5({J6Y*|dcSsq2X}yh z#CQ8?XhbH9_w!=P5S4A?ZB4$LOL+9dCZ%ttb)8;&tY4c2r~(Sgm30e@RCbM2)5r=y zpu|XJMgBd14+YpP5i4>1p@=7YvbFRvA#)8>uzT1lK><_`F#byT{H3mos$WqR`fk9B z)MtM%W4*nKKi?PYl!yxGCx?+Uot<(@;L^r4&9yAKUXDNeB|K2y)#R-Xfk2YB(QXU4 z?UVh?8GvWhO(4am=ipTDO~#sMv#zXm({(sLNOYkKm3bKXhmuuhG*zZ8>RUhAa#CHu zZ<>-kRjPWn;_H}8%y2stQ#VHMqnya$Tt*Ts>q*OGz&m%Kmc40$m!=_g`74fT%Bhu~ z)A%s{jEJ*%-t=GXcK+6qi9XAN7qAyQf&n@RLfOK=1@Y!?-eyY+n-LG{C&!P&zd0Iq zxL@8FEsv+QWy*iEso4u>!|!YvrATwHQc%to$O|oe`(b;~U{5fr#qA_vY7+t&!$fDe zH$hSr8@NV+H?*GfH1W$p^WK-#(&UzQHe2a}jkCnhmz(r+wFR0Bu#eJzRTF>f%@wTJ zbNNVDtmkZ^kk%1GN;a(80~iDaZisE5(#i3%&x7uFg)5`u{$3qhgQZggvUK|(S!K~0 z1Xu#%%P*Sby403mIt5*Ij9*N5`vrX7^})kmxMjBV0avQJpyyM1v$G@prdAEPwouo^ zI;KLD1)e~8+(Y!S({Xw(d-~YGtJ*Ek{4Hc;nTI*tk`)J~7wgdo&we5pF8H3;P_+rA^ryXJ1D0xdWCfRHawx9MsHGe_UjOn67vXsKlf)-*0+$ESa~sF~9L{xRi1e zfcz^4A{(_@{cXNro7I*oT_3ws`{BvrliQy_|6f%SX-hkq1_#|v`oG^s<2*`!b`mBV z5ZL6a?Lsd9Et)t6|7n%8>iHNs9@oST;$qPkL0A~u|IJ{?>U{*dY!~Lm9-~JVRrX(O zg%cr3x=YrRtMBk+n!)@=yQcwnJ%R4!7_?G|69+t1RSx6*R_cEeo4l&;cfSaJX*eJD zYc4!}c2JW4@ERRcTB)e@BMpQ>7<&q-Qix5*&DZ)3ZE$n&VB^d{XZ;4gu0Z%k08#S3 zA(vp_u_~X*F7mKhUkCkC&(m(QZZuxEU$66dJL7SRD0Z_wjcA-I>?}Sy95}h%Lwg(! zH&wU-$`E^^PkX>&F$W*i^{|<`Cd)i5>g`1TI`|Sl#Z1B^xvdM*1zIbb{5@59mio2v z8uU6`5qkZ?`P|zX6cM;#8J<7jf2(mkO=|J{j-k+aIqdv$IKMksjS#VZ=wQP=l-hlh z&szj;L98!l!5Nf^a~YIC$qt@T4g+}E2K+LHcU^)2uVT{~$Z^ zbL1%<;Xgu-`re$o$tQ$AQ>tWE-WQKe#qVtz*NKp2CSC|Bj5i_b^SzuTIJ)pbHbk&Q zHwEwBlr!zITJj+PC@FU6B#kWN%X1)_vWF?s<5q7srfJ@)0LQm~NLJ`L+oP*#^ZiHq zH;B~*zIOr?bV*NNUHW)`6L&hB!IiBbS091)EHXL;;ljRE8H)nSdF zGda9N+FvJ4rY1H2%?FfxK0n!XANUJ!zWQ|#@tV$8Lf)T^^jEimOWLIU$KH0*#GvFX z8bR3EqAVSQ$wnCqP8%p@LZPnw%_H#M*En(@9OBB;5A|Kgw>zU|R3fBa465~VDq}nD#l`vDq%IzHk*ebzJxGaGf<)2vo5lW!SRD4AK>2Bz6zrw@*x|_<_VyQQ#>> z#{4hlUvba|!7rnsk_%3nTkW_w_NRRHf+0^REZO0+8}W&X|2e7ZW6*D<0}0>LJ`^$T zqsU#$hjr~kkodsDY7Ry@JNxOmrI7g07W7q9pPu8B4TvjM6ydAw3T2mCD{+X5#jE=3 zGyQ(%UN?tSq93^%sg-4%>b7eS@I5NI7qUA2O2Ta=GnEKpg@!^}9Zd3c6-CwwjT?TB z2-jzUCINjHwri*Uh8hwa>}4=W11uuOOJ0x*D`punv17d0AB2IeIT91N=NgQ_Yp75d zU{(r&lpE;DIUX7hZT^O!Ca8YlR=FQ4ssux54ojFF{=Lz{iQygM+igRDQo+J^e<+U& zjaJJaAtHCObyshBS1;v{^Pg#U7)fda&|x5w1TtO+nSegJ zUo$5_JBPZ6AwO3u0TokRlh{?@kEbX9Y?Z_ViLccsuF|h}jNM)wuvABaxin>0f zoR)ZsyL$h6?W|5G|E{<_Q`b-fZ7vlbpV@sHZwRV|_v8NI+Vji}g{>>4xe7(8vH<_7 z=V(yIQC*K6f`=y!r7_?YS*I6al1dv?C^%NgZ|lD3|siNsVex0cNcz`m*Mjei7u?n-HGl?z%+3N3W& zmHc#yUUMhwE2XO*$M=cMm3+<)C;e$$c}s!J`LI7uFG1I#2s5m*ooi&>bE-9@4F}fH zpw8m|x{8alRV>&^=cO(;iJa7MJv*d~b&mwy5VoE-)kR%`S-Y!?^}58Kun@3Pm7M{m zmAAq?5!FdzJt2SL2A$Pc6A3Inj))uTJU3N*A-wexoOkLTTLg^AO!X)AN@jfXC$_PV z9@5*Tu~wxo?HXF$V@7dAbyzIwp&|@eiIDa1j$)>END+rs4ARhW-QK?WduTWbpCcAC zz0YdSEt2MT?`Hvy#Q`cG)Ib#=qZI1r#?nGzO-hp|p0f1~+Ze+(OrLo zKMU8dBzi@EPZxcTJudz=TK1R-Nc5CZMhhj&&HUmUT4c-3{O`63aTU0&`}&FC50T@c zNM(C9o8xS^?$h4a?X)s_d5cNJhZS0R%zsD*Fa5lssQb44Gc1`2)pa29>rK{8?ewUL z6jdDLAv0JJLLSXsx<`sVtZv}@(yFf+yczrY5wN|RZsQw}*(per8&f=7=SvroC%a9G zFsz=JGe#SsuN~X{V5##B}@Cfo1qi-wX2>n zg1UzNS%9gHQ4xM_MK**FR+7$D`EVcke-dAi1Q~!iS=)b`|7{FI03;P9>cosg{tt82 BTV((M diff --git a/webroot/AutoSa/static/images/logo13.png b/webroot/AutoSa/static/images/logo13.png deleted file mode 100644 index 027961b674a80cf19909a462077ab0b43858104f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24562 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 diff --git a/webroot/AutoSa/static/images/menu-current-arrow.gif b/webroot/AutoSa/static/images/menu-current-arrow.gif deleted file mode 100644 index 079ed590e0e3c8cdbb8797c9c40f47a974558ae2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59 zcmZ?wbhEHbWM$xFn8*ME|NsC0^5qMVRQ$=p$iTqNpaT*G$ultV%u!eGyv-eJ5?~m` Hz+epkB)<@d diff --git a/webroot/AutoSa/static/images/new_line.png b/webroot/AutoSa/static/images/new_line.png deleted file mode 100644 index bd62d364aa0d2c76dc88919149570f47480d3551..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmaJ=O=#0l9FID54(9|9!_S5I4Yq00CTnBsSeJGynljr$=Rq+`-qx@sFD7qmRzc96 zJb4g3=s^$#q@dNzYP#B2l%WSI$YY6ZC-{bfD{XgG{&SZOi z-P$^WAnFqxVu~OZ&tiK~?NYpEx!GyFtwFIal!iShFI#|URbe+E6S~|BQb1OR4o`qE zK`f!POc&~s_6iEry|Rn(I=YG31QBj=Oj+pzi0lTvnh~KskKdt4O^r}lPVz}+8^~!L z1q-AL$&6CyQ$i}$vYQM$0v6B#l1WGJH*CR)Pz$;Ow%u!*A{QX2FGBqes!Qr5+n@zV z&g=ImK87KA-pd3yo@aKFtdC)7AO3j{6A(CFV4KO(M`3T4+9RaIc*z$&MW`G?ra;sA zeBPV)d!f}!Goet()nHi?}fRrQ?l7R%MD*`G7 zw8B;{N?EHy1(AgV*2W^J6+}dZZo?A6>nYbNV5=em?M|%N{juzvnfWf~d7k%uzxO%k z`*dsEMmOxAu_zSEO|Xe4LPjF;1!A0$|Mrv*vyj0Dj+Me$rreZ`%og zTE!(KFojg1J_bxyZ^|@);>0|+q543d&cqX8@ynHIuiv1sc7I+aGJP?48KqJ?mnEDk*s zc>NHNXa-dxN5td5j)knagk%`jb0`#($wW3W$dDn4LJJEEvun`lBm_Y+X6RtKnWQuN zFDmdrqtc+(!)ize*cIgpC=KQkkW7CsL92fwt24enCgi{c`8|0!&gWavSP2sA=z1|`zCM1OlIJtxKh%3;VLfgsJ|DQ-=MV91yZ>46wA z3kXP1>r{}*82Ab=6mkSQBP`b`K>?3TKorPowTi>%v)OzqpUGx1_%vE9J(|X+vtweJ zbSjG<5<+Dya(R$4O$+MaMXu@(E^A4y-3nSg5}5}Y)ajs#Z-BJGtCBhDrE_5{srQD2e%YYkAg| zxK#Yrdq1DgBb_6P$o~6I)(grvuPdV#h;$74(Vy1Nes{ZQ+fmn}mIFdYnM7x~=fj|# z$y0QF6jbJoo#M?#4$chN#vdE*&Qw-CW`s?JP0hBokG`Cl}U}G*sga^){AE@1s_tBoI*FEUu5$-_QIpP6VgYPxjdv9F8E9gvicbrqigiu z8izlX@E&$EWLVD!j?#`Tn^9b$7qMZm%k;>(uayiEf9NKhzH%Ggj}QK-kL$U2Z+6;! zOnFpQ?ulc)-F5XRHSd(4n!xUM4Z8enJG*&-jW5vjBqaQ*nf7f#FI;l&%~`mZCilDJI9{)P>&e-bY<+|+P=be5otx95jk13P)GMQ8^ z9AeH`^^XFrtkig&a%NSqgW%YaYrP5k@xI~>xu@TDTL21^b`hVfc1i#EYE@8rMqyC+ zFm6?o8#B>5pZfiwclVg;#s8M_d{;hmZM^$cgjNdZ%uaU&{WHkwC>95 zosp!Sn7r^gnp|umVE4!lvv(!Q8AqxlbgR9V|vLul@`lf!w%H>_BvTTdrTux=~nYb)th+0{K;D$?hl)k{6j&G4o4 z&~=0foU~`0fBt>fy4{w$&A1aowu*;!6$eBuS=anf$0ykaSF3L;tM`j1MS-(3#PVa6 zJH~c2DZHcnHSf-;B24#F3j#KN_GMAP*M}=b>C?aA*416HdB)mm+d~_nnrKPRh2m}h zJUor58$!j0J-U(B)5nnFzB(xDC&=?}j#lqnCOcbjz`KSC9qyurpZKO<<$OJdT4=lc z!$_wiC-&55BfspDS?2qOF1L(aRbo7BRqJFan+7&GIHS(a;g3+G1An$(tAf}#UPH7j F=Rf(7BdGuY diff --git a/webroot/AutoSa/static/images/ok.png b/webroot/AutoSa/static/images/ok.png deleted file mode 100644 index de8f000d3bdb8f820e33fbe9ee5ad2f4e78b0c7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 741 zcmVG1xN@H&i2}X&Q80Z_$H+tXnpJe1@CQ zP%Ipc3&v}3F47(e*J?GGrs+y_vAw&EJHhMdth6Ja&*SFnyI5XX1~XV#FkXXWGUT9b z+xUEG9>q!#xt$zhqz`AiMxiJQrZ->URrw7XQUiu%1O?+Y0JSM@_g}-((h}x}XK*qy zf+r&nUHENz0gnsQKnSj=LS5#-py6zlwUUwjdLObZ!{_ti>Chwi6d%^>KX7j|3)aE- zzkn-?n1*1y9ems_6{~VsM*91>`_-nduHOPWu@4IwwR%-BUW3`+Ta^t7L??X&r@mcw z;nZRpIMNC;X6t5A-w@1!0doqrMyD#DimMJ~I*AdazHm5({c{Vk2G!NY>ME<-Q-X10 zAi_il&q0g_VN@EI`sIv2*&g>N+QM>|5)?)DFKSq8^{Tb1ZLpslUSxB~*>KrC197Fh zxgzM5dN7PMjv~dw<=!?Po&t8Uj1?@Pz;^gfiL1<6+BA?nCsqEDV39?QtIk>WM}PqU X8gD*;Zn-LF00000NkvXXu0mjfwggkd diff --git a/webroot/AutoSa/static/images/shortcut-button-bg.gif b/webroot/AutoSa/static/images/shortcut-button-bg.gif deleted file mode 100644 index 48e77b9dbb25d5c769652a81d365b0203296346a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1341 zcmV-D1;YAANk%w1VQm0t0J8u900030|Ns8}{{8*^{QUg;`}_L(`uX|!`1ttu_xJz* z{{R30000000000000000A^8LW000UAEC2ui0Brzh000F45XmWzz1W(~yZ>M)X5>Mg zQ=+bH+oDLBiF9G#H$BQ1e7Zmvil@4cYL3m^SlyvD|j+Be1}RjM1X=SF?k|;1e27NlzWPQYJzSd zah9N=1aUhun|6>OW}>X3W~C&Is3nnFt+%dcA(}p%B(+(%!k}fa7_wlrs=>p}mbxFj zFtZq*%+A=8&>qq#YctkL!UN>x=HfJCDbeR$MHOPw!S9PoGJ={%`m zrv|LL>{&e|~d0CEInceQp?F_(D3f8>g(#wo zGeY!TS<*dWTXik+2%?WtQOMqYC)#KLMMth?U40V9*qd`EY9r;8D&}ZhlGiP%oR+`Q z_#IsiA`~E*Wm1yeYfq}VU=G9mx8j>S=G7yUbe7oVC@6yYSe2~3m}Q_*VTR$CVT!4O zT5y{8C!m2k8YP1_;ur`Jl=d0tBmyxylwWs(*I=7fCJ-tI1Dc6xnow?vXOTuyHz`-6 zlDgMxsHRF}kvpaJs!t!vS|FFfKFVqTijjT_)3H~?D(6NPZba6wogT^|Pt;bM?6ox+ zRpXb2#`mpOJ&EfgmgUxJ>#eKis_Uffx~t@+@yhFEq3NnCDZBap)KI@dZkv<0>k=Gp zJc^+r({A8gaa08`njvHkGsCqPu;QV^~dUyO0a**LRJz4kV&^2*k>%yGva z-#arfEZcl8#TBPKbGZ7B>+`=XEzIzq{3!F;yGOsGw7^V{REWqmn+%6BOApLOCs=1K zY|>Lx?R6MnKaB_`T$?Se9c^6A^V+0jlJm!5Jd#S-bOYRNv~R;5x7>60jV{cry4eU7 zX&YiVw{5!}xZo6wVa3{3K-&%K-a)|N1ksNBZTIFngW<#HnWxSL9jXZe#pj@_zB=oz zQ|>wJvgZza%$%DJ$nLq%PJ8XH1EM$X!RNV%@dz|B1@pVVlX~=$pY41C%o9SrLbyhs zee>7*p8fXZ@BTgb;foJ_`RoH;disN$e|-DY%a1<%wvSK0`SRl*zWv(UU-cB{zr_JC zfb2Wqf4d3(AzhE&|@J-3jTL4n65aGKJa zi>kXgB~~zHg^Zp{CM0mn90WqNOPra}*Z0{kiIv{o~-b=GT*r10o|L fZ$xJ3$neauD_x^sx!G?E&{zgfS3j3^P6f4xp=xbhE&|@J+)AfL4k+GVA`V_ zi@i$(ZI&5dnZ|p1@qvOp9o~Wy8Q7coxO9zA=N|uQu;Ab0z?&8~c9@!JNn1 (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || $active[type]() - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var fallback = type == 'next' ? 'first' : 'last' - var that = this - - if (!$next.length) { - if (!this.options.wrap) return - $next = this.$element.find('.item')[fallback]() - } - - this.sliding = true - - isCycling && this.pause() - - var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) - - if ($next.hasClass('active')) return - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid.bs.carousel', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0) - }) - .emulateTransitionEnd(600) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid.bs.carousel') - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - }) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - $carousel.carousel($carousel.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.0.3 - * http://getbootstrap.com/javascript/#collapse - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * 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. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.transitioning = null - - if (this.options.parent) this.$parent = $(this.options.parent) - if (this.options.toggle) this.toggle() - } - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var actives = this.$parent && this.$parent.find('> .panel > .in') - - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing') - [dimension](0) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('in') - [dimension]('auto') - this.transitioning = 0 - this.$element.trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - [dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element - [dimension](this.$element[dimension]()) - [0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .trigger('hidden.bs.collapse') - .removeClass('collapsing') - .addClass('collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } - - $target.collapse(option) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.0.3 - * http://getbootstrap.com/javascript/#dropdowns - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * 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. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle=dropdown]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $('