├── .gitignore ├── Flask ├── app.py ├── static │ ├── bootstrap │ │ ├── css │ │ │ ├── bootstrap-grid.css │ │ │ ├── bootstrap-grid.css.map │ │ │ ├── bootstrap-grid.min.css │ │ │ ├── bootstrap-grid.min.css.map │ │ │ ├── bootstrap-reboot.css │ │ │ ├── bootstrap-reboot.css.map │ │ │ ├── bootstrap-reboot.min.css │ │ │ ├── bootstrap-reboot.min.css.map │ │ │ ├── bootstrap-theme.css │ │ │ ├── bootstrap-theme.css.map │ │ │ ├── bootstrap-theme.min.css │ │ │ ├── bootstrap-theme.min.css.map │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ └── glyphicons-halflings-regular.woff2 │ │ └── js │ │ │ ├── bootstrap.bundle.js │ │ │ ├── bootstrap.bundle.js.map │ │ │ ├── bootstrap.bundle.min.js │ │ │ ├── bootstrap.bundle.min.js.map │ │ │ ├── bootstrap.js │ │ │ ├── bootstrap.js.map │ │ │ ├── bootstrap.min.js │ │ │ ├── bootstrap.min.js.map │ │ │ └── npm.js │ ├── favicon.ico │ ├── font-awesome │ │ ├── HELP-US-OUT.txt │ │ ├── css │ │ │ ├── font-awesome.css │ │ │ └── font-awesome.min.css │ │ ├── fonts │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ └── fontawesome-webfont.woff2 │ │ ├── less │ │ │ ├── animated.less │ │ │ ├── bordered-pulled.less │ │ │ ├── core.less │ │ │ ├── fixed-width.less │ │ │ ├── font-awesome.less │ │ │ ├── icons.less │ │ │ ├── larger.less │ │ │ ├── list.less │ │ │ ├── mixins.less │ │ │ ├── path.less │ │ │ ├── rotated-flipped.less │ │ │ ├── screen-reader.less │ │ │ ├── stacked.less │ │ │ └── variables.less │ │ └── scss │ │ │ ├── _animated.scss │ │ │ ├── _bordered-pulled.scss │ │ │ ├── _core.scss │ │ │ ├── _fixed-width.scss │ │ │ ├── _icons.scss │ │ │ ├── _larger.scss │ │ │ ├── _list.scss │ │ │ ├── _mixins.scss │ │ │ ├── _path.scss │ │ │ ├── _rotated-flipped.scss │ │ │ ├── _screen-reader.scss │ │ │ ├── _stacked.scss │ │ │ ├── _variables.scss │ │ │ └── font-awesome.scss │ ├── image │ │ ├── alipay-pay.jpg │ │ └── wechat-pay.jpg │ ├── index.css │ ├── index.js │ ├── jquery │ │ └── js │ │ │ └── jquery.min.js │ └── socketio │ │ └── socket.io-3.0.5.js └── templates │ ├── backup.html │ ├── bootstrap │ ├── base.html │ ├── fixes.html │ ├── google.html │ ├── pagination.html │ ├── utils.html │ └── wtf.html │ ├── donate.html │ ├── error_404.html │ ├── error_500.html │ ├── index.html │ ├── macro │ ├── setting_base.html │ ├── setting_dev.html │ └── tutorial.html ├── LICENSE ├── README.md ├── README_en.md ├── api ├── backup_info.py ├── configuration.py ├── notion_dump.py └── notion_dump_api.py ├── config.json ├── img └── database_args.png ├── notion-dump.ico ├── notion_backup_background.spec ├── notion_backup_gui.py ├── notion_backup_gui.spec └── notion_backup_terminal.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | 53 | # Translations 54 | *.mo 55 | *.pot 56 | 57 | # Django stuff: 58 | *.log 59 | local_settings.py 60 | db.sqlite3 61 | db.sqlite3-journal 62 | 63 | # Flask stuff: 64 | instance/ 65 | .webassets-cache 66 | 67 | # Scrapy stuff: 68 | .scrapy 69 | 70 | # Sphinx documentation 71 | docs/_build/ 72 | 73 | # PyBuilder 74 | target/ 75 | 76 | # Jupyter Notebook 77 | .ipynb_checkpoints 78 | 79 | # IPython 80 | profile_default/ 81 | ipython_config.py 82 | 83 | # pyenv 84 | .python-version 85 | 86 | # pipenv 87 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 88 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 89 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 90 | # install all needed dependencies. 91 | #Pipfile.lock 92 | 93 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 94 | __pypackages__/ 95 | 96 | # Celery stuff 97 | celerybeat-schedule 98 | celerybeat.pid 99 | 100 | # SageMath parsed files 101 | *.sage.py 102 | 103 | # Environments 104 | .env 105 | .venv 106 | env/ 107 | venv/ 108 | ENV/ 109 | env.bak/ 110 | venv.bak/ 111 | 112 | # Spyder project settings 113 | .spyderproject 114 | .spyproject 115 | 116 | # Rope project settings 117 | .ropeproject 118 | 119 | # mkdocs documentation 120 | /site 121 | 122 | # mypy 123 | .mypy_cache/ 124 | .dmypy.json 125 | dmypy.json 126 | 127 | # Pyre type checker 128 | .pyre/ 129 | .idea/ 130 | .tmp/ 131 | *_result.json 132 | release/ 133 | dumped_pages/ 134 | config_multi.json 135 | buffer_file/ 136 | 测试-功能测试/ 137 | notion_backup_terminal.spec 138 | -------------------------------------------------------------------------------- /Flask/app.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import json 4 | import threading 5 | import time 6 | 7 | from NotionDump import NotionBackupLogger 8 | from api.configuration import CONFIG_FILE_PATH, Configuration 9 | from api.notion_dump import NotionBackup 10 | 11 | from flask import Flask, render_template, send_from_directory, request 12 | from flask_bootstrap import Bootstrap 13 | 14 | app = Flask(__name__, template_folder='templates', static_folder='static//') 15 | app.config['SECRET_KEY'] = 'delta1037@qq.com' 16 | app.config['BOOTSTRAP_SERVE_LOCAL'] = True 17 | bootstrap = Bootstrap(app) 18 | 19 | SEVER_ABS_PATH = os.path.dirname(sys.argv[0]) 20 | LOG_FILE = SEVER_ABS_PATH + "/dump.log" 21 | 22 | 23 | class NotionBackupGUI(NotionBackupLogger): 24 | def __init__(self): 25 | super().__init__() 26 | self.__notion_backup = None 27 | # 日志文件句柄 28 | self.__log = open(LOG_FILE, "a+", encoding='utf-8') 29 | # 输出备份的时间 30 | self.backup_time = time.strftime('backup_time: %Y-%m-%d %H:%M:%S\n', time.localtime(time.time())) 31 | self.__log.write("\n###################################################\n") 32 | self.__log.write(self.backup_time + "\n") 33 | self.__log.flush() 34 | # 增量输出内容,给前端用的 35 | self.__mutex = threading.Lock() 36 | self.__append_buffer = "" 37 | 38 | def log_debug(self, log_str): 39 | self.log_info(log_str) 40 | 41 | def log_info(self, message): 42 | self.log("[EXPORT KERNEL] " + str(message)) 43 | 44 | def log(self, msg): 45 | # 文件输出 46 | self.__log.write(msg + "\n") 47 | self.__log.flush() 48 | 49 | # 窗口输出 50 | self.__mutex.acquire() 51 | self.__append_buffer += (str(msg) + "\n") 52 | self.__mutex.release() 53 | 54 | def init_process(self, config_handle): 55 | # dump api 56 | self.__notion_backup = NotionBackup(logger=self, config=config_handle) 57 | 58 | def start_process(self): 59 | # 转入后台执行 60 | self.log(self.backup_time) 61 | self.__notion_backup.start_dump(force_auto=True) 62 | 63 | def get_append_log(self): 64 | self.__mutex.acquire() 65 | ret_str = self.__append_buffer 66 | self.__append_buffer = "" 67 | self.__mutex.release() 68 | # print("//trans", ret_str, "##trans", len(ret_str)) 69 | return ret_str 70 | 71 | 72 | # 初始化控制程序 73 | gui = NotionBackupGUI() 74 | config = Configuration(CONFIG_FILE_PATH, gui) 75 | gui.init_process(config) 76 | 77 | 78 | @app.route('/', methods=['GET', 'POST']) 79 | def index(): 80 | # 默认返回主界面渲染 81 | return render_main() 82 | 83 | 84 | # 基本设置界面 85 | @app.route('/setting_base', methods=['GET', 'POST']) 86 | def render_setting_base(): 87 | backup_type = config.get_key("*backup_type") 88 | return render_template( 89 | 'index.html', 90 | main_content=render_template( 91 | 'setting_base.html', 92 | backup_root_path=config.get_key("backup_root_path", default=""), 93 | display_rowss=["单页面备份", "多页面备份"], 94 | # 单页面配置 95 | display_rows_choose=("单页面备份" if backup_type == "single" else "多页面备份"), 96 | single_readonly_token=config.get_key("*backup_token", prefix="single"), 97 | single_page_id=config.get_key("*page_id", prefix="single"), 98 | single_page_types=["Page-ID是页面类型的", "Database-ID是数据库页面类型的"], 99 | single_page_type_choose=("Page-ID是页面类型的" if config.get_key("-page_type", prefix="single") == "page" else "Database-ID是数据库页面类型的"), 100 | single_dump_path=config.get_key("-dump_path", prefix="single"), 101 | database_insert_types=["Content-内容嵌入", "Link-链接嵌入"], 102 | database_insert_type_choose=("Content-内容嵌入" if config.get_key("db_insert_type", prefix="single") == "content" else "Link-链接嵌入"), 103 | # 多页面配置 104 | multi_readonly_token=config.get_key("*backup_token", prefix="multi"), 105 | multi_rw_token=config.get_key("*backup_info_token", prefix="multi"), 106 | multi_page_id=config.get_key("*backup_list_id", prefix="multi"), 107 | multi_log_id=config.get_key("*backup_log_id", prefix="multi"), 108 | ) 109 | ) 110 | 111 | 112 | # 基本设置 确认请求 113 | @app.route('/setting_base_ack', methods=['GET', 'POST']) 114 | def setting_base_ack(): 115 | setting_base_json = json.loads(request.data) 116 | # print(setting_base_json) 117 | config.alt_key("backup_root_path", setting_base_json["backup_root_path"]) 118 | if setting_base_json["display_type"] != "多页面备份": 119 | config.alt_key("*backup_type", "single") 120 | config.alt_key("*backup_token", setting_base_json["single_readonly_token"], prefix="single") 121 | config.alt_key("*page_id", setting_base_json["single_page_id"], prefix="single") 122 | if "Page-" in setting_base_json["single_page_type"]: 123 | config.alt_key("-page_type", "page", prefix="single") 124 | else: 125 | config.alt_key("-page_type", "database", prefix="single") 126 | config.alt_key("-dump_path", setting_base_json["single_dump_path"], prefix="single") 127 | if "Content-" in setting_base_json["database_insert_type"]: 128 | config.alt_key("db_insert_type", "content", prefix="single") 129 | else: 130 | config.alt_key("db_insert_type", "link", prefix="single") 131 | else: 132 | config.alt_key("*backup_type", "multi") 133 | config.alt_key("*backup_token", setting_base_json["multi_readonly_token"], prefix="multi") 134 | config.alt_key("*backup_info_token", setting_base_json["multi_rw_token"], prefix="multi") 135 | config.alt_key("*backup_list_id", setting_base_json["multi_page_id"], prefix="multi") 136 | config.alt_key("*backup_log_id", setting_base_json["multi_log_id"], prefix="multi") 137 | return "" 138 | 139 | 140 | # 基本设置 取消请求 141 | @app.route('/setting_base_cancel', methods=['GET', 'POST']) 142 | def setting_base_cancel(): 143 | ret_map = { 144 | "display_type": ("单页面备份" if config.get_key("*backup_type") == "single" else "多页面备份") 145 | } 146 | if ret_map["display_type"] != "多页面备份": 147 | ret_map["single_readonly_token"] = config.get_key("*backup_token", prefix="single") 148 | ret_map["single_page_id"] = config.get_key("*page_id", prefix="single") 149 | ret_map["single_page_type_choose"] = ("Page-ID是页面类型的" if config.get_key("-page_type", prefix="single") == "page" else "Database-ID是数据库页面类型的") 150 | ret_map["single_dump_path"] = config.get_key("-dump_path", prefix="single") 151 | ret_map["database_insert_type_choose"] = ("Content-内容嵌入" if config.get_key("db_insert_type", prefix="single") == "content" else "Link-链接嵌入") 152 | else: 153 | ret_map["multi_readonly_token"] = config.get_key("*backup_token", prefix="multi") 154 | ret_map["multi_rw_token"] = config.get_key("*backup_info_token", prefix="multi") 155 | ret_map["multi_page_id"] = config.get_key("*backup_list_id", prefix="multi") 156 | ret_map["multi_log_id"] = config.get_key("*backup_log_id", prefix="multi") 157 | return ret_map 158 | 159 | 160 | # 开发设置界面 161 | @app.route('/setting_dev', methods=['GET', 'POST']) 162 | def render_setting_dev(): 163 | backup_list_map = config.get_key("backup_list_map", prefix="multi") 164 | backup_log_map = config.get_key("backup_log_map", prefix="multi") 165 | # 主题名称转换 166 | color_theme_type_choose = "自定义" 167 | if config.get_key("color_theme") == "dark": 168 | color_theme_type_choose = "暗黑" 169 | elif config.get_key("color_theme") == "light": 170 | color_theme_type_choose = "明亮" 171 | # 主题文字背景属性 172 | color_map = config.get_key("your_color_theme") 173 | b_types = [] 174 | f_types = [] 175 | d_types = [] 176 | for color_name in color_map: 177 | if color_name.startswith("b_"): 178 | b_types.append({ 179 | "name": color_name[color_name.find("_")+1:], 180 | "id_name": color_name, 181 | "color": color_map[color_name] 182 | }) 183 | elif color_name.startswith("f_"): 184 | f_types.append({ 185 | "name": color_name[color_name.find("_")+1:], 186 | "id_name": color_name, 187 | "color": color_map[color_name] 188 | }) 189 | elif color_name.startswith("d_"): 190 | d_types.append({ 191 | "name": color_name[color_name.find("_")+1:], 192 | "id_name": color_name, 193 | "color": color_map[color_name] 194 | }) 195 | 196 | return render_template( 197 | 'index.html', 198 | main_content=render_template( 199 | 'setting_dev.html', 200 | # checkbox信息 201 | debug=("true" if config.get_key("debug") else "false"), 202 | page_properties=("true" if config.get_key("page_properties") else "false"), 203 | use_buffer=("true" if config.get_key("use_buffer") else "false"), 204 | file_with_link=("true" if config.get_key("file_with_link") else "false"), 205 | # 日期信息 206 | date_formate=config.get_key("date_formate"), 207 | datetime_formate=config.get_key("datetime_formate"), 208 | # 主题选择 209 | color_theme_types=["明亮", "暗黑", "自定义"], 210 | color_theme_type_choose=color_theme_type_choose, 211 | b_types=b_types, 212 | f_types=f_types, 213 | d_types=d_types, 214 | # 多页面配置页面列名映射表 215 | page_id=backup_list_map["page_id"], 216 | page_type=backup_list_map["page_type"], 217 | dump_path=backup_list_map["dump_path"], 218 | db_insert_type=backup_list_map["db_insert_type"], 219 | dump_status=backup_list_map["dump_status"], 220 | title=backup_log_map["title"], 221 | date=backup_log_map["date"], 222 | status=backup_log_map["status"], 223 | log=backup_log_map["log"], 224 | ) 225 | ) 226 | 227 | 228 | # 开发设置 确认请求 229 | @app.route('/setting_dev_ack', methods=['GET', 'POST']) 230 | def setting_dev_ack(): 231 | setting_dev_json = json.loads(request.data) 232 | # print(setting_dev_json) 233 | 234 | # checkbox信息 235 | config.alt_key("debug", setting_dev_json["debug"]) 236 | config.alt_key("use_buffer", setting_dev_json["use_buffer"]) 237 | config.alt_key("page_properties", setting_dev_json["page_properties"]) 238 | config.alt_key("file_with_link", setting_dev_json["file_with_link"]) 239 | # 日期格式 240 | config.alt_key("date_formate", setting_dev_json["date_formate"]) 241 | config.alt_key("datetime_formate", setting_dev_json["datetime_formate"]) 242 | # 主题 243 | if setting_dev_json["theme_type"] == "明亮": 244 | config.alt_key("color_theme", "light") 245 | elif setting_dev_json["theme_type"] == "暗黑": 246 | config.alt_key("color_theme", "dark") 247 | else: 248 | config.alt_key("color_theme", "your_color_theme") 249 | for key in setting_dev_json: 250 | if key.startswith("b_") or key.startswith("f_") or key.startswith("d_"): 251 | config.alt_key(key, setting_dev_json[key], prefix="your_color_theme") 252 | 253 | # 备份映射表 254 | backup_list_map = { 255 | "page_id": setting_dev_json["page_id"], 256 | "page_type": setting_dev_json["page_type"], 257 | "dump_path": setting_dev_json["dump_path"], 258 | "dump_status": setting_dev_json["dump_status"], 259 | "db_insert_type": setting_dev_json["db_insert_type"], 260 | } 261 | backup_log_map = { 262 | "title": setting_dev_json["title"], 263 | "date": setting_dev_json["date"], 264 | "status": setting_dev_json["status"], 265 | "log": setting_dev_json["log"], 266 | } 267 | config.alt_key("backup_list_map", backup_list_map, prefix="multi") 268 | config.alt_key("backup_log_map", backup_log_map, prefix="multi") 269 | return "" 270 | 271 | 272 | @app.route('/donate', methods=['GET', 'POST']) 273 | def render_donate(): 274 | return render_template( 275 | 'index.html', 276 | main_content=render_template( 277 | 'donate.html', 278 | ) 279 | ) 280 | 281 | 282 | @app.route('/tutorial', methods=['GET', 'POST']) 283 | def render_tutorial(): 284 | return render_template( 285 | 'index.html', 286 | main_content=render_template( 287 | 'tutorial.html', 288 | ) 289 | ) 290 | 291 | 292 | # 主界面 293 | @app.route('/main', methods=['GET', 'POST']) 294 | def render_main(): 295 | return render_template( 296 | 'index.html', 297 | main_content=render_template( 298 | 'backup.html' 299 | ) 300 | ) 301 | 302 | 303 | @app.route('/start_export', methods=['GET', 'POST']) 304 | def start_export(): 305 | gui.start_process() 306 | return "" 307 | 308 | 309 | @app.route('/get_msg', methods=['GET', 'POST']) 310 | def get_msg(): 311 | return gui.get_append_log() 312 | # return "msg test" 313 | 314 | 315 | @app.errorhandler(404) 316 | def page_not_found(e): 317 | return render_template("index.html", main_content=render_template("error_404.html")), 404 318 | 319 | 320 | @app.errorhandler(500) 321 | def page_not_found(e): 322 | return render_template("index.html", main_content=render_template("error_500.html")), 500 323 | 324 | 325 | @app.route('/favicon.ico') 326 | def favicon(): 327 | return send_from_directory(os.path.join(app.root_path, 'static'), 'favicon.ico') 328 | 329 | 330 | @app.route('/local_static/') 331 | def local_static(filename): 332 | return send_from_directory(os.path.join(app.root_path, 'static'), filename) 333 | -------------------------------------------------------------------------------- /Flask/static/bootstrap/css/bootstrap-reboot.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.6.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors 4 | * Copyright 2011-2021 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */ 8 | *, 9 | *::before, 10 | *::after { 11 | box-sizing: border-box; 12 | } 13 | 14 | html { 15 | font-family: sans-serif; 16 | line-height: 1.15; 17 | -webkit-text-size-adjust: 100%; 18 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 19 | } 20 | 21 | article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { 22 | display: block; 23 | } 24 | 25 | body { 26 | margin: 0; 27 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 28 | font-size: 1rem; 29 | font-weight: 400; 30 | line-height: 1.5; 31 | color: #212529; 32 | text-align: left; 33 | background-color: #fff; 34 | } 35 | 36 | [tabindex="-1"]:focus:not(:focus-visible) { 37 | outline: 0 !important; 38 | } 39 | 40 | hr { 41 | box-sizing: content-box; 42 | height: 0; 43 | overflow: visible; 44 | } 45 | 46 | h1, h2, h3, h4, h5, h6 { 47 | margin-top: 0; 48 | margin-bottom: 0.5rem; 49 | } 50 | 51 | p { 52 | margin-top: 0; 53 | margin-bottom: 1rem; 54 | } 55 | 56 | abbr[title], 57 | abbr[data-original-title] { 58 | text-decoration: underline; 59 | -webkit-text-decoration: underline dotted; 60 | text-decoration: underline dotted; 61 | cursor: help; 62 | border-bottom: 0; 63 | -webkit-text-decoration-skip-ink: none; 64 | text-decoration-skip-ink: none; 65 | } 66 | 67 | address { 68 | margin-bottom: 1rem; 69 | font-style: normal; 70 | line-height: inherit; 71 | } 72 | 73 | ol, 74 | ul, 75 | dl { 76 | margin-top: 0; 77 | margin-bottom: 1rem; 78 | } 79 | 80 | ol ol, 81 | ul ul, 82 | ol ul, 83 | ul ol { 84 | margin-bottom: 0; 85 | } 86 | 87 | dt { 88 | font-weight: 700; 89 | } 90 | 91 | dd { 92 | margin-bottom: .5rem; 93 | margin-left: 0; 94 | } 95 | 96 | blockquote { 97 | margin: 0 0 1rem; 98 | } 99 | 100 | b, 101 | strong { 102 | font-weight: bolder; 103 | } 104 | 105 | small { 106 | font-size: 80%; 107 | } 108 | 109 | sub, 110 | sup { 111 | position: relative; 112 | font-size: 75%; 113 | line-height: 0; 114 | vertical-align: baseline; 115 | } 116 | 117 | sub { 118 | bottom: -.25em; 119 | } 120 | 121 | sup { 122 | top: -.5em; 123 | } 124 | 125 | a { 126 | color: #007bff; 127 | text-decoration: none; 128 | background-color: transparent; 129 | } 130 | 131 | a:hover { 132 | color: #0056b3; 133 | text-decoration: underline; 134 | } 135 | 136 | a:not([href]):not([class]) { 137 | color: inherit; 138 | text-decoration: none; 139 | } 140 | 141 | a:not([href]):not([class]):hover { 142 | color: inherit; 143 | text-decoration: none; 144 | } 145 | 146 | pre, 147 | code, 148 | kbd, 149 | samp { 150 | font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 151 | font-size: 1em; 152 | } 153 | 154 | pre { 155 | margin-top: 0; 156 | margin-bottom: 1rem; 157 | overflow: auto; 158 | -ms-overflow-style: scrollbar; 159 | } 160 | 161 | figure { 162 | margin: 0 0 1rem; 163 | } 164 | 165 | img { 166 | vertical-align: middle; 167 | border-style: none; 168 | } 169 | 170 | svg { 171 | overflow: hidden; 172 | vertical-align: middle; 173 | } 174 | 175 | table { 176 | border-collapse: collapse; 177 | } 178 | 179 | caption { 180 | padding-top: 0.75rem; 181 | padding-bottom: 0.75rem; 182 | color: #6c757d; 183 | text-align: left; 184 | caption-side: bottom; 185 | } 186 | 187 | th { 188 | text-align: inherit; 189 | text-align: -webkit-match-parent; 190 | } 191 | 192 | label { 193 | display: inline-block; 194 | margin-bottom: 0.5rem; 195 | } 196 | 197 | button { 198 | border-radius: 0; 199 | } 200 | 201 | button:focus:not(:focus-visible) { 202 | outline: 0; 203 | } 204 | 205 | input, 206 | button, 207 | select, 208 | optgroup, 209 | textarea { 210 | margin: 0; 211 | font-family: inherit; 212 | font-size: inherit; 213 | line-height: inherit; 214 | } 215 | 216 | button, 217 | input { 218 | overflow: visible; 219 | } 220 | 221 | button, 222 | select { 223 | text-transform: none; 224 | } 225 | 226 | [role="button"] { 227 | cursor: pointer; 228 | } 229 | 230 | select { 231 | word-wrap: normal; 232 | } 233 | 234 | button, 235 | [type="button"], 236 | [type="reset"], 237 | [type="submit"] { 238 | -webkit-appearance: button; 239 | } 240 | 241 | button:not(:disabled), 242 | [type="button"]:not(:disabled), 243 | [type="reset"]:not(:disabled), 244 | [type="submit"]:not(:disabled) { 245 | cursor: pointer; 246 | } 247 | 248 | button::-moz-focus-inner, 249 | [type="button"]::-moz-focus-inner, 250 | [type="reset"]::-moz-focus-inner, 251 | [type="submit"]::-moz-focus-inner { 252 | padding: 0; 253 | border-style: none; 254 | } 255 | 256 | input[type="radio"], 257 | input[type="checkbox"] { 258 | box-sizing: border-box; 259 | padding: 0; 260 | } 261 | 262 | textarea { 263 | overflow: auto; 264 | resize: vertical; 265 | } 266 | 267 | fieldset { 268 | min-width: 0; 269 | padding: 0; 270 | margin: 0; 271 | border: 0; 272 | } 273 | 274 | legend { 275 | display: block; 276 | width: 100%; 277 | max-width: 100%; 278 | padding: 0; 279 | margin-bottom: .5rem; 280 | font-size: 1.5rem; 281 | line-height: inherit; 282 | color: inherit; 283 | white-space: normal; 284 | } 285 | 286 | progress { 287 | vertical-align: baseline; 288 | } 289 | 290 | [type="number"]::-webkit-inner-spin-button, 291 | [type="number"]::-webkit-outer-spin-button { 292 | height: auto; 293 | } 294 | 295 | [type="search"] { 296 | outline-offset: -2px; 297 | -webkit-appearance: none; 298 | } 299 | 300 | [type="search"]::-webkit-search-decoration { 301 | -webkit-appearance: none; 302 | } 303 | 304 | ::-webkit-file-upload-button { 305 | font: inherit; 306 | -webkit-appearance: button; 307 | } 308 | 309 | output { 310 | display: inline-block; 311 | } 312 | 313 | summary { 314 | display: list-item; 315 | cursor: pointer; 316 | } 317 | 318 | template { 319 | display: none; 320 | } 321 | 322 | [hidden] { 323 | display: none !important; 324 | } 325 | /*# sourceMappingURL=bootstrap-reboot.css.map */ -------------------------------------------------------------------------------- /Flask/static/bootstrap/css/bootstrap-reboot.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.6.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors 4 | * Copyright 2011-2021 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important} 8 | /*# sourceMappingURL=bootstrap-reboot.min.css.map */ -------------------------------------------------------------------------------- /Flask/static/bootstrap/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.4.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x;background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x;background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.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)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} 6 | /*# sourceMappingURL=bootstrap-theme.min.css.map */ -------------------------------------------------------------------------------- /Flask/static/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delta1037/notion-export-client/93cf173b8bac81a6d793c46425a4f741d4defc8a/Flask/static/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /Flask/static/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delta1037/notion-export-client/93cf173b8bac81a6d793c46425a4f741d4defc8a/Flask/static/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /Flask/static/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delta1037/notion-export-client/93cf173b8bac81a6d793c46425a4f741d4defc8a/Flask/static/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /Flask/static/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delta1037/notion-export-client/93cf173b8bac81a6d793c46425a4f741d4defc8a/Flask/static/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /Flask/static/bootstrap/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /Flask/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delta1037/notion-export-client/93cf173b8bac81a6d793c46425a4f741d4defc8a/Flask/static/favicon.ico -------------------------------------------------------------------------------- /Flask/static/font-awesome/HELP-US-OUT.txt: -------------------------------------------------------------------------------- 1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, 2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, 3 | comprehensive icon sets or copy and paste your own. 4 | 5 | Please. Check it out. 6 | 7 | -Dave Gandy 8 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delta1037/notion-export-client/93cf173b8bac81a6d793c46425a4f741d4defc8a/Flask/static/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /Flask/static/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delta1037/notion-export-client/93cf173b8bac81a6d793c46425a4f741d4defc8a/Flask/static/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /Flask/static/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delta1037/notion-export-client/93cf173b8bac81a6d793c46425a4f741d4defc8a/Flask/static/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /Flask/static/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delta1037/notion-export-client/93cf173b8bac81a6d793c46425a4f741d4defc8a/Flask/static/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /Flask/static/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delta1037/notion-export-client/93cf173b8bac81a6d793c46425a4f741d4defc8a/Flask/static/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /Flask/static/font-awesome/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | .sr-only() { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | .sr-only-focusable() { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/less/variables.less: -------------------------------------------------------------------------------- 1 | // Variables 2 | // -------------------------- 3 | 4 | @fa-font-path: "../fonts"; 5 | @fa-font-size-base: 14px; 6 | @fa-line-height-base: 1; 7 | //@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly 8 | @fa-css-prefix: fa; 9 | @fa-version: "4.7.0"; 10 | @fa-border-color: #eee; 11 | @fa-inverse: #fff; 12 | @fa-li-width: (30em / 14); 13 | 14 | @fa-var-500px: "\f26e"; 15 | @fa-var-address-book: "\f2b9"; 16 | @fa-var-address-book-o: "\f2ba"; 17 | @fa-var-address-card: "\f2bb"; 18 | @fa-var-address-card-o: "\f2bc"; 19 | @fa-var-adjust: "\f042"; 20 | @fa-var-adn: "\f170"; 21 | @fa-var-align-center: "\f037"; 22 | @fa-var-align-justify: "\f039"; 23 | @fa-var-align-left: "\f036"; 24 | @fa-var-align-right: "\f038"; 25 | @fa-var-amazon: "\f270"; 26 | @fa-var-ambulance: "\f0f9"; 27 | @fa-var-american-sign-language-interpreting: "\f2a3"; 28 | @fa-var-anchor: "\f13d"; 29 | @fa-var-android: "\f17b"; 30 | @fa-var-angellist: "\f209"; 31 | @fa-var-angle-double-down: "\f103"; 32 | @fa-var-angle-double-left: "\f100"; 33 | @fa-var-angle-double-right: "\f101"; 34 | @fa-var-angle-double-up: "\f102"; 35 | @fa-var-angle-down: "\f107"; 36 | @fa-var-angle-left: "\f104"; 37 | @fa-var-angle-right: "\f105"; 38 | @fa-var-angle-up: "\f106"; 39 | @fa-var-apple: "\f179"; 40 | @fa-var-archive: "\f187"; 41 | @fa-var-area-chart: "\f1fe"; 42 | @fa-var-arrow-circle-down: "\f0ab"; 43 | @fa-var-arrow-circle-left: "\f0a8"; 44 | @fa-var-arrow-circle-o-down: "\f01a"; 45 | @fa-var-arrow-circle-o-left: "\f190"; 46 | @fa-var-arrow-circle-o-right: "\f18e"; 47 | @fa-var-arrow-circle-o-up: "\f01b"; 48 | @fa-var-arrow-circle-right: "\f0a9"; 49 | @fa-var-arrow-circle-up: "\f0aa"; 50 | @fa-var-arrow-down: "\f063"; 51 | @fa-var-arrow-left: "\f060"; 52 | @fa-var-arrow-right: "\f061"; 53 | @fa-var-arrow-up: "\f062"; 54 | @fa-var-arrows: "\f047"; 55 | @fa-var-arrows-alt: "\f0b2"; 56 | @fa-var-arrows-h: "\f07e"; 57 | @fa-var-arrows-v: "\f07d"; 58 | @fa-var-asl-interpreting: "\f2a3"; 59 | @fa-var-assistive-listening-systems: "\f2a2"; 60 | @fa-var-asterisk: "\f069"; 61 | @fa-var-at: "\f1fa"; 62 | @fa-var-audio-description: "\f29e"; 63 | @fa-var-automobile: "\f1b9"; 64 | @fa-var-backward: "\f04a"; 65 | @fa-var-balance-scale: "\f24e"; 66 | @fa-var-ban: "\f05e"; 67 | @fa-var-bandcamp: "\f2d5"; 68 | @fa-var-bank: "\f19c"; 69 | @fa-var-bar-chart: "\f080"; 70 | @fa-var-bar-chart-o: "\f080"; 71 | @fa-var-barcode: "\f02a"; 72 | @fa-var-bars: "\f0c9"; 73 | @fa-var-bath: "\f2cd"; 74 | @fa-var-bathtub: "\f2cd"; 75 | @fa-var-battery: "\f240"; 76 | @fa-var-battery-0: "\f244"; 77 | @fa-var-battery-1: "\f243"; 78 | @fa-var-battery-2: "\f242"; 79 | @fa-var-battery-3: "\f241"; 80 | @fa-var-battery-4: "\f240"; 81 | @fa-var-battery-empty: "\f244"; 82 | @fa-var-battery-full: "\f240"; 83 | @fa-var-battery-half: "\f242"; 84 | @fa-var-battery-quarter: "\f243"; 85 | @fa-var-battery-three-quarters: "\f241"; 86 | @fa-var-bed: "\f236"; 87 | @fa-var-beer: "\f0fc"; 88 | @fa-var-behance: "\f1b4"; 89 | @fa-var-behance-square: "\f1b5"; 90 | @fa-var-bell: "\f0f3"; 91 | @fa-var-bell-o: "\f0a2"; 92 | @fa-var-bell-slash: "\f1f6"; 93 | @fa-var-bell-slash-o: "\f1f7"; 94 | @fa-var-bicycle: "\f206"; 95 | @fa-var-binoculars: "\f1e5"; 96 | @fa-var-birthday-cake: "\f1fd"; 97 | @fa-var-bitbucket: "\f171"; 98 | @fa-var-bitbucket-square: "\f172"; 99 | @fa-var-bitcoin: "\f15a"; 100 | @fa-var-black-tie: "\f27e"; 101 | @fa-var-blind: "\f29d"; 102 | @fa-var-bluetooth: "\f293"; 103 | @fa-var-bluetooth-b: "\f294"; 104 | @fa-var-bold: "\f032"; 105 | @fa-var-bolt: "\f0e7"; 106 | @fa-var-bomb: "\f1e2"; 107 | @fa-var-book: "\f02d"; 108 | @fa-var-bookmark: "\f02e"; 109 | @fa-var-bookmark-o: "\f097"; 110 | @fa-var-braille: "\f2a1"; 111 | @fa-var-briefcase: "\f0b1"; 112 | @fa-var-btc: "\f15a"; 113 | @fa-var-bug: "\f188"; 114 | @fa-var-building: "\f1ad"; 115 | @fa-var-building-o: "\f0f7"; 116 | @fa-var-bullhorn: "\f0a1"; 117 | @fa-var-bullseye: "\f140"; 118 | @fa-var-bus: "\f207"; 119 | @fa-var-buysellads: "\f20d"; 120 | @fa-var-cab: "\f1ba"; 121 | @fa-var-calculator: "\f1ec"; 122 | @fa-var-calendar: "\f073"; 123 | @fa-var-calendar-check-o: "\f274"; 124 | @fa-var-calendar-minus-o: "\f272"; 125 | @fa-var-calendar-o: "\f133"; 126 | @fa-var-calendar-plus-o: "\f271"; 127 | @fa-var-calendar-times-o: "\f273"; 128 | @fa-var-camera: "\f030"; 129 | @fa-var-camera-retro: "\f083"; 130 | @fa-var-car: "\f1b9"; 131 | @fa-var-caret-down: "\f0d7"; 132 | @fa-var-caret-left: "\f0d9"; 133 | @fa-var-caret-right: "\f0da"; 134 | @fa-var-caret-square-o-down: "\f150"; 135 | @fa-var-caret-square-o-left: "\f191"; 136 | @fa-var-caret-square-o-right: "\f152"; 137 | @fa-var-caret-square-o-up: "\f151"; 138 | @fa-var-caret-up: "\f0d8"; 139 | @fa-var-cart-arrow-down: "\f218"; 140 | @fa-var-cart-plus: "\f217"; 141 | @fa-var-cc: "\f20a"; 142 | @fa-var-cc-amex: "\f1f3"; 143 | @fa-var-cc-diners-club: "\f24c"; 144 | @fa-var-cc-discover: "\f1f2"; 145 | @fa-var-cc-jcb: "\f24b"; 146 | @fa-var-cc-mastercard: "\f1f1"; 147 | @fa-var-cc-paypal: "\f1f4"; 148 | @fa-var-cc-stripe: "\f1f5"; 149 | @fa-var-cc-visa: "\f1f0"; 150 | @fa-var-certificate: "\f0a3"; 151 | @fa-var-chain: "\f0c1"; 152 | @fa-var-chain-broken: "\f127"; 153 | @fa-var-check: "\f00c"; 154 | @fa-var-check-circle: "\f058"; 155 | @fa-var-check-circle-o: "\f05d"; 156 | @fa-var-check-square: "\f14a"; 157 | @fa-var-check-square-o: "\f046"; 158 | @fa-var-chevron-circle-down: "\f13a"; 159 | @fa-var-chevron-circle-left: "\f137"; 160 | @fa-var-chevron-circle-right: "\f138"; 161 | @fa-var-chevron-circle-up: "\f139"; 162 | @fa-var-chevron-down: "\f078"; 163 | @fa-var-chevron-left: "\f053"; 164 | @fa-var-chevron-right: "\f054"; 165 | @fa-var-chevron-up: "\f077"; 166 | @fa-var-child: "\f1ae"; 167 | @fa-var-chrome: "\f268"; 168 | @fa-var-circle: "\f111"; 169 | @fa-var-circle-o: "\f10c"; 170 | @fa-var-circle-o-notch: "\f1ce"; 171 | @fa-var-circle-thin: "\f1db"; 172 | @fa-var-clipboard: "\f0ea"; 173 | @fa-var-clock-o: "\f017"; 174 | @fa-var-clone: "\f24d"; 175 | @fa-var-close: "\f00d"; 176 | @fa-var-cloud: "\f0c2"; 177 | @fa-var-cloud-download: "\f0ed"; 178 | @fa-var-cloud-upload: "\f0ee"; 179 | @fa-var-cny: "\f157"; 180 | @fa-var-code: "\f121"; 181 | @fa-var-code-fork: "\f126"; 182 | @fa-var-codepen: "\f1cb"; 183 | @fa-var-codiepie: "\f284"; 184 | @fa-var-coffee: "\f0f4"; 185 | @fa-var-cog: "\f013"; 186 | @fa-var-cogs: "\f085"; 187 | @fa-var-columns: "\f0db"; 188 | @fa-var-comment: "\f075"; 189 | @fa-var-comment-o: "\f0e5"; 190 | @fa-var-commenting: "\f27a"; 191 | @fa-var-commenting-o: "\f27b"; 192 | @fa-var-comments: "\f086"; 193 | @fa-var-comments-o: "\f0e6"; 194 | @fa-var-compass: "\f14e"; 195 | @fa-var-compress: "\f066"; 196 | @fa-var-connectdevelop: "\f20e"; 197 | @fa-var-contao: "\f26d"; 198 | @fa-var-copy: "\f0c5"; 199 | @fa-var-copyright: "\f1f9"; 200 | @fa-var-creative-commons: "\f25e"; 201 | @fa-var-credit-card: "\f09d"; 202 | @fa-var-credit-card-alt: "\f283"; 203 | @fa-var-crop: "\f125"; 204 | @fa-var-crosshairs: "\f05b"; 205 | @fa-var-css3: "\f13c"; 206 | @fa-var-cube: "\f1b2"; 207 | @fa-var-cubes: "\f1b3"; 208 | @fa-var-cut: "\f0c4"; 209 | @fa-var-cutlery: "\f0f5"; 210 | @fa-var-dashboard: "\f0e4"; 211 | @fa-var-dashcube: "\f210"; 212 | @fa-var-database: "\f1c0"; 213 | @fa-var-deaf: "\f2a4"; 214 | @fa-var-deafness: "\f2a4"; 215 | @fa-var-dedent: "\f03b"; 216 | @fa-var-delicious: "\f1a5"; 217 | @fa-var-desktop: "\f108"; 218 | @fa-var-deviantart: "\f1bd"; 219 | @fa-var-diamond: "\f219"; 220 | @fa-var-digg: "\f1a6"; 221 | @fa-var-dollar: "\f155"; 222 | @fa-var-dot-circle-o: "\f192"; 223 | @fa-var-download: "\f019"; 224 | @fa-var-dribbble: "\f17d"; 225 | @fa-var-drivers-license: "\f2c2"; 226 | @fa-var-drivers-license-o: "\f2c3"; 227 | @fa-var-dropbox: "\f16b"; 228 | @fa-var-drupal: "\f1a9"; 229 | @fa-var-edge: "\f282"; 230 | @fa-var-edit: "\f044"; 231 | @fa-var-eercast: "\f2da"; 232 | @fa-var-eject: "\f052"; 233 | @fa-var-ellipsis-h: "\f141"; 234 | @fa-var-ellipsis-v: "\f142"; 235 | @fa-var-empire: "\f1d1"; 236 | @fa-var-envelope: "\f0e0"; 237 | @fa-var-envelope-o: "\f003"; 238 | @fa-var-envelope-open: "\f2b6"; 239 | @fa-var-envelope-open-o: "\f2b7"; 240 | @fa-var-envelope-square: "\f199"; 241 | @fa-var-envira: "\f299"; 242 | @fa-var-eraser: "\f12d"; 243 | @fa-var-etsy: "\f2d7"; 244 | @fa-var-eur: "\f153"; 245 | @fa-var-euro: "\f153"; 246 | @fa-var-exchange: "\f0ec"; 247 | @fa-var-exclamation: "\f12a"; 248 | @fa-var-exclamation-circle: "\f06a"; 249 | @fa-var-exclamation-triangle: "\f071"; 250 | @fa-var-expand: "\f065"; 251 | @fa-var-expeditedssl: "\f23e"; 252 | @fa-var-external-link: "\f08e"; 253 | @fa-var-external-link-square: "\f14c"; 254 | @fa-var-eye: "\f06e"; 255 | @fa-var-eye-slash: "\f070"; 256 | @fa-var-eyedropper: "\f1fb"; 257 | @fa-var-fa: "\f2b4"; 258 | @fa-var-facebook: "\f09a"; 259 | @fa-var-facebook-f: "\f09a"; 260 | @fa-var-facebook-official: "\f230"; 261 | @fa-var-facebook-square: "\f082"; 262 | @fa-var-fast-backward: "\f049"; 263 | @fa-var-fast-forward: "\f050"; 264 | @fa-var-fax: "\f1ac"; 265 | @fa-var-feed: "\f09e"; 266 | @fa-var-female: "\f182"; 267 | @fa-var-fighter-jet: "\f0fb"; 268 | @fa-var-file: "\f15b"; 269 | @fa-var-file-archive-o: "\f1c6"; 270 | @fa-var-file-audio-o: "\f1c7"; 271 | @fa-var-file-code-o: "\f1c9"; 272 | @fa-var-file-excel-o: "\f1c3"; 273 | @fa-var-file-image-o: "\f1c5"; 274 | @fa-var-file-movie-o: "\f1c8"; 275 | @fa-var-file-o: "\f016"; 276 | @fa-var-file-pdf-o: "\f1c1"; 277 | @fa-var-file-photo-o: "\f1c5"; 278 | @fa-var-file-picture-o: "\f1c5"; 279 | @fa-var-file-powerpoint-o: "\f1c4"; 280 | @fa-var-file-sound-o: "\f1c7"; 281 | @fa-var-file-text: "\f15c"; 282 | @fa-var-file-text-o: "\f0f6"; 283 | @fa-var-file-video-o: "\f1c8"; 284 | @fa-var-file-word-o: "\f1c2"; 285 | @fa-var-file-zip-o: "\f1c6"; 286 | @fa-var-files-o: "\f0c5"; 287 | @fa-var-film: "\f008"; 288 | @fa-var-filter: "\f0b0"; 289 | @fa-var-fire: "\f06d"; 290 | @fa-var-fire-extinguisher: "\f134"; 291 | @fa-var-firefox: "\f269"; 292 | @fa-var-first-order: "\f2b0"; 293 | @fa-var-flag: "\f024"; 294 | @fa-var-flag-checkered: "\f11e"; 295 | @fa-var-flag-o: "\f11d"; 296 | @fa-var-flash: "\f0e7"; 297 | @fa-var-flask: "\f0c3"; 298 | @fa-var-flickr: "\f16e"; 299 | @fa-var-floppy-o: "\f0c7"; 300 | @fa-var-folder: "\f07b"; 301 | @fa-var-folder-o: "\f114"; 302 | @fa-var-folder-open: "\f07c"; 303 | @fa-var-folder-open-o: "\f115"; 304 | @fa-var-font: "\f031"; 305 | @fa-var-font-awesome: "\f2b4"; 306 | @fa-var-fonticons: "\f280"; 307 | @fa-var-fort-awesome: "\f286"; 308 | @fa-var-forumbee: "\f211"; 309 | @fa-var-forward: "\f04e"; 310 | @fa-var-foursquare: "\f180"; 311 | @fa-var-free-code-camp: "\f2c5"; 312 | @fa-var-frown-o: "\f119"; 313 | @fa-var-futbol-o: "\f1e3"; 314 | @fa-var-gamepad: "\f11b"; 315 | @fa-var-gavel: "\f0e3"; 316 | @fa-var-gbp: "\f154"; 317 | @fa-var-ge: "\f1d1"; 318 | @fa-var-gear: "\f013"; 319 | @fa-var-gears: "\f085"; 320 | @fa-var-genderless: "\f22d"; 321 | @fa-var-get-pocket: "\f265"; 322 | @fa-var-gg: "\f260"; 323 | @fa-var-gg-circle: "\f261"; 324 | @fa-var-gift: "\f06b"; 325 | @fa-var-git: "\f1d3"; 326 | @fa-var-git-square: "\f1d2"; 327 | @fa-var-github: "\f09b"; 328 | @fa-var-github-alt: "\f113"; 329 | @fa-var-github-square: "\f092"; 330 | @fa-var-gitlab: "\f296"; 331 | @fa-var-gittip: "\f184"; 332 | @fa-var-glass: "\f000"; 333 | @fa-var-glide: "\f2a5"; 334 | @fa-var-glide-g: "\f2a6"; 335 | @fa-var-globe: "\f0ac"; 336 | @fa-var-google: "\f1a0"; 337 | @fa-var-google-plus: "\f0d5"; 338 | @fa-var-google-plus-circle: "\f2b3"; 339 | @fa-var-google-plus-official: "\f2b3"; 340 | @fa-var-google-plus-square: "\f0d4"; 341 | @fa-var-google-wallet: "\f1ee"; 342 | @fa-var-graduation-cap: "\f19d"; 343 | @fa-var-gratipay: "\f184"; 344 | @fa-var-grav: "\f2d6"; 345 | @fa-var-group: "\f0c0"; 346 | @fa-var-h-square: "\f0fd"; 347 | @fa-var-hacker-news: "\f1d4"; 348 | @fa-var-hand-grab-o: "\f255"; 349 | @fa-var-hand-lizard-o: "\f258"; 350 | @fa-var-hand-o-down: "\f0a7"; 351 | @fa-var-hand-o-left: "\f0a5"; 352 | @fa-var-hand-o-right: "\f0a4"; 353 | @fa-var-hand-o-up: "\f0a6"; 354 | @fa-var-hand-paper-o: "\f256"; 355 | @fa-var-hand-peace-o: "\f25b"; 356 | @fa-var-hand-pointer-o: "\f25a"; 357 | @fa-var-hand-rock-o: "\f255"; 358 | @fa-var-hand-scissors-o: "\f257"; 359 | @fa-var-hand-spock-o: "\f259"; 360 | @fa-var-hand-stop-o: "\f256"; 361 | @fa-var-handshake-o: "\f2b5"; 362 | @fa-var-hard-of-hearing: "\f2a4"; 363 | @fa-var-hashtag: "\f292"; 364 | @fa-var-hdd-o: "\f0a0"; 365 | @fa-var-header: "\f1dc"; 366 | @fa-var-headphones: "\f025"; 367 | @fa-var-heart: "\f004"; 368 | @fa-var-heart-o: "\f08a"; 369 | @fa-var-heartbeat: "\f21e"; 370 | @fa-var-history: "\f1da"; 371 | @fa-var-home: "\f015"; 372 | @fa-var-hospital-o: "\f0f8"; 373 | @fa-var-hotel: "\f236"; 374 | @fa-var-hourglass: "\f254"; 375 | @fa-var-hourglass-1: "\f251"; 376 | @fa-var-hourglass-2: "\f252"; 377 | @fa-var-hourglass-3: "\f253"; 378 | @fa-var-hourglass-end: "\f253"; 379 | @fa-var-hourglass-half: "\f252"; 380 | @fa-var-hourglass-o: "\f250"; 381 | @fa-var-hourglass-start: "\f251"; 382 | @fa-var-houzz: "\f27c"; 383 | @fa-var-html5: "\f13b"; 384 | @fa-var-i-cursor: "\f246"; 385 | @fa-var-id-badge: "\f2c1"; 386 | @fa-var-id-card: "\f2c2"; 387 | @fa-var-id-card-o: "\f2c3"; 388 | @fa-var-ils: "\f20b"; 389 | @fa-var-image: "\f03e"; 390 | @fa-var-imdb: "\f2d8"; 391 | @fa-var-inbox: "\f01c"; 392 | @fa-var-indent: "\f03c"; 393 | @fa-var-industry: "\f275"; 394 | @fa-var-info: "\f129"; 395 | @fa-var-info-circle: "\f05a"; 396 | @fa-var-inr: "\f156"; 397 | @fa-var-instagram: "\f16d"; 398 | @fa-var-institution: "\f19c"; 399 | @fa-var-internet-explorer: "\f26b"; 400 | @fa-var-intersex: "\f224"; 401 | @fa-var-ioxhost: "\f208"; 402 | @fa-var-italic: "\f033"; 403 | @fa-var-joomla: "\f1aa"; 404 | @fa-var-jpy: "\f157"; 405 | @fa-var-jsfiddle: "\f1cc"; 406 | @fa-var-key: "\f084"; 407 | @fa-var-keyboard-o: "\f11c"; 408 | @fa-var-krw: "\f159"; 409 | @fa-var-language: "\f1ab"; 410 | @fa-var-laptop: "\f109"; 411 | @fa-var-lastfm: "\f202"; 412 | @fa-var-lastfm-square: "\f203"; 413 | @fa-var-leaf: "\f06c"; 414 | @fa-var-leanpub: "\f212"; 415 | @fa-var-legal: "\f0e3"; 416 | @fa-var-lemon-o: "\f094"; 417 | @fa-var-level-down: "\f149"; 418 | @fa-var-level-up: "\f148"; 419 | @fa-var-life-bouy: "\f1cd"; 420 | @fa-var-life-buoy: "\f1cd"; 421 | @fa-var-life-ring: "\f1cd"; 422 | @fa-var-life-saver: "\f1cd"; 423 | @fa-var-lightbulb-o: "\f0eb"; 424 | @fa-var-line-chart: "\f201"; 425 | @fa-var-link: "\f0c1"; 426 | @fa-var-linkedin: "\f0e1"; 427 | @fa-var-linkedin-square: "\f08c"; 428 | @fa-var-linode: "\f2b8"; 429 | @fa-var-linux: "\f17c"; 430 | @fa-var-list: "\f03a"; 431 | @fa-var-list-alt: "\f022"; 432 | @fa-var-list-ol: "\f0cb"; 433 | @fa-var-list-ul: "\f0ca"; 434 | @fa-var-location-arrow: "\f124"; 435 | @fa-var-lock: "\f023"; 436 | @fa-var-long-arrow-down: "\f175"; 437 | @fa-var-long-arrow-left: "\f177"; 438 | @fa-var-long-arrow-right: "\f178"; 439 | @fa-var-long-arrow-up: "\f176"; 440 | @fa-var-low-vision: "\f2a8"; 441 | @fa-var-magic: "\f0d0"; 442 | @fa-var-magnet: "\f076"; 443 | @fa-var-mail-forward: "\f064"; 444 | @fa-var-mail-reply: "\f112"; 445 | @fa-var-mail-reply-all: "\f122"; 446 | @fa-var-male: "\f183"; 447 | @fa-var-map: "\f279"; 448 | @fa-var-map-marker: "\f041"; 449 | @fa-var-map-o: "\f278"; 450 | @fa-var-map-pin: "\f276"; 451 | @fa-var-map-signs: "\f277"; 452 | @fa-var-mars: "\f222"; 453 | @fa-var-mars-double: "\f227"; 454 | @fa-var-mars-stroke: "\f229"; 455 | @fa-var-mars-stroke-h: "\f22b"; 456 | @fa-var-mars-stroke-v: "\f22a"; 457 | @fa-var-maxcdn: "\f136"; 458 | @fa-var-meanpath: "\f20c"; 459 | @fa-var-medium: "\f23a"; 460 | @fa-var-medkit: "\f0fa"; 461 | @fa-var-meetup: "\f2e0"; 462 | @fa-var-meh-o: "\f11a"; 463 | @fa-var-mercury: "\f223"; 464 | @fa-var-microchip: "\f2db"; 465 | @fa-var-microphone: "\f130"; 466 | @fa-var-microphone-slash: "\f131"; 467 | @fa-var-minus: "\f068"; 468 | @fa-var-minus-circle: "\f056"; 469 | @fa-var-minus-square: "\f146"; 470 | @fa-var-minus-square-o: "\f147"; 471 | @fa-var-mixcloud: "\f289"; 472 | @fa-var-mobile: "\f10b"; 473 | @fa-var-mobile-phone: "\f10b"; 474 | @fa-var-modx: "\f285"; 475 | @fa-var-money: "\f0d6"; 476 | @fa-var-moon-o: "\f186"; 477 | @fa-var-mortar-board: "\f19d"; 478 | @fa-var-motorcycle: "\f21c"; 479 | @fa-var-mouse-pointer: "\f245"; 480 | @fa-var-music: "\f001"; 481 | @fa-var-navicon: "\f0c9"; 482 | @fa-var-neuter: "\f22c"; 483 | @fa-var-newspaper-o: "\f1ea"; 484 | @fa-var-object-group: "\f247"; 485 | @fa-var-object-ungroup: "\f248"; 486 | @fa-var-odnoklassniki: "\f263"; 487 | @fa-var-odnoklassniki-square: "\f264"; 488 | @fa-var-opencart: "\f23d"; 489 | @fa-var-openid: "\f19b"; 490 | @fa-var-opera: "\f26a"; 491 | @fa-var-optin-monster: "\f23c"; 492 | @fa-var-outdent: "\f03b"; 493 | @fa-var-pagelines: "\f18c"; 494 | @fa-var-paint-brush: "\f1fc"; 495 | @fa-var-paper-plane: "\f1d8"; 496 | @fa-var-paper-plane-o: "\f1d9"; 497 | @fa-var-paperclip: "\f0c6"; 498 | @fa-var-paragraph: "\f1dd"; 499 | @fa-var-paste: "\f0ea"; 500 | @fa-var-pause: "\f04c"; 501 | @fa-var-pause-circle: "\f28b"; 502 | @fa-var-pause-circle-o: "\f28c"; 503 | @fa-var-paw: "\f1b0"; 504 | @fa-var-paypal: "\f1ed"; 505 | @fa-var-pencil: "\f040"; 506 | @fa-var-pencil-square: "\f14b"; 507 | @fa-var-pencil-square-o: "\f044"; 508 | @fa-var-percent: "\f295"; 509 | @fa-var-phone: "\f095"; 510 | @fa-var-phone-square: "\f098"; 511 | @fa-var-photo: "\f03e"; 512 | @fa-var-picture-o: "\f03e"; 513 | @fa-var-pie-chart: "\f200"; 514 | @fa-var-pied-piper: "\f2ae"; 515 | @fa-var-pied-piper-alt: "\f1a8"; 516 | @fa-var-pied-piper-pp: "\f1a7"; 517 | @fa-var-pinterest: "\f0d2"; 518 | @fa-var-pinterest-p: "\f231"; 519 | @fa-var-pinterest-square: "\f0d3"; 520 | @fa-var-plane: "\f072"; 521 | @fa-var-play: "\f04b"; 522 | @fa-var-play-circle: "\f144"; 523 | @fa-var-play-circle-o: "\f01d"; 524 | @fa-var-plug: "\f1e6"; 525 | @fa-var-plus: "\f067"; 526 | @fa-var-plus-circle: "\f055"; 527 | @fa-var-plus-square: "\f0fe"; 528 | @fa-var-plus-square-o: "\f196"; 529 | @fa-var-podcast: "\f2ce"; 530 | @fa-var-power-off: "\f011"; 531 | @fa-var-print: "\f02f"; 532 | @fa-var-product-hunt: "\f288"; 533 | @fa-var-puzzle-piece: "\f12e"; 534 | @fa-var-qq: "\f1d6"; 535 | @fa-var-qrcode: "\f029"; 536 | @fa-var-question: "\f128"; 537 | @fa-var-question-circle: "\f059"; 538 | @fa-var-question-circle-o: "\f29c"; 539 | @fa-var-quora: "\f2c4"; 540 | @fa-var-quote-left: "\f10d"; 541 | @fa-var-quote-right: "\f10e"; 542 | @fa-var-ra: "\f1d0"; 543 | @fa-var-random: "\f074"; 544 | @fa-var-ravelry: "\f2d9"; 545 | @fa-var-rebel: "\f1d0"; 546 | @fa-var-recycle: "\f1b8"; 547 | @fa-var-reddit: "\f1a1"; 548 | @fa-var-reddit-alien: "\f281"; 549 | @fa-var-reddit-square: "\f1a2"; 550 | @fa-var-refresh: "\f021"; 551 | @fa-var-registered: "\f25d"; 552 | @fa-var-remove: "\f00d"; 553 | @fa-var-renren: "\f18b"; 554 | @fa-var-reorder: "\f0c9"; 555 | @fa-var-repeat: "\f01e"; 556 | @fa-var-reply: "\f112"; 557 | @fa-var-reply-all: "\f122"; 558 | @fa-var-resistance: "\f1d0"; 559 | @fa-var-retweet: "\f079"; 560 | @fa-var-rmb: "\f157"; 561 | @fa-var-road: "\f018"; 562 | @fa-var-rocket: "\f135"; 563 | @fa-var-rotate-left: "\f0e2"; 564 | @fa-var-rotate-right: "\f01e"; 565 | @fa-var-rouble: "\f158"; 566 | @fa-var-rss: "\f09e"; 567 | @fa-var-rss-square: "\f143"; 568 | @fa-var-rub: "\f158"; 569 | @fa-var-ruble: "\f158"; 570 | @fa-var-rupee: "\f156"; 571 | @fa-var-s15: "\f2cd"; 572 | @fa-var-safari: "\f267"; 573 | @fa-var-save: "\f0c7"; 574 | @fa-var-scissors: "\f0c4"; 575 | @fa-var-scribd: "\f28a"; 576 | @fa-var-search: "\f002"; 577 | @fa-var-search-minus: "\f010"; 578 | @fa-var-search-plus: "\f00e"; 579 | @fa-var-sellsy: "\f213"; 580 | @fa-var-send: "\f1d8"; 581 | @fa-var-send-o: "\f1d9"; 582 | @fa-var-server: "\f233"; 583 | @fa-var-share: "\f064"; 584 | @fa-var-share-alt: "\f1e0"; 585 | @fa-var-share-alt-square: "\f1e1"; 586 | @fa-var-share-square: "\f14d"; 587 | @fa-var-share-square-o: "\f045"; 588 | @fa-var-shekel: "\f20b"; 589 | @fa-var-sheqel: "\f20b"; 590 | @fa-var-shield: "\f132"; 591 | @fa-var-ship: "\f21a"; 592 | @fa-var-shirtsinbulk: "\f214"; 593 | @fa-var-shopping-bag: "\f290"; 594 | @fa-var-shopping-basket: "\f291"; 595 | @fa-var-shopping-cart: "\f07a"; 596 | @fa-var-shower: "\f2cc"; 597 | @fa-var-sign-in: "\f090"; 598 | @fa-var-sign-language: "\f2a7"; 599 | @fa-var-sign-out: "\f08b"; 600 | @fa-var-signal: "\f012"; 601 | @fa-var-signing: "\f2a7"; 602 | @fa-var-simplybuilt: "\f215"; 603 | @fa-var-sitemap: "\f0e8"; 604 | @fa-var-skyatlas: "\f216"; 605 | @fa-var-skype: "\f17e"; 606 | @fa-var-slack: "\f198"; 607 | @fa-var-sliders: "\f1de"; 608 | @fa-var-slideshare: "\f1e7"; 609 | @fa-var-smile-o: "\f118"; 610 | @fa-var-snapchat: "\f2ab"; 611 | @fa-var-snapchat-ghost: "\f2ac"; 612 | @fa-var-snapchat-square: "\f2ad"; 613 | @fa-var-snowflake-o: "\f2dc"; 614 | @fa-var-soccer-ball-o: "\f1e3"; 615 | @fa-var-sort: "\f0dc"; 616 | @fa-var-sort-alpha-asc: "\f15d"; 617 | @fa-var-sort-alpha-desc: "\f15e"; 618 | @fa-var-sort-amount-asc: "\f160"; 619 | @fa-var-sort-amount-desc: "\f161"; 620 | @fa-var-sort-asc: "\f0de"; 621 | @fa-var-sort-desc: "\f0dd"; 622 | @fa-var-sort-down: "\f0dd"; 623 | @fa-var-sort-numeric-asc: "\f162"; 624 | @fa-var-sort-numeric-desc: "\f163"; 625 | @fa-var-sort-up: "\f0de"; 626 | @fa-var-soundcloud: "\f1be"; 627 | @fa-var-space-shuttle: "\f197"; 628 | @fa-var-spinner: "\f110"; 629 | @fa-var-spoon: "\f1b1"; 630 | @fa-var-spotify: "\f1bc"; 631 | @fa-var-square: "\f0c8"; 632 | @fa-var-square-o: "\f096"; 633 | @fa-var-stack-exchange: "\f18d"; 634 | @fa-var-stack-overflow: "\f16c"; 635 | @fa-var-star: "\f005"; 636 | @fa-var-star-half: "\f089"; 637 | @fa-var-star-half-empty: "\f123"; 638 | @fa-var-star-half-full: "\f123"; 639 | @fa-var-star-half-o: "\f123"; 640 | @fa-var-star-o: "\f006"; 641 | @fa-var-steam: "\f1b6"; 642 | @fa-var-steam-square: "\f1b7"; 643 | @fa-var-step-backward: "\f048"; 644 | @fa-var-step-forward: "\f051"; 645 | @fa-var-stethoscope: "\f0f1"; 646 | @fa-var-sticky-note: "\f249"; 647 | @fa-var-sticky-note-o: "\f24a"; 648 | @fa-var-stop: "\f04d"; 649 | @fa-var-stop-circle: "\f28d"; 650 | @fa-var-stop-circle-o: "\f28e"; 651 | @fa-var-street-view: "\f21d"; 652 | @fa-var-strikethrough: "\f0cc"; 653 | @fa-var-stumbleupon: "\f1a4"; 654 | @fa-var-stumbleupon-circle: "\f1a3"; 655 | @fa-var-subscript: "\f12c"; 656 | @fa-var-subway: "\f239"; 657 | @fa-var-suitcase: "\f0f2"; 658 | @fa-var-sun-o: "\f185"; 659 | @fa-var-superpowers: "\f2dd"; 660 | @fa-var-superscript: "\f12b"; 661 | @fa-var-support: "\f1cd"; 662 | @fa-var-table: "\f0ce"; 663 | @fa-var-tablet: "\f10a"; 664 | @fa-var-tachometer: "\f0e4"; 665 | @fa-var-tag: "\f02b"; 666 | @fa-var-tags: "\f02c"; 667 | @fa-var-tasks: "\f0ae"; 668 | @fa-var-taxi: "\f1ba"; 669 | @fa-var-telegram: "\f2c6"; 670 | @fa-var-television: "\f26c"; 671 | @fa-var-tencent-weibo: "\f1d5"; 672 | @fa-var-terminal: "\f120"; 673 | @fa-var-text-height: "\f034"; 674 | @fa-var-text-width: "\f035"; 675 | @fa-var-th: "\f00a"; 676 | @fa-var-th-large: "\f009"; 677 | @fa-var-th-list: "\f00b"; 678 | @fa-var-themeisle: "\f2b2"; 679 | @fa-var-thermometer: "\f2c7"; 680 | @fa-var-thermometer-0: "\f2cb"; 681 | @fa-var-thermometer-1: "\f2ca"; 682 | @fa-var-thermometer-2: "\f2c9"; 683 | @fa-var-thermometer-3: "\f2c8"; 684 | @fa-var-thermometer-4: "\f2c7"; 685 | @fa-var-thermometer-empty: "\f2cb"; 686 | @fa-var-thermometer-full: "\f2c7"; 687 | @fa-var-thermometer-half: "\f2c9"; 688 | @fa-var-thermometer-quarter: "\f2ca"; 689 | @fa-var-thermometer-three-quarters: "\f2c8"; 690 | @fa-var-thumb-tack: "\f08d"; 691 | @fa-var-thumbs-down: "\f165"; 692 | @fa-var-thumbs-o-down: "\f088"; 693 | @fa-var-thumbs-o-up: "\f087"; 694 | @fa-var-thumbs-up: "\f164"; 695 | @fa-var-ticket: "\f145"; 696 | @fa-var-times: "\f00d"; 697 | @fa-var-times-circle: "\f057"; 698 | @fa-var-times-circle-o: "\f05c"; 699 | @fa-var-times-rectangle: "\f2d3"; 700 | @fa-var-times-rectangle-o: "\f2d4"; 701 | @fa-var-tint: "\f043"; 702 | @fa-var-toggle-down: "\f150"; 703 | @fa-var-toggle-left: "\f191"; 704 | @fa-var-toggle-off: "\f204"; 705 | @fa-var-toggle-on: "\f205"; 706 | @fa-var-toggle-right: "\f152"; 707 | @fa-var-toggle-up: "\f151"; 708 | @fa-var-trademark: "\f25c"; 709 | @fa-var-train: "\f238"; 710 | @fa-var-transgender: "\f224"; 711 | @fa-var-transgender-alt: "\f225"; 712 | @fa-var-trash: "\f1f8"; 713 | @fa-var-trash-o: "\f014"; 714 | @fa-var-tree: "\f1bb"; 715 | @fa-var-trello: "\f181"; 716 | @fa-var-tripadvisor: "\f262"; 717 | @fa-var-trophy: "\f091"; 718 | @fa-var-truck: "\f0d1"; 719 | @fa-var-try: "\f195"; 720 | @fa-var-tty: "\f1e4"; 721 | @fa-var-tumblr: "\f173"; 722 | @fa-var-tumblr-square: "\f174"; 723 | @fa-var-turkish-lira: "\f195"; 724 | @fa-var-tv: "\f26c"; 725 | @fa-var-twitch: "\f1e8"; 726 | @fa-var-twitter: "\f099"; 727 | @fa-var-twitter-square: "\f081"; 728 | @fa-var-umbrella: "\f0e9"; 729 | @fa-var-underline: "\f0cd"; 730 | @fa-var-undo: "\f0e2"; 731 | @fa-var-universal-access: "\f29a"; 732 | @fa-var-university: "\f19c"; 733 | @fa-var-unlink: "\f127"; 734 | @fa-var-unlock: "\f09c"; 735 | @fa-var-unlock-alt: "\f13e"; 736 | @fa-var-unsorted: "\f0dc"; 737 | @fa-var-upload: "\f093"; 738 | @fa-var-usb: "\f287"; 739 | @fa-var-usd: "\f155"; 740 | @fa-var-user: "\f007"; 741 | @fa-var-user-circle: "\f2bd"; 742 | @fa-var-user-circle-o: "\f2be"; 743 | @fa-var-user-md: "\f0f0"; 744 | @fa-var-user-o: "\f2c0"; 745 | @fa-var-user-plus: "\f234"; 746 | @fa-var-user-secret: "\f21b"; 747 | @fa-var-user-times: "\f235"; 748 | @fa-var-users: "\f0c0"; 749 | @fa-var-vcard: "\f2bb"; 750 | @fa-var-vcard-o: "\f2bc"; 751 | @fa-var-venus: "\f221"; 752 | @fa-var-venus-double: "\f226"; 753 | @fa-var-venus-mars: "\f228"; 754 | @fa-var-viacoin: "\f237"; 755 | @fa-var-viadeo: "\f2a9"; 756 | @fa-var-viadeo-square: "\f2aa"; 757 | @fa-var-video-camera: "\f03d"; 758 | @fa-var-vimeo: "\f27d"; 759 | @fa-var-vimeo-square: "\f194"; 760 | @fa-var-vine: "\f1ca"; 761 | @fa-var-vk: "\f189"; 762 | @fa-var-volume-control-phone: "\f2a0"; 763 | @fa-var-volume-down: "\f027"; 764 | @fa-var-volume-off: "\f026"; 765 | @fa-var-volume-up: "\f028"; 766 | @fa-var-warning: "\f071"; 767 | @fa-var-wechat: "\f1d7"; 768 | @fa-var-weibo: "\f18a"; 769 | @fa-var-weixin: "\f1d7"; 770 | @fa-var-whatsapp: "\f232"; 771 | @fa-var-wheelchair: "\f193"; 772 | @fa-var-wheelchair-alt: "\f29b"; 773 | @fa-var-wifi: "\f1eb"; 774 | @fa-var-wikipedia-w: "\f266"; 775 | @fa-var-window-close: "\f2d3"; 776 | @fa-var-window-close-o: "\f2d4"; 777 | @fa-var-window-maximize: "\f2d0"; 778 | @fa-var-window-minimize: "\f2d1"; 779 | @fa-var-window-restore: "\f2d2"; 780 | @fa-var-windows: "\f17a"; 781 | @fa-var-won: "\f159"; 782 | @fa-var-wordpress: "\f19a"; 783 | @fa-var-wpbeginner: "\f297"; 784 | @fa-var-wpexplorer: "\f2de"; 785 | @fa-var-wpforms: "\f298"; 786 | @fa-var-wrench: "\f0ad"; 787 | @fa-var-xing: "\f168"; 788 | @fa-var-xing-square: "\f169"; 789 | @fa-var-y-combinator: "\f23b"; 790 | @fa-var-y-combinator-square: "\f1d4"; 791 | @fa-var-yahoo: "\f19e"; 792 | @fa-var-yc: "\f23b"; 793 | @fa-var-yc-square: "\f1d4"; 794 | @fa-var-yelp: "\f1e9"; 795 | @fa-var-yen: "\f157"; 796 | @fa-var-yoast: "\f2b1"; 797 | @fa-var-youtube: "\f167"; 798 | @fa-var-youtube-play: "\f16a"; 799 | @fa-var-youtube-square: "\f166"; 800 | 801 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | @mixin sr-only { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | @mixin sr-only-focusable { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | // -------------------------- 3 | 4 | $fa-font-path: "../fonts" !default; 5 | $fa-font-size-base: 14px !default; 6 | $fa-line-height-base: 1 !default; 7 | //$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly 8 | $fa-css-prefix: fa !default; 9 | $fa-version: "4.7.0" !default; 10 | $fa-border-color: #eee !default; 11 | $fa-inverse: #fff !default; 12 | $fa-li-width: (30em / 14) !default; 13 | 14 | $fa-var-500px: "\f26e"; 15 | $fa-var-address-book: "\f2b9"; 16 | $fa-var-address-book-o: "\f2ba"; 17 | $fa-var-address-card: "\f2bb"; 18 | $fa-var-address-card-o: "\f2bc"; 19 | $fa-var-adjust: "\f042"; 20 | $fa-var-adn: "\f170"; 21 | $fa-var-align-center: "\f037"; 22 | $fa-var-align-justify: "\f039"; 23 | $fa-var-align-left: "\f036"; 24 | $fa-var-align-right: "\f038"; 25 | $fa-var-amazon: "\f270"; 26 | $fa-var-ambulance: "\f0f9"; 27 | $fa-var-american-sign-language-interpreting: "\f2a3"; 28 | $fa-var-anchor: "\f13d"; 29 | $fa-var-android: "\f17b"; 30 | $fa-var-angellist: "\f209"; 31 | $fa-var-angle-double-down: "\f103"; 32 | $fa-var-angle-double-left: "\f100"; 33 | $fa-var-angle-double-right: "\f101"; 34 | $fa-var-angle-double-up: "\f102"; 35 | $fa-var-angle-down: "\f107"; 36 | $fa-var-angle-left: "\f104"; 37 | $fa-var-angle-right: "\f105"; 38 | $fa-var-angle-up: "\f106"; 39 | $fa-var-apple: "\f179"; 40 | $fa-var-archive: "\f187"; 41 | $fa-var-area-chart: "\f1fe"; 42 | $fa-var-arrow-circle-down: "\f0ab"; 43 | $fa-var-arrow-circle-left: "\f0a8"; 44 | $fa-var-arrow-circle-o-down: "\f01a"; 45 | $fa-var-arrow-circle-o-left: "\f190"; 46 | $fa-var-arrow-circle-o-right: "\f18e"; 47 | $fa-var-arrow-circle-o-up: "\f01b"; 48 | $fa-var-arrow-circle-right: "\f0a9"; 49 | $fa-var-arrow-circle-up: "\f0aa"; 50 | $fa-var-arrow-down: "\f063"; 51 | $fa-var-arrow-left: "\f060"; 52 | $fa-var-arrow-right: "\f061"; 53 | $fa-var-arrow-up: "\f062"; 54 | $fa-var-arrows: "\f047"; 55 | $fa-var-arrows-alt: "\f0b2"; 56 | $fa-var-arrows-h: "\f07e"; 57 | $fa-var-arrows-v: "\f07d"; 58 | $fa-var-asl-interpreting: "\f2a3"; 59 | $fa-var-assistive-listening-systems: "\f2a2"; 60 | $fa-var-asterisk: "\f069"; 61 | $fa-var-at: "\f1fa"; 62 | $fa-var-audio-description: "\f29e"; 63 | $fa-var-automobile: "\f1b9"; 64 | $fa-var-backward: "\f04a"; 65 | $fa-var-balance-scale: "\f24e"; 66 | $fa-var-ban: "\f05e"; 67 | $fa-var-bandcamp: "\f2d5"; 68 | $fa-var-bank: "\f19c"; 69 | $fa-var-bar-chart: "\f080"; 70 | $fa-var-bar-chart-o: "\f080"; 71 | $fa-var-barcode: "\f02a"; 72 | $fa-var-bars: "\f0c9"; 73 | $fa-var-bath: "\f2cd"; 74 | $fa-var-bathtub: "\f2cd"; 75 | $fa-var-battery: "\f240"; 76 | $fa-var-battery-0: "\f244"; 77 | $fa-var-battery-1: "\f243"; 78 | $fa-var-battery-2: "\f242"; 79 | $fa-var-battery-3: "\f241"; 80 | $fa-var-battery-4: "\f240"; 81 | $fa-var-battery-empty: "\f244"; 82 | $fa-var-battery-full: "\f240"; 83 | $fa-var-battery-half: "\f242"; 84 | $fa-var-battery-quarter: "\f243"; 85 | $fa-var-battery-three-quarters: "\f241"; 86 | $fa-var-bed: "\f236"; 87 | $fa-var-beer: "\f0fc"; 88 | $fa-var-behance: "\f1b4"; 89 | $fa-var-behance-square: "\f1b5"; 90 | $fa-var-bell: "\f0f3"; 91 | $fa-var-bell-o: "\f0a2"; 92 | $fa-var-bell-slash: "\f1f6"; 93 | $fa-var-bell-slash-o: "\f1f7"; 94 | $fa-var-bicycle: "\f206"; 95 | $fa-var-binoculars: "\f1e5"; 96 | $fa-var-birthday-cake: "\f1fd"; 97 | $fa-var-bitbucket: "\f171"; 98 | $fa-var-bitbucket-square: "\f172"; 99 | $fa-var-bitcoin: "\f15a"; 100 | $fa-var-black-tie: "\f27e"; 101 | $fa-var-blind: "\f29d"; 102 | $fa-var-bluetooth: "\f293"; 103 | $fa-var-bluetooth-b: "\f294"; 104 | $fa-var-bold: "\f032"; 105 | $fa-var-bolt: "\f0e7"; 106 | $fa-var-bomb: "\f1e2"; 107 | $fa-var-book: "\f02d"; 108 | $fa-var-bookmark: "\f02e"; 109 | $fa-var-bookmark-o: "\f097"; 110 | $fa-var-braille: "\f2a1"; 111 | $fa-var-briefcase: "\f0b1"; 112 | $fa-var-btc: "\f15a"; 113 | $fa-var-bug: "\f188"; 114 | $fa-var-building: "\f1ad"; 115 | $fa-var-building-o: "\f0f7"; 116 | $fa-var-bullhorn: "\f0a1"; 117 | $fa-var-bullseye: "\f140"; 118 | $fa-var-bus: "\f207"; 119 | $fa-var-buysellads: "\f20d"; 120 | $fa-var-cab: "\f1ba"; 121 | $fa-var-calculator: "\f1ec"; 122 | $fa-var-calendar: "\f073"; 123 | $fa-var-calendar-check-o: "\f274"; 124 | $fa-var-calendar-minus-o: "\f272"; 125 | $fa-var-calendar-o: "\f133"; 126 | $fa-var-calendar-plus-o: "\f271"; 127 | $fa-var-calendar-times-o: "\f273"; 128 | $fa-var-camera: "\f030"; 129 | $fa-var-camera-retro: "\f083"; 130 | $fa-var-car: "\f1b9"; 131 | $fa-var-caret-down: "\f0d7"; 132 | $fa-var-caret-left: "\f0d9"; 133 | $fa-var-caret-right: "\f0da"; 134 | $fa-var-caret-square-o-down: "\f150"; 135 | $fa-var-caret-square-o-left: "\f191"; 136 | $fa-var-caret-square-o-right: "\f152"; 137 | $fa-var-caret-square-o-up: "\f151"; 138 | $fa-var-caret-up: "\f0d8"; 139 | $fa-var-cart-arrow-down: "\f218"; 140 | $fa-var-cart-plus: "\f217"; 141 | $fa-var-cc: "\f20a"; 142 | $fa-var-cc-amex: "\f1f3"; 143 | $fa-var-cc-diners-club: "\f24c"; 144 | $fa-var-cc-discover: "\f1f2"; 145 | $fa-var-cc-jcb: "\f24b"; 146 | $fa-var-cc-mastercard: "\f1f1"; 147 | $fa-var-cc-paypal: "\f1f4"; 148 | $fa-var-cc-stripe: "\f1f5"; 149 | $fa-var-cc-visa: "\f1f0"; 150 | $fa-var-certificate: "\f0a3"; 151 | $fa-var-chain: "\f0c1"; 152 | $fa-var-chain-broken: "\f127"; 153 | $fa-var-check: "\f00c"; 154 | $fa-var-check-circle: "\f058"; 155 | $fa-var-check-circle-o: "\f05d"; 156 | $fa-var-check-square: "\f14a"; 157 | $fa-var-check-square-o: "\f046"; 158 | $fa-var-chevron-circle-down: "\f13a"; 159 | $fa-var-chevron-circle-left: "\f137"; 160 | $fa-var-chevron-circle-right: "\f138"; 161 | $fa-var-chevron-circle-up: "\f139"; 162 | $fa-var-chevron-down: "\f078"; 163 | $fa-var-chevron-left: "\f053"; 164 | $fa-var-chevron-right: "\f054"; 165 | $fa-var-chevron-up: "\f077"; 166 | $fa-var-child: "\f1ae"; 167 | $fa-var-chrome: "\f268"; 168 | $fa-var-circle: "\f111"; 169 | $fa-var-circle-o: "\f10c"; 170 | $fa-var-circle-o-notch: "\f1ce"; 171 | $fa-var-circle-thin: "\f1db"; 172 | $fa-var-clipboard: "\f0ea"; 173 | $fa-var-clock-o: "\f017"; 174 | $fa-var-clone: "\f24d"; 175 | $fa-var-close: "\f00d"; 176 | $fa-var-cloud: "\f0c2"; 177 | $fa-var-cloud-download: "\f0ed"; 178 | $fa-var-cloud-upload: "\f0ee"; 179 | $fa-var-cny: "\f157"; 180 | $fa-var-code: "\f121"; 181 | $fa-var-code-fork: "\f126"; 182 | $fa-var-codepen: "\f1cb"; 183 | $fa-var-codiepie: "\f284"; 184 | $fa-var-coffee: "\f0f4"; 185 | $fa-var-cog: "\f013"; 186 | $fa-var-cogs: "\f085"; 187 | $fa-var-columns: "\f0db"; 188 | $fa-var-comment: "\f075"; 189 | $fa-var-comment-o: "\f0e5"; 190 | $fa-var-commenting: "\f27a"; 191 | $fa-var-commenting-o: "\f27b"; 192 | $fa-var-comments: "\f086"; 193 | $fa-var-comments-o: "\f0e6"; 194 | $fa-var-compass: "\f14e"; 195 | $fa-var-compress: "\f066"; 196 | $fa-var-connectdevelop: "\f20e"; 197 | $fa-var-contao: "\f26d"; 198 | $fa-var-copy: "\f0c5"; 199 | $fa-var-copyright: "\f1f9"; 200 | $fa-var-creative-commons: "\f25e"; 201 | $fa-var-credit-card: "\f09d"; 202 | $fa-var-credit-card-alt: "\f283"; 203 | $fa-var-crop: "\f125"; 204 | $fa-var-crosshairs: "\f05b"; 205 | $fa-var-css3: "\f13c"; 206 | $fa-var-cube: "\f1b2"; 207 | $fa-var-cubes: "\f1b3"; 208 | $fa-var-cut: "\f0c4"; 209 | $fa-var-cutlery: "\f0f5"; 210 | $fa-var-dashboard: "\f0e4"; 211 | $fa-var-dashcube: "\f210"; 212 | $fa-var-database: "\f1c0"; 213 | $fa-var-deaf: "\f2a4"; 214 | $fa-var-deafness: "\f2a4"; 215 | $fa-var-dedent: "\f03b"; 216 | $fa-var-delicious: "\f1a5"; 217 | $fa-var-desktop: "\f108"; 218 | $fa-var-deviantart: "\f1bd"; 219 | $fa-var-diamond: "\f219"; 220 | $fa-var-digg: "\f1a6"; 221 | $fa-var-dollar: "\f155"; 222 | $fa-var-dot-circle-o: "\f192"; 223 | $fa-var-download: "\f019"; 224 | $fa-var-dribbble: "\f17d"; 225 | $fa-var-drivers-license: "\f2c2"; 226 | $fa-var-drivers-license-o: "\f2c3"; 227 | $fa-var-dropbox: "\f16b"; 228 | $fa-var-drupal: "\f1a9"; 229 | $fa-var-edge: "\f282"; 230 | $fa-var-edit: "\f044"; 231 | $fa-var-eercast: "\f2da"; 232 | $fa-var-eject: "\f052"; 233 | $fa-var-ellipsis-h: "\f141"; 234 | $fa-var-ellipsis-v: "\f142"; 235 | $fa-var-empire: "\f1d1"; 236 | $fa-var-envelope: "\f0e0"; 237 | $fa-var-envelope-o: "\f003"; 238 | $fa-var-envelope-open: "\f2b6"; 239 | $fa-var-envelope-open-o: "\f2b7"; 240 | $fa-var-envelope-square: "\f199"; 241 | $fa-var-envira: "\f299"; 242 | $fa-var-eraser: "\f12d"; 243 | $fa-var-etsy: "\f2d7"; 244 | $fa-var-eur: "\f153"; 245 | $fa-var-euro: "\f153"; 246 | $fa-var-exchange: "\f0ec"; 247 | $fa-var-exclamation: "\f12a"; 248 | $fa-var-exclamation-circle: "\f06a"; 249 | $fa-var-exclamation-triangle: "\f071"; 250 | $fa-var-expand: "\f065"; 251 | $fa-var-expeditedssl: "\f23e"; 252 | $fa-var-external-link: "\f08e"; 253 | $fa-var-external-link-square: "\f14c"; 254 | $fa-var-eye: "\f06e"; 255 | $fa-var-eye-slash: "\f070"; 256 | $fa-var-eyedropper: "\f1fb"; 257 | $fa-var-fa: "\f2b4"; 258 | $fa-var-facebook: "\f09a"; 259 | $fa-var-facebook-f: "\f09a"; 260 | $fa-var-facebook-official: "\f230"; 261 | $fa-var-facebook-square: "\f082"; 262 | $fa-var-fast-backward: "\f049"; 263 | $fa-var-fast-forward: "\f050"; 264 | $fa-var-fax: "\f1ac"; 265 | $fa-var-feed: "\f09e"; 266 | $fa-var-female: "\f182"; 267 | $fa-var-fighter-jet: "\f0fb"; 268 | $fa-var-file: "\f15b"; 269 | $fa-var-file-archive-o: "\f1c6"; 270 | $fa-var-file-audio-o: "\f1c7"; 271 | $fa-var-file-code-o: "\f1c9"; 272 | $fa-var-file-excel-o: "\f1c3"; 273 | $fa-var-file-image-o: "\f1c5"; 274 | $fa-var-file-movie-o: "\f1c8"; 275 | $fa-var-file-o: "\f016"; 276 | $fa-var-file-pdf-o: "\f1c1"; 277 | $fa-var-file-photo-o: "\f1c5"; 278 | $fa-var-file-picture-o: "\f1c5"; 279 | $fa-var-file-powerpoint-o: "\f1c4"; 280 | $fa-var-file-sound-o: "\f1c7"; 281 | $fa-var-file-text: "\f15c"; 282 | $fa-var-file-text-o: "\f0f6"; 283 | $fa-var-file-video-o: "\f1c8"; 284 | $fa-var-file-word-o: "\f1c2"; 285 | $fa-var-file-zip-o: "\f1c6"; 286 | $fa-var-files-o: "\f0c5"; 287 | $fa-var-film: "\f008"; 288 | $fa-var-filter: "\f0b0"; 289 | $fa-var-fire: "\f06d"; 290 | $fa-var-fire-extinguisher: "\f134"; 291 | $fa-var-firefox: "\f269"; 292 | $fa-var-first-order: "\f2b0"; 293 | $fa-var-flag: "\f024"; 294 | $fa-var-flag-checkered: "\f11e"; 295 | $fa-var-flag-o: "\f11d"; 296 | $fa-var-flash: "\f0e7"; 297 | $fa-var-flask: "\f0c3"; 298 | $fa-var-flickr: "\f16e"; 299 | $fa-var-floppy-o: "\f0c7"; 300 | $fa-var-folder: "\f07b"; 301 | $fa-var-folder-o: "\f114"; 302 | $fa-var-folder-open: "\f07c"; 303 | $fa-var-folder-open-o: "\f115"; 304 | $fa-var-font: "\f031"; 305 | $fa-var-font-awesome: "\f2b4"; 306 | $fa-var-fonticons: "\f280"; 307 | $fa-var-fort-awesome: "\f286"; 308 | $fa-var-forumbee: "\f211"; 309 | $fa-var-forward: "\f04e"; 310 | $fa-var-foursquare: "\f180"; 311 | $fa-var-free-code-camp: "\f2c5"; 312 | $fa-var-frown-o: "\f119"; 313 | $fa-var-futbol-o: "\f1e3"; 314 | $fa-var-gamepad: "\f11b"; 315 | $fa-var-gavel: "\f0e3"; 316 | $fa-var-gbp: "\f154"; 317 | $fa-var-ge: "\f1d1"; 318 | $fa-var-gear: "\f013"; 319 | $fa-var-gears: "\f085"; 320 | $fa-var-genderless: "\f22d"; 321 | $fa-var-get-pocket: "\f265"; 322 | $fa-var-gg: "\f260"; 323 | $fa-var-gg-circle: "\f261"; 324 | $fa-var-gift: "\f06b"; 325 | $fa-var-git: "\f1d3"; 326 | $fa-var-git-square: "\f1d2"; 327 | $fa-var-github: "\f09b"; 328 | $fa-var-github-alt: "\f113"; 329 | $fa-var-github-square: "\f092"; 330 | $fa-var-gitlab: "\f296"; 331 | $fa-var-gittip: "\f184"; 332 | $fa-var-glass: "\f000"; 333 | $fa-var-glide: "\f2a5"; 334 | $fa-var-glide-g: "\f2a6"; 335 | $fa-var-globe: "\f0ac"; 336 | $fa-var-google: "\f1a0"; 337 | $fa-var-google-plus: "\f0d5"; 338 | $fa-var-google-plus-circle: "\f2b3"; 339 | $fa-var-google-plus-official: "\f2b3"; 340 | $fa-var-google-plus-square: "\f0d4"; 341 | $fa-var-google-wallet: "\f1ee"; 342 | $fa-var-graduation-cap: "\f19d"; 343 | $fa-var-gratipay: "\f184"; 344 | $fa-var-grav: "\f2d6"; 345 | $fa-var-group: "\f0c0"; 346 | $fa-var-h-square: "\f0fd"; 347 | $fa-var-hacker-news: "\f1d4"; 348 | $fa-var-hand-grab-o: "\f255"; 349 | $fa-var-hand-lizard-o: "\f258"; 350 | $fa-var-hand-o-down: "\f0a7"; 351 | $fa-var-hand-o-left: "\f0a5"; 352 | $fa-var-hand-o-right: "\f0a4"; 353 | $fa-var-hand-o-up: "\f0a6"; 354 | $fa-var-hand-paper-o: "\f256"; 355 | $fa-var-hand-peace-o: "\f25b"; 356 | $fa-var-hand-pointer-o: "\f25a"; 357 | $fa-var-hand-rock-o: "\f255"; 358 | $fa-var-hand-scissors-o: "\f257"; 359 | $fa-var-hand-spock-o: "\f259"; 360 | $fa-var-hand-stop-o: "\f256"; 361 | $fa-var-handshake-o: "\f2b5"; 362 | $fa-var-hard-of-hearing: "\f2a4"; 363 | $fa-var-hashtag: "\f292"; 364 | $fa-var-hdd-o: "\f0a0"; 365 | $fa-var-header: "\f1dc"; 366 | $fa-var-headphones: "\f025"; 367 | $fa-var-heart: "\f004"; 368 | $fa-var-heart-o: "\f08a"; 369 | $fa-var-heartbeat: "\f21e"; 370 | $fa-var-history: "\f1da"; 371 | $fa-var-home: "\f015"; 372 | $fa-var-hospital-o: "\f0f8"; 373 | $fa-var-hotel: "\f236"; 374 | $fa-var-hourglass: "\f254"; 375 | $fa-var-hourglass-1: "\f251"; 376 | $fa-var-hourglass-2: "\f252"; 377 | $fa-var-hourglass-3: "\f253"; 378 | $fa-var-hourglass-end: "\f253"; 379 | $fa-var-hourglass-half: "\f252"; 380 | $fa-var-hourglass-o: "\f250"; 381 | $fa-var-hourglass-start: "\f251"; 382 | $fa-var-houzz: "\f27c"; 383 | $fa-var-html5: "\f13b"; 384 | $fa-var-i-cursor: "\f246"; 385 | $fa-var-id-badge: "\f2c1"; 386 | $fa-var-id-card: "\f2c2"; 387 | $fa-var-id-card-o: "\f2c3"; 388 | $fa-var-ils: "\f20b"; 389 | $fa-var-image: "\f03e"; 390 | $fa-var-imdb: "\f2d8"; 391 | $fa-var-inbox: "\f01c"; 392 | $fa-var-indent: "\f03c"; 393 | $fa-var-industry: "\f275"; 394 | $fa-var-info: "\f129"; 395 | $fa-var-info-circle: "\f05a"; 396 | $fa-var-inr: "\f156"; 397 | $fa-var-instagram: "\f16d"; 398 | $fa-var-institution: "\f19c"; 399 | $fa-var-internet-explorer: "\f26b"; 400 | $fa-var-intersex: "\f224"; 401 | $fa-var-ioxhost: "\f208"; 402 | $fa-var-italic: "\f033"; 403 | $fa-var-joomla: "\f1aa"; 404 | $fa-var-jpy: "\f157"; 405 | $fa-var-jsfiddle: "\f1cc"; 406 | $fa-var-key: "\f084"; 407 | $fa-var-keyboard-o: "\f11c"; 408 | $fa-var-krw: "\f159"; 409 | $fa-var-language: "\f1ab"; 410 | $fa-var-laptop: "\f109"; 411 | $fa-var-lastfm: "\f202"; 412 | $fa-var-lastfm-square: "\f203"; 413 | $fa-var-leaf: "\f06c"; 414 | $fa-var-leanpub: "\f212"; 415 | $fa-var-legal: "\f0e3"; 416 | $fa-var-lemon-o: "\f094"; 417 | $fa-var-level-down: "\f149"; 418 | $fa-var-level-up: "\f148"; 419 | $fa-var-life-bouy: "\f1cd"; 420 | $fa-var-life-buoy: "\f1cd"; 421 | $fa-var-life-ring: "\f1cd"; 422 | $fa-var-life-saver: "\f1cd"; 423 | $fa-var-lightbulb-o: "\f0eb"; 424 | $fa-var-line-chart: "\f201"; 425 | $fa-var-link: "\f0c1"; 426 | $fa-var-linkedin: "\f0e1"; 427 | $fa-var-linkedin-square: "\f08c"; 428 | $fa-var-linode: "\f2b8"; 429 | $fa-var-linux: "\f17c"; 430 | $fa-var-list: "\f03a"; 431 | $fa-var-list-alt: "\f022"; 432 | $fa-var-list-ol: "\f0cb"; 433 | $fa-var-list-ul: "\f0ca"; 434 | $fa-var-location-arrow: "\f124"; 435 | $fa-var-lock: "\f023"; 436 | $fa-var-long-arrow-down: "\f175"; 437 | $fa-var-long-arrow-left: "\f177"; 438 | $fa-var-long-arrow-right: "\f178"; 439 | $fa-var-long-arrow-up: "\f176"; 440 | $fa-var-low-vision: "\f2a8"; 441 | $fa-var-magic: "\f0d0"; 442 | $fa-var-magnet: "\f076"; 443 | $fa-var-mail-forward: "\f064"; 444 | $fa-var-mail-reply: "\f112"; 445 | $fa-var-mail-reply-all: "\f122"; 446 | $fa-var-male: "\f183"; 447 | $fa-var-map: "\f279"; 448 | $fa-var-map-marker: "\f041"; 449 | $fa-var-map-o: "\f278"; 450 | $fa-var-map-pin: "\f276"; 451 | $fa-var-map-signs: "\f277"; 452 | $fa-var-mars: "\f222"; 453 | $fa-var-mars-double: "\f227"; 454 | $fa-var-mars-stroke: "\f229"; 455 | $fa-var-mars-stroke-h: "\f22b"; 456 | $fa-var-mars-stroke-v: "\f22a"; 457 | $fa-var-maxcdn: "\f136"; 458 | $fa-var-meanpath: "\f20c"; 459 | $fa-var-medium: "\f23a"; 460 | $fa-var-medkit: "\f0fa"; 461 | $fa-var-meetup: "\f2e0"; 462 | $fa-var-meh-o: "\f11a"; 463 | $fa-var-mercury: "\f223"; 464 | $fa-var-microchip: "\f2db"; 465 | $fa-var-microphone: "\f130"; 466 | $fa-var-microphone-slash: "\f131"; 467 | $fa-var-minus: "\f068"; 468 | $fa-var-minus-circle: "\f056"; 469 | $fa-var-minus-square: "\f146"; 470 | $fa-var-minus-square-o: "\f147"; 471 | $fa-var-mixcloud: "\f289"; 472 | $fa-var-mobile: "\f10b"; 473 | $fa-var-mobile-phone: "\f10b"; 474 | $fa-var-modx: "\f285"; 475 | $fa-var-money: "\f0d6"; 476 | $fa-var-moon-o: "\f186"; 477 | $fa-var-mortar-board: "\f19d"; 478 | $fa-var-motorcycle: "\f21c"; 479 | $fa-var-mouse-pointer: "\f245"; 480 | $fa-var-music: "\f001"; 481 | $fa-var-navicon: "\f0c9"; 482 | $fa-var-neuter: "\f22c"; 483 | $fa-var-newspaper-o: "\f1ea"; 484 | $fa-var-object-group: "\f247"; 485 | $fa-var-object-ungroup: "\f248"; 486 | $fa-var-odnoklassniki: "\f263"; 487 | $fa-var-odnoklassniki-square: "\f264"; 488 | $fa-var-opencart: "\f23d"; 489 | $fa-var-openid: "\f19b"; 490 | $fa-var-opera: "\f26a"; 491 | $fa-var-optin-monster: "\f23c"; 492 | $fa-var-outdent: "\f03b"; 493 | $fa-var-pagelines: "\f18c"; 494 | $fa-var-paint-brush: "\f1fc"; 495 | $fa-var-paper-plane: "\f1d8"; 496 | $fa-var-paper-plane-o: "\f1d9"; 497 | $fa-var-paperclip: "\f0c6"; 498 | $fa-var-paragraph: "\f1dd"; 499 | $fa-var-paste: "\f0ea"; 500 | $fa-var-pause: "\f04c"; 501 | $fa-var-pause-circle: "\f28b"; 502 | $fa-var-pause-circle-o: "\f28c"; 503 | $fa-var-paw: "\f1b0"; 504 | $fa-var-paypal: "\f1ed"; 505 | $fa-var-pencil: "\f040"; 506 | $fa-var-pencil-square: "\f14b"; 507 | $fa-var-pencil-square-o: "\f044"; 508 | $fa-var-percent: "\f295"; 509 | $fa-var-phone: "\f095"; 510 | $fa-var-phone-square: "\f098"; 511 | $fa-var-photo: "\f03e"; 512 | $fa-var-picture-o: "\f03e"; 513 | $fa-var-pie-chart: "\f200"; 514 | $fa-var-pied-piper: "\f2ae"; 515 | $fa-var-pied-piper-alt: "\f1a8"; 516 | $fa-var-pied-piper-pp: "\f1a7"; 517 | $fa-var-pinterest: "\f0d2"; 518 | $fa-var-pinterest-p: "\f231"; 519 | $fa-var-pinterest-square: "\f0d3"; 520 | $fa-var-plane: "\f072"; 521 | $fa-var-play: "\f04b"; 522 | $fa-var-play-circle: "\f144"; 523 | $fa-var-play-circle-o: "\f01d"; 524 | $fa-var-plug: "\f1e6"; 525 | $fa-var-plus: "\f067"; 526 | $fa-var-plus-circle: "\f055"; 527 | $fa-var-plus-square: "\f0fe"; 528 | $fa-var-plus-square-o: "\f196"; 529 | $fa-var-podcast: "\f2ce"; 530 | $fa-var-power-off: "\f011"; 531 | $fa-var-print: "\f02f"; 532 | $fa-var-product-hunt: "\f288"; 533 | $fa-var-puzzle-piece: "\f12e"; 534 | $fa-var-qq: "\f1d6"; 535 | $fa-var-qrcode: "\f029"; 536 | $fa-var-question: "\f128"; 537 | $fa-var-question-circle: "\f059"; 538 | $fa-var-question-circle-o: "\f29c"; 539 | $fa-var-quora: "\f2c4"; 540 | $fa-var-quote-left: "\f10d"; 541 | $fa-var-quote-right: "\f10e"; 542 | $fa-var-ra: "\f1d0"; 543 | $fa-var-random: "\f074"; 544 | $fa-var-ravelry: "\f2d9"; 545 | $fa-var-rebel: "\f1d0"; 546 | $fa-var-recycle: "\f1b8"; 547 | $fa-var-reddit: "\f1a1"; 548 | $fa-var-reddit-alien: "\f281"; 549 | $fa-var-reddit-square: "\f1a2"; 550 | $fa-var-refresh: "\f021"; 551 | $fa-var-registered: "\f25d"; 552 | $fa-var-remove: "\f00d"; 553 | $fa-var-renren: "\f18b"; 554 | $fa-var-reorder: "\f0c9"; 555 | $fa-var-repeat: "\f01e"; 556 | $fa-var-reply: "\f112"; 557 | $fa-var-reply-all: "\f122"; 558 | $fa-var-resistance: "\f1d0"; 559 | $fa-var-retweet: "\f079"; 560 | $fa-var-rmb: "\f157"; 561 | $fa-var-road: "\f018"; 562 | $fa-var-rocket: "\f135"; 563 | $fa-var-rotate-left: "\f0e2"; 564 | $fa-var-rotate-right: "\f01e"; 565 | $fa-var-rouble: "\f158"; 566 | $fa-var-rss: "\f09e"; 567 | $fa-var-rss-square: "\f143"; 568 | $fa-var-rub: "\f158"; 569 | $fa-var-ruble: "\f158"; 570 | $fa-var-rupee: "\f156"; 571 | $fa-var-s15: "\f2cd"; 572 | $fa-var-safari: "\f267"; 573 | $fa-var-save: "\f0c7"; 574 | $fa-var-scissors: "\f0c4"; 575 | $fa-var-scribd: "\f28a"; 576 | $fa-var-search: "\f002"; 577 | $fa-var-search-minus: "\f010"; 578 | $fa-var-search-plus: "\f00e"; 579 | $fa-var-sellsy: "\f213"; 580 | $fa-var-send: "\f1d8"; 581 | $fa-var-send-o: "\f1d9"; 582 | $fa-var-server: "\f233"; 583 | $fa-var-share: "\f064"; 584 | $fa-var-share-alt: "\f1e0"; 585 | $fa-var-share-alt-square: "\f1e1"; 586 | $fa-var-share-square: "\f14d"; 587 | $fa-var-share-square-o: "\f045"; 588 | $fa-var-shekel: "\f20b"; 589 | $fa-var-sheqel: "\f20b"; 590 | $fa-var-shield: "\f132"; 591 | $fa-var-ship: "\f21a"; 592 | $fa-var-shirtsinbulk: "\f214"; 593 | $fa-var-shopping-bag: "\f290"; 594 | $fa-var-shopping-basket: "\f291"; 595 | $fa-var-shopping-cart: "\f07a"; 596 | $fa-var-shower: "\f2cc"; 597 | $fa-var-sign-in: "\f090"; 598 | $fa-var-sign-language: "\f2a7"; 599 | $fa-var-sign-out: "\f08b"; 600 | $fa-var-signal: "\f012"; 601 | $fa-var-signing: "\f2a7"; 602 | $fa-var-simplybuilt: "\f215"; 603 | $fa-var-sitemap: "\f0e8"; 604 | $fa-var-skyatlas: "\f216"; 605 | $fa-var-skype: "\f17e"; 606 | $fa-var-slack: "\f198"; 607 | $fa-var-sliders: "\f1de"; 608 | $fa-var-slideshare: "\f1e7"; 609 | $fa-var-smile-o: "\f118"; 610 | $fa-var-snapchat: "\f2ab"; 611 | $fa-var-snapchat-ghost: "\f2ac"; 612 | $fa-var-snapchat-square: "\f2ad"; 613 | $fa-var-snowflake-o: "\f2dc"; 614 | $fa-var-soccer-ball-o: "\f1e3"; 615 | $fa-var-sort: "\f0dc"; 616 | $fa-var-sort-alpha-asc: "\f15d"; 617 | $fa-var-sort-alpha-desc: "\f15e"; 618 | $fa-var-sort-amount-asc: "\f160"; 619 | $fa-var-sort-amount-desc: "\f161"; 620 | $fa-var-sort-asc: "\f0de"; 621 | $fa-var-sort-desc: "\f0dd"; 622 | $fa-var-sort-down: "\f0dd"; 623 | $fa-var-sort-numeric-asc: "\f162"; 624 | $fa-var-sort-numeric-desc: "\f163"; 625 | $fa-var-sort-up: "\f0de"; 626 | $fa-var-soundcloud: "\f1be"; 627 | $fa-var-space-shuttle: "\f197"; 628 | $fa-var-spinner: "\f110"; 629 | $fa-var-spoon: "\f1b1"; 630 | $fa-var-spotify: "\f1bc"; 631 | $fa-var-square: "\f0c8"; 632 | $fa-var-square-o: "\f096"; 633 | $fa-var-stack-exchange: "\f18d"; 634 | $fa-var-stack-overflow: "\f16c"; 635 | $fa-var-star: "\f005"; 636 | $fa-var-star-half: "\f089"; 637 | $fa-var-star-half-empty: "\f123"; 638 | $fa-var-star-half-full: "\f123"; 639 | $fa-var-star-half-o: "\f123"; 640 | $fa-var-star-o: "\f006"; 641 | $fa-var-steam: "\f1b6"; 642 | $fa-var-steam-square: "\f1b7"; 643 | $fa-var-step-backward: "\f048"; 644 | $fa-var-step-forward: "\f051"; 645 | $fa-var-stethoscope: "\f0f1"; 646 | $fa-var-sticky-note: "\f249"; 647 | $fa-var-sticky-note-o: "\f24a"; 648 | $fa-var-stop: "\f04d"; 649 | $fa-var-stop-circle: "\f28d"; 650 | $fa-var-stop-circle-o: "\f28e"; 651 | $fa-var-street-view: "\f21d"; 652 | $fa-var-strikethrough: "\f0cc"; 653 | $fa-var-stumbleupon: "\f1a4"; 654 | $fa-var-stumbleupon-circle: "\f1a3"; 655 | $fa-var-subscript: "\f12c"; 656 | $fa-var-subway: "\f239"; 657 | $fa-var-suitcase: "\f0f2"; 658 | $fa-var-sun-o: "\f185"; 659 | $fa-var-superpowers: "\f2dd"; 660 | $fa-var-superscript: "\f12b"; 661 | $fa-var-support: "\f1cd"; 662 | $fa-var-table: "\f0ce"; 663 | $fa-var-tablet: "\f10a"; 664 | $fa-var-tachometer: "\f0e4"; 665 | $fa-var-tag: "\f02b"; 666 | $fa-var-tags: "\f02c"; 667 | $fa-var-tasks: "\f0ae"; 668 | $fa-var-taxi: "\f1ba"; 669 | $fa-var-telegram: "\f2c6"; 670 | $fa-var-television: "\f26c"; 671 | $fa-var-tencent-weibo: "\f1d5"; 672 | $fa-var-terminal: "\f120"; 673 | $fa-var-text-height: "\f034"; 674 | $fa-var-text-width: "\f035"; 675 | $fa-var-th: "\f00a"; 676 | $fa-var-th-large: "\f009"; 677 | $fa-var-th-list: "\f00b"; 678 | $fa-var-themeisle: "\f2b2"; 679 | $fa-var-thermometer: "\f2c7"; 680 | $fa-var-thermometer-0: "\f2cb"; 681 | $fa-var-thermometer-1: "\f2ca"; 682 | $fa-var-thermometer-2: "\f2c9"; 683 | $fa-var-thermometer-3: "\f2c8"; 684 | $fa-var-thermometer-4: "\f2c7"; 685 | $fa-var-thermometer-empty: "\f2cb"; 686 | $fa-var-thermometer-full: "\f2c7"; 687 | $fa-var-thermometer-half: "\f2c9"; 688 | $fa-var-thermometer-quarter: "\f2ca"; 689 | $fa-var-thermometer-three-quarters: "\f2c8"; 690 | $fa-var-thumb-tack: "\f08d"; 691 | $fa-var-thumbs-down: "\f165"; 692 | $fa-var-thumbs-o-down: "\f088"; 693 | $fa-var-thumbs-o-up: "\f087"; 694 | $fa-var-thumbs-up: "\f164"; 695 | $fa-var-ticket: "\f145"; 696 | $fa-var-times: "\f00d"; 697 | $fa-var-times-circle: "\f057"; 698 | $fa-var-times-circle-o: "\f05c"; 699 | $fa-var-times-rectangle: "\f2d3"; 700 | $fa-var-times-rectangle-o: "\f2d4"; 701 | $fa-var-tint: "\f043"; 702 | $fa-var-toggle-down: "\f150"; 703 | $fa-var-toggle-left: "\f191"; 704 | $fa-var-toggle-off: "\f204"; 705 | $fa-var-toggle-on: "\f205"; 706 | $fa-var-toggle-right: "\f152"; 707 | $fa-var-toggle-up: "\f151"; 708 | $fa-var-trademark: "\f25c"; 709 | $fa-var-train: "\f238"; 710 | $fa-var-transgender: "\f224"; 711 | $fa-var-transgender-alt: "\f225"; 712 | $fa-var-trash: "\f1f8"; 713 | $fa-var-trash-o: "\f014"; 714 | $fa-var-tree: "\f1bb"; 715 | $fa-var-trello: "\f181"; 716 | $fa-var-tripadvisor: "\f262"; 717 | $fa-var-trophy: "\f091"; 718 | $fa-var-truck: "\f0d1"; 719 | $fa-var-try: "\f195"; 720 | $fa-var-tty: "\f1e4"; 721 | $fa-var-tumblr: "\f173"; 722 | $fa-var-tumblr-square: "\f174"; 723 | $fa-var-turkish-lira: "\f195"; 724 | $fa-var-tv: "\f26c"; 725 | $fa-var-twitch: "\f1e8"; 726 | $fa-var-twitter: "\f099"; 727 | $fa-var-twitter-square: "\f081"; 728 | $fa-var-umbrella: "\f0e9"; 729 | $fa-var-underline: "\f0cd"; 730 | $fa-var-undo: "\f0e2"; 731 | $fa-var-universal-access: "\f29a"; 732 | $fa-var-university: "\f19c"; 733 | $fa-var-unlink: "\f127"; 734 | $fa-var-unlock: "\f09c"; 735 | $fa-var-unlock-alt: "\f13e"; 736 | $fa-var-unsorted: "\f0dc"; 737 | $fa-var-upload: "\f093"; 738 | $fa-var-usb: "\f287"; 739 | $fa-var-usd: "\f155"; 740 | $fa-var-user: "\f007"; 741 | $fa-var-user-circle: "\f2bd"; 742 | $fa-var-user-circle-o: "\f2be"; 743 | $fa-var-user-md: "\f0f0"; 744 | $fa-var-user-o: "\f2c0"; 745 | $fa-var-user-plus: "\f234"; 746 | $fa-var-user-secret: "\f21b"; 747 | $fa-var-user-times: "\f235"; 748 | $fa-var-users: "\f0c0"; 749 | $fa-var-vcard: "\f2bb"; 750 | $fa-var-vcard-o: "\f2bc"; 751 | $fa-var-venus: "\f221"; 752 | $fa-var-venus-double: "\f226"; 753 | $fa-var-venus-mars: "\f228"; 754 | $fa-var-viacoin: "\f237"; 755 | $fa-var-viadeo: "\f2a9"; 756 | $fa-var-viadeo-square: "\f2aa"; 757 | $fa-var-video-camera: "\f03d"; 758 | $fa-var-vimeo: "\f27d"; 759 | $fa-var-vimeo-square: "\f194"; 760 | $fa-var-vine: "\f1ca"; 761 | $fa-var-vk: "\f189"; 762 | $fa-var-volume-control-phone: "\f2a0"; 763 | $fa-var-volume-down: "\f027"; 764 | $fa-var-volume-off: "\f026"; 765 | $fa-var-volume-up: "\f028"; 766 | $fa-var-warning: "\f071"; 767 | $fa-var-wechat: "\f1d7"; 768 | $fa-var-weibo: "\f18a"; 769 | $fa-var-weixin: "\f1d7"; 770 | $fa-var-whatsapp: "\f232"; 771 | $fa-var-wheelchair: "\f193"; 772 | $fa-var-wheelchair-alt: "\f29b"; 773 | $fa-var-wifi: "\f1eb"; 774 | $fa-var-wikipedia-w: "\f266"; 775 | $fa-var-window-close: "\f2d3"; 776 | $fa-var-window-close-o: "\f2d4"; 777 | $fa-var-window-maximize: "\f2d0"; 778 | $fa-var-window-minimize: "\f2d1"; 779 | $fa-var-window-restore: "\f2d2"; 780 | $fa-var-windows: "\f17a"; 781 | $fa-var-won: "\f159"; 782 | $fa-var-wordpress: "\f19a"; 783 | $fa-var-wpbeginner: "\f297"; 784 | $fa-var-wpexplorer: "\f2de"; 785 | $fa-var-wpforms: "\f298"; 786 | $fa-var-wrench: "\f0ad"; 787 | $fa-var-xing: "\f168"; 788 | $fa-var-xing-square: "\f169"; 789 | $fa-var-y-combinator: "\f23b"; 790 | $fa-var-y-combinator-square: "\f1d4"; 791 | $fa-var-yahoo: "\f19e"; 792 | $fa-var-yc: "\f23b"; 793 | $fa-var-yc-square: "\f1d4"; 794 | $fa-var-yelp: "\f1e9"; 795 | $fa-var-yen: "\f157"; 796 | $fa-var-yoast: "\f2b1"; 797 | $fa-var-youtube: "\f167"; 798 | $fa-var-youtube-play: "\f16a"; 799 | $fa-var-youtube-square: "\f166"; 800 | 801 | -------------------------------------------------------------------------------- /Flask/static/font-awesome/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /Flask/static/image/alipay-pay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delta1037/notion-export-client/93cf173b8bac81a6d793c46425a4f741d4defc8a/Flask/static/image/alipay-pay.jpg -------------------------------------------------------------------------------- /Flask/static/image/wechat-pay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delta1037/notion-export-client/93cf173b8bac81a6d793c46425a4f741d4defc8a/Flask/static/image/wechat-pay.jpg -------------------------------------------------------------------------------- /Flask/static/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | height: 100vh; 3 | } 4 | 5 | .bt_area{ 6 | width: 100vw; 7 | height: 85vh; 8 | margin-top: 15px; 9 | } 10 | 11 | .bt_left_area{ 12 | float: left; 13 | width: 50%; 14 | } 15 | 16 | .bt_right_area{ 17 | float: left; 18 | width: 45%; 19 | margin-right: 20px; 20 | } 21 | 22 | .line { 23 | width: 100%; 24 | height: 1px; 25 | border-bottom: 1px dashed #ddd; 26 | margin: 40px 0; 27 | } 28 | 29 | /*自制弹窗样式*/ 30 | .mark { 31 | position:absolute; 32 | top: 0; 33 | left: 45%; 34 | height: 6rem; 35 | line-height: 6rem; 36 | width: 20rem; 37 | text-align: center; 38 | font-size: 1.5rem; 39 | color: #3d3b4f; 40 | background: #cef5ff; 41 | border-radius: 0.5rem; 42 | } 43 | 44 | .nav-pills > li > a { 45 | border-radius: 0; 46 | } 47 | 48 | #wrapper { 49 | padding-left: 0; 50 | -webkit-transition: all 0.5s ease; 51 | -moz-transition: all 0.5s ease; 52 | -o-transition: all 0.5s ease; 53 | transition: all 0.5s ease; 54 | overflow: hidden; 55 | height: 100vh; 56 | } 57 | 58 | #wrapper.toggled { 59 | padding-left: 250px; 60 | overflow: hidden; 61 | } 62 | 63 | #sidebar-wrapper { 64 | z-index: 1000; 65 | position: absolute; 66 | left: 250px; 67 | width: 0; 68 | height: 100%; 69 | margin-left: -250px; 70 | overflow-y: auto; 71 | background: #f0fcff; 72 | -webkit-transition: all 0.5s ease; 73 | -moz-transition: all 0.5s ease; 74 | -o-transition: all 0.5s ease; 75 | transition: all 0.5s ease; 76 | } 77 | 78 | #sidebar-wrapper::-webkit-scrollbar { 79 | display: none; /* Chrome Safari */ 80 | } 81 | 82 | #wrapper.toggled #sidebar-wrapper { 83 | width: 250px; 84 | } 85 | 86 | #page-content-wrapper { 87 | position: absolute; 88 | padding: 5px; 89 | width: 100%; 90 | height: 95%; 91 | overflow-x: hidden; 92 | } 93 | 94 | #main_content { 95 | padding: 5px; 96 | width: 100%; 97 | height: 100%; 98 | } 99 | 100 | .xyz { 101 | min-width: 360px; 102 | } 103 | 104 | #wrapper.toggled #page-content-wrapper { 105 | position: relative; 106 | margin-right: 0; 107 | } 108 | 109 | .fixed-brand { 110 | width: auto; 111 | } 112 | /* Sidebar Styles */ 113 | 114 | .sidebar-nav { 115 | position: absolute; 116 | top: 0; 117 | width: 250px; 118 | padding: 0; 119 | list-style: none; 120 | margin: 2px 0 0; 121 | } 122 | 123 | .sidebar-nav li { 124 | text-indent: 15px; 125 | line-height: 40px; 126 | } 127 | 128 | .sidebar-nav li a { 129 | display: block; 130 | text-decoration: none; 131 | color: #3d3b4f; 132 | } 133 | 134 | .sidebar-nav li a:hover { 135 | text-decoration: none; 136 | color: #3d3b4f; 137 | background: #dff9ff; 138 | border-left: #46daff 2px solid; 139 | } 140 | 141 | .sidebar-nav li a:active, 142 | .sidebar-nav li a:focus { 143 | text-decoration: none; 144 | } 145 | 146 | .sidebar-nav > .sidebar-brand { 147 | height: 65px; 148 | font-size: 18px; 149 | line-height: 60px; 150 | } 151 | 152 | .sidebar-nav > .sidebar-brand a { 153 | color: #3d3b4f; 154 | } 155 | 156 | .sidebar-nav > .sidebar-brand a:hover { 157 | color: #cef5ff; 158 | background: none; 159 | } 160 | 161 | .no-margin { 162 | margin: 0; 163 | } 164 | 165 | @media (min-width: 768px) { 166 | #wrapper { 167 | padding-left: 250px; 168 | } 169 | .fixed-brand { 170 | width: 250px; 171 | } 172 | #wrapper.toggled { 173 | padding-left: 0; 174 | } 175 | #sidebar-wrapper { 176 | width: 250px; 177 | } 178 | #wrapper.toggled #sidebar-wrapper { 179 | width: 250px; 180 | } 181 | #wrapper.toggled-2 #sidebar-wrapper { 182 | width: 10px; 183 | background: #ffffff; 184 | } 185 | #wrapper.toggled-2 #sidebar-wrapper:hover { 186 | width: 250px; 187 | background: #f0fcff; 188 | } 189 | #page-content-wrapper { 190 | padding: 5px; 191 | margin: 0; 192 | position: relative; 193 | -webkit-transition: all 0.5s ease; 194 | -moz-transition: all 0.5s ease; 195 | -o-transition: all 0.5s ease; 196 | transition: all 0.5s ease; 197 | } 198 | #wrapper.toggled #page-content-wrapper { 199 | position: relative; 200 | margin-right: 0; 201 | padding-left: 250px; 202 | } 203 | #wrapper.toggled-2 #page-content-wrapper { 204 | position: relative; 205 | margin-right: 10px; 206 | margin-left: -240px; 207 | -webkit-transition: all 0.5s ease; 208 | -moz-transition: all 0.5s ease; 209 | -o-transition: all 0.5s ease; 210 | transition: all 0.5s ease; 211 | width: auto; 212 | } 213 | } 214 | -------------------------------------------------------------------------------- /Flask/static/index.js: -------------------------------------------------------------------------------- 1 | function update_stock_chart(url, form_prefix) { 2 | let data; 3 | if(form_prefix === 'a_'){ 4 | data = { 5 | "stock_time_type": $("#a_stock_time_type option:selected").val(), 6 | "form_start_date": $("#a_form_start_date").val(), 7 | "form_end_date": $("#a_form_end_date").val(), 8 | "interest_stock_code": $("#a_interest_stock_code option:selected").val(), 9 | "find_add_code": $("#a_find_add_code").val() 10 | } 11 | }else if (form_prefix === 'b_'){ 12 | data = { 13 | "stock_time_type": $("#b_stock_time_type option:selected").val(), 14 | "form_start_date": $("#b_form_start_date").val(), 15 | "form_end_date": $("#b_form_end_date").val(), 16 | "interest_stock_code": $("#b_interest_stock_code option:selected").val(), 17 | "find_add_code": $("#b_find_add_code").val() 18 | } 19 | }else{ 20 | data = { 21 | "stock_time_type": $("#bt_stock_time_type option:selected").val(), 22 | "form_start_date": $("#bt_form_start_date").val(), 23 | "form_end_date": $("#bt_form_end_date").val(), 24 | "interest_stock_code": $("#bt_interest_stock_code option:selected").val(), 25 | "find_add_code": $("#bt_find_add_code").val(), 26 | "bt_strategy": $("#bt_strategy option:selected").val(), 27 | "bt_data": $("#bt_data option:selected").val(), 28 | } 29 | } 30 | $.ajax({ 31 | type: "POST", 32 | url: url, 33 | data: JSON.stringify(data), // 将data转化为字符串 34 | contentType: 'application/json; charset=UTF-8', // 指定contentType 35 | dataType: "json", // 注意:这里是指希望服务端返回的数据类型 36 | success: function (data) { // 返回数据根据结果进行相应的处理 37 | if(data['my_chart'] === 'fail'){ 38 | alert('查找对象为空') 39 | return 40 | } 41 | // 替换标签的内容 42 | if(form_prefix === 'a_'){ 43 | // console.log("replace area a") 44 | $("#a_chart_area").html(data['my_chart']) 45 | }else if (form_prefix === 'b_'){ 46 | // console.log("replace area b") 47 | $("#b_chart_area").html(data['my_chart']) 48 | }else{ 49 | // console.log("replace area bt") 50 | $("#bt_chart_area").html(data['my_chart']) 51 | $("#bt_table").html(data['bt_table']) 52 | } 53 | console.log('success') 54 | }, 55 | error: function (XMLHttpRequest, textStatus, errorThrown) { 56 | alert(errorThrown); 57 | } 58 | }); 59 | } 60 | function update_stock_form(url, form_prefix) { 61 | let data; 62 | if(form_prefix === 'a_'){ 63 | data = { 64 | "stock_time_type": $("#a_stock_time_type option:selected").val(), 65 | "form_start_date": $("#a_form_start_date").val(), 66 | "form_end_date": $("#a_form_end_date").val(), 67 | "interest_stock_code": $("#a_interest_stock_code option:selected").val(), 68 | "find_add_code": $("#a_find_add_code").val() 69 | } 70 | }else if (form_prefix === 'b_'){ 71 | data = { 72 | "stock_time_type": $("#b_stock_time_type option:selected").val(), 73 | "form_start_date": $("#b_form_start_date").val(), 74 | "form_end_date": $("#b_form_end_date").val(), 75 | "interest_stock_code": $("#b_interest_stock_code option:selected").val(), 76 | "find_add_code": $("#b_find_add_code").val() 77 | } 78 | }else{ 79 | data = { 80 | "stock_time_type": $("#bt_stock_time_type option:selected").val(), 81 | "form_start_date": $("#bt_form_start_date").val(), 82 | "form_end_date": $("#bt_form_end_date").val(), 83 | "interest_stock_code": $("#bt_interest_stock_code option:selected").val(), 84 | "find_add_code": $("#bt_find_add_code").val() 85 | } 86 | } 87 | $.ajax({ 88 | type: "POST", 89 | url: url, 90 | data: JSON.stringify(data), // 将data转化为字符串 91 | contentType: 'application/json; charset=UTF-8', // 指定contentType 92 | dataType: "json", // 注意:这里是指希望服务端返回的数据类型 93 | success: function (data) { // 返回数据根据结果进行相应的处理 94 | if(data['form_inline'] === 'fail'){ 95 | return 96 | } 97 | console.log(form_prefix) 98 | if(form_prefix === 'a_'){ 99 | console.log("replace form a") 100 | $("#a_form_inline").html(data['form_inline']) 101 | }else if (form_prefix === 'b_'){ 102 | console.log("replace form b") 103 | $("#b_form_inline").html(data['form_inline']) 104 | }else{ 105 | console.log("replace form bt") 106 | $("#bt_form_inline").html(data['form_inline']) 107 | } 108 | 109 | console.log('success') 110 | }, 111 | error: function (XMLHttpRequest, textStatus, errorThrown) { 112 | alert(errorThrown); 113 | } 114 | }); 115 | } 116 | function repairZero(num){ 117 | if(num < 10){ 118 | num = "0" + num; 119 | } 120 | return num; 121 | } 122 | function get_time_str(date){ 123 | return date.getFullYear() + "-" + repairZero(date.getMonth()+1) + "-" + repairZero(date.getDate()) 124 | } 125 | function stock_time_type_change(form_prefix) { 126 | let date = new Date(); 127 | let now_date_str = get_time_str(date) 128 | if(form_prefix === 'b_'){ 129 | let stock_time_type = $("#b_stock_time_type option:selected").val() 130 | // console.log("set end date to ", now_date_str) 131 | $("#b_form_end_date").val(now_date_str) 132 | if (stock_time_type === 'DAY'){ 133 | $("#b_form_start_date").val(get_time_str(new Date(date.setDate(date.getDate()-400)))) 134 | }else if(stock_time_type === '30M' || stock_time_type === '15M'){ 135 | $("#b_form_start_date").val(get_time_str(new Date(date.setDate(date.getDate()-38)))) 136 | }else{ 137 | $("#b_form_start_date").val(get_time_str(new Date(date.setDate(date.getDate()-30)))) 138 | } 139 | }else if (form_prefix === 'a_'){ 140 | let stock_time_type = $("#a_stock_time_type option:selected").val() 141 | // console.log("set end date to ", now_date_str) 142 | $("#a_form_end_date").val(now_date_str) 143 | if (stock_time_type === 'DAY'){ 144 | $("#a_form_start_date").val(get_time_str(new Date(date.setDate(date.getDate()-400)))) 145 | }else if(stock_time_type === '30M' || stock_time_type === '15M'){ 146 | $("#a_form_start_date").val(get_time_str(new Date(date.setDate(date.getDate()-38)))) 147 | }else{ 148 | $("#a_form_start_date").val(get_time_str(new Date(date.setDate(date.getDate()-30)))) 149 | } 150 | }else{ 151 | let stock_time_type = $("#bt_stock_time_type option:selected").val() 152 | // console.log("set end date to ", now_date_str) 153 | $("#bt_form_end_date").val(now_date_str) 154 | if (stock_time_type === 'DAY'){ 155 | $("#bt_form_start_date").val(get_time_str(new Date(date.setDate(date.getDate()-400)))) 156 | }else if(stock_time_type === '30M' || stock_time_type === '15M'){ 157 | $("#bt_form_start_date").val(get_time_str(new Date(date.setDate(date.getDate()-38)))) 158 | }else{ 159 | $("#bt_form_start_date").val(get_time_str(new Date(date.setDate(date.getDate()-30)))) 160 | } 161 | } 162 | } -------------------------------------------------------------------------------- /Flask/templates/backup.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |
6 | 开始导出 7 |
8 | 9 | -------------------------------------------------------------------------------- /Flask/templates/bootstrap/base.html: -------------------------------------------------------------------------------- 1 | {% block doc -%} 2 | 3 | 4 | {%- block html %} 5 | 6 | {%- block head %} 7 | {% block title %}{{title|default}}{% endblock title %} 8 | 9 | {%- block metas %} 10 | 11 | {%- endblock metas %} 12 | 13 | {%- block styles %} 14 | 15 | 16 | {%- endblock styles %} 17 | {%- endblock head %} 18 | 19 | 20 | {% block body -%} 21 | {% block navbar %} 22 | {%- endblock navbar %} 23 | {% block content -%} 24 | {%- endblock content %} 25 | 26 | {% block scripts %} 27 | 28 | 29 | {%- endblock scripts %} 30 | {%- endblock body %} 31 | 32 | {%- endblock html %} 33 | 34 | {% endblock doc -%} -------------------------------------------------------------------------------- /Flask/templates/bootstrap/fixes.html: -------------------------------------------------------------------------------- 1 | {% macro ie8() %} 2 | 6 | {% endmacro %} 7 | -------------------------------------------------------------------------------- /Flask/templates/bootstrap/google.html: -------------------------------------------------------------------------------- 1 | {% macro analytics(account) -%} 2 | 13 | {% endmacro %} 14 | 15 | {% macro uanalytics(id, options='auto', domain=None) %} 16 | {# The uanalytics macro currently contains a hack to support legacy code. 17 | The old signature was ``uanalytics(id, domain)`` when domain was a required 18 | parameter that was passed on to the ga() function. 19 | 20 | To preserve old behavior, if options is not a dictionary, it is passed on 21 | unchanged. The ``domain`` parameter is added to not break calls with named 22 | parameters, it will override any other value for options. 23 | 24 | More modern code can simply pass any desired option to the analytics 25 | function as desired. 26 | #} 27 | {%- if domain != None %} 28 | {%- set options = domain %} 29 | {%- endif %} 30 | 38 | {% endmacro %} 39 | -------------------------------------------------------------------------------- /Flask/templates/bootstrap/pagination.html: -------------------------------------------------------------------------------- 1 | {% macro _arg_url_for(endpoint, base) %} 2 | {# calls url_for() with a given endpoint and **base as the parameters, 3 | additionally passing on all keyword_arguments (may overwrite existing ones) 4 | #} 5 | {%- with kargs = base.copy() -%} 6 | {%- do kargs.update(kwargs) -%} 7 | {{url_for(endpoint, **kargs)}} 8 | {%- endwith %} 9 | {%- endmacro %} 10 | 11 | {% macro render_pagination(pagination, 12 | endpoint=None, 13 | prev=('«')|safe, 14 | next=('»')|safe, 15 | size=None, 16 | ellipses='…', 17 | args={} 18 | ) 19 | -%} 20 | {% with url_args = {} %} 21 | {%- do url_args.update(request.view_args if not endpoint else {}), 22 | url_args.update(request.args if not endpoint else {}), 23 | url_args.update(args) -%} 24 | {% with endpoint = endpoint or request.endpoint %} 25 | 49 | {% endwith %} 50 | {% endwith %} 51 | {% endmacro %} 52 | -------------------------------------------------------------------------------- /Flask/templates/bootstrap/utils.html: -------------------------------------------------------------------------------- 1 | {% macro flashed_messages(messages=None, container=True, transform={ 2 | 'critical': 'danger', 3 | 'error': 'danger', 4 | 'info': 'info', 5 | 'warning': 'warning', 6 | 'debug': 'info', 7 | 'notset': 'info', 8 | 'message': 'info', 9 | }, default_category=None, dismissible=False) -%} 10 | {% with messages = messages or get_flashed_messages(with_categories=True) -%} 11 | {% if messages -%} {# don't output anything if there are no messages #} 12 | 13 | {% if container -%} 14 | 15 |
16 |
17 |
18 | {% endif -%} 19 | 20 | {% for cat, msg in messages %} 24 | {%- endfor -%} 25 | 26 | {% if container %} 27 |
28 |
29 |
30 | 31 | {% endif -%} 32 | 33 | {% endif -%} 34 | {% endwith -%} 35 | {% endmacro -%} 36 | 37 | 38 | {% macro icon(type=None, extra_classes=[]) -%} 39 | 40 | {%- endmacro %} 41 | 42 | 43 | {% macro form_button(url, content, method='post', class='btn-link') -%} 44 |
45 | {%- endmacro %} 46 | -------------------------------------------------------------------------------- /Flask/templates/bootstrap/wtf.html: -------------------------------------------------------------------------------- 1 | {% macro form_errors(form, hiddens=True) %} 2 | {%- if form.errors %} 3 | {%- for fieldname, errors in form.errors.items() %} 4 | {%- if bootstrap_is_hidden_field(form[fieldname]) and hiddens or 5 | not bootstrap_is_hidden_field(form[fieldname]) and hiddens != 'only' %} 6 | {%- for error in errors %} 7 |

{{error}}

8 | {%- endfor %} 9 | {%- endif %} 10 | {%- endfor %} 11 | {%- endif %} 12 | {%- endmacro %} 13 | 14 | {% macro _hz_form_wrap(horizontal_columns, form_type, add_group=False, required=False) %} 15 | {% if form_type == "horizontal" %} 16 | {% if add_group %}
{% endif %} 17 |
20 | {% endif %} 21 | {{caller()}} 22 | 23 | {% if form_type == "horizontal" %} 24 | {% if add_group %}
{% endif %} 25 |
26 | {% endif %} 27 | {% endmacro %} 28 | 29 | {% macro form_field(field, 30 | form_type="basic", 31 | horizontal_columns=('lg', 2, 10), 32 | button_map={}) %} 33 | 34 | {# this is a workaround hack for the more straightforward-code of just passing required=required parameter. older versions of wtforms do not have 35 | the necessary fix for required=False attributes, but will also not set the required flag in the first place. we skirt the issue using the code below #} 36 | {% if field.flags.required and not required in kwargs %} 37 | {% set kwargs = dict(required=True, **kwargs) %} 38 | {% endif %} 39 | 40 | {% if field.widget.input_type == 'checkbox' %} 41 | {% call _hz_form_wrap(horizontal_columns, form_type, True, required=required) %} 42 |
43 | 46 |
47 | {% endcall %} 48 | {%- elif field.type == 'RadioField' -%} 49 | {# note: A cleaner solution would be rendering depending on the widget, 50 | this is just a hack for now, until I can think of something better #} 51 | {% call _hz_form_wrap(horizontal_columns, form_type, True, required=required) %} 52 | {% for item in field -%} 53 |
54 | 57 |
58 | {% endfor %} 59 | {% endcall %} 60 | {%- elif field.type == 'SubmitField' -%} 61 | {# deal with jinja scoping issues? #} 62 | {% set field_kwargs = kwargs %} 63 | 64 | {# note: same issue as above - should check widget, not field type #} 65 | {% call _hz_form_wrap(horizontal_columns, form_type, True, required=required) %} 66 | {{field(class='btn btn-%s' % button_map.get(field.name, 'default'), 67 | **field_kwargs)}} 68 | {% endcall %} 69 | {%- elif field.type == 'FormField' -%} 70 | {# note: FormFields are tricky to get right and complex setups requiring 71 | these are probably beyond the scope of what this macro tries to do. 72 | the code below ensures that things don't break horribly if we run into 73 | one, but does not try too hard to get things pretty. #} 74 |
75 | {{field.label}} 76 | {%- for subfield in field %} 77 | {% if not bootstrap_is_hidden_field(subfield) -%} 78 | {{ form_field(subfield, 79 | form_type=form_type, 80 | horizontal_columns=horizontal_columns, 81 | button_map=button_map) }} 82 | {%- endif %} 83 | {%- endfor %} 84 |
85 | {% else -%} 86 |
89 | {%- if form_type == "inline" %} 90 | {{field.label(class="sr-only")|safe}} 91 | {% if field.type == 'FileField' %} 92 | {{field(**kwargs)|safe}} 93 | {% else %} 94 | {{field(class="form-control", **kwargs)|safe}} 95 | {% endif %} 96 | {% elif form_type == "horizontal" %} 97 | {{field.label(class="control-label " + ( 98 | " col-%s-%s" % horizontal_columns[0:2] 99 | ))|safe}} 100 |
101 | {% if field.type == 'FileField' %} 102 | {{field(**kwargs)|safe}} 103 | {% else %} 104 | {{field(class="form-control", **kwargs)|safe}} 105 | {% endif %} 106 |
107 | {%- if field.errors %} 108 | {%- for error in field.errors %} 109 | {% call _hz_form_wrap(horizontal_columns, form_type, required=required) %} 110 |

{{error}}

111 | {% endcall %} 112 | {%- endfor %} 113 | {%- elif field.description -%} 114 | {% call _hz_form_wrap(horizontal_columns, form_type, required=required) %} 115 |

{{field.description|safe}}

116 | {% endcall %} 117 | {%- endif %} 118 | {%- else -%} 119 | {{field.label(class="control-label")|safe}} 120 | {% if field.type == 'FileField' %} 121 | {{field(**kwargs)|safe}} 122 | {% else %} 123 | {{field(class="form-control", **kwargs)|safe}} 124 | {% endif %} 125 | 126 | {%- if field.errors %} 127 | {%- for error in field.errors %} 128 |

{{error}}

129 | {%- endfor %} 130 | {%- elif field.description -%} 131 |

{{field.description|safe}}

132 | {%- endif %} 133 | {%- endif %} 134 |
135 | {% endif %} 136 | {% endmacro %} 137 | 138 | {# valid form types are "basic", "inline" and "horizontal" #} 139 | {% macro quick_form(form, 140 | action="", 141 | method="post", 142 | extra_classes=None, 143 | role="form", 144 | form_type="basic", 145 | horizontal_columns=('lg', 2, 10), 146 | enctype=None, 147 | button_map={}, 148 | id="", 149 | novalidate=False) %} 150 | {#- 151 | action="" is what we want, from http://www.ietf.org/rfc/rfc2396.txt: 152 | 153 | 4.2. Same-document References 154 | 155 | A URI reference that does not contain a URI is a reference to the 156 | current document. In other words, an empty URI reference within a 157 | document is interpreted as a reference to the start of that document, 158 | and a reference containing only a fragment identifier is a reference 159 | to the identified fragment of that document. Traversal of such a 160 | reference should not result in an additional retrieval action. 161 | However, if the URI reference occurs in a context that is always 162 | intended to result in a new request, as in the case of HTML's FORM 163 | element, then an empty URI reference represents the base URI of the 164 | current document and should be replaced by that URI when transformed 165 | into a request. 166 | 167 | -#} 168 | {#- if any file fields are inside the form and enctype is automatic, adjust 169 | if file fields are found. could really use the equalto test of jinja2 170 | here, but latter is not available until 2.8 171 | 172 | warning: the code below is guaranteed to make you cry =( 173 | #} 174 | {%- set _enctype = [] %} 175 | {%- if enctype is none -%} 176 | {%- for field in form %} 177 | {%- if field.type == 'FileField' %} 178 | {#- for loops come with a fairly watertight scope, so this list-hack is 179 | used to be able to set values outside of it #} 180 | {%- set _ = _enctype.append('multipart/form-data') -%} 181 | {%- endif %} 182 | {%- endfor %} 183 | {%- else %} 184 | {% set _ = _enctype.append(enctype) %} 185 | {%- endif %} 186 |
200 | {{ form.hidden_tag() }} 201 | {{ form_errors(form, hiddens='only') }} 202 | 203 | {%- for field in form %} 204 | {% if not bootstrap_is_hidden_field(field) -%} 205 | {{ form_field(field, 206 | form_type=form_type, 207 | horizontal_columns=horizontal_columns, 208 | button_map=button_map) }} 209 | {%- endif %} 210 | {%- endfor %} 211 | 212 |
213 | {%- endmacro %} 214 | -------------------------------------------------------------------------------- /Flask/templates/donate.html: -------------------------------------------------------------------------------- 1 |

捐助页面

2 |

3 |
4 | 支付宝二维码 5 | 微信二维码 6 |
7 |
8 | 9 | 10 |
11 | 12 | -------------------------------------------------------------------------------- /Flask/templates/error_404.html: -------------------------------------------------------------------------------- 1 |
2 |

网页走丢啦

3 |
4 | -------------------------------------------------------------------------------- /Flask/templates/error_500.html: -------------------------------------------------------------------------------- 1 |
2 |

服务器出错啦

3 |
4 | -------------------------------------------------------------------------------- /Flask/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "bootstrap/base.html" %} 2 | {% block scripts %} 3 | 4 | 5 | 6 | {%- endblock scripts %} 7 | {%- block styles %} 8 | 9 | 10 | 11 | {%- endblock styles %} 12 | 13 | {% block head %} 14 | {{super()}} 15 | {% endblock %} 16 | 17 | {% block content %} 18 |
19 | 39 | 40 |
41 |
42 | {{ main_content | safe }} 43 |
44 |
45 |
46 | 47 | 48 | 49 | 86 | {% endblock %} -------------------------------------------------------------------------------- /Flask/templates/macro: -------------------------------------------------------------------------------- 1 | {%- macro render_chart_content(c) -%} 2 |
3 | 25 | {%- endmacro %} 26 | 27 | {%- macro render_notebook_charts(charts, libraries) -%} 28 | 47 | {%- endmacro %} 48 | 49 | {%- macro render_chart_dependencies(c) -%} 50 | {% for dep in c.dependencies %} 51 | 52 | {% endfor %} 53 | {%- endmacro %} 54 | 55 | {%- macro render_chart_css(c) -%} 56 | {% for dep in c.css_libs %} 57 | 58 | {% endfor %} 59 | {%- endmacro %} 60 | 61 | {%- macro display_tablinks(chart) -%} 62 |
63 | {% for c in chart %} 64 | 65 | {% endfor %} 66 |
67 | {%- endmacro %} 68 | 69 | {%- macro switch_tabs() -%} 70 | 93 | {%- endmacro %} 94 | 95 | {%- macro generate_tab_css() %} 96 | 127 | {%- endmacro %} 128 | 129 | {%- macro gen_components_content(chart) %} 130 | {% if chart._component_type == "table" %} 131 | 183 |
184 |

{{ chart.title_opts.title }}

185 |

{{ chart.title_opts.subtitle }}

186 | {{ chart.html_content }} 187 |
188 | {% elif chart._component_type == "image" %} 189 |
190 |

{{ chart.title_opts.title }}

191 |

{{ chart.title_opts.subtitle }}

192 | 193 |
194 | {% endif %} 195 | {%- endmacro %} 196 | -------------------------------------------------------------------------------- /Flask/templates/setting_base.html: -------------------------------------------------------------------------------- 1 |

基础设置

2 |

3 | 9 |
10 |
11 | 12 |
13 | 14 |
15 |
16 |
17 | 18 |
19 | 28 |
29 |
30 |
31 |
32 | 33 |
34 | 35 |
36 |
37 |
38 | 39 |
40 | 41 |
42 |
43 |

44 |
45 | 46 |
47 | 56 |
57 |
58 |
59 | 60 |
61 | 62 |
63 |
64 |
65 | 66 |
67 | 76 |
77 |
78 |
79 |
80 |
81 | 82 |
83 | 84 |
85 |
86 |
87 | 88 |
89 | 90 |
91 |
92 |
93 | 94 |
95 | 96 |
97 |
98 |
99 | 100 |
101 | 102 |
103 |
104 |
105 |
106 |
107 | 取消 108 | 确认 109 |
110 |
111 | 112 | -------------------------------------------------------------------------------- /Flask/templates/setting_dev.html: -------------------------------------------------------------------------------- 1 |

开发设置

2 |

3 |
4 |
5 | 6 |
7 | {% if debug == "true" %} 8 | 9 | {% else %} 10 | 11 | {% endif %} 12 |
13 | 14 |
15 | {% if use_buffer == "true" %} 16 | 17 | {% else %} 18 | 19 | {% endif %} 20 |
21 |
22 |
23 | 24 |
25 | {% if page_properties == "true" %} 26 | 27 | {% else %} 28 | 29 | {% endif %} 30 |
31 | 32 |
33 | {% if file_with_link == "true" %} 34 | 35 | {% else %} 36 | 37 | {% endif %} 38 |
39 |
40 |

41 |
42 | 43 |
44 | 45 |
46 |
47 |
48 | 49 |
50 | 51 |
52 |
53 |

54 |
55 | 56 |
57 | 66 |
67 |
68 |
69 |
70 |
71 |
72 | {% for f_type in f_types %} 73 | 74 |
75 | 76 |
77 | {% endfor %} 78 |
79 |
80 |
81 |
82 |
83 | {% for b_type in b_types %} 84 | 85 |
86 | 87 |
88 | {% endfor %} 89 |
90 |
91 |
92 |
93 |
94 | {% for d_type in d_types %} 95 | 96 |
97 | 98 |
99 | {% endfor %} 100 |
101 |

102 |
103 |
104 |
105 |
106 | 107 |
108 | 109 |
110 |
111 |
112 | 113 |
114 | 115 |
116 |
117 |
118 | 119 |
120 | 121 |
122 |
123 |
124 | 125 |
126 | 127 |
128 |
129 |
130 | 131 |
132 | 133 |
134 |
135 |

136 |
137 |
138 |
139 |
140 | 141 |
142 | 143 |
144 |
145 |
146 | 147 |
148 | 149 |
150 |
151 |
152 | 153 |
154 | 155 |
156 |
157 |
158 | 159 |
160 | 161 |
162 |
163 |
164 |
165 | 取消 166 | 确认 167 |
168 |
169 | -------------------------------------------------------------------------------- /Flask/templates/tutorial.html: -------------------------------------------------------------------------------- 1 |

教程页面

2 |

3 |
4 |
5 | Notion备份工具主页 6 | 7 |
8 |

9 |
10 | Bilibili备份工具教程 11 | 12 |
13 |
14 | Bilibili定时备份教程 15 | 16 |
17 |

18 |
19 | 客户端源代码 20 | 21 |
22 |
23 | 备份内核代码 24 | 25 |
26 |

27 |
28 | QQ交流群:917606741 29 |
30 |
31 | 60 | 83 | 84 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 delta1037 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # notion-export-client 2 | 3 | **功能:** 4 | 5 | - 将指定的notion页面和子页面备份为本地的markdown文件 6 | - 子页面递归下载 7 | - 图片下载和本地链接重定位 8 | 9 | 10 | **注意:** 11 | 12 | - **备份的内容不能恢复到Notion中** 13 | - 数据库某些高级字段不支持(可以但是没必要) 14 | - 离线目录可以自由编辑(Typora可以打开目录;Obsidian也可以打开,但是表格里的某些富文本可能无法渲染) 15 | - 数据库备份为csv格式时,使用Excel打开会乱码,百度搜索“Excel utf8乱码”解决 16 | - 备份的内容中图片和文件的命名优先级:Caption > (文件名称:图片没有解析名称) > id 17 | 18 | ------ 19 | 20 | **使用说明:** 21 | 22 | - [Notion备份工具说明页面](https://www.notion.so/delta1037/Notion-921e6b4ea44046c6935bcb2c69453196) 23 | -------------------------------------------------------------------------------- /README_en.md: -------------------------------------------------------------------------------- 1 | # notion-export-client 2 | 3 | Backup tool base on [notion-export-kernel](https://github.com/delta1037/notion-export-kernel). It use official API and integration token. 4 | 5 | ```bash 6 | pip isntall notion-dump-kernel 7 | # NOT notion-export-kernel 8 | ``` 9 | 10 | 11 | 12 | **Functions:** 13 | 14 | - convert notion page or database to markdown file(you also can choose CSV type for database) 15 | - relocate link(sub-pages, image, files) in markdown file (relocate to local url) 16 | 17 | 18 | 19 | **Attention:** 20 | 21 | - **You should know the backup file cant restore to notion. Its completely local. ** 22 | 23 | - **You should update notion-dump-kernel to the latest version and check for updates regularly** 24 | 25 | ## Config 26 | 27 | **Before you launch the app, you should know the meaning of the config.** 28 | 29 | **Fill the config**:config file name is `config.json`, which content such as: 30 | 31 | ```json 32 | { 33 | "backup_type": "multi", 34 | "auto_close": true, 35 | "single" : { 36 | "backup_token": "secret_DVp3bq1mDGUOF75mAxxxxxxxxxxxxxxxxxxx", 37 | "page_id" : "3b82xxxxxxxxxxxxxxxxxxxxxxxxxxx", 38 | "page_type" : "page", 39 | "export_child_page": true, 40 | "dump_path": "./dumped_pages", 41 | "page_parser_type": "md", 42 | "db_parser_type": "md", 43 | "db_insert_type": "content" 44 | }, 45 | "multi": { 46 | "backup_token": "secret_WRLJ9xxxxxxxxxxxxxxxxxxxx", 47 | "backup_info_token" : "secret_WRLJ9xxxxxxxxxxxxxxxxxxxx", 48 | "backup_list_id" : "3b82xxxxxxxxxxxxxxxxxxxxxxxxxxx", 49 | "backup_log_id" : "26edxxxxxxxxxxxxxxxxxxxxxxxxxxx", 50 | "backup_list_map": { 51 | "page_id": "页面ID", 52 | "page_type": "页面类型", 53 | "dump_path": "备份位置", 54 | "export_child_page": "递归备份", 55 | "page_parser_type": "页面备份类型", 56 | "db_parser_type": "数据库备份类型", 57 | "db_insert_type": "数据库嵌入类型", 58 | "dump_status": "备份" 59 | }, 60 | "backup_log_map": { 61 | "title": "时间戳", 62 | "date": "备份时间", 63 | "status": "备份状态", 64 | "log": "备注" 65 | } 66 | } 67 | } 68 | ``` 69 | 70 | > single or **multi** ? (usually multi is better. if you only have a small page, single is more simple to configure) 71 | > 72 | > 1、Official API have a limite on call speed 73 | > 74 | > 2、We usually only update a portion of the page 75 | 76 | ### Explanation: 77 | 78 | - backup_type:only backup one page(single),or backup many important child pages(multi) 79 | - auto_close: auto close when backup finish 80 | 81 | single: 82 | 83 | - backup_token:the page that you want to backup must invite this token 84 | - page_id:the id of the page that you want to backup 85 | - page_type:support page/database 86 | - export_child_page:backup sub-page or nested page(true/false) 87 | 88 | - dump_path:the path that you want to backup 89 | - page_parser_type:page parser type(md/plain:md is markdown,plain only text without format,default is markdown, it will not warn when you use a wrong value) 90 | - db_parser_type:database parser type(md/plain:md is markdown table,plain is csv,default is plain, it will not warn when you use a wrong value) 91 | 92 | multi: 93 | 94 | - dump_token:the page that you want to backup must invite this token 95 | - backup_info_token:the page of configuration and backup-log database (the template page that you duplicated) must invite this token 96 | - backup_list_id:configuration database id 97 | - backup_log_id:backup-log database id 98 | - backup_list_map:the key-value map of configuration database (you needn't edit this if you duplicated template directly and not change database properties) 99 | - backup_log_map:the key-value map of backup-log database(you needn't edit this if you duplicated template directly and not change database properties) 100 | 101 | ### Multi type NEED Configure database 102 | 103 | ![database sample](H:\GitHubRepo\notion-dump-local\README\database_args.png) 104 | 105 | [configuration template](https://delta1037.notion.site/dump-a0a1fb8c871b4672b5b20437d8a078ec) 106 | 107 | **Attention:** If you want to change the property name in database, you **must** change the key-value map of `backup_list_map` and `backup_log_map` in local config file. 108 | 109 | ## Run 110 | 111 | use pyinstaller to pack a exe for window system (or other paltform); use `py notion_backup_terminal.py` run in terminal. 112 | 113 | 114 | 115 | If you find any log in `dump.log` start with `[ISSUE]`, you can issue in github repo or email the `dump.log` to geniusrabbit@qq.com (**you should check the log file not contain your token !!!**) 116 | 117 | 118 | 119 | ## Output 120 | 121 | the file structure in the path of backup: 122 | 123 | ```powershell 124 | - child_pages/ # all child page, include database page 125 | - databases/ # all database file(markdown table or csv file, depend on your configuration), which used to link in page 126 | - files/ # all file (pdf...) and image 127 | main.md # the main page to backup 128 | ``` 129 | 130 | 131 | 132 | ## Structure 133 | 134 | - api/backup_info.py: operate backup list page (the page is the config of backup what and where to backup). It will check backup status and add backup log automately 135 | - api/notion_dump_api.py: relocate link in the page of *notion-dump-kernel* downloaded, regroup the file downloaded. 136 | - api/notion_dump.py: choose single or multi 137 | - notion_backup_terminal.py: a terminal version of backup tool 138 | - notion_backup_gui.py: a GUI version of backup tool 139 | -------------------------------------------------------------------------------- /api/backup_info.py: -------------------------------------------------------------------------------- 1 | # author: delta1037 2 | # Date: 2022/02/10 3 | # mail:geniusrabbit@qq.com 4 | 5 | import time 6 | import datetime 7 | 8 | import NotionDump 9 | from NotionDump.Notion.Notion import NotionQuery 10 | from NotionDump.Dump.database import Database 11 | from notion_client import Client 12 | 13 | 14 | class BackupInfo: 15 | def __init__(self, _backup_info_token, _backup_list_id, _backup_log_id, _backup_list_map, _backup_log_map): 16 | self.__backup_info_token = _backup_info_token 17 | self.__backup_list_id = _backup_list_id 18 | self.__backup_log_id = _backup_log_id 19 | self.__backup_list_map = _backup_list_map 20 | self.__backup_log_map = _backup_log_map 21 | # 初始化notion操作handle 22 | self.db_handle = Database(database_id=self.__backup_list_id, 23 | query_handle=NotionQuery(token=self.__backup_info_token)) 24 | self.notion = Client(auth=self.__backup_info_token) 25 | self.backup_id_list = [] 26 | 27 | def add_backup_log(self, status=False, log="备份正常"): 28 | backup_status = "失败" 29 | if status is True: 30 | backup_status = "成功" 31 | 32 | backup_title = str(int(time.time())) 33 | # 备份历史中新增一条记录 34 | backup_log = { 35 | self.__backup_log_map["title"]: { 36 | "title": [ 37 | { 38 | "type": "text", 39 | "text": { 40 | "content": backup_title 41 | } 42 | } 43 | ] 44 | }, 45 | self.__backup_log_map["date"]: { 46 | "date": { 47 | "start": datetime.datetime.now().isoformat(), 48 | "time_zone": "Asia/Shanghai" 49 | } 50 | }, 51 | self.__backup_log_map["status"]: { 52 | "select": { 53 | "name": backup_status 54 | } 55 | }, 56 | self.__backup_log_map["log"]: { 57 | "rich_text": [ 58 | { 59 | "type": "text", 60 | "text": { 61 | "content": log 62 | } 63 | } 64 | ] 65 | } 66 | } 67 | parent = { 68 | "type": "database_id", 69 | "database_id": self.__backup_log_id 70 | } 71 | self.notion.pages.create(parent=parent, properties=backup_log) 72 | 73 | def get_backup_list(self): 74 | # 获取操作列表 75 | for item_line in self.db_handle.dump_to_dic(): 76 | if item_line[self.__backup_list_map["dump_status"]] == NotionDump.MD_BOOL_TRUE: 77 | self.backup_id_list.append(item_line) 78 | return self.backup_id_list 79 | 80 | def update_backup_list(self, id_list): 81 | properties = {self.__backup_list_map["dump_status"]: {"checkbox": False}} 82 | for _id in id_list: 83 | # 更新每一个页面的备份状态 84 | self.notion.pages.update(page_id=_id, properties=properties) 85 | 86 | -------------------------------------------------------------------------------- /api/configuration.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import json 4 | from json import JSONDecodeError 5 | 6 | SEVER_ABS_PATH = os.path.dirname(sys.argv[0]) + "/" 7 | CONFIG_FILE_PATH = SEVER_ABS_PATH + "config.json" 8 | 9 | 10 | class Configuration: 11 | def __init__(self, config_path, logger=None): 12 | self.__config_path = config_path 13 | self.__logger = logger 14 | 15 | self.__config = None 16 | self.__load_config() 17 | 18 | def __log(self, str_log): 19 | if self.__logger is not None: 20 | self.__logger.log(str(str_log)) 21 | else: 22 | print(str_log) 23 | 24 | def __load_config(self): 25 | try: 26 | with open(self.__config_path, encoding="utf-8") as conf_file_handle: 27 | self.__config = json.load(conf_file_handle) 28 | except FileNotFoundError as e: 29 | self.__log("\nConfiguration file does not exist\n") 30 | self.__log(e) 31 | except JSONDecodeError as e: 32 | self.__log("\nConfiguration file is corrupted\n") 33 | self.__log(e) 34 | 35 | def _save_config(self): 36 | if self.__config is None: 37 | print("config is None") 38 | return None 39 | 40 | with open(self.__config_path, "w+", encoding="utf-8") as conf_file_handle: 41 | json.dump(self.__config, conf_file_handle, indent=4, ensure_ascii=False) 42 | 43 | def check(self): 44 | if self.__config is None: 45 | return False 46 | return True 47 | 48 | def get_key(self, key, prefix=None, default=None): 49 | if prefix is None: 50 | # print(self.__config) 51 | if key in self.__config: 52 | return self.__config.get(key) 53 | else: 54 | return default 55 | else: 56 | if prefix not in self.__config: 57 | return default 58 | if key not in self.__config.get(prefix): 59 | return default 60 | return self.__config.get(prefix).get(key) 61 | 62 | def alt_key(self, key, value, prefix=None): 63 | if self.__config is None: 64 | print("config is None") 65 | return None 66 | 67 | if prefix is not None: 68 | if prefix not in self.__config: 69 | self.__config[prefix] = {} 70 | self.__config[prefix][key] = value 71 | else: 72 | self.__config[key] = value 73 | self._save_config() 74 | -------------------------------------------------------------------------------- /api/notion_dump.py: -------------------------------------------------------------------------------- 1 | # author: delta1037 2 | # Date: 2022/05/01 3 | # mail:geniusrabbit@qq.com 4 | import os 5 | import sys 6 | 7 | 8 | from api.configuration import CONFIG_FILE_PATH, Configuration 9 | from api.notion_dump_api import NotionDumpApi, DB_INSERT_TYPE_PAGE, DB_INSERT_TYPE_LINK 10 | from api.backup_info import BackupInfo 11 | import NotionDump 12 | 13 | SEVER_ABS_PATH = os.path.dirname(sys.argv[0]) 14 | NotionDump.TMP_DIR = os.path.normpath(SEVER_ABS_PATH + "/buffer_file") + "/" 15 | NotionDump.BUFFER_FILE = os.path.normpath(NotionDump.TMP_DIR + "/notion_download_buffer.json") 16 | 17 | VERSION = "3.0.1" 18 | 19 | 20 | class NotionBackup: 21 | def __init__(self, logger=None, config=None): 22 | # 配置获取 23 | if config is None: 24 | self.config = Configuration(CONFIG_FILE_PATH, self) 25 | else: 26 | self.config = config 27 | 28 | # dump api 29 | self.dump_api = None 30 | 31 | if logger is not None: 32 | NotionDump.LOGGER = logger 33 | self.logger = NotionDump.LOGGER 34 | 35 | self.backup_root = "" 36 | 37 | def log(self, msg): 38 | if self.logger is not None: 39 | self.logger.log("[EXPORT CLIENT] " + str(msg)) 40 | else: 41 | print("[EXPORT CLIENT] " + str(msg)) 42 | 43 | def start_dump(self, force_auto=False): 44 | self.log("log write to dump.log") 45 | self.log("start backup, it may take a long time ...") 46 | 47 | if not self.config.check(): 48 | self.log("Config init failed") 49 | return 50 | 51 | # 开启DEBUG模式 52 | debug_mode = self.config.get_key("debug", None, default=False) 53 | if debug_mode is True: 54 | NotionDump.DUMP_MODE = NotionDump.DUMP_MODE_DEBUG 55 | else: 56 | NotionDump.DUMP_MODE = NotionDump.DUMP_MODE_DEFAULT 57 | # Page是否导出属性表的配置 58 | NotionDump.S_PAGE_PROPERTIES = self.config.get_key("page_properties", None, default=True) 59 | # 输出时间格式 60 | NotionDump.FORMAT_DATETIME = self.config.get_key("datetime_formate", None, default="%Y/%m/%d-%H:%M:%S") 61 | NotionDump.FORMAT_DATE = self.config.get_key("date_formate", None, default="%Y/%m/%d") 62 | # 主题格式 63 | NotionDump.S_THEME_TYPE = self.config.get_key("color_theme", None, default="default") 64 | if NotionDump.S_THEME_TYPE == "self_define": 65 | NotionDump.S_THEME_SELF_DEFINE = self.config.get_key("your_color_theme", None, default="default") 66 | if NotionDump.S_THEME_SELF_DEFINE == "default": 67 | NotionDump.S_THEME_TYPE = "default" 68 | # 是否下载所有链接文件 69 | NotionDump.FILE_WITH_LINK = self.config.get_key("file_with_link", None, default=False) 70 | # 是否启用缓存 71 | NotionDump.USE_BUFFER = self.config.get_key("use_buffer", None, default=True) 72 | 73 | self.dump_api = NotionDumpApi(debug=debug_mode, logger=self.logger) 74 | 75 | self.backup_root = self.config.get_key("backup_root_path", default="") 76 | # print(self.backup_root) 77 | if self.backup_root == "": 78 | self.backup_root = SEVER_ABS_PATH 79 | 80 | if self.config.get_key("*backup_type", None) == "single": 81 | self.start_dump_single() 82 | else: 83 | self.start_dump_multi() 84 | 85 | self.log("backup success ~ ") 86 | 87 | if not force_auto and self.config.get_key("auto_close", None) is False: 88 | # 终端停顿 89 | input() 90 | 91 | def start_dump_multi(self): 92 | self.log("server version: " + VERSION + "(m)\n") 93 | # 备份内容需要的token 94 | dump_token = self.config.get_key("*backup_token", "multi") 95 | if len(dump_token) == 0: 96 | self.log("dump_token is null") 97 | # 备份信息页面的token 98 | backup_info_token = self.config.get_key("*backup_info_token", "multi") 99 | if len(backup_info_token) == 0: 100 | self.log("backup_info_token is null") 101 | # 存储需要备份的内容的数据库id 102 | backup_list_id = self.config.get_key("*backup_list_id", "multi") 103 | if len(backup_list_id) == 0: 104 | self.log("backup_list_id is null") 105 | # 存储数据库日志记录的数据库ID 106 | backup_log_id = self.config.get_key("*backup_log_id", "multi") 107 | if len(backup_log_id) == 0: 108 | self.log("backup_log_id is null") 109 | # 两个数据库的对照表 110 | backup_list_map = self.config.get_key("backup_list_map", "multi") 111 | backup_log_map = self.config.get_key("backup_log_map", "multi") 112 | 113 | # 备份页面控制 114 | backup_handle = BackupInfo( 115 | _backup_info_token=backup_info_token, 116 | _backup_list_id=backup_list_id, 117 | _backup_log_id=backup_log_id, 118 | _backup_list_map=backup_list_map, 119 | _backup_log_map=backup_log_map 120 | ) 121 | # 获取备份列表 122 | self.log("get backup list...") 123 | backup_list = backup_handle.get_backup_list() 124 | if len(backup_list) == 0: 125 | backup_handle.add_backup_log(status=True, log="没有需要备份的内容") 126 | self.log("没有需要备份的内容") 127 | return 128 | 129 | dump_status = True 130 | dump_log = "" 131 | success_back_list = [] 132 | # 逐个解析需要备份的内容 133 | for backup in backup_list: 134 | item_id = backup["_page_id"] 135 | # 校验内容调用备份 136 | _page_id = backup[backup_list_map["page_id"]] 137 | _dump_type_str = backup[backup_list_map["page_type"]] 138 | _dump_type = NotionDump.DUMP_TYPE_PAGE 139 | if _dump_type_str == "Page": 140 | _dump_type = NotionDump.DUMP_TYPE_PAGE 141 | elif _dump_type_str == "Database": 142 | _dump_type = NotionDump.DUMP_TYPE_DB_TABLE 143 | else: 144 | self.log("unknown dump type " + _dump_type_str) 145 | if dump_log != "": 146 | dump_log += "\n" 147 | dump_log += "id:" + _page_id + " unknown dump type " + _dump_type_str 148 | continue 149 | _export_child = True 150 | _dump_path = os.path.normpath(self.backup_root + "/" + backup[backup_list_map["dump_path"]]) 151 | 152 | # 配置错误按照默认处理 153 | _page_parser_type = NotionDump.PARSER_TYPE_MD 154 | _db_parser_type = NotionDump.PARSER_TYPE_MD 155 | _db_insert_type = DB_INSERT_TYPE_PAGE 156 | _db_insert_type = DB_INSERT_TYPE_PAGE 157 | if "db_insert_type" in backup_list_map \ 158 | and backup_list_map["db_insert_type"] in backup \ 159 | and backup[backup_list_map["db_insert_type"]] == "Link": 160 | _db_insert_type = DB_INSERT_TYPE_LINK 161 | 162 | # 启动导出 163 | ret_status = self.dump_api.start_dump( 164 | token=dump_token, 165 | page_id=_page_id, 166 | dump_path=_dump_path, 167 | dump_type=_dump_type, 168 | export_child=_export_child, 169 | page_parser_type=_page_parser_type, 170 | db_parser_type=_db_parser_type, 171 | db_insert_type=_db_insert_type, 172 | ) 173 | if dump_log != "": 174 | dump_log += "\n" 175 | if ret_status: 176 | success_back_list.append(item_id) 177 | dump_log += "id:" + _page_id + " backup success " 178 | else: 179 | dump_log += "id:" + _page_id + " backup fail " 180 | dump_status = False 181 | 182 | # 更新备份列表 183 | auto_check_off = self.config.get_key("auto_check_off", "multi", default=True) 184 | if auto_check_off: 185 | backup_handle.update_backup_list(success_back_list) 186 | 187 | # 新增备份日志 188 | if dump_log != "": 189 | dump_log += "\n" 190 | if dump_status: 191 | dump_log += "备份成功" 192 | else: 193 | dump_log += "部分备份失败" 194 | self.log(dump_log) 195 | backup_handle.add_backup_log(status=dump_status, log=dump_log) 196 | 197 | def start_dump_single(self): 198 | self.log("server version: " + VERSION + "(s)\n") 199 | # 获取必要的配置 200 | _token = self.config.get_key("*backup_token", "single") 201 | _page_id = self.config.get_key("*page_id", "single") 202 | _dump_type_str = self.config.get_key("-page_type", "single") 203 | _dump_type = NotionDump.DUMP_TYPE_PAGE 204 | if _dump_type_str == "page": 205 | _dump_type = NotionDump.DUMP_TYPE_PAGE 206 | elif _dump_type_str == "database": 207 | _dump_type = NotionDump.DUMP_TYPE_DB_TABLE 208 | elif _dump_type_str == "block": 209 | _dump_type = NotionDump.DUMP_TYPE_BLOCK 210 | else: 211 | self.log("unknown type " + _dump_type_str) 212 | return 213 | _export_child = self.config.get_key("export_child_page", "single") 214 | _dump_path = os.path.normpath(self.backup_root + "/" + self.config.get_key("-dump_path", "single")) 215 | 216 | # 配置错误按照默认处理 217 | _page_parser_type = NotionDump.PARSER_TYPE_MD 218 | _db_parser_type = NotionDump.PARSER_TYPE_MD 219 | 220 | _db_insert_type = DB_INSERT_TYPE_PAGE 221 | if self.config.get_key("db_insert_type", "single") is not None and self.config.get_key("db_insert_type", "single") == "link": 222 | _db_insert_type = DB_INSERT_TYPE_LINK 223 | 224 | # 开始导出 225 | self.log("start export") 226 | self.dump_api.start_dump( 227 | token=_token, 228 | page_id=_page_id, 229 | dump_path=_dump_path, 230 | dump_type=_dump_type, 231 | export_child=_export_child, 232 | page_parser_type=_page_parser_type, 233 | db_parser_type=_db_parser_type, 234 | db_insert_type=_db_insert_type, 235 | ) 236 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "*backup_type": "multi", 3 | "single": { 4 | "*backup_token": "secret_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 5 | "*page_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 6 | "-page_type": "page", 7 | "-dump_path": "测试-功能测试2", 8 | "export_child_page": true, 9 | "page_parser_type": "md", 10 | "db_parser_type": "md", 11 | "db_insert_type": "content" 12 | }, 13 | "multi": { 14 | "*backup_token": "secret_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 15 | "*backup_info_token": "secret_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 16 | "*backup_list_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 17 | "*backup_log_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 18 | "backup_list_map": { 19 | "page_id": "页面ID", 20 | "page_type": "页面类型", 21 | "dump_path": "备份位置", 22 | "dump_status": "备份", 23 | "db_insert_type": "数据库嵌入类型" 24 | }, 25 | "backup_log_map": { 26 | "title": "时间戳", 27 | "date": "备份时间", 28 | "status": "备份状态", 29 | "log": "备注" 30 | }, 31 | "auto_check_off": true 32 | }, 33 | "use_buffer": true, 34 | "debug": false, 35 | "auto_close": true, 36 | "page_properties": true, 37 | "datetime_formate": "%Y/%m/%d-%H:%M:%S", 38 | "date_formate": "%Y/%m/%d", 39 | "file_with_link": false, 40 | "color_theme": "light", 41 | "your_color_theme": { 42 | "f_gray": "#787774", 43 | "f_brown": "#9F6B53", 44 | "f_orange": "#D9730D", 45 | "f_yellow": "#CB912F", 46 | "f_green": "#448361", 47 | "f_blue": "#337EA9", 48 | "f_purple": "#9065B0", 49 | "f_pink": "#C14C8A", 50 | "f_red": "#D44C47", 51 | "b_gray": "#F1F1EF", 52 | "b_brown": "#F4EEEE", 53 | "b_orange": "#FBECDD", 54 | "b_yellow": "#FBF3DB", 55 | "b_green": "#EDF3EC", 56 | "b_blue": "#E7F3F8", 57 | "b_purple": "#F4F0F7CC", 58 | "b_pink": "#F9EEF3CC", 59 | "b_red": "#FDEBEC", 60 | "d_light_gray": "#E3E2E080", 61 | "d_gray": "#E3E2E0", 62 | "d_brown": "#EEE0DA", 63 | "d_orange": "#FADEC9", 64 | "d_yellow": "#FDECC8", 65 | "d_green": "#DBEDDB", 66 | "d_blue": "#D3E5EF", 67 | "d_purple": "#E8DEEE", 68 | "d_pink": "#F5E0E9", 69 | "d_red": "#FFE2DD" 70 | }, 71 | "backup_root_path": "G:\\Notion备份" 72 | } -------------------------------------------------------------------------------- /img/database_args.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delta1037/notion-export-client/93cf173b8bac81a6d793c46425a4f741d4defc8a/img/database_args.png -------------------------------------------------------------------------------- /notion-dump.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delta1037/notion-export-client/93cf173b8bac81a6d793c46425a4f741d4defc8a/notion-dump.ico -------------------------------------------------------------------------------- /notion_backup_background.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python ; coding: utf-8 -*- 2 | 3 | 4 | block_cipher = None 5 | 6 | 7 | a = Analysis( 8 | ['notion_backup_terminal.py'], 9 | pathex=['api/notion_dump.py', 'api/notion_dump_api.py', 'api/backup_info.py'], 10 | binaries=[], 11 | datas=[], 12 | hiddenimports=[], 13 | hookspath=[], 14 | hooksconfig={}, 15 | runtime_hooks=[], 16 | excludes=[], 17 | win_no_prefer_redirects=False, 18 | win_private_assemblies=False, 19 | cipher=block_cipher, 20 | noarchive=False, 21 | ) 22 | pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) 23 | 24 | exe = EXE( 25 | pyz, 26 | a.scripts, 27 | a.binaries, 28 | a.zipfiles, 29 | a.datas, 30 | [], 31 | name='notion_backup_background', 32 | debug=False, 33 | bootloader_ignore_signals=False, 34 | strip=False, 35 | upx=True, 36 | upx_exclude=[], 37 | runtime_tmpdir=None, 38 | console=False, 39 | disable_windowed_traceback=False, 40 | argv_emulation=False, 41 | target_arch=None, 42 | codesign_identity=None, 43 | entitlements_file=None, 44 | icon=['notion-dump.ico'], 45 | ) 46 | -------------------------------------------------------------------------------- /notion_backup_gui.py: -------------------------------------------------------------------------------- 1 | # author: delta1037 2 | # Date: 2022/05/01 3 | # mail:geniusrabbit@qq.com 4 | # 打包代码 pyinstaller notion_backup_gui.spec 5 | import webview 6 | from Flask.app import app, bootstrap 7 | 8 | if __name__ == "__main__": 9 | window = webview.create_window( 10 | title='Notion备份程序', 11 | url=app, 12 | # confirm_close=True, # 退出时提示 13 | width=1200, 14 | height=850 15 | ) 16 | # 自定义退出提示的中文内容 17 | cn = { 18 | 'global.quitConfirmation': u'确定关闭?' 19 | } 20 | webview.start(localization=cn, gui='gtk') 21 | 22 | # 网页测试 23 | # app.run(debug=True) 24 | -------------------------------------------------------------------------------- /notion_backup_gui.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python ; coding: utf-8 -*- 2 | 3 | 4 | block_cipher = None 5 | 6 | 7 | a = Analysis( 8 | ['notion_backup_gui.py'], 9 | pathex=[ 10 | 'Flask/app.py', 11 | 'api/notion_dump.py', 12 | 'api/notion_dump_api.py', 13 | 'api/backup_info.py' 14 | ], 15 | binaries=[], 16 | datas=[ 17 | ('./Flask/static', './Flask/static/.'), 18 | ('./Flask/templates', './Flask/templates/.'), 19 | ], 20 | hiddenimports=[], 21 | hookspath=[], 22 | hooksconfig={}, 23 | runtime_hooks=[], 24 | excludes=[], 25 | win_no_prefer_redirects=False, 26 | win_private_assemblies=False, 27 | cipher=block_cipher, 28 | noarchive=False, 29 | ) 30 | pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) 31 | 32 | exe = EXE( 33 | pyz, 34 | a.scripts, 35 | [], 36 | exclude_binaries=True, 37 | name='notion_backup_gui', 38 | debug=False, 39 | bootloader_ignore_signals=False, 40 | strip=False, 41 | upx=True, 42 | console=False, 43 | disable_windowed_traceback=False, 44 | argv_emulation=False, 45 | target_arch=None, 46 | codesign_identity=None, 47 | entitlements_file=None, 48 | icon=['notion-dump.ico'], 49 | ) 50 | coll = COLLECT( 51 | exe, 52 | a.binaries, 53 | a.zipfiles, 54 | a.datas, 55 | strip=False, 56 | upx=True, 57 | upx_exclude=[], 58 | name='notion_backup_gui', 59 | ) 60 | -------------------------------------------------------------------------------- /notion_backup_terminal.py: -------------------------------------------------------------------------------- 1 | # author: delta1037 2 | # Date: 2022/05/01 3 | # mail:geniusrabbit@qq.com 4 | # 终端-打包代码 pyinstaller -F -c -i notion-dump.ico notion_backup_terminal.py -p api/notion_dump.py -p api/notion_dump_api.py -p api/backup_info.py 5 | # 终端-打包代码 pyinstaller notion_backup_terminal.spec 6 | # 后台-打包代码 pyinstaller -F -i notion-dump.ico notion_backup_terminal.py -p api/notion_dump.py -p api/notion_dump_api.py -p api/backup_info.py 7 | # 后台-打包代码 pyinstaller notion_backup_background.spec 8 | import os 9 | import sys 10 | import time 11 | 12 | from NotionDump import NotionBackupLogger 13 | 14 | from api.notion_dump import NotionBackup 15 | 16 | SEVER_ABS_PATH = os.path.dirname(sys.argv[0]) 17 | LOG_FILE = SEVER_ABS_PATH + "/dump.log" 18 | 19 | 20 | class Logger(NotionBackupLogger): 21 | def __init__(self): 22 | super().__init__() 23 | self.terminal = sys.stdout 24 | self.__log = open(LOG_FILE, "a+", encoding='utf-8') 25 | # 输出备份的时间 26 | backup_time = time.strftime('backup_time: %Y-%m-%d %H:%M:%S\n', time.localtime(time.time())) 27 | if self.terminal is not None: 28 | self.terminal.write(backup_time) 29 | self.__log.write("\n###################################################\n") 30 | self.__log.write(backup_time) 31 | self.__log.flush() 32 | 33 | def log_debug(self, log_str): 34 | self.log_info(log_str) 35 | 36 | def log_info(self, message): 37 | self.log("[EXPORT KERNEL] " + str(message)) 38 | 39 | def log(self, message): 40 | if self.terminal is not None: 41 | self.terminal.write(message + "\n") 42 | self.__log.write(message + "\n") 43 | self.__log.flush() 44 | 45 | def flush(self): 46 | pass 47 | 48 | 49 | if __name__ == '__main__': 50 | notion_back = NotionBackup(logger=Logger()) 51 | # 开始备份 52 | notion_back.start_dump() 53 | --------------------------------------------------------------------------------