├── LICENSE ├── README.md ├── config.ini ├── image ├── 8823logo.gif ├── hayabusa-arch.png ├── hayabusa.gif ├── spark-sqlite-dist.png └── spark-sqlite-para.png ├── logrotate-crontab ├── logrotate-hayabusa ├── presentation └── was │ ├── Makefile │ ├── pictures │ ├── hayabusa-arch.eps │ ├── spark-sqlite-dist2.eps │ ├── spark-sqlite-para.eps │ └── spark-sqlite-para2.eps │ ├── was.pdf │ └── was.tex ├── search_engine.py ├── store_engine.py └── webui ├── README.md ├── app.py ├── hayabusa-webui.png ├── original ├── 8823logo.gif ├── README.md ├── hayabusa.gif ├── hayabusa.html └── original-8823-ui.png ├── static ├── css │ ├── 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 │ ├── jquery-ui.css │ └── jquery.dataTables.css └── js │ ├── bootstrap.js │ ├── bootstrap.min.js │ ├── jquery-1.10.2.min.js │ ├── jquery-1.8.1.min.js │ ├── jquery.dataTables.js │ ├── jquery.dataTables.min.js │ └── npm.js └── templates ├── index.html └── index_get.html /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017-2018 Hiroshi ABE 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 | # Hayabusa 2 | Hayabusa: A Simple and Fast Full-Text Search Engine for Massive System Log Data 3 | 4 | # Concept 5 | - Pure python implement 6 | - Parallel SQLite processing engine 7 | - SQLite3 FTS(Full Text Search) 8 | - Core-scale architecture 9 | 10 | # Architecture 11 | - Design of the directory structure 12 | - By specifying a search range of time in ”the directory path + yyyy + mm + dd + hh + min.db”, the search program can select the search time systematically. 13 | ``` 14 | /targetdir/yyyy/mm/dd/hh/min.db 15 | ``` 16 | 17 | - StoreEngine 18 | - sample code 19 | ``` 20 | import os.path import sqlite3 21 | db_file = ’test.db’ log_file = ’1m.log’ 22 | 23 | if not os.path.exists(db_file): 24 | conn = sqlite3.connect(db_file) conn.execute("CREATE VIRTUAL TABLE SYSLOG USING FTS3(LOGS)"); 25 | conn.close() 26 | conn = sqlite3.connect(db_file) 27 | 28 | with open(log_file) as fh: 29 | lines = [[line] for line in fh] 30 | conn.executemany(’INSERT INTO SYSLOG VALUES ( ? )’, lines) 31 | conn.commit() 32 | ``` 33 | 34 | - SearchEngine 35 | - sample command 36 | ``` 37 | $ python search_engine.py -h 38 | usage: search_engine.py [-h] [--time TIME] [--match MATCH] [-c] [-s] [-v] 39 | 40 | optional arguments: 41 | -h, --help show this help message and exit 42 | --time TIME time explain regexp(YYYY/MM/DD/HH/MIN). eg: 2017/04/27/10/* 43 | --match MATCH matching keyword. eg: noc or 'noc Login' 44 | -e exact match 45 | -c count 46 | -s sum 47 | -v verbose 48 | 49 | $ python search_engine.py --time 2017/05/11/13/* --match 'keyword' -c 50 | ``` 51 | - Architecture image 52 | ![Hayabusa Architecture](./image/hayabusa-arch.png "hayabusa architecture image") 53 | 54 | # Search condition 55 | - case-insensitive 56 | - no distinguish uppercase or lowercase 57 | - Exact match 58 | ``` 59 | -e --match '192.168.0.1' 60 | ``` 61 | 62 | - AND 63 | ``` 64 | --match 'Hello World' 65 | ``` 66 | - OR 67 | ``` 68 | --match 'Hello OR World' 69 | ``` 70 | - NOT 71 | ``` 72 | --match 'Hello World -Wide' 73 | ``` 74 | - PHRASE 75 | ``` 76 | --match '"Hello World"' 77 | --match '\"192.168.0.1\"' <- IP address case(same as -e flag) 78 | --match '\"192.168.0.1\" src sent' <- PHRASE + AND search 79 | ``` 80 | - asterisk(*) 81 | ``` 82 | --match 'H* World' 83 | ``` 84 | - HAT 85 | ``` 86 | --match '^Hello World' 87 | ``` 88 | 89 | # Development environment 90 | - CentOS 7.3 91 | - Python 3.5.1(use anaconda packages) 92 | - SQLite3(version 3.9.2) 93 | 94 | # Dependency softwares 95 | - Python 3 96 | - SQLite3 97 | - GNU Parallel 98 | 99 | # Benchmark 100 | ## Compare with Apache Spark 101 | - Hayabusa and Spark time comparison 102 | ![](./image/spark-sqlite-para.png) 103 | 104 | - Comarison of distributes Spark environment and the stand-alone Hayabusa 105 | ![](./image/spark-sqlite-dist.png) 106 | -------------------------------------------------------------------------------- /config.ini: -------------------------------------------------------------------------------- 1 | [path] 2 | log-file : /var/log/messages.1 3 | base-dir : /var/tmp/data 4 | -------------------------------------------------------------------------------- /image/8823logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirolovesbeer/hayabusa/d6ecea2ac1d624f4a3fabbbfb5ee265cf48f4a02/image/8823logo.gif -------------------------------------------------------------------------------- /image/hayabusa-arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirolovesbeer/hayabusa/d6ecea2ac1d624f4a3fabbbfb5ee265cf48f4a02/image/hayabusa-arch.png -------------------------------------------------------------------------------- /image/hayabusa.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirolovesbeer/hayabusa/d6ecea2ac1d624f4a3fabbbfb5ee265cf48f4a02/image/hayabusa.gif -------------------------------------------------------------------------------- /image/spark-sqlite-dist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirolovesbeer/hayabusa/d6ecea2ac1d624f4a3fabbbfb5ee265cf48f4a02/image/spark-sqlite-dist.png -------------------------------------------------------------------------------- /image/spark-sqlite-para.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirolovesbeer/hayabusa/d6ecea2ac1d624f4a3fabbbfb5ee265cf48f4a02/image/spark-sqlite-para.png -------------------------------------------------------------------------------- /logrotate-crontab: -------------------------------------------------------------------------------- 1 | * * * * * root logrotate -f /etc/logrotate.d/hayabusa 2 | * * * * * root /home/XXXXXXX/anaconda3/bin/python /home/XXXXX/work/hayabusa/store_engine.py 3 | -------------------------------------------------------------------------------- /logrotate-hayabusa: -------------------------------------------------------------------------------- 1 | /var/log/messages 2 | { 3 | rotate 60 4 | missingok 5 | ifempty 6 | sharedscripts 7 | postrotate 8 | /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true 9 | endscript 10 | } 11 | -------------------------------------------------------------------------------- /presentation/was/Makefile: -------------------------------------------------------------------------------- 1 | .SUFFIXES: .tex .dvi .aux .log .toc .lof .lot .pdf .ps 2 | F=was 3 | TEX=platex 4 | 5 | all: pdf 6 | 7 | pdf: dvi 8 | dvipdfmx $F.dvi 9 | 10 | dvi: 11 | extractbb pictures/*.pdf 12 | extractbb pictures/*.png 13 | platex $F.tex 14 | platex $F.tex 15 | 16 | clean: 17 | rm -f *~ *.{dvi,aux,lof,toc,lot,log,pdf,ps} 18 | -------------------------------------------------------------------------------- /presentation/was/pictures/spark-sqlite-dist2.eps: -------------------------------------------------------------------------------- 1 | %!PS-Adobe-3.0 EPSF-3.0 2 | %%BoundingBox: -5 198 595 588 3 | %%HiResBoundingBox: -4.907 198.888 594.707 587.490 4 | %%Title: spark-sqlite-dist.eps 5 | %%Creator: matplotlib version 1.4.3, http://matplotlib.org/ 6 | %%CreationDate: Thu Apr 6 12:45:08 2017 7 | %%Orientation: portrait 8 | %%EndComments 9 | %%BeginProlog 10 | /mpldict 8 dict def 11 | mpldict begin 12 | /m { moveto } bind def 13 | /l { lineto } bind def 14 | /r { rlineto } bind def 15 | /c { curveto } bind def 16 | /cl { closepath } bind def 17 | /box { 18 | m 19 | 1 index 0 r 20 | 0 exch r 21 | neg 0 r 22 | cl 23 | } bind def 24 | /clipbox { 25 | box 26 | clip 27 | newpath 28 | } bind def 29 | %!PS-Adobe-3.0 Resource-Font 30 | %%Title: Bitstream Vera Sans 31 | %%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. 32 | %%Creator: Converted from TrueType to type 3 by PPR 33 | 25 dict begin 34 | /_d{bind def}bind def 35 | /_m{moveto}_d 36 | /_l{lineto}_d 37 | /_cl{closepath eofill}_d 38 | /_c{curveto}_d 39 | /_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d 40 | /_e{exec}_d 41 | /FontName /BitstreamVeraSans-Roman def 42 | /PaintType 0 def 43 | /FontMatrix[.001 0 0 .001 0 0]def 44 | /FontBBox[-183 -236 1287 928]def 45 | /FontType 3 def 46 | /Encoding [ /space /quotedbl /parenleft /parenright /zero /one /two /three /four /five /six /H /N /S /a /b /c /d /e /f /i /k /l /m /n /o /p /r /s /t /u /w /y ] def 47 | /FontInfo 10 dict dup begin 48 | /FamilyName (Bitstream Vera Sans) def 49 | /FullName (Bitstream Vera Sans) def 50 | /Notice (Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc.) def 51 | /Weight (Roman) def 52 | /Version (Release 1.10) def 53 | /ItalicAngle 0.0 def 54 | /isFixedPitch false def 55 | /UnderlinePosition -213 def 56 | /UnderlineThickness 143 def 57 | end readonly def 58 | /CharStrings 33 dict dup begin 59 | /space{318 0 0 0 0 0 _sc 60 | }_d 61 | /quotedbl{460 0 96 458 364 729 _sc 62 | 179 729 _m 63 | 179 458 _l 64 | 96 458 _l 65 | 96 729 _l 66 | 179 729 _l 67 | 364 729 _m 68 | 364 458 _l 69 | 281 458 _l 70 | 281 729 _l 71 | 364 729 _l 72 | _cl}_d 73 | /parenleft{390 0 86 -131 310 759 _sc 74 | 310 759 _m 75 | 266 683 234 609 213 536 _c 76 | 191 463 181 389 181 314 _c 77 | 181 238 191 164 213 91 _c 78 | 234 17 266 -56 310 -131 _c 79 | 232 -131 _l 80 | 183 -54 146 20 122 94 _c 81 | 98 168 86 241 86 314 _c 82 | 86 386 98 459 122 533 _c 83 | 146 607 182 682 232 759 _c 84 | 310 759 _l 85 | _cl}_d 86 | /parenright{390 0 80 -131 304 759 _sc 87 | 80 759 _m 88 | 158 759 _l 89 | 206 682 243 607 267 533 _c 90 | 291 459 304 386 304 314 _c 91 | 304 241 291 168 267 94 _c 92 | 243 20 206 -54 158 -131 _c 93 | 80 -131 _l 94 | 123 -56 155 17 177 91 _c 95 | 198 164 209 238 209 314 _c 96 | 209 389 198 463 177 536 _c 97 | 155 609 123 683 80 759 _c 98 | _cl}_d 99 | /zero{636 0 66 -13 570 742 _sc 100 | 318 664 _m 101 | 267 664 229 639 203 589 _c 102 | 177 539 165 464 165 364 _c 103 | 165 264 177 189 203 139 _c 104 | 229 89 267 64 318 64 _c 105 | 369 64 407 89 433 139 _c 106 | 458 189 471 264 471 364 _c 107 | 471 464 458 539 433 589 _c 108 | 407 639 369 664 318 664 _c 109 | 318 742 _m 110 | 399 742 461 709 505 645 _c 111 | 548 580 570 486 570 364 _c 112 | 570 241 548 147 505 83 _c 113 | 461 19 399 -13 318 -13 _c 114 | 236 -13 173 19 130 83 _c 115 | 87 147 66 241 66 364 _c 116 | 66 486 87 580 130 645 _c 117 | 173 709 236 742 318 742 _c 118 | _cl}_d 119 | /one{636 0 110 0 544 729 _sc 120 | 124 83 _m 121 | 285 83 _l 122 | 285 639 _l 123 | 110 604 _l 124 | 110 694 _l 125 | 284 729 _l 126 | 383 729 _l 127 | 383 83 _l 128 | 544 83 _l 129 | 544 0 _l 130 | 124 0 _l 131 | 124 83 _l 132 | _cl}_d 133 | /two{{636 0 73 0 536 742 _sc 134 | 192 83 _m 135 | 536 83 _l 136 | 536 0 _l 137 | 73 0 _l 138 | 73 83 _l 139 | 110 121 161 173 226 239 _c 140 | 290 304 331 346 348 365 _c 141 | 380 400 402 430 414 455 _c 142 | 426 479 433 504 433 528 _c 143 | 433 566 419 598 392 622 _c 144 | 365 646 330 659 286 659 _c 145 | 255 659 222 653 188 643 _c 146 | 154 632 117 616 78 594 _c 147 | 78 694 _l 148 | 118 710 155 722 189 730 _c 149 | 223 738 255 742 284 742 _c 150 | }_e{359 742 419 723 464 685 _c 151 | 509 647 532 597 532 534 _c 152 | 532 504 526 475 515 449 _c 153 | 504 422 484 390 454 354 _c 154 | 446 344 420 317 376 272 _c 155 | 332 227 271 164 192 83 _c 156 | _cl}_e}_d 157 | /three{{636 0 76 -13 556 742 _sc 158 | 406 393 _m 159 | 453 383 490 362 516 330 _c 160 | 542 298 556 258 556 212 _c 161 | 556 140 531 84 482 45 _c 162 | 432 6 362 -13 271 -13 _c 163 | 240 -13 208 -10 176 -4 _c 164 | 144 1 110 10 76 22 _c 165 | 76 117 _l 166 | 103 101 133 89 166 81 _c 167 | 198 73 232 69 268 69 _c 168 | 330 69 377 81 409 105 _c 169 | 441 129 458 165 458 212 _c 170 | 458 254 443 288 413 312 _c 171 | 383 336 341 349 287 349 _c 172 | }_e{202 349 _l 173 | 202 430 _l 174 | 291 430 _l 175 | 339 430 376 439 402 459 _c 176 | 428 478 441 506 441 543 _c 177 | 441 580 427 609 401 629 _c 178 | 374 649 336 659 287 659 _c 179 | 260 659 231 656 200 650 _c 180 | 169 644 135 635 98 623 _c 181 | 98 711 _l 182 | 135 721 170 729 203 734 _c 183 | 235 739 266 742 296 742 _c 184 | 370 742 429 725 473 691 _c 185 | 517 657 539 611 539 553 _c 186 | 539 513 527 479 504 451 _c 187 | 481 423 448 403 406 393 _c 188 | _cl}_e}_d 189 | /four{636 0 49 0 580 729 _sc 190 | 378 643 _m 191 | 129 254 _l 192 | 378 254 _l 193 | 378 643 _l 194 | 352 729 _m 195 | 476 729 _l 196 | 476 254 _l 197 | 580 254 _l 198 | 580 172 _l 199 | 476 172 _l 200 | 476 0 _l 201 | 378 0 _l 202 | 378 172 _l 203 | 49 172 _l 204 | 49 267 _l 205 | 352 729 _l 206 | _cl}_d 207 | /five{{636 0 77 -13 549 729 _sc 208 | 108 729 _m 209 | 495 729 _l 210 | 495 646 _l 211 | 198 646 _l 212 | 198 467 _l 213 | 212 472 227 476 241 478 _c 214 | 255 480 270 482 284 482 _c 215 | 365 482 429 459 477 415 _c 216 | 525 370 549 310 549 234 _c 217 | 549 155 524 94 475 51 _c 218 | 426 8 357 -13 269 -13 _c 219 | 238 -13 207 -10 175 -6 _c 220 | 143 -1 111 6 77 17 _c 221 | 77 116 _l 222 | 106 100 136 88 168 80 _c 223 | 199 72 232 69 267 69 _c 224 | }_e{323 69 368 83 401 113 _c 225 | 433 143 450 183 450 234 _c 226 | 450 284 433 324 401 354 _c 227 | 368 384 323 399 267 399 _c 228 | 241 399 214 396 188 390 _c 229 | 162 384 135 375 108 363 _c 230 | 108 729 _l 231 | _cl}_e}_d 232 | /six{{636 0 70 -13 573 742 _sc 233 | 330 404 _m 234 | 286 404 251 388 225 358 _c 235 | 199 328 186 286 186 234 _c 236 | 186 181 199 139 225 109 _c 237 | 251 79 286 64 330 64 _c 238 | 374 64 409 79 435 109 _c 239 | 461 139 474 181 474 234 _c 240 | 474 286 461 328 435 358 _c 241 | 409 388 374 404 330 404 _c 242 | 526 713 _m 243 | 526 623 _l 244 | 501 635 476 644 451 650 _c 245 | 425 656 400 659 376 659 _c 246 | 310 659 260 637 226 593 _c 247 | }_e{192 549 172 482 168 394 _c 248 | 187 422 211 444 240 459 _c 249 | 269 474 301 482 336 482 _c 250 | 409 482 467 459 509 415 _c 251 | 551 371 573 310 573 234 _c 252 | 573 159 550 99 506 54 _c 253 | 462 9 403 -13 330 -13 _c 254 | 246 -13 181 19 137 83 _c 255 | 92 147 70 241 70 364 _c 256 | 70 479 97 571 152 639 _c 257 | 206 707 280 742 372 742 _c 258 | 396 742 421 739 447 735 _c 259 | 472 730 498 723 526 713 _c 260 | _cl}_e}_d 261 | /H{752 0 98 0 654 729 _sc 262 | 98 729 _m 263 | 197 729 _l 264 | 197 430 _l 265 | 555 430 _l 266 | 555 729 _l 267 | 654 729 _l 268 | 654 0 _l 269 | 555 0 _l 270 | 555 347 _l 271 | 197 347 _l 272 | 197 0 _l 273 | 98 0 _l 274 | 98 729 _l 275 | _cl}_d 276 | /N{748 0 98 0 650 729 _sc 277 | 98 729 _m 278 | 231 729 _l 279 | 554 119 _l 280 | 554 729 _l 281 | 650 729 _l 282 | 650 0 _l 283 | 517 0 _l 284 | 194 610 _l 285 | 194 0 _l 286 | 98 0 _l 287 | 98 729 _l 288 | _cl}_d 289 | /S{{635 0 66 -13 579 742 _sc 290 | 535 705 _m 291 | 535 609 _l 292 | 497 627 462 640 429 649 _c 293 | 395 657 363 662 333 662 _c 294 | 279 662 237 651 208 631 _c 295 | 179 610 165 580 165 542 _c 296 | 165 510 174 485 194 469 _c 297 | 213 452 250 439 304 429 _c 298 | 364 417 _l 299 | 437 403 491 378 526 343 _c 300 | 561 307 579 260 579 201 _c 301 | 579 130 555 77 508 41 _c 302 | 460 5 391 -13 300 -13 _c 303 | 265 -13 228 -9 189 -2 _c 304 | }_e{150 5 110 16 69 32 _c 305 | 69 134 _l 306 | 109 111 148 94 186 83 _c 307 | 224 71 262 66 300 66 _c 308 | 356 66 399 77 430 99 _c 309 | 460 121 476 152 476 194 _c 310 | 476 230 465 258 443 278 _c 311 | 421 298 385 313 335 323 _c 312 | 275 335 _l 313 | 201 349 148 372 115 404 _c 314 | 82 435 66 478 66 534 _c 315 | 66 598 88 649 134 686 _c 316 | 179 723 242 742 322 742 _c 317 | 356 742 390 739 426 733 _c 318 | 461 727 497 717 535 705 _c 319 | }_e{_cl}_e}_d 320 | /a{{613 0 60 -13 522 560 _sc 321 | 343 275 _m 322 | 270 275 220 266 192 250 _c 323 | 164 233 150 205 150 165 _c 324 | 150 133 160 107 181 89 _c 325 | 202 70 231 61 267 61 _c 326 | 317 61 357 78 387 114 _c 327 | 417 149 432 196 432 255 _c 328 | 432 275 _l 329 | 343 275 _l 330 | 522 312 _m 331 | 522 0 _l 332 | 432 0 _l 333 | 432 83 _l 334 | 411 49 385 25 355 10 _c 335 | 325 -5 287 -13 243 -13 _c 336 | 187 -13 142 2 109 33 _c 337 | 76 64 60 106 60 159 _c 338 | }_e{60 220 80 266 122 298 _c 339 | 163 329 224 345 306 345 _c 340 | 432 345 _l 341 | 432 354 _l 342 | 432 395 418 427 391 450 _c 343 | 364 472 326 484 277 484 _c 344 | 245 484 215 480 185 472 _c 345 | 155 464 127 453 100 439 _c 346 | 100 522 _l 347 | 132 534 164 544 195 550 _c 348 | 226 556 256 560 286 560 _c 349 | 365 560 424 539 463 498 _c 350 | 502 457 522 395 522 312 _c 351 | _cl}_e}_d 352 | /b{{635 0 91 -13 580 760 _sc 353 | 487 273 _m 354 | 487 339 473 390 446 428 _c 355 | 418 466 381 485 334 485 _c 356 | 286 485 249 466 222 428 _c 357 | 194 390 181 339 181 273 _c 358 | 181 207 194 155 222 117 _c 359 | 249 79 286 61 334 61 _c 360 | 381 61 418 79 446 117 _c 361 | 473 155 487 207 487 273 _c 362 | 181 464 _m 363 | 199 496 223 520 252 536 _c 364 | 281 552 316 560 356 560 _c 365 | 422 560 476 533 518 481 _c 366 | 559 428 580 359 580 273 _c 367 | }_e{580 187 559 117 518 65 _c 368 | 476 13 422 -13 356 -13 _c 369 | 316 -13 281 -5 252 10 _c 370 | 223 25 199 49 181 82 _c 371 | 181 0 _l 372 | 91 0 _l 373 | 91 760 _l 374 | 181 760 _l 375 | 181 464 _l 376 | _cl}_e}_d 377 | /c{{550 0 55 -13 488 560 _sc 378 | 488 526 _m 379 | 488 442 _l 380 | 462 456 437 466 411 473 _c 381 | 385 480 360 484 334 484 _c 382 | 276 484 230 465 198 428 _c 383 | 166 391 150 339 150 273 _c 384 | 150 206 166 154 198 117 _c 385 | 230 80 276 62 334 62 _c 386 | 360 62 385 65 411 72 _c 387 | 437 79 462 90 488 104 _c 388 | 488 21 _l 389 | 462 9 436 0 410 -5 _c 390 | 383 -10 354 -13 324 -13 _c 391 | 242 -13 176 12 128 64 _c 392 | }_e{79 115 55 185 55 273 _c 393 | 55 362 79 432 128 483 _c 394 | 177 534 244 560 330 560 _c 395 | 358 560 385 557 411 551 _c 396 | 437 545 463 537 488 526 _c 397 | _cl}_e}_d 398 | /d{{635 0 55 -13 544 760 _sc 399 | 454 464 _m 400 | 454 760 _l 401 | 544 760 _l 402 | 544 0 _l 403 | 454 0 _l 404 | 454 82 _l 405 | 435 49 411 25 382 10 _c 406 | 353 -5 319 -13 279 -13 _c 407 | 213 -13 159 13 117 65 _c 408 | 75 117 55 187 55 273 _c 409 | 55 359 75 428 117 481 _c 410 | 159 533 213 560 279 560 _c 411 | 319 560 353 552 382 536 _c 412 | 411 520 435 496 454 464 _c 413 | 148 273 _m 414 | 148 207 161 155 188 117 _c 415 | 215 79 253 61 301 61 _c 416 | }_e{348 61 385 79 413 117 _c 417 | 440 155 454 207 454 273 _c 418 | 454 339 440 390 413 428 _c 419 | 385 466 348 485 301 485 _c 420 | 253 485 215 466 188 428 _c 421 | 161 390 148 339 148 273 _c 422 | _cl}_e}_d 423 | /e{{615 0 55 -13 562 560 _sc 424 | 562 296 _m 425 | 562 252 _l 426 | 149 252 _l 427 | 153 190 171 142 205 110 _c 428 | 238 78 284 62 344 62 _c 429 | 378 62 412 66 444 74 _c 430 | 476 82 509 95 541 113 _c 431 | 541 28 _l 432 | 509 14 476 3 442 -3 _c 433 | 408 -9 373 -13 339 -13 _c 434 | 251 -13 182 12 131 62 _c 435 | 80 112 55 181 55 268 _c 436 | 55 357 79 428 127 481 _c 437 | 175 533 241 560 323 560 _c 438 | 397 560 455 536 498 489 _c 439 | }_e{540 441 562 377 562 296 _c 440 | 472 322 _m 441 | 471 371 457 410 431 440 _c 442 | 404 469 368 484 324 484 _c 443 | 274 484 234 469 204 441 _c 444 | 174 413 156 373 152 322 _c 445 | 472 322 _l 446 | _cl}_e}_d 447 | /f{352 0 23 0 371 760 _sc 448 | 371 760 _m 449 | 371 685 _l 450 | 285 685 _l 451 | 253 685 230 678 218 665 _c 452 | 205 652 199 629 199 595 _c 453 | 199 547 _l 454 | 347 547 _l 455 | 347 477 _l 456 | 199 477 _l 457 | 199 0 _l 458 | 109 0 _l 459 | 109 477 _l 460 | 23 477 _l 461 | 23 547 _l 462 | 109 547 _l 463 | 109 585 _l 464 | 109 645 123 690 151 718 _c 465 | 179 746 224 760 286 760 _c 466 | 371 760 _l 467 | _cl}_d 468 | /i{278 0 94 0 184 760 _sc 469 | 94 547 _m 470 | 184 547 _l 471 | 184 0 _l 472 | 94 0 _l 473 | 94 547 _l 474 | 94 760 _m 475 | 184 760 _l 476 | 184 646 _l 477 | 94 646 _l 478 | 94 760 _l 479 | _cl}_d 480 | /k{579 0 91 0 576 760 _sc 481 | 91 760 _m 482 | 181 760 _l 483 | 181 311 _l 484 | 449 547 _l 485 | 564 547 _l 486 | 274 291 _l 487 | 576 0 _l 488 | 459 0 _l 489 | 181 267 _l 490 | 181 0 _l 491 | 91 0 _l 492 | 91 760 _l 493 | _cl}_d 494 | /l{278 0 94 0 184 760 _sc 495 | 94 760 _m 496 | 184 760 _l 497 | 184 0 _l 498 | 94 0 _l 499 | 94 760 _l 500 | _cl}_d 501 | /m{{974 0 91 0 889 560 _sc 502 | 520 442 _m 503 | 542 482 569 511 600 531 _c 504 | 631 550 668 560 711 560 _c 505 | 767 560 811 540 842 500 _c 506 | 873 460 889 403 889 330 _c 507 | 889 0 _l 508 | 799 0 _l 509 | 799 327 _l 510 | 799 379 789 418 771 444 _c 511 | 752 469 724 482 686 482 _c 512 | 639 482 602 466 575 435 _c 513 | 548 404 535 362 535 309 _c 514 | 535 0 _l 515 | 445 0 _l 516 | 445 327 _l 517 | 445 379 435 418 417 444 _c 518 | 398 469 369 482 331 482 _c 519 | }_e{285 482 248 466 221 435 _c 520 | 194 404 181 362 181 309 _c 521 | 181 0 _l 522 | 91 0 _l 523 | 91 547 _l 524 | 181 547 _l 525 | 181 462 _l 526 | 201 495 226 520 255 536 _c 527 | 283 552 317 560 357 560 _c 528 | 397 560 430 550 458 530 _c 529 | 486 510 506 480 520 442 _c 530 | _cl}_e}_d 531 | /n{634 0 91 0 549 560 _sc 532 | 549 330 _m 533 | 549 0 _l 534 | 459 0 _l 535 | 459 327 _l 536 | 459 379 448 417 428 443 _c 537 | 408 469 378 482 338 482 _c 538 | 289 482 251 466 223 435 _c 539 | 195 404 181 362 181 309 _c 540 | 181 0 _l 541 | 91 0 _l 542 | 91 547 _l 543 | 181 547 _l 544 | 181 462 _l 545 | 202 494 227 519 257 535 _c 546 | 286 551 320 560 358 560 _c 547 | 420 560 468 540 500 501 _c 548 | 532 462 549 405 549 330 _c 549 | _cl}_d 550 | /o{612 0 55 -13 557 560 _sc 551 | 306 484 _m 552 | 258 484 220 465 192 427 _c 553 | 164 389 150 338 150 273 _c 554 | 150 207 163 156 191 118 _c 555 | 219 80 257 62 306 62 _c 556 | 354 62 392 80 420 118 _c 557 | 448 156 462 207 462 273 _c 558 | 462 337 448 389 420 427 _c 559 | 392 465 354 484 306 484 _c 560 | 306 560 _m 561 | 384 560 445 534 490 484 _c 562 | 534 433 557 363 557 273 _c 563 | 557 183 534 113 490 63 _c 564 | 445 12 384 -13 306 -13 _c 565 | 227 -13 165 12 121 63 _c 566 | 77 113 55 183 55 273 _c 567 | 55 363 77 433 121 484 _c 568 | 165 534 227 560 306 560 _c 569 | _cl}_d 570 | /p{{635 0 91 -207 580 560 _sc 571 | 181 82 _m 572 | 181 -207 _l 573 | 91 -207 _l 574 | 91 547 _l 575 | 181 547 _l 576 | 181 464 _l 577 | 199 496 223 520 252 536 _c 578 | 281 552 316 560 356 560 _c 579 | 422 560 476 533 518 481 _c 580 | 559 428 580 359 580 273 _c 581 | 580 187 559 117 518 65 _c 582 | 476 13 422 -13 356 -13 _c 583 | 316 -13 281 -5 252 10 _c 584 | 223 25 199 49 181 82 _c 585 | 487 273 _m 586 | 487 339 473 390 446 428 _c 587 | 418 466 381 485 334 485 _c 588 | }_e{286 485 249 466 222 428 _c 589 | 194 390 181 339 181 273 _c 590 | 181 207 194 155 222 117 _c 591 | 249 79 286 61 334 61 _c 592 | 381 61 418 79 446 117 _c 593 | 473 155 487 207 487 273 _c 594 | _cl}_e}_d 595 | /r{411 0 91 0 411 560 _sc 596 | 411 463 _m 597 | 401 469 390 473 378 476 _c 598 | 366 478 353 480 339 480 _c 599 | 288 480 249 463 222 430 _c 600 | 194 397 181 350 181 288 _c 601 | 181 0 _l 602 | 91 0 _l 603 | 91 547 _l 604 | 181 547 _l 605 | 181 462 _l 606 | 199 495 224 520 254 536 _c 607 | 284 552 321 560 365 560 _c 608 | 371 560 378 559 386 559 _c 609 | 393 558 401 557 411 555 _c 610 | 411 463 _l 611 | _cl}_d 612 | /s{{521 0 54 -13 472 560 _sc 613 | 443 531 _m 614 | 443 446 _l 615 | 417 458 391 468 364 475 _c 616 | 336 481 308 485 279 485 _c 617 | 234 485 200 478 178 464 _c 618 | 156 450 145 430 145 403 _c 619 | 145 382 153 366 169 354 _c 620 | 185 342 217 330 265 320 _c 621 | 296 313 _l 622 | 360 299 405 279 432 255 _c 623 | 458 230 472 195 472 151 _c 624 | 472 100 452 60 412 31 _c 625 | 372 1 316 -13 246 -13 _c 626 | 216 -13 186 -10 154 -5 _c 627 | }_e{122 0 89 8 54 20 _c 628 | 54 113 _l 629 | 87 95 120 82 152 74 _c 630 | 184 65 216 61 248 61 _c 631 | 290 61 323 68 346 82 _c 632 | 368 96 380 117 380 144 _c 633 | 380 168 371 187 355 200 _c 634 | 339 213 303 226 247 238 _c 635 | 216 245 _l 636 | 160 257 119 275 95 299 _c 637 | 70 323 58 356 58 399 _c 638 | 58 450 76 490 112 518 _c 639 | 148 546 200 560 268 560 _c 640 | 301 560 332 557 362 552 _c 641 | 391 547 418 540 443 531 _c 642 | }_e{_cl}_e}_d 643 | /t{392 0 27 0 368 702 _sc 644 | 183 702 _m 645 | 183 547 _l 646 | 368 547 _l 647 | 368 477 _l 648 | 183 477 _l 649 | 183 180 _l 650 | 183 135 189 106 201 94 _c 651 | 213 81 238 75 276 75 _c 652 | 368 75 _l 653 | 368 0 _l 654 | 276 0 _l 655 | 206 0 158 13 132 39 _c 656 | 106 65 93 112 93 180 _c 657 | 93 477 _l 658 | 27 477 _l 659 | 27 547 _l 660 | 93 547 _l 661 | 93 702 _l 662 | 183 702 _l 663 | _cl}_d 664 | /u{634 0 85 -13 543 547 _sc 665 | 85 216 _m 666 | 85 547 _l 667 | 175 547 _l 668 | 175 219 _l 669 | 175 167 185 129 205 103 _c 670 | 225 77 255 64 296 64 _c 671 | 344 64 383 79 411 110 _c 672 | 439 141 453 183 453 237 _c 673 | 453 547 _l 674 | 543 547 _l 675 | 543 0 _l 676 | 453 0 _l 677 | 453 84 _l 678 | 431 50 405 26 377 10 _c 679 | 348 -5 315 -13 277 -13 _c 680 | 214 -13 166 6 134 45 _c 681 | 101 83 85 140 85 216 _c 682 | _cl}_d 683 | /w{818 0 42 0 776 547 _sc 684 | 42 547 _m 685 | 132 547 _l 686 | 244 120 _l 687 | 356 547 _l 688 | 462 547 _l 689 | 574 120 _l 690 | 686 547 _l 691 | 776 547 _l 692 | 633 0 _l 693 | 527 0 _l 694 | 409 448 _l 695 | 291 0 _l 696 | 185 0 _l 697 | 42 547 _l 698 | _cl}_d 699 | /y{592 0 30 -207 562 547 _sc 700 | 322 -50 _m 701 | 296 -114 271 -157 247 -177 _c 702 | 223 -197 191 -207 151 -207 _c 703 | 79 -207 _l 704 | 79 -132 _l 705 | 132 -132 _l 706 | 156 -132 175 -126 189 -114 _c 707 | 203 -102 218 -75 235 -31 _c 708 | 251 9 _l 709 | 30 547 _l 710 | 125 547 _l 711 | 296 119 _l 712 | 467 547 _l 713 | 562 547 _l 714 | 322 -50 _l 715 | _cl}_d 716 | end readonly def 717 | 718 | /BuildGlyph 719 | {exch begin 720 | CharStrings exch 721 | 2 copy known not{pop /.notdef}if 722 | true 3 1 roll get exec 723 | end}_d 724 | 725 | /BuildChar { 726 | 1 index /Encoding get exch get 727 | 1 index /BuildGlyph get exec 728 | }_d 729 | 730 | FontName currentdict end definefont pop 731 | end 732 | %%EndProlog 733 | mpldict begin 734 | -54 180 translate 735 | 720 432 0 0 clipbox 736 | gsave 737 | 0 0 m 738 | 720 0 l 739 | 720 432 l 740 | 0 432 l 741 | cl 742 | 1.000 setgray 743 | fill 744 | grestore 745 | gsave 746 | 90 54 m 747 | 648 54 l 748 | 648 388.8 l 749 | 90 388.8 l 750 | cl 751 | 1.000 setgray 752 | fill 753 | grestore 754 | 1.000 setlinewidth 755 | 0 setlinejoin 756 | 0 setlinecap 757 | [] 0 setdash 758 | 0.000 setgray 759 | gsave 760 | 558 334.8 90 54 clipbox 761 | 114.412 54 m 762 | 163.237 54 l 763 | 163.237 58.6481 l 764 | 114.412 58.6481 l 765 | cl 766 | gsave 767 | 0.000 0.500 0.000 setrgbcolor 768 | fill 769 | grestore 770 | stroke 771 | grestore 772 | gsave 773 | 558 334.8 90 54 clipbox 774 | 253.912 54 m 775 | 302.737 54 l 776 | 302.737 62.2584 l 777 | 253.912 62.2584 l 778 | cl 779 | gsave 780 | 0.000 0.500 0.000 setrgbcolor 781 | fill 782 | grestore 783 | stroke 784 | grestore 785 | gsave 786 | 558 334.8 90 54 clipbox 787 | 393.412 54 m 788 | 442.237 54 l 789 | 442.237 93.7296 l 790 | 393.412 93.7296 l 791 | cl 792 | gsave 793 | 0.000 0.500 0.000 setrgbcolor 794 | fill 795 | grestore 796 | stroke 797 | grestore 798 | gsave 799 | 558 334.8 90 54 clipbox 800 | 532.912 54 m 801 | 581.737 54 l 802 | 581.737 364.973 l 803 | 532.912 364.973 l 804 | cl 805 | gsave 806 | 0.000 0.500 0.000 setrgbcolor 807 | fill 808 | grestore 809 | stroke 810 | grestore 811 | gsave 812 | 558 334.8 90 54 clipbox 813 | 163.237 54 m 814 | 212.062 54 l 815 | 212.062 58.3133 l 816 | 163.237 58.3133 l 817 | cl 818 | gsave 819 | 0.000 0.000 1.000 setrgbcolor 820 | fill 821 | grestore 822 | stroke 823 | grestore 824 | gsave 825 | 558 334.8 90 54 clipbox 826 | 302.738 54 m 827 | 351.562 54 l 828 | 351.562 59.0778 l 829 | 302.738 59.0778 l 830 | cl 831 | gsave 832 | 0.000 0.000 1.000 setrgbcolor 833 | fill 834 | grestore 835 | stroke 836 | grestore 837 | gsave 838 | 558 334.8 90 54 clipbox 839 | 442.238 54 m 840 | 491.062 54 l 841 | 491.062 60.1994 l 842 | 442.238 60.1994 l 843 | cl 844 | gsave 845 | 0.000 0.000 1.000 setrgbcolor 846 | fill 847 | grestore 848 | stroke 849 | grestore 850 | gsave 851 | 558 334.8 90 54 clipbox 852 | 581.737 54 m 853 | 630.562 54 l 854 | 630.562 69.8249 l 855 | 581.737 69.8249 l 856 | cl 857 | gsave 858 | 0.000 0.000 1.000 setrgbcolor 859 | fill 860 | grestore 861 | stroke 862 | grestore 863 | 2 setlinecap 864 | gsave 865 | 648 54 m 866 | 648 388.8 l 867 | stroke 868 | grestore 869 | gsave 870 | 90 388.8 m 871 | 648 388.8 l 872 | stroke 873 | grestore 874 | gsave 875 | 90 54 m 876 | 90 388.8 l 877 | stroke 878 | grestore 879 | gsave 880 | 90 54 m 881 | 648 54 l 882 | stroke 883 | grestore 884 | 0.500 setlinewidth 885 | 1 setlinejoin 886 | 0 setlinecap 887 | [1 3] 0 setdash 888 | gsave 889 | 558 334.8 90 54 clipbox 890 | 163.237 54 m 891 | 163.237 388.8 l 892 | stroke 893 | grestore 894 | [] 0 setdash 895 | gsave 896 | /o { 897 | gsave 898 | newpath 899 | translate 900 | 0.5 setlinewidth 901 | 1 setlinejoin 902 | 0 setlinecap 903 | 0 0 m 904 | 0 4 l 905 | gsave 906 | 0.000 setgray 907 | fill 908 | grestore 909 | stroke 910 | grestore 911 | } bind def 912 | 163.237 54 o 913 | grestore 914 | gsave 915 | /o { 916 | gsave 917 | newpath 918 | translate 919 | 0.5 setlinewidth 920 | 1 setlinejoin 921 | 0 setlinecap 922 | 0 0 m 923 | 0 -4 l 924 | gsave 925 | 0.000 setgray 926 | fill 927 | grestore 928 | stroke 929 | grestore 930 | } bind def 931 | 163.237 388.8 o 932 | grestore 933 | /BitstreamVeraSans-Roman findfont 934 | 15.000 scalefont 935 | setfont 936 | gsave 937 | 159.987500 38.609375 translate 938 | 0.000000 rotate 939 | 0.000000 0.000000 m /one glyphshow 940 | grestore 941 | [1 3] 0 setdash 942 | gsave 943 | 558 334.8 90 54 clipbox 944 | 302.738 54 m 945 | 302.738 388.8 l 946 | stroke 947 | grestore 948 | [] 0 setdash 949 | gsave 950 | /o { 951 | gsave 952 | newpath 953 | translate 954 | 0.5 setlinewidth 955 | 1 setlinejoin 956 | 0 setlinecap 957 | 0 0 m 958 | 0 4 l 959 | gsave 960 | 0.000 setgray 961 | fill 962 | grestore 963 | stroke 964 | grestore 965 | } bind def 966 | 302.738 54 o 967 | grestore 968 | gsave 969 | /o { 970 | gsave 971 | newpath 972 | translate 973 | 0.5 setlinewidth 974 | 1 setlinejoin 975 | 0 setlinecap 976 | 0 0 m 977 | 0 -4 l 978 | gsave 979 | 0.000 setgray 980 | fill 981 | grestore 982 | stroke 983 | grestore 984 | } bind def 985 | 302.738 388.8 o 986 | grestore 987 | gsave 988 | 294.518750 38.609375 translate 989 | 0.000000 rotate 990 | 0.000000 0.000000 m /one glyphshow 991 | 9.543457 0.000000 m /zero glyphshow 992 | grestore 993 | [1 3] 0 setdash 994 | gsave 995 | 558 334.8 90 54 clipbox 996 | 442.238 54 m 997 | 442.238 388.8 l 998 | stroke 999 | grestore 1000 | [] 0 setdash 1001 | gsave 1002 | /o { 1003 | gsave 1004 | newpath 1005 | translate 1006 | 0.5 setlinewidth 1007 | 1 setlinejoin 1008 | 0 setlinecap 1009 | 0 0 m 1010 | 0 4 l 1011 | gsave 1012 | 0.000 setgray 1013 | fill 1014 | grestore 1015 | stroke 1016 | grestore 1017 | } bind def 1018 | 442.238 54 o 1019 | grestore 1020 | gsave 1021 | /o { 1022 | gsave 1023 | newpath 1024 | translate 1025 | 0.5 setlinewidth 1026 | 1 setlinejoin 1027 | 0 setlinecap 1028 | 0 0 m 1029 | 0 -4 l 1030 | gsave 1031 | 0.000 setgray 1032 | fill 1033 | grestore 1034 | stroke 1035 | grestore 1036 | } bind def 1037 | 442.238 388.8 o 1038 | grestore 1039 | gsave 1040 | 429.245313 38.609375 translate 1041 | 0.000000 rotate 1042 | 0.000000 0.000000 m /one glyphshow 1043 | 9.543457 0.000000 m /zero glyphshow 1044 | 19.086914 0.000000 m /zero glyphshow 1045 | grestore 1046 | [1 3] 0 setdash 1047 | gsave 1048 | 558 334.8 90 54 clipbox 1049 | 581.737 54 m 1050 | 581.737 388.8 l 1051 | stroke 1052 | grestore 1053 | [] 0 setdash 1054 | gsave 1055 | /o { 1056 | gsave 1057 | newpath 1058 | translate 1059 | 0.5 setlinewidth 1060 | 1 setlinejoin 1061 | 0 setlinecap 1062 | 0 0 m 1063 | 0 4 l 1064 | gsave 1065 | 0.000 setgray 1066 | fill 1067 | grestore 1068 | stroke 1069 | grestore 1070 | } bind def 1071 | 581.737 54 o 1072 | grestore 1073 | gsave 1074 | /o { 1075 | gsave 1076 | newpath 1077 | translate 1078 | 0.5 setlinewidth 1079 | 1 setlinejoin 1080 | 0 setlinecap 1081 | 0 0 m 1082 | 0 -4 l 1083 | gsave 1084 | 0.000 setgray 1085 | fill 1086 | grestore 1087 | stroke 1088 | grestore 1089 | } bind def 1090 | 581.737 388.8 o 1091 | grestore 1092 | gsave 1093 | 563.971875 38.609375 translate 1094 | 0.000000 rotate 1095 | 0.000000 0.000000 m /one glyphshow 1096 | 9.543457 0.000000 m /zero glyphshow 1097 | 19.086914 0.000000 m /zero glyphshow 1098 | 28.630371 0.000000 m /zero glyphshow 1099 | grestore 1100 | gsave 1101 | 311.906250 19.093750 translate 1102 | 0.000000 rotate 1103 | 0.000000 0.000000 m /N glyphshow 1104 | 11.220703 0.000000 m /u glyphshow 1105 | 20.727539 0.000000 m /m glyphshow 1106 | 35.339355 0.000000 m /b glyphshow 1107 | 44.860840 0.000000 m /e glyphshow 1108 | 54.089355 0.000000 m /r glyphshow 1109 | 60.256348 0.000000 m /space glyphshow 1110 | 65.024414 0.000000 m /o glyphshow 1111 | 74.201660 0.000000 m /f glyphshow 1112 | 79.482422 0.000000 m /space glyphshow 1113 | 84.250488 0.000000 m /f glyphshow 1114 | 89.531250 0.000000 m /i glyphshow 1115 | 93.698730 0.000000 m /l glyphshow 1116 | 97.866211 0.000000 m /e glyphshow 1117 | 107.094727 0.000000 m /s glyphshow 1118 | grestore 1119 | [1 3] 0 setdash 1120 | gsave 1121 | 558 334.8 90 54 clipbox 1122 | 90 54 m 1123 | 648 54 l 1124 | stroke 1125 | grestore 1126 | [] 0 setdash 1127 | gsave 1128 | /o { 1129 | gsave 1130 | newpath 1131 | translate 1132 | 0.5 setlinewidth 1133 | 1 setlinejoin 1134 | 0 setlinecap 1135 | 0 0 m 1136 | 4 0 l 1137 | gsave 1138 | 0.000 setgray 1139 | fill 1140 | grestore 1141 | stroke 1142 | grestore 1143 | } bind def 1144 | 90 54 o 1145 | grestore 1146 | gsave 1147 | /o { 1148 | gsave 1149 | newpath 1150 | translate 1151 | 0.5 setlinewidth 1152 | 1 setlinejoin 1153 | 0 setlinecap 1154 | 0 0 m 1155 | -4 0 l 1156 | gsave 1157 | 0.000 setgray 1158 | fill 1159 | grestore 1160 | stroke 1161 | grestore 1162 | } bind def 1163 | 648 54 o 1164 | grestore 1165 | gsave 1166 | 78.437500 49.867188 translate 1167 | 0.000000 rotate 1168 | 0.000000 0.000000 m /zero glyphshow 1169 | grestore 1170 | [1 3] 0 setdash 1171 | gsave 1172 | 558 334.8 90 54 clipbox 1173 | 90 109.8 m 1174 | 648 109.8 l 1175 | stroke 1176 | grestore 1177 | [] 0 setdash 1178 | gsave 1179 | /o { 1180 | gsave 1181 | newpath 1182 | translate 1183 | 0.5 setlinewidth 1184 | 1 setlinejoin 1185 | 0 setlinecap 1186 | 0 0 m 1187 | 4 0 l 1188 | gsave 1189 | 0.000 setgray 1190 | fill 1191 | grestore 1192 | stroke 1193 | grestore 1194 | } bind def 1195 | 90 109.8 o 1196 | grestore 1197 | gsave 1198 | /o { 1199 | gsave 1200 | newpath 1201 | translate 1202 | 0.5 setlinewidth 1203 | 1 setlinejoin 1204 | 0 setlinecap 1205 | 0 0 m 1206 | -4 0 l 1207 | gsave 1208 | 0.000 setgray 1209 | fill 1210 | grestore 1211 | stroke 1212 | grestore 1213 | } bind def 1214 | 648 109.8 o 1215 | grestore 1216 | gsave 1217 | 69.562500 105.667187 translate 1218 | 0.000000 rotate 1219 | 0.000000 0.000000 m /one glyphshow 1220 | 9.543457 0.000000 m /zero glyphshow 1221 | grestore 1222 | [1 3] 0 setdash 1223 | gsave 1224 | 558 334.8 90 54 clipbox 1225 | 90 165.6 m 1226 | 648 165.6 l 1227 | stroke 1228 | grestore 1229 | [] 0 setdash 1230 | gsave 1231 | /o { 1232 | gsave 1233 | newpath 1234 | translate 1235 | 0.5 setlinewidth 1236 | 1 setlinejoin 1237 | 0 setlinecap 1238 | 0 0 m 1239 | 4 0 l 1240 | gsave 1241 | 0.000 setgray 1242 | fill 1243 | grestore 1244 | stroke 1245 | grestore 1246 | } bind def 1247 | 90 165.6 o 1248 | grestore 1249 | gsave 1250 | /o { 1251 | gsave 1252 | newpath 1253 | translate 1254 | 0.5 setlinewidth 1255 | 1 setlinejoin 1256 | 0 setlinecap 1257 | 0 0 m 1258 | -4 0 l 1259 | gsave 1260 | 0.000 setgray 1261 | fill 1262 | grestore 1263 | stroke 1264 | grestore 1265 | } bind def 1266 | 648 165.6 o 1267 | grestore 1268 | gsave 1269 | 69.000000 161.467187 translate 1270 | 0.000000 rotate 1271 | 0.000000 0.000000 m /two glyphshow 1272 | 9.543457 0.000000 m /zero glyphshow 1273 | grestore 1274 | [1 3] 0 setdash 1275 | gsave 1276 | 558 334.8 90 54 clipbox 1277 | 90 221.4 m 1278 | 648 221.4 l 1279 | stroke 1280 | grestore 1281 | [] 0 setdash 1282 | gsave 1283 | /o { 1284 | gsave 1285 | newpath 1286 | translate 1287 | 0.5 setlinewidth 1288 | 1 setlinejoin 1289 | 0 setlinecap 1290 | 0 0 m 1291 | 4 0 l 1292 | gsave 1293 | 0.000 setgray 1294 | fill 1295 | grestore 1296 | stroke 1297 | grestore 1298 | } bind def 1299 | 90 221.4 o 1300 | grestore 1301 | gsave 1302 | /o { 1303 | gsave 1304 | newpath 1305 | translate 1306 | 0.5 setlinewidth 1307 | 1 setlinejoin 1308 | 0 setlinecap 1309 | 0 0 m 1310 | -4 0 l 1311 | gsave 1312 | 0.000 setgray 1313 | fill 1314 | grestore 1315 | stroke 1316 | grestore 1317 | } bind def 1318 | 648 221.4 o 1319 | grestore 1320 | gsave 1321 | 69.046875 217.267188 translate 1322 | 0.000000 rotate 1323 | 0.000000 0.000000 m /three glyphshow 1324 | 9.543457 0.000000 m /zero glyphshow 1325 | grestore 1326 | [1 3] 0 setdash 1327 | gsave 1328 | 558 334.8 90 54 clipbox 1329 | 90 277.2 m 1330 | 648 277.2 l 1331 | stroke 1332 | grestore 1333 | [] 0 setdash 1334 | gsave 1335 | /o { 1336 | gsave 1337 | newpath 1338 | translate 1339 | 0.5 setlinewidth 1340 | 1 setlinejoin 1341 | 0 setlinecap 1342 | 0 0 m 1343 | 4 0 l 1344 | gsave 1345 | 0.000 setgray 1346 | fill 1347 | grestore 1348 | stroke 1349 | grestore 1350 | } bind def 1351 | 90 277.2 o 1352 | grestore 1353 | gsave 1354 | /o { 1355 | gsave 1356 | newpath 1357 | translate 1358 | 0.5 setlinewidth 1359 | 1 setlinejoin 1360 | 0 setlinecap 1361 | 0 0 m 1362 | -4 0 l 1363 | gsave 1364 | 0.000 setgray 1365 | fill 1366 | grestore 1367 | stroke 1368 | grestore 1369 | } bind def 1370 | 648 277.2 o 1371 | grestore 1372 | gsave 1373 | 68.640625 273.067187 translate 1374 | 0.000000 rotate 1375 | 0.000000 0.000000 m /four glyphshow 1376 | 9.543457 0.000000 m /zero glyphshow 1377 | grestore 1378 | [1 3] 0 setdash 1379 | gsave 1380 | 558 334.8 90 54 clipbox 1381 | 90 333 m 1382 | 648 333 l 1383 | stroke 1384 | grestore 1385 | [] 0 setdash 1386 | gsave 1387 | /o { 1388 | gsave 1389 | newpath 1390 | translate 1391 | 0.5 setlinewidth 1392 | 1 setlinejoin 1393 | 0 setlinecap 1394 | 0 0 m 1395 | 4 0 l 1396 | gsave 1397 | 0.000 setgray 1398 | fill 1399 | grestore 1400 | stroke 1401 | grestore 1402 | } bind def 1403 | 90 333 o 1404 | grestore 1405 | gsave 1406 | /o { 1407 | gsave 1408 | newpath 1409 | translate 1410 | 0.5 setlinewidth 1411 | 1 setlinejoin 1412 | 0 setlinecap 1413 | 0 0 m 1414 | -4 0 l 1415 | gsave 1416 | 0.000 setgray 1417 | fill 1418 | grestore 1419 | stroke 1420 | grestore 1421 | } bind def 1422 | 648 333 o 1423 | grestore 1424 | gsave 1425 | 69.062500 328.867188 translate 1426 | 0.000000 rotate 1427 | 0.000000 0.000000 m /five glyphshow 1428 | 9.543457 0.000000 m /zero glyphshow 1429 | grestore 1430 | [1 3] 0 setdash 1431 | gsave 1432 | 558 334.8 90 54 clipbox 1433 | 90 388.8 m 1434 | 648 388.8 l 1435 | stroke 1436 | grestore 1437 | [] 0 setdash 1438 | gsave 1439 | /o { 1440 | gsave 1441 | newpath 1442 | translate 1443 | 0.5 setlinewidth 1444 | 1 setlinejoin 1445 | 0 setlinecap 1446 | 0 0 m 1447 | 4 0 l 1448 | gsave 1449 | 0.000 setgray 1450 | fill 1451 | grestore 1452 | stroke 1453 | grestore 1454 | } bind def 1455 | 90 388.8 o 1456 | grestore 1457 | gsave 1458 | /o { 1459 | gsave 1460 | newpath 1461 | translate 1462 | 0.5 setlinewidth 1463 | 1 setlinejoin 1464 | 0 setlinecap 1465 | 0 0 m 1466 | -4 0 l 1467 | gsave 1468 | 0.000 setgray 1469 | fill 1470 | grestore 1471 | stroke 1472 | grestore 1473 | } bind def 1474 | 648 388.8 o 1475 | grestore 1476 | gsave 1477 | 68.953125 384.667188 translate 1478 | 0.000000 rotate 1479 | 0.000000 0.000000 m /six glyphshow 1480 | 9.543457 0.000000 m /zero glyphshow 1481 | grestore 1482 | gsave 1483 | 60.515625 190.751563 translate 1484 | 90.000000 rotate 1485 | 0.000000 0.000000 m /S glyphshow 1486 | 9.521484 0.000000 m /e glyphshow 1487 | 18.750000 0.000000 m /c glyphshow 1488 | 26.997070 0.000000 m /o glyphshow 1489 | 36.174316 0.000000 m /n glyphshow 1490 | 45.681152 0.000000 m /d glyphshow 1491 | 55.202637 0.000000 m /s glyphshow 1492 | grestore 1493 | /BitstreamVeraSans-Roman findfont 1494 | 18.000 scalefont 1495 | setfont 1496 | gsave 1497 | 161.210938 393.800000 translate 1498 | 0.000000 rotate 1499 | 0.000000 0.000000 m /H glyphshow 1500 | 13.535156 0.000000 m /a glyphshow 1501 | 24.565430 0.000000 m /y glyphshow 1502 | 35.217773 0.000000 m /a glyphshow 1503 | 46.248047 0.000000 m /b glyphshow 1504 | 57.673828 0.000000 m /u glyphshow 1505 | 69.082031 0.000000 m /s glyphshow 1506 | 78.459961 0.000000 m /a glyphshow 1507 | 89.490234 0.000000 m /space glyphshow 1508 | 95.211914 0.000000 m /a glyphshow 1509 | 106.242188 0.000000 m /n glyphshow 1510 | 117.650391 0.000000 m /d glyphshow 1511 | 129.076172 0.000000 m /space glyphshow 1512 | 134.797852 0.000000 m /S glyphshow 1513 | 146.223633 0.000000 m /p glyphshow 1514 | 157.649414 0.000000 m /a glyphshow 1515 | 168.679688 0.000000 m /r glyphshow 1516 | 176.080078 0.000000 m /k glyphshow 1517 | 186.503906 0.000000 m /space glyphshow 1518 | 192.225586 0.000000 m /t glyphshow 1519 | 199.283203 0.000000 m /o glyphshow 1520 | 210.295898 0.000000 m /space glyphshow 1521 | 216.017578 0.000000 m /p glyphshow 1522 | 227.443359 0.000000 m /i glyphshow 1523 | 232.444336 0.000000 m /c glyphshow 1524 | 242.340820 0.000000 m /k glyphshow 1525 | 252.764648 0.000000 m /space glyphshow 1526 | 258.486328 0.000000 m /u glyphshow 1527 | 269.894531 0.000000 m /p glyphshow 1528 | 281.320312 0.000000 m /space glyphshow 1529 | 287.041992 0.000000 m /k glyphshow 1530 | 296.840820 0.000000 m /e glyphshow 1531 | 307.915039 0.000000 m /y glyphshow 1532 | 318.567383 0.000000 m /w glyphshow 1533 | 333.289062 0.000000 m /o glyphshow 1534 | 344.301758 0.000000 m /r glyphshow 1535 | 351.327148 0.000000 m /d glyphshow 1536 | 362.752930 0.000000 m /space glyphshow 1537 | 368.474609 0.000000 m /quotedbl glyphshow 1538 | 376.753906 0.000000 m /n glyphshow 1539 | 388.162109 0.000000 m /o glyphshow 1540 | 399.174805 0.000000 m /c glyphshow 1541 | 409.071289 0.000000 m /quotedbl glyphshow 1542 | grestore 1543 | 1.000 setlinewidth 1544 | 0 setlinejoin 1545 | gsave 1546 | 99 321.556 m 1547 | 363.862 321.556 l 1548 | 363.862 379.8 l 1549 | 99 379.8 l 1550 | cl 1551 | gsave 1552 | 1.000 setgray 1553 | fill 1554 | grestore 1555 | stroke 1556 | grestore 1557 | gsave 1558 | 106.2 358.928 m 1559 | 142.2 358.928 l 1560 | 142.2 371.528 l 1561 | 106.2 371.528 l 1562 | cl 1563 | gsave 1564 | 0.000 0.000 1.000 setrgbcolor 1565 | fill 1566 | grestore 1567 | stroke 1568 | grestore 1569 | gsave 1570 | 156.600000 358.928125 translate 1571 | 0.000000 rotate 1572 | 0.000000 0.000000 m /H glyphshow 1573 | 13.535156 0.000000 m /a glyphshow 1574 | 24.565430 0.000000 m /y glyphshow 1575 | 35.217773 0.000000 m /a glyphshow 1576 | 46.248047 0.000000 m /b glyphshow 1577 | 57.673828 0.000000 m /u glyphshow 1578 | 69.082031 0.000000 m /s glyphshow 1579 | 78.459961 0.000000 m /a glyphshow 1580 | 89.490234 0.000000 m /parenleft glyphshow 1581 | 96.512695 0.000000 m /s glyphshow 1582 | 105.890625 0.000000 m /t glyphshow 1583 | 112.948242 0.000000 m /a glyphshow 1584 | 123.978516 0.000000 m /n glyphshow 1585 | 135.386719 0.000000 m /d glyphshow 1586 | 146.812500 0.000000 m /a glyphshow 1587 | 157.842773 0.000000 m /l glyphshow 1588 | 162.843750 0.000000 m /o glyphshow 1589 | 173.856445 0.000000 m /n glyphshow 1590 | 185.264648 0.000000 m /e glyphshow 1591 | 196.338867 0.000000 m /parenright glyphshow 1592 | grestore 1593 | gsave 1594 | 106.2 332.506 m 1595 | 142.2 332.506 l 1596 | 142.2 345.106 l 1597 | 106.2 345.106 l 1598 | cl 1599 | gsave 1600 | 0.000 0.500 0.000 setrgbcolor 1601 | fill 1602 | grestore 1603 | stroke 1604 | grestore 1605 | gsave 1606 | 156.600000 332.506250 translate 1607 | 0.000000 rotate 1608 | 0.000000 0.000000 m /S glyphshow 1609 | 11.425781 0.000000 m /p glyphshow 1610 | 22.851562 0.000000 m /a glyphshow 1611 | 33.881836 0.000000 m /r glyphshow 1612 | 41.282227 0.000000 m /k glyphshow 1613 | 51.706055 0.000000 m /parenleft glyphshow 1614 | 58.728516 0.000000 m /d glyphshow 1615 | 70.154297 0.000000 m /i glyphshow 1616 | 75.155273 0.000000 m /s glyphshow 1617 | 84.533203 0.000000 m /t glyphshow 1618 | 91.590820 0.000000 m /r glyphshow 1619 | 98.991211 0.000000 m /i glyphshow 1620 | 103.992188 0.000000 m /b glyphshow 1621 | 115.417969 0.000000 m /u glyphshow 1622 | 126.826172 0.000000 m /t glyphshow 1623 | 133.883789 0.000000 m /e glyphshow 1624 | 144.958008 0.000000 m /d glyphshow 1625 | 156.383789 0.000000 m /parenright glyphshow 1626 | grestore 1627 | 1628 | end 1629 | showpage 1630 | -------------------------------------------------------------------------------- /presentation/was/was.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirolovesbeer/hayabusa/d6ecea2ac1d624f4a3fabbbfb5ee265cf48f4a02/presentation/was/was.pdf -------------------------------------------------------------------------------- /presentation/was/was.tex: -------------------------------------------------------------------------------- 1 | \documentclass[twocolumn,10pt]{jarticle} 2 | \usepackage[top=5truemm,bottom=15truemm,left=15truemm,right=15truemm]{geometry} 3 | \usepackage[dvipdfmx]{graphicx} 4 | \usepackage{ascmac} 5 | %\setlength{\columnsep}{3zw} 6 | \title{高速なログ検索エンジンHayabusaについて} 7 | \author{あべひろし (@hirolovesbeer)} 8 | \date{2017/12/20} 9 | %%%%%% TEXT START %%%%%% 10 | 11 | \begin{document} 12 | \maketitle 13 | \thispagestyle{empty} 14 | 15 | \section{背景と目的} 16 | ネットワークのトラブルシューティングやセキュリティインシデントに対応するため, 17 | ネットワーク管理者はトラブルの原因を特定するためにサーバやネットワーク,セキュリティ機器から出力されるログを蓄積し,検索をすることがある. 18 | 大規模なネットワークでは,出力されるログの量も多く蓄積・検索システムの規模も巨大化する. 19 | 大量に出力される機器のログを高速に蓄積し,高速に検索するシステムとしてHayabusa\cite{hayabusa}を実装した. 20 | 21 | 22 | \section{Hayabusaのアーキテクチャ} 23 | %Hayabusa\cite{hayabusa}は,Interop Tokyoで収集された大量のsyslogを高速に検索するためのシステムとして設計された. 24 | Hayabusaはオープンソースソフトウェアとして実装され,GitHub上で公開されている(https://github.com/hirolovesbeer/hayabusaa). 25 | 図 \ref{fig:hayabusa-arch} にHayabusaのアーキテクチャを示す. 26 | \begin{figure}[h] 27 | \centering 28 | \includegraphics[width=85mm]{./pictures/hayabusa-arch.eps} 29 | \caption{Hayabusaのアーキテクチャ} 30 | \label{fig:hayabusa-arch} 31 | \end{figure} 32 | 33 | Hayabusaはスタンドアロンサーバで動作し,CPUのマルチコアを有効に使い高速な並列検索処理を実現する. 34 | Hayabusaは大きくStoreEngineとSearchEngineの2つに分けられる. 35 | StoreEngineはcronにより1分毎に起動され,ターゲットとなるログファイルを開きログメッセージをSQLite3ファイルへと変換する. 36 | %ログデータは1分ごとのSQLite3ファイルへと分割され,検索時に複数プロセスにより並列処理される. 37 | %ログが保存されるディレクトリは以下の様に時間を意味する階層として定義される. 38 | %\begin{screen} 39 | %\begin{verbatim} 40 | %/targetdir/yyyy/mm/dd/hh/min.db 41 | %\end{verbatim} 42 | %\end{screen} 43 | %そのためログ検索のための時間情報をデータベース内部に保持することなくディレクトリとのマッチングで行うことができ, 44 | %時間のクエリ条件を指定することなく時間指定のログが検索可能になる. 45 | ログが保存されるSQLite3ファイルはFTS(Full Text Search)と呼ばれる全文検索に特化したテーブルとして作成され高速なログ検索を実現する. 46 | 47 | SearchEngineは,並列検索性能を向上させるために分単位に細分化されたFTSフォーマットで定義されたSQLite3ファイルへアクセスを行う. 48 | 各SQLite3ファイルへはGNU Parallelを用いて並列にSQL検索クエリが実行され, 49 | 結果はUNIXパイプラインを経由してawkコマンドやcountコマンドを用いて集計される. 50 | 51 | 52 | \section{性能概要} 53 | Hayabusaはスタンドアロン環境で動作するが,小規模なApache Sparkのクラスタよりも全文検索性能が高い. 54 | 性能評価実験では,Hayabusaは3台のApache Sparkクラスタより27倍早い検索性能を示した. 55 | \begin{figure}[h] 56 | \centering 57 | \includegraphics[width=85mm]{./pictures/spark-sqlite-dist2.eps} 58 | \caption{HayabusaとSparkの性能比較} 59 | \label{fig:hayabusa-spark} 60 | \end{figure} 61 | 62 | 63 | \section{まとめ} 64 | スタンドアロン環境にはハードウェア限界が存在し, 65 | 規模が拡大した他の分散処理クラスタにいつかは性能が抜かれてしまう可能性が高い. 66 | そこで,Hayabusaの限界であるスタンドアロン環境という制約を取り払い, 67 | 複数ホストでHayabusaの分散処理環境を構築し,検索性能がスケールアウトするアーキテクチャの実現をした\cite{d-hayabusa}. 68 | 計測した結果,1台の処理ホストでは約468秒かかった検索処理が最大約6秒まで短縮した. 69 | 144億レコードのsyslogデータを6秒でフルスキャンし, 70 | 全文検索可能な分散Hayabusa環境はログ検索エンジンとして高い性能を発揮する. 71 | 72 | 73 | 74 | \begin{thebibliography}{9} 75 | \bibitem{hayabusa} H. Abe, K. Shima, Y. Sekiya, D. Miyamoto, T. Ishihara, and K. Okada. Hayabusa: Simple and fast full-text search engine for massive system log data., CFI’17, pages 2:1–2:7, Fukuoka, JAPAN, 2017. ACM. 76 | \bibitem{d-hayabusa} 阿部博 and 篠田陽一, スケールアウト可能なログ検索エンジンの実現と評価, インターネットと運用技術シンポジウム論文集 2017論文集, volume 2017, pages 73-80, nov 2017. 77 | 78 | \end{thebibliography} 79 | 80 | 81 | \end{document} 82 | -------------------------------------------------------------------------------- /search_engine.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import configparser 3 | import subprocess 4 | import shlex 5 | 6 | BASE_DIR = '/var/tmp/data' 7 | CONFIG = '/path/to/config.ini' 8 | 9 | def exec(args): 10 | time = args.time 11 | match = args.match 12 | exact = args.e 13 | count = args.c 14 | sum = args.s 15 | verbose = args.v 16 | 17 | if count: 18 | if sum: 19 | if exact: 20 | cmd = 'parallel sqlite3 ::: %s/%s.db ::: "select count(*) from syslog where logs match %s;" | awk \'{m+=$1} END{print m;}\'' % (BASE_DIR, time, shlex.quote('\\"%s\\"' % match)) 21 | else: 22 | cmd = 'parallel sqlite3 ::: %s/%s.db ::: "select count(*) from syslog where logs match \'%s\';" | awk \'{m+=$1} END{print m;}\'' % (BASE_DIR, time, match) 23 | else: 24 | if exact: 25 | cmd = 'parallel sqlite3 ::: %s/%s.db ::: "select count(*) from syslog where logs match %s;"' % (BASE_DIR, time, shlex.quote('\\"%s\\"' % match)) 26 | else: 27 | cmd = 'parallel sqlite3 ::: %s/%s.db ::: "select count(*) from syslog where logs match \'%s\';"' % (BASE_DIR, time, match) 28 | 29 | # debug code 30 | # cmd = 'parallel sqlite3 ::: /mnt/ssd1/benchmark-db/100k/100k-1.db ::: "select count(*) from syslog where logs match \'noc\';"' 31 | 32 | else: 33 | if exact: 34 | cmd = 'parallel sqlite3 ::: %s/%s.db ::: "select * from syslog where logs match %s;"' % (BASE_DIR, time, shlex.quote('\\"%s\\"' % match)) 35 | else: 36 | cmd = 'parallel sqlite3 ::: %s/%s.db ::: "select * from syslog where logs match \'%s\';"' % (BASE_DIR, time, match) 37 | 38 | # debug code 39 | # cmd = 'parallel sqlite3 ::: /mnt/ssd1/benchmark-db/100k/100k-1.db ::: "select * from syslog where logs match \'noc\';"' 40 | 41 | if verbose: 42 | print(cmd) 43 | 44 | subprocess.call(cmd, shell=True) 45 | 46 | if __name__ == '__main__': 47 | config = configparser.ConfigParser() 48 | config.read(CONFIG) 49 | 50 | BASE_DIR = config['path']['base-dir'] 51 | 52 | parser = argparse.ArgumentParser() 53 | parser.add_argument("--time", 54 | help="time explain regexp(YYYY/MM/DD/HH/MIN). eg: 2017/04/27/10/*") 55 | parser.add_argument("--match", 56 | help="matching keyword. eg: noc or 'noc Login'") 57 | parser.add_argument("-e", 58 | help="exact match", action="store_true") 59 | parser.add_argument("-c", 60 | help="count", action="store_true") 61 | parser.add_argument("-s", 62 | help="sum", action="store_true") 63 | parser.add_argument("-v", 64 | help="verbose", action="store_true") 65 | parser.parse_args() 66 | 67 | args = parser.parse_args() 68 | 69 | exec(args) 70 | -------------------------------------------------------------------------------- /store_engine.py: -------------------------------------------------------------------------------- 1 | import configparser 2 | import os.path 3 | import sqlite3 4 | 5 | import datetime 6 | from distutils.dir_util import mkpath 7 | 8 | LOG_FILE = '/var/log/messages.1' 9 | BASE_DIR = '/var/tmp/data' 10 | CONFIG = '/path/to/config.ini' 11 | 12 | def main(): 13 | now = datetime.datetime.now() 14 | dir_path = '%d/%02d/%02d/%02d' % (now.year, now.month, now.day, now.hour) 15 | db_file = '%02d.db' % (now.minute) 16 | db_path = '%s/%s/%s' % (BASE_DIR, dir_path, db_file) 17 | 18 | dir_path = '%s/%s' %(BASE_DIR, dir_path) 19 | mkpath(dir_path) 20 | 21 | if os.path.exists(db_path): 22 | os.remove(db_path) 23 | conn = sqlite3.connect(db_path) 24 | conn.execute("CREATE VIRTUAL TABLE SYSLOG USING FTS3(LOGS)"); 25 | conn.execute("PRAGMA SYNCHRONOUS = OFF"); 26 | conn.execute("PRAGMA JOURNAL_MODE = MEMORY"); 27 | 28 | with open(LOG_FILE, "r", encoding="utf-8", errors='ignore') as fh: 29 | lines = [[line] for line in fh] 30 | 31 | try: 32 | conn.executemany('INSERT INTO SYSLOG VALUES( ? )', lines) 33 | except sqlite3.Error as e: 34 | print(e) 35 | else: 36 | conn.commit() 37 | 38 | if __name__ == '__main__': 39 | config = configparser.ConfigParser() 40 | config.read(CONFIG) 41 | 42 | LOG_FILE = config['path']['log-file'] 43 | BASE_DIR = config['path']['base-dir'] 44 | 45 | main() 46 | -------------------------------------------------------------------------------- /webui/README.md: -------------------------------------------------------------------------------- 1 | # Simple Hayabusa Web UI 2 | This is the Hayabusa Web UI using flask framework 3 | 4 | # Dependency softwares 5 | - Python 3 6 | - flask 7 | - flask-httpauth 8 | - Bootstrap3 9 | 10 | # WebUI image 11 | ![Hayabusa Architecture](./hayabusa-webui.png "hayabusa webui image") 12 | -------------------------------------------------------------------------------- /webui/app.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | import subprocess 4 | from datetime import datetime as dt 5 | 6 | from flask import Flask, request, render_template, jsonify, redirect, url_for 7 | # conda install -c conda-forge flask-httpauth 8 | from flask_httpauth import HTTPBasicAuth 9 | 10 | app = Flask(__name__) 11 | app.debug = True 12 | auth = HTTPBasicAuth() 13 | 14 | users = { 15 | "hayabusa" : "hayabusa" 16 | } 17 | 18 | result_file = '/var/tmp/result.log' 19 | search_engine_path = '/opt/hayabusa/search_engine.py' 20 | 21 | columns = ["syslog"] 22 | collection = [{columns[0] : ''}] 23 | 24 | 25 | class BaseDataTables: 26 | def __init__(self, request, columns, collection): 27 | self.columns = columns 28 | self.collection = collection 29 | 30 | # values specified by the datatable for filtering, sorting, paging 31 | self.request_values = request.values 32 | 33 | # results from the db 34 | self.result_data = None 35 | 36 | # total in the table after filtering 37 | self.cardinality_filtered = 0 38 | 39 | # total in the table unfiltered 40 | self.cadinality = 0 41 | 42 | self.run_queries() 43 | 44 | def output_result(self): 45 | output = {} 46 | 47 | aaData_rows = [] 48 | 49 | for row in self.result_data: 50 | aaData_row = [] 51 | for i in range(len(self.columns)): 52 | # print row, self.columns, self.columns[i] 53 | aaData_row.append(str(row[ self.columns[i] ]).replace('"','\\"')) 54 | aaData_rows.append(aaData_row) 55 | 56 | output['aaData'] = aaData_rows 57 | 58 | return output 59 | 60 | def run_queries(self): 61 | self.result_data = self.collection 62 | self.cardinality_filtered = len(self.result_data) 63 | self.cardinality = len(self.result_data) 64 | 65 | 66 | def getCollection(): 67 | tmp_file = '%s-%s' % (result_file, auth.username()) 68 | 69 | collection = [] 70 | if os.path.exists(tmp_file): 71 | file = open(tmp_file) 72 | collection = [{columns[0] : line.strip()} for line in file] 73 | file.close() 74 | else: 75 | collection = [{columns[0] : ''}] 76 | 77 | return collection 78 | 79 | @auth.get_password 80 | def get_pw(username): 81 | if username in users: 82 | return users.get(username) 83 | return None 84 | 85 | @app.route('/', methods=['GET']) 86 | def get(): 87 | tmp_file = '%s-%s' % (result_file, auth.username()) 88 | cmd = "/bin/rm %s" % (tmp_file) 89 | subprocess.call(cmd, shell=True) 90 | 91 | time = dt.now().strftime('%Y/%m/%d/%H/%M') 92 | return render_template('index_get.html', columns=columns, time=time) 93 | 94 | 95 | @auth.login_required 96 | def index(): 97 | tmp_file = '%s-%s' % (result_file, auth.username()) 98 | 99 | cmd = "/bin/rm %s" % (tmp_file) 100 | subprocess.call(cmd, shell=True) 101 | 102 | return render_template('index.html', columns=columns, username=auth.username()) 103 | 104 | @app.route('/dt') 105 | def get_server_data(): 106 | collection = getCollection() 107 | 108 | results = BaseDataTables(request, columns, collection).output_result() 109 | 110 | # return the results as a string for the datatable 111 | return json.dumps(results) 112 | 113 | @app.route('/post', methods=['POST']) 114 | def post(): 115 | print('do post') 116 | if request.method == 'POST': 117 | time = request.form['time'] 118 | keyword = request.form['keyword'] 119 | 120 | tmp_file = '%s-%s' % (result_file, auth.username()) 121 | #cmd = "%s -e --time %s --match %s | /bin/grep -v -e '^\s*#' -e '^\s*$' > %s" % (search_engine_path, time, keyword, tmp_file) 122 | cmd = "%s -e --time %s --match %s | sed '/^$/d' > %s" % (search_engine_path, time, keyword, tmp_file) 123 | subprocess.call(cmd, shell=True) 124 | 125 | return render_template('index.html', columns=columns, time=time, keyword=keyword, username=auth.username()) 126 | else: 127 | time = dt.now().strftime('%Y/%m/%d/%H/%M') 128 | return render_template('index_get.html', columns=columns, time=time) 129 | 130 | 131 | if __name__ == '__main__': 132 | app.jinja_env.auto_reload = True 133 | app.run(host="0.0.0.0", debug=True) 134 | -------------------------------------------------------------------------------- /webui/hayabusa-webui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirolovesbeer/hayabusa/d6ecea2ac1d624f4a3fabbbfb5ee265cf48f4a02/webui/hayabusa-webui.png -------------------------------------------------------------------------------- /webui/original/8823logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirolovesbeer/hayabusa/d6ecea2ac1d624f4a3fabbbfb5ee265cf48f4a02/webui/original/8823logo.gif -------------------------------------------------------------------------------- /webui/original/README.md: -------------------------------------------------------------------------------- 1 | # Origianl 8823 image 2 | ![Original 8823 UI](./original-8823-ui.png "8823 webui image") 3 | -------------------------------------------------------------------------------- /webui/original/hayabusa.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirolovesbeer/hayabusa/d6ecea2ac1d624f4a3fabbbfb5ee265cf48f4a02/webui/original/hayabusa.gif -------------------------------------------------------------------------------- /webui/original/hayabusa.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | サーチエンジン-はやぶさ- 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 |
13 |
14 |

手動サーチエンジンはやぶさ

15 | 16 |
17 | 18 |
19 | 33 | 34 | 35 | 41 | 42 |
現在の回答時間は約 43 | 1900日です。
44 | 45 | 50 | 51 | 52 | 53 |

-サーチエンジンはやぶさの特徴-

54 | 62 | 63 | 64 | -その流れ- 65 |
    66 |
  1. キーワードを入力します。 67 |
  2. ボタンを押すことによりキーワードが"はやぶさデータベースセンター" 68 | に送られます。 69 |
  3. 後はしばらく待つだけ。(通常1、2日)メールにより探し求めた 70 | ホームページのありかが分かります。 71 |
72 | 73 | -注意- 74 | 82 |
83 |
84 | 85 | 87 | 89 | 91 | 95 |
あなたのメールアドレスを入力して下さい。 86 |
検索するキーワードを入力して下さい。 88 |
返答のご希望などがありましたら入力して下さい。 90 |
イメージ検索 92 | ON 93 | OFF 94 |
96 | 97 | 98 | 99 | 103 | 104 |
100 | 101 | 102 |
105 |
106 | 107 | 108 | 109 | 110 | 111 |
112 | 本サイトは青少年向けコンテンツです。 113 |
info@8823.net
114 | 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /webui/original/original-8823-ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirolovesbeer/hayabusa/d6ecea2ac1d624f4a3fabbbfb5ee265cf48f4a02/webui/original/original-8823-ui.png -------------------------------------------------------------------------------- /webui/static/css/bootstrap-theme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2016 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | .btn-default, 7 | .btn-primary, 8 | .btn-success, 9 | .btn-info, 10 | .btn-warning, 11 | .btn-danger { 12 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); 13 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 14 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 15 | } 16 | .btn-default:active, 17 | .btn-primary:active, 18 | .btn-success:active, 19 | .btn-info:active, 20 | .btn-warning:active, 21 | .btn-danger:active, 22 | .btn-default.active, 23 | .btn-primary.active, 24 | .btn-success.active, 25 | .btn-info.active, 26 | .btn-warning.active, 27 | .btn-danger.active { 28 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 29 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 30 | } 31 | .btn-default.disabled, 32 | .btn-primary.disabled, 33 | .btn-success.disabled, 34 | .btn-info.disabled, 35 | .btn-warning.disabled, 36 | .btn-danger.disabled, 37 | .btn-default[disabled], 38 | .btn-primary[disabled], 39 | .btn-success[disabled], 40 | .btn-info[disabled], 41 | .btn-warning[disabled], 42 | .btn-danger[disabled], 43 | fieldset[disabled] .btn-default, 44 | fieldset[disabled] .btn-primary, 45 | fieldset[disabled] .btn-success, 46 | fieldset[disabled] .btn-info, 47 | fieldset[disabled] .btn-warning, 48 | fieldset[disabled] .btn-danger { 49 | -webkit-box-shadow: none; 50 | box-shadow: none; 51 | } 52 | .btn-default .badge, 53 | .btn-primary .badge, 54 | .btn-success .badge, 55 | .btn-info .badge, 56 | .btn-warning .badge, 57 | .btn-danger .badge { 58 | text-shadow: none; 59 | } 60 | .btn:active, 61 | .btn.active { 62 | background-image: none; 63 | } 64 | .btn-default { 65 | text-shadow: 0 1px 0 #fff; 66 | background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); 67 | background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); 68 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); 69 | background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); 70 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); 71 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 72 | background-repeat: repeat-x; 73 | border-color: #dbdbdb; 74 | border-color: #ccc; 75 | } 76 | .btn-default:hover, 77 | .btn-default:focus { 78 | background-color: #e0e0e0; 79 | background-position: 0 -15px; 80 | } 81 | .btn-default:active, 82 | .btn-default.active { 83 | background-color: #e0e0e0; 84 | border-color: #dbdbdb; 85 | } 86 | .btn-default.disabled, 87 | .btn-default[disabled], 88 | fieldset[disabled] .btn-default, 89 | .btn-default.disabled:hover, 90 | .btn-default[disabled]:hover, 91 | fieldset[disabled] .btn-default:hover, 92 | .btn-default.disabled:focus, 93 | .btn-default[disabled]:focus, 94 | fieldset[disabled] .btn-default:focus, 95 | .btn-default.disabled.focus, 96 | .btn-default[disabled].focus, 97 | fieldset[disabled] .btn-default.focus, 98 | .btn-default.disabled:active, 99 | .btn-default[disabled]:active, 100 | fieldset[disabled] .btn-default:active, 101 | .btn-default.disabled.active, 102 | .btn-default[disabled].active, 103 | fieldset[disabled] .btn-default.active { 104 | background-color: #e0e0e0; 105 | background-image: none; 106 | } 107 | .btn-primary { 108 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); 109 | background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); 110 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); 111 | background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); 112 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); 113 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 114 | background-repeat: repeat-x; 115 | border-color: #245580; 116 | } 117 | .btn-primary:hover, 118 | .btn-primary:focus { 119 | background-color: #265a88; 120 | background-position: 0 -15px; 121 | } 122 | .btn-primary:active, 123 | .btn-primary.active { 124 | background-color: #265a88; 125 | border-color: #245580; 126 | } 127 | .btn-primary.disabled, 128 | .btn-primary[disabled], 129 | fieldset[disabled] .btn-primary, 130 | .btn-primary.disabled:hover, 131 | .btn-primary[disabled]:hover, 132 | fieldset[disabled] .btn-primary:hover, 133 | .btn-primary.disabled:focus, 134 | .btn-primary[disabled]:focus, 135 | fieldset[disabled] .btn-primary:focus, 136 | .btn-primary.disabled.focus, 137 | .btn-primary[disabled].focus, 138 | fieldset[disabled] .btn-primary.focus, 139 | .btn-primary.disabled:active, 140 | .btn-primary[disabled]:active, 141 | fieldset[disabled] .btn-primary:active, 142 | .btn-primary.disabled.active, 143 | .btn-primary[disabled].active, 144 | fieldset[disabled] .btn-primary.active { 145 | background-color: #265a88; 146 | background-image: none; 147 | } 148 | .btn-success { 149 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); 150 | background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); 151 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); 152 | background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); 153 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); 154 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 155 | background-repeat: repeat-x; 156 | border-color: #3e8f3e; 157 | } 158 | .btn-success:hover, 159 | .btn-success:focus { 160 | background-color: #419641; 161 | background-position: 0 -15px; 162 | } 163 | .btn-success:active, 164 | .btn-success.active { 165 | background-color: #419641; 166 | border-color: #3e8f3e; 167 | } 168 | .btn-success.disabled, 169 | .btn-success[disabled], 170 | fieldset[disabled] .btn-success, 171 | .btn-success.disabled:hover, 172 | .btn-success[disabled]:hover, 173 | fieldset[disabled] .btn-success:hover, 174 | .btn-success.disabled:focus, 175 | .btn-success[disabled]:focus, 176 | fieldset[disabled] .btn-success:focus, 177 | .btn-success.disabled.focus, 178 | .btn-success[disabled].focus, 179 | fieldset[disabled] .btn-success.focus, 180 | .btn-success.disabled:active, 181 | .btn-success[disabled]:active, 182 | fieldset[disabled] .btn-success:active, 183 | .btn-success.disabled.active, 184 | .btn-success[disabled].active, 185 | fieldset[disabled] .btn-success.active { 186 | background-color: #419641; 187 | background-image: none; 188 | } 189 | .btn-info { 190 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 191 | background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 192 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); 193 | background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); 194 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); 195 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 196 | background-repeat: repeat-x; 197 | border-color: #28a4c9; 198 | } 199 | .btn-info:hover, 200 | .btn-info:focus { 201 | background-color: #2aabd2; 202 | background-position: 0 -15px; 203 | } 204 | .btn-info:active, 205 | .btn-info.active { 206 | background-color: #2aabd2; 207 | border-color: #28a4c9; 208 | } 209 | .btn-info.disabled, 210 | .btn-info[disabled], 211 | fieldset[disabled] .btn-info, 212 | .btn-info.disabled:hover, 213 | .btn-info[disabled]:hover, 214 | fieldset[disabled] .btn-info:hover, 215 | .btn-info.disabled:focus, 216 | .btn-info[disabled]:focus, 217 | fieldset[disabled] .btn-info:focus, 218 | .btn-info.disabled.focus, 219 | .btn-info[disabled].focus, 220 | fieldset[disabled] .btn-info.focus, 221 | .btn-info.disabled:active, 222 | .btn-info[disabled]:active, 223 | fieldset[disabled] .btn-info:active, 224 | .btn-info.disabled.active, 225 | .btn-info[disabled].active, 226 | fieldset[disabled] .btn-info.active { 227 | background-color: #2aabd2; 228 | background-image: none; 229 | } 230 | .btn-warning { 231 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 232 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 233 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); 234 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); 235 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); 236 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 237 | background-repeat: repeat-x; 238 | border-color: #e38d13; 239 | } 240 | .btn-warning:hover, 241 | .btn-warning:focus { 242 | background-color: #eb9316; 243 | background-position: 0 -15px; 244 | } 245 | .btn-warning:active, 246 | .btn-warning.active { 247 | background-color: #eb9316; 248 | border-color: #e38d13; 249 | } 250 | .btn-warning.disabled, 251 | .btn-warning[disabled], 252 | fieldset[disabled] .btn-warning, 253 | .btn-warning.disabled:hover, 254 | .btn-warning[disabled]:hover, 255 | fieldset[disabled] .btn-warning:hover, 256 | .btn-warning.disabled:focus, 257 | .btn-warning[disabled]:focus, 258 | fieldset[disabled] .btn-warning:focus, 259 | .btn-warning.disabled.focus, 260 | .btn-warning[disabled].focus, 261 | fieldset[disabled] .btn-warning.focus, 262 | .btn-warning.disabled:active, 263 | .btn-warning[disabled]:active, 264 | fieldset[disabled] .btn-warning:active, 265 | .btn-warning.disabled.active, 266 | .btn-warning[disabled].active, 267 | fieldset[disabled] .btn-warning.active { 268 | background-color: #eb9316; 269 | background-image: none; 270 | } 271 | .btn-danger { 272 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 273 | background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 274 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); 275 | background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); 276 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); 277 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 278 | background-repeat: repeat-x; 279 | border-color: #b92c28; 280 | } 281 | .btn-danger:hover, 282 | .btn-danger:focus { 283 | background-color: #c12e2a; 284 | background-position: 0 -15px; 285 | } 286 | .btn-danger:active, 287 | .btn-danger.active { 288 | background-color: #c12e2a; 289 | border-color: #b92c28; 290 | } 291 | .btn-danger.disabled, 292 | .btn-danger[disabled], 293 | fieldset[disabled] .btn-danger, 294 | .btn-danger.disabled:hover, 295 | .btn-danger[disabled]:hover, 296 | fieldset[disabled] .btn-danger:hover, 297 | .btn-danger.disabled:focus, 298 | .btn-danger[disabled]:focus, 299 | fieldset[disabled] .btn-danger:focus, 300 | .btn-danger.disabled.focus, 301 | .btn-danger[disabled].focus, 302 | fieldset[disabled] .btn-danger.focus, 303 | .btn-danger.disabled:active, 304 | .btn-danger[disabled]:active, 305 | fieldset[disabled] .btn-danger:active, 306 | .btn-danger.disabled.active, 307 | .btn-danger[disabled].active, 308 | fieldset[disabled] .btn-danger.active { 309 | background-color: #c12e2a; 310 | background-image: none; 311 | } 312 | .thumbnail, 313 | .img-thumbnail { 314 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 315 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 316 | } 317 | .dropdown-menu > li > a:hover, 318 | .dropdown-menu > li > a:focus { 319 | background-color: #e8e8e8; 320 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 321 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 322 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 323 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 324 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 325 | background-repeat: repeat-x; 326 | } 327 | .dropdown-menu > .active > a, 328 | .dropdown-menu > .active > a:hover, 329 | .dropdown-menu > .active > a:focus { 330 | background-color: #2e6da4; 331 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 332 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 333 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 334 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 335 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 336 | background-repeat: repeat-x; 337 | } 338 | .navbar-default { 339 | background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); 340 | background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); 341 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); 342 | background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); 343 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); 344 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 345 | background-repeat: repeat-x; 346 | border-radius: 4px; 347 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 348 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 349 | } 350 | .navbar-default .navbar-nav > .open > a, 351 | .navbar-default .navbar-nav > .active > a { 352 | background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 353 | background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 354 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); 355 | background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); 356 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); 357 | background-repeat: repeat-x; 358 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 359 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 360 | } 361 | .navbar-brand, 362 | .navbar-nav > li > a { 363 | text-shadow: 0 1px 0 rgba(255, 255, 255, .25); 364 | } 365 | .navbar-inverse { 366 | background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); 367 | background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); 368 | background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); 369 | background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); 370 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); 371 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 372 | background-repeat: repeat-x; 373 | border-radius: 4px; 374 | } 375 | .navbar-inverse .navbar-nav > .open > a, 376 | .navbar-inverse .navbar-nav > .active > a { 377 | background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); 378 | background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); 379 | background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); 380 | background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); 381 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); 382 | background-repeat: repeat-x; 383 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 384 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 385 | } 386 | .navbar-inverse .navbar-brand, 387 | .navbar-inverse .navbar-nav > li > a { 388 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); 389 | } 390 | .navbar-static-top, 391 | .navbar-fixed-top, 392 | .navbar-fixed-bottom { 393 | border-radius: 0; 394 | } 395 | @media (max-width: 767px) { 396 | .navbar .navbar-nav .open .dropdown-menu > .active > a, 397 | .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, 398 | .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { 399 | color: #fff; 400 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 401 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 402 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 403 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 404 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 405 | background-repeat: repeat-x; 406 | } 407 | } 408 | .alert { 409 | text-shadow: 0 1px 0 rgba(255, 255, 255, .2); 410 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 411 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 412 | } 413 | .alert-success { 414 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 415 | background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 416 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); 417 | background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); 418 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); 419 | background-repeat: repeat-x; 420 | border-color: #b2dba1; 421 | } 422 | .alert-info { 423 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 424 | background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 425 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); 426 | background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); 427 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); 428 | background-repeat: repeat-x; 429 | border-color: #9acfea; 430 | } 431 | .alert-warning { 432 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 433 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 434 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); 435 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); 436 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); 437 | background-repeat: repeat-x; 438 | border-color: #f5e79e; 439 | } 440 | .alert-danger { 441 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 442 | background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 443 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); 444 | background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); 445 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); 446 | background-repeat: repeat-x; 447 | border-color: #dca7a7; 448 | } 449 | .progress { 450 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 451 | background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 452 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); 453 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); 454 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); 455 | background-repeat: repeat-x; 456 | } 457 | .progress-bar { 458 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); 459 | background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); 460 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); 461 | background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); 462 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); 463 | background-repeat: repeat-x; 464 | } 465 | .progress-bar-success { 466 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); 467 | background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); 468 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); 469 | background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); 470 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); 471 | background-repeat: repeat-x; 472 | } 473 | .progress-bar-info { 474 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 475 | background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 476 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); 477 | background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); 478 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); 479 | background-repeat: repeat-x; 480 | } 481 | .progress-bar-warning { 482 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 483 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 484 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); 485 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); 486 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); 487 | background-repeat: repeat-x; 488 | } 489 | .progress-bar-danger { 490 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); 491 | background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); 492 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); 493 | background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); 494 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); 495 | background-repeat: repeat-x; 496 | } 497 | .progress-bar-striped { 498 | 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); 499 | 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); 500 | 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); 501 | } 502 | .list-group { 503 | border-radius: 4px; 504 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 505 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 506 | } 507 | .list-group-item.active, 508 | .list-group-item.active:hover, 509 | .list-group-item.active:focus { 510 | text-shadow: 0 -1px 0 #286090; 511 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); 512 | background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); 513 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); 514 | background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); 515 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); 516 | background-repeat: repeat-x; 517 | border-color: #2b669a; 518 | } 519 | .list-group-item.active .badge, 520 | .list-group-item.active:hover .badge, 521 | .list-group-item.active:focus .badge { 522 | text-shadow: none; 523 | } 524 | .panel { 525 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 526 | box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 527 | } 528 | .panel-default > .panel-heading { 529 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 530 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 531 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 532 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 533 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 534 | background-repeat: repeat-x; 535 | } 536 | .panel-primary > .panel-heading { 537 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 538 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 539 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 540 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 541 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 542 | background-repeat: repeat-x; 543 | } 544 | .panel-success > .panel-heading { 545 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 546 | background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 547 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); 548 | background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); 549 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); 550 | background-repeat: repeat-x; 551 | } 552 | .panel-info > .panel-heading { 553 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 554 | background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 555 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); 556 | background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); 557 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); 558 | background-repeat: repeat-x; 559 | } 560 | .panel-warning > .panel-heading { 561 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 562 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 563 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); 564 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); 565 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); 566 | background-repeat: repeat-x; 567 | } 568 | .panel-danger > .panel-heading { 569 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 570 | background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 571 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); 572 | background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); 573 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); 574 | background-repeat: repeat-x; 575 | } 576 | .well { 577 | background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 578 | background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 579 | background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); 580 | background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); 581 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); 582 | background-repeat: repeat-x; 583 | border-color: #dcdcdc; 584 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 585 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 586 | } 587 | /*# sourceMappingURL=bootstrap-theme.css.map */ 588 | -------------------------------------------------------------------------------- /webui/static/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2016 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{text-shadow:0 1px 0 #fff;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;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-color:#e8e8e8;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}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;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}.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);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;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);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;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 */ -------------------------------------------------------------------------------- /webui/static/css/bootstrap-theme.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":";;;;AAmBA,YAAA,aAAA,UAAA,aAAA,aAAA,aAME,YAAA,EAAA,KAAA,EAAA,eC2CA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBDvCR,mBAAA,mBAAA,oBAAA,oBAAA,iBAAA,iBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBCsCA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBDlCR,qBAAA,sBAAA,sBAAA,uBAAA,mBAAA,oBAAA,sBAAA,uBAAA,sBAAA,uBAAA,sBAAA,uBAAA,+BAAA,gCAAA,6BAAA,gCAAA,gCAAA,gCCiCA,mBAAA,KACQ,WAAA,KDlDV,mBAAA,oBAAA,iBAAA,oBAAA,oBAAA,oBAuBI,YAAA,KAyCF,YAAA,YAEE,iBAAA,KAKJ,aErEI,YAAA,EAAA,IAAA,EAAA,KACA,iBAAA,iDACA,iBAAA,4CAAA,iBAAA,qEAEA,iBAAA,+CCnBF,OAAA,+GH4CA,OAAA,0DACA,kBAAA,SAuC2C,aAAA,QAA2B,aAAA,KArCtE,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAgBN,aEtEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAiBN,aEvEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAkBN,UExEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,gBAAA,gBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,iBAAA,iBAEE,iBAAA,QACA,aAAA,QAMA,mBAAA,0BAAA,yBAAA,0BAAA,yBAAA,yBAAA,oBAAA,2BAAA,0BAAA,2BAAA,0BAAA,0BAAA,6BAAA,oCAAA,mCAAA,oCAAA,mCAAA,mCAME,iBAAA,QACA,iBAAA,KAmBN,aEzEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAoBN,YE1EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,kBAAA,kBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,mBAAA,mBAEE,iBAAA,QACA,aAAA,QAMA,qBAAA,4BAAA,2BAAA,4BAAA,2BAAA,2BAAA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,+BAAA,sCAAA,qCAAA,sCAAA,qCAAA,qCAME,iBAAA,QACA,iBAAA,KA2BN,eAAA,WClCE,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBD2CV,0BAAA,0BE3FI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GF0FF,kBAAA,SAEF,yBAAA,+BAAA,+BEhGI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GFgGF,kBAAA,SASF,gBE7GI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SH+HA,cAAA,ICjEA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBD6DV,sCAAA,oCE7GI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBD0EV,cAAA,iBAEE,YAAA,EAAA,IAAA,EAAA,sBAIF,gBEhII,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SHkJA,cAAA,IAHF,sCAAA,oCEhII,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBDgFV,8BAAA,iCAYI,YAAA,EAAA,KAAA,EAAA,gBAKJ,qBAAA,kBAAA,mBAGE,cAAA,EAqBF,yBAfI,mDAAA,yDAAA,yDAGE,MAAA,KE7JF,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,UFqKJ,OACE,YAAA,EAAA,IAAA,EAAA,qBC3HA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBDsIV,eEtLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAKF,YEvLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAMF,eExLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAOF,cEzLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAeF,UEjMI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFuMJ,cE3MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFwMJ,sBE5MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyMJ,mBE7MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0MJ,sBE9MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2MJ,qBE/MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+MJ,sBElLI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKFyLJ,YACE,cAAA,IC9KA,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBDgLV,wBAAA,8BAAA,8BAGE,YAAA,EAAA,KAAA,EAAA,QEnOE,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiOF,aAAA,QALF,+BAAA,qCAAA,qCAQI,YAAA,KAUJ,OCnME,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gBD4MV,8BE5PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyPJ,8BE7PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0PJ,8BE9PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2PJ,2BE/PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF4PJ,8BEhQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF6PJ,6BEjQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoQJ,MExQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFsQF,aAAA,QC3NA,mBAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} -------------------------------------------------------------------------------- /webui/static/css/jquery.dataTables.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Table styles 3 | */ 4 | table.dataTable { 5 | width: 100%; 6 | margin: 0 auto; 7 | clear: both; 8 | border-collapse: separate; 9 | border-spacing: 0; 10 | /* 11 | * Header and footer styles 12 | */ 13 | /* 14 | * Body styles 15 | */ 16 | } 17 | table.dataTable thead th, 18 | table.dataTable tfoot th { 19 | font-weight: bold; 20 | } 21 | table.dataTable thead th, 22 | table.dataTable thead td { 23 | padding: 10px 18px; 24 | border-bottom: 1px solid #111; 25 | } 26 | table.dataTable thead th:active, 27 | table.dataTable thead td:active { 28 | outline: none; 29 | } 30 | table.dataTable tfoot th, 31 | table.dataTable tfoot td { 32 | padding: 10px 18px 6px 18px; 33 | border-top: 1px solid #111; 34 | } 35 | table.dataTable thead .sorting, 36 | table.dataTable thead .sorting_asc, 37 | table.dataTable thead .sorting_desc { 38 | cursor: pointer; 39 | *cursor: hand; 40 | } 41 | table.dataTable thead .sorting, 42 | table.dataTable thead .sorting_asc, 43 | table.dataTable thead .sorting_desc, 44 | table.dataTable thead .sorting_asc_disabled, 45 | table.dataTable thead .sorting_desc_disabled { 46 | background-repeat: no-repeat; 47 | background-position: center right; 48 | } 49 | table.dataTable thead .sorting { 50 | background-image: url("../images/sort_both.png"); 51 | } 52 | table.dataTable thead .sorting_asc { 53 | background-image: url("../images/sort_asc.png"); 54 | } 55 | table.dataTable thead .sorting_desc { 56 | background-image: url("../images/sort_desc.png"); 57 | } 58 | table.dataTable thead .sorting_asc_disabled { 59 | background-image: url("../images/sort_asc_disabled.png"); 60 | } 61 | table.dataTable thead .sorting_desc_disabled { 62 | background-image: url("../images/sort_desc_disabled.png"); 63 | } 64 | table.dataTable tbody tr { 65 | background-color: #ffffff; 66 | } 67 | table.dataTable tbody tr.selected { 68 | background-color: #B0BED9; 69 | } 70 | table.dataTable tbody th, 71 | table.dataTable tbody td { 72 | padding: 8px 10px; 73 | } 74 | table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { 75 | border-top: 1px solid #ddd; 76 | } 77 | table.dataTable.row-border tbody tr:first-child th, 78 | table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, 79 | table.dataTable.display tbody tr:first-child td { 80 | border-top: none; 81 | } 82 | table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { 83 | border-top: 1px solid #ddd; 84 | border-right: 1px solid #ddd; 85 | } 86 | table.dataTable.cell-border tbody tr th:first-child, 87 | table.dataTable.cell-border tbody tr td:first-child { 88 | border-left: 1px solid #ddd; 89 | } 90 | table.dataTable.cell-border tbody tr:first-child th, 91 | table.dataTable.cell-border tbody tr:first-child td { 92 | border-top: none; 93 | } 94 | table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { 95 | background-color: #f9f9f9; 96 | } 97 | table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { 98 | background-color: #acbad4; 99 | } 100 | table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover { 101 | background-color: #f6f6f6; 102 | } 103 | table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected { 104 | background-color: #aab7d1; 105 | } 106 | table.dataTable.order-column tbody tr > .sorting_1, 107 | table.dataTable.order-column tbody tr > .sorting_2, 108 | table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, 109 | table.dataTable.display tbody tr > .sorting_2, 110 | table.dataTable.display tbody tr > .sorting_3 { 111 | background-color: #fafafa; 112 | } 113 | table.dataTable.order-column tbody tr.selected > .sorting_1, 114 | table.dataTable.order-column tbody tr.selected > .sorting_2, 115 | table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, 116 | table.dataTable.display tbody tr.selected > .sorting_2, 117 | table.dataTable.display tbody tr.selected > .sorting_3 { 118 | background-color: #acbad5; 119 | } 120 | table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { 121 | background-color: #f1f1f1; 122 | } 123 | table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { 124 | background-color: #f3f3f3; 125 | } 126 | table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { 127 | background-color: whitesmoke; 128 | } 129 | table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { 130 | background-color: #a6b4cd; 131 | } 132 | table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { 133 | background-color: #a8b5cf; 134 | } 135 | table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { 136 | background-color: #a9b7d1; 137 | } 138 | table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { 139 | background-color: #fafafa; 140 | } 141 | table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { 142 | background-color: #fcfcfc; 143 | } 144 | table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { 145 | background-color: #fefefe; 146 | } 147 | table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { 148 | background-color: #acbad5; 149 | } 150 | table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { 151 | background-color: #aebcd6; 152 | } 153 | table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { 154 | background-color: #afbdd8; 155 | } 156 | table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 { 157 | background-color: #eaeaea; 158 | } 159 | table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 { 160 | background-color: #ececec; 161 | } 162 | table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 { 163 | background-color: #efefef; 164 | } 165 | table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 { 166 | background-color: #a2aec7; 167 | } 168 | table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 { 169 | background-color: #a3b0c9; 170 | } 171 | table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 { 172 | background-color: #a5b2cb; 173 | } 174 | table.dataTable.no-footer { 175 | border-bottom: 1px solid #111; 176 | } 177 | table.dataTable.nowrap th, table.dataTable.nowrap td { 178 | white-space: nowrap; 179 | } 180 | table.dataTable.compact thead th, 181 | table.dataTable.compact thead td { 182 | padding: 4px 17px 4px 4px; 183 | } 184 | table.dataTable.compact tfoot th, 185 | table.dataTable.compact tfoot td { 186 | padding: 4px; 187 | } 188 | table.dataTable.compact tbody th, 189 | table.dataTable.compact tbody td { 190 | padding: 4px; 191 | } 192 | table.dataTable th.dt-left, 193 | table.dataTable td.dt-left { 194 | text-align: left; 195 | } 196 | table.dataTable th.dt-center, 197 | table.dataTable td.dt-center, 198 | table.dataTable td.dataTables_empty { 199 | text-align: center; 200 | } 201 | table.dataTable th.dt-right, 202 | table.dataTable td.dt-right { 203 | text-align: right; 204 | } 205 | table.dataTable th.dt-justify, 206 | table.dataTable td.dt-justify { 207 | text-align: justify; 208 | } 209 | table.dataTable th.dt-nowrap, 210 | table.dataTable td.dt-nowrap { 211 | white-space: nowrap; 212 | } 213 | table.dataTable thead th.dt-head-left, 214 | table.dataTable thead td.dt-head-left, 215 | table.dataTable tfoot th.dt-head-left, 216 | table.dataTable tfoot td.dt-head-left { 217 | text-align: left; 218 | } 219 | table.dataTable thead th.dt-head-center, 220 | table.dataTable thead td.dt-head-center, 221 | table.dataTable tfoot th.dt-head-center, 222 | table.dataTable tfoot td.dt-head-center { 223 | text-align: center; 224 | } 225 | table.dataTable thead th.dt-head-right, 226 | table.dataTable thead td.dt-head-right, 227 | table.dataTable tfoot th.dt-head-right, 228 | table.dataTable tfoot td.dt-head-right { 229 | text-align: right; 230 | } 231 | table.dataTable thead th.dt-head-justify, 232 | table.dataTable thead td.dt-head-justify, 233 | table.dataTable tfoot th.dt-head-justify, 234 | table.dataTable tfoot td.dt-head-justify { 235 | text-align: justify; 236 | } 237 | table.dataTable thead th.dt-head-nowrap, 238 | table.dataTable thead td.dt-head-nowrap, 239 | table.dataTable tfoot th.dt-head-nowrap, 240 | table.dataTable tfoot td.dt-head-nowrap { 241 | white-space: nowrap; 242 | } 243 | table.dataTable tbody th.dt-body-left, 244 | table.dataTable tbody td.dt-body-left { 245 | text-align: left; 246 | } 247 | table.dataTable tbody th.dt-body-center, 248 | table.dataTable tbody td.dt-body-center { 249 | text-align: center; 250 | } 251 | table.dataTable tbody th.dt-body-right, 252 | table.dataTable tbody td.dt-body-right { 253 | text-align: right; 254 | } 255 | table.dataTable tbody th.dt-body-justify, 256 | table.dataTable tbody td.dt-body-justify { 257 | text-align: justify; 258 | } 259 | table.dataTable tbody th.dt-body-nowrap, 260 | table.dataTable tbody td.dt-body-nowrap { 261 | white-space: nowrap; 262 | } 263 | 264 | table.dataTable, 265 | table.dataTable th, 266 | table.dataTable td { 267 | -webkit-box-sizing: content-box; 268 | box-sizing: content-box; 269 | } 270 | 271 | /* 272 | * Control feature layout 273 | */ 274 | .dataTables_wrapper { 275 | position: relative; 276 | clear: both; 277 | *zoom: 1; 278 | zoom: 1; 279 | } 280 | .dataTables_wrapper .dataTables_length { 281 | float: left; 282 | } 283 | .dataTables_wrapper .dataTables_filter { 284 | float: right; 285 | text-align: right; 286 | } 287 | .dataTables_wrapper .dataTables_filter input { 288 | margin-left: 0.5em; 289 | } 290 | .dataTables_wrapper .dataTables_info { 291 | clear: both; 292 | float: left; 293 | padding-top: 0.755em; 294 | } 295 | .dataTables_wrapper .dataTables_paginate { 296 | float: right; 297 | text-align: right; 298 | padding-top: 0.25em; 299 | } 300 | .dataTables_wrapper .dataTables_paginate .paginate_button { 301 | box-sizing: border-box; 302 | display: inline-block; 303 | min-width: 1.5em; 304 | padding: 0.5em 1em; 305 | margin-left: 2px; 306 | text-align: center; 307 | text-decoration: none !important; 308 | cursor: pointer; 309 | *cursor: hand; 310 | color: #333 !important; 311 | border: 1px solid transparent; 312 | border-radius: 2px; 313 | } 314 | .dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { 315 | color: #333 !important; 316 | border: 1px solid #979797; 317 | background-color: white; 318 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc)); 319 | /* Chrome,Safari4+ */ 320 | background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%); 321 | /* Chrome10+,Safari5.1+ */ 322 | background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%); 323 | /* FF3.6+ */ 324 | background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%); 325 | /* IE10+ */ 326 | background: -o-linear-gradient(top, white 0%, #dcdcdc 100%); 327 | /* Opera 11.10+ */ 328 | background: linear-gradient(to bottom, white 0%, #dcdcdc 100%); 329 | /* W3C */ 330 | } 331 | .dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { 332 | cursor: default; 333 | color: #666 !important; 334 | border: 1px solid transparent; 335 | background: transparent; 336 | box-shadow: none; 337 | } 338 | .dataTables_wrapper .dataTables_paginate .paginate_button:hover { 339 | color: white !important; 340 | border: 1px solid #111; 341 | background-color: #585858; 342 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111)); 343 | /* Chrome,Safari4+ */ 344 | background: -webkit-linear-gradient(top, #585858 0%, #111 100%); 345 | /* Chrome10+,Safari5.1+ */ 346 | background: -moz-linear-gradient(top, #585858 0%, #111 100%); 347 | /* FF3.6+ */ 348 | background: -ms-linear-gradient(top, #585858 0%, #111 100%); 349 | /* IE10+ */ 350 | background: -o-linear-gradient(top, #585858 0%, #111 100%); 351 | /* Opera 11.10+ */ 352 | background: linear-gradient(to bottom, #585858 0%, #111 100%); 353 | /* W3C */ 354 | } 355 | .dataTables_wrapper .dataTables_paginate .paginate_button:active { 356 | outline: none; 357 | background-color: #2b2b2b; 358 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c)); 359 | /* Chrome,Safari4+ */ 360 | background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); 361 | /* Chrome10+,Safari5.1+ */ 362 | background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); 363 | /* FF3.6+ */ 364 | background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); 365 | /* IE10+ */ 366 | background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); 367 | /* Opera 11.10+ */ 368 | background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%); 369 | /* W3C */ 370 | box-shadow: inset 0 0 3px #111; 371 | } 372 | .dataTables_wrapper .dataTables_paginate .ellipsis { 373 | padding: 0 1em; 374 | } 375 | .dataTables_wrapper .dataTables_processing { 376 | position: absolute; 377 | top: 50%; 378 | left: 50%; 379 | width: 100%; 380 | height: 40px; 381 | margin-left: -50%; 382 | margin-top: -25px; 383 | padding-top: 20px; 384 | text-align: center; 385 | font-size: 1.2em; 386 | background-color: white; 387 | background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); 388 | background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); 389 | background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); 390 | background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); 391 | background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); 392 | background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); 393 | } 394 | .dataTables_wrapper .dataTables_length, 395 | .dataTables_wrapper .dataTables_filter, 396 | .dataTables_wrapper .dataTables_info, 397 | .dataTables_wrapper .dataTables_processing, 398 | .dataTables_wrapper .dataTables_paginate { 399 | color: #333; 400 | } 401 | .dataTables_wrapper .dataTables_scroll { 402 | clear: both; 403 | } 404 | .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody { 405 | *margin-top: -1px; 406 | -webkit-overflow-scrolling: touch; 407 | } 408 | .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td { 409 | vertical-align: middle; 410 | } 411 | .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing, 412 | .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing { 413 | height: 0; 414 | overflow: hidden; 415 | margin: 0 !important; 416 | padding: 0 !important; 417 | } 418 | .dataTables_wrapper.no-footer .dataTables_scrollBody { 419 | border-bottom: 1px solid #111; 420 | } 421 | .dataTables_wrapper.no-footer div.dataTables_scrollHead table, 422 | .dataTables_wrapper.no-footer div.dataTables_scrollBody table { 423 | border-bottom: none; 424 | } 425 | .dataTables_wrapper:after { 426 | visibility: hidden; 427 | display: block; 428 | content: ""; 429 | clear: both; 430 | height: 0; 431 | } 432 | 433 | @media screen and (max-width: 767px) { 434 | .dataTables_wrapper .dataTables_info, 435 | .dataTables_wrapper .dataTables_paginate { 436 | float: none; 437 | text-align: center; 438 | } 439 | .dataTables_wrapper .dataTables_paginate { 440 | margin-top: 0.5em; 441 | } 442 | } 443 | @media screen and (max-width: 640px) { 444 | .dataTables_wrapper .dataTables_length, 445 | .dataTables_wrapper .dataTables_filter { 446 | float: none; 447 | text-align: center; 448 | } 449 | .dataTables_wrapper .dataTables_filter { 450 | margin-top: 0.5em; 451 | } 452 | } 453 | -------------------------------------------------------------------------------- /webui/static/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2016 Twitter, Inc. 4 | * Licensed under the MIT license 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); -------------------------------------------------------------------------------- /webui/static/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') -------------------------------------------------------------------------------- /webui/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 43 | 44 | 45 | 46 | 47 | 57 | 58 | 59 |
60 |
61 |
62 | Target time 63 | 64 |
65 |
66 | Search keyarod 67 | 68 |
69 | 70 |
71 |
72 | 73 |
74 | 75 | 76 | 77 | 78 | {% for col in columns %} 79 | 80 | {% endfor %} 81 | 82 | 83 |
{{ col }}
84 | 85 | 86 | -------------------------------------------------------------------------------- /webui/templates/index_get.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 43 | 44 | 45 | 46 | 47 | 57 | 58 | 59 |
60 |
61 |
62 | Target time 63 | 64 |
65 |
66 | Search keyarod 67 | 68 |
69 | 70 |
71 |
72 | 73 |
74 | 75 | 76 | 77 | 78 | {% for col in columns %} 79 | 80 | {% endfor %} 81 | 82 | 83 |
{{ col }}
84 | 85 | 86 | --------------------------------------------------------------------------------