diff --git a/cgi-bin/EngineDB/__pycache__/add_test_functions.cpython-36.pyc b/cgi-bin/EngineDB/__pycache__/add_test_functions.cpython-36.pyc new file mode 100644 index 0000000..5cf8ff7 Binary files /dev/null and b/cgi-bin/EngineDB/__pycache__/add_test_functions.cpython-36.pyc differ diff --git a/cgi-bin/EngineDB/__pycache__/base.cpython-36.pyc b/cgi-bin/EngineDB/__pycache__/base.cpython-36.pyc new file mode 100644 index 0000000..fb2958b Binary files /dev/null and b/cgi-bin/EngineDB/__pycache__/base.cpython-36.pyc differ diff --git a/cgi-bin/EngineDB/__pycache__/connect.cpython-36.pyc b/cgi-bin/EngineDB/__pycache__/connect.cpython-36.pyc new file mode 100644 index 0000000..131eea8 Binary files /dev/null and b/cgi-bin/EngineDB/__pycache__/connect.cpython-36.pyc differ diff --git a/cgi-bin/EngineDB/__pycache__/generic_hist.cpython-36.pyc b/cgi-bin/EngineDB/__pycache__/generic_hist.cpython-36.pyc new file mode 100644 index 0000000..5471830 Binary files /dev/null and b/cgi-bin/EngineDB/__pycache__/generic_hist.cpython-36.pyc differ diff --git a/cgi-bin/EngineDB/__pycache__/get_attach.cpython-36.pyc b/cgi-bin/EngineDB/__pycache__/get_attach.cpython-36.pyc new file mode 100644 index 0000000..ef60b23 Binary files /dev/null and b/cgi-bin/EngineDB/__pycache__/get_attach.cpython-36.pyc differ diff --git a/cgi-bin/EngineDB/__pycache__/home_page_list.cpython-36.pyc b/cgi-bin/EngineDB/__pycache__/home_page_list.cpython-36.pyc new file mode 100644 index 0000000..fd6d7ba Binary files /dev/null and b/cgi-bin/EngineDB/__pycache__/home_page_list.cpython-36.pyc differ diff --git a/cgi-bin/EngineDB/__pycache__/module_functions.cpython-36.pyc b/cgi-bin/EngineDB/__pycache__/module_functions.cpython-36.pyc new file mode 100644 index 0000000..0244ea7 Binary files /dev/null and b/cgi-bin/EngineDB/__pycache__/module_functions.cpython-36.pyc differ diff --git a/cgi-bin/EngineDB/__pycache__/settings.cpython-36.pyc b/cgi-bin/EngineDB/__pycache__/settings.cpython-36.pyc new file mode 100644 index 0000000..d7489f2 Binary files /dev/null and b/cgi-bin/EngineDB/__pycache__/settings.cpython-36.pyc differ diff --git a/cgi-bin/EngineDB/__pycache__/summary_functions.cpython-36.pyc b/cgi-bin/EngineDB/__pycache__/summary_functions.cpython-36.pyc new file mode 100644 index 0000000..3b69886 Binary files /dev/null and b/cgi-bin/EngineDB/__pycache__/summary_functions.cpython-36.pyc differ diff --git a/cgi-bin/EngineDB/add_board_info.py b/cgi-bin/EngineDB/add_board_info.py new file mode 100755 index 0000000..2bba12c --- /dev/null +++ b/cgi-bin/EngineDB/add_board_info.py @@ -0,0 +1,30 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list + +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +#card_id = form.getvalue('card_id') +serial_num = base.cleanCGInumber(form.getvalue('serial_num')) +board_id = base.cleanCGInumber(form.getvalue('board_id')) + +base.header(title='Add extra information about board') +base.top() + +home_page_list.add_board_info_form(serial_num, board_id) + +print('
') +print('
') +print('

List of All Boards

' ) +print('(Sorted by Serial Number)Successful Tests') +print('
') +print('
') + +home_page_list.render_list_module() + +base.bottom() + diff --git a/cgi-bin/EngineDB/add_board_info2.py b/cgi-bin/EngineDB/add_board_info2.py new file mode 100755 index 0000000..d796dd0 --- /dev/null +++ b/cgi-bin/EngineDB/add_board_info2.py @@ -0,0 +1,32 @@ +#!/usr/bin/python3 + +import cgi +import cgitb +import base +import module_functions +import os +import connect + +cgitb.enable() + +base_url = connect.get_base_url() + +print("Location: %s/summary.py\n\n"%(base_url)) +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +sn = base.cleanCGInumber(form.getvalue("serial_num")) +board_id = base.cleanCGInumber(form.getvalue("board_id")) +location = form.getvalue("location") +daqid = form.getvalue("daq_chip_id") +trig1id = form.getvalue("trigger_chip_1_id") +trig2id = form.getvalue("trigger_chip_2_id") +comments = cgi.escape(form.getvalue("comments")) + +base.header(title='Add Board Info') +base.top() + +module_functions.add_board_info(board_id, str(sn), location, daqid, trig1id, trig2id, comments) + +base.bottom() diff --git a/cgi-bin/EngineDB/add_init_test.py b/cgi-bin/EngineDB/add_init_test.py new file mode 100755 index 0000000..cbcca9a --- /dev/null +++ b/cgi-bin/EngineDB/add_init_test.py @@ -0,0 +1,30 @@ +#!/usr/bin/python3 + +import cgi +import base +import add_test_functions +import os + +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +label_applied = base.cleanCGInumber(form.getvalue("label_applied")) +database_entry = base.cleanCGInumber(form.getvalue("database_entry")) +label_legibility = base.cleanCGInumber(form.getvalue("label_legibility")) +power_cycle = base.cleanCGInumber(form.getvalue("power_cycle")) +tester = cgi.escape(form.getvalue("tester")) +serial_num = base.cleanCGInumber(form.getvalue("serial_num")) +comments = form.getvalue("comments") + +test_results = {"Label Applied": label_applied, "Database Entry": database_entry, "Label Legibility": label_legibility, "Power Cycle": power_cycle} + +if comments: + comments = cgi.escape(comments) + +base.header(title='Add Test') +base.top() + +test_id=add_test_functions.add_init_tests(serial_num, tester, test_results, comments) + +base.bottom() diff --git a/cgi-bin/EngineDB/add_module.py b/cgi-bin/EngineDB/add_module.py new file mode 100755 index 0000000..e8781fe --- /dev/null +++ b/cgi-bin/EngineDB/add_module.py @@ -0,0 +1,25 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Add a new module to HGCAL Wagon Test') +base.top() + +home_page_list.add_module_form() + +print('
') +print('
') +print('

List of All Boards

' ) +print('(Sorted by Serial Number)Successful Tests') +print('
') +print('
') + +home_page_list.render_list_module() + +base.bottom() + diff --git a/cgi-bin/EngineDB/add_module2.py b/cgi-bin/EngineDB/add_module2.py new file mode 100755 index 0000000..6fb7e22 --- /dev/null +++ b/cgi-bin/EngineDB/add_module2.py @@ -0,0 +1,71 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list +import connect +import os + +base_url = connect.get_base_url() + +print("Location: %s/summary.py\n\n" % base_url) + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Adding a new module...') +base.top() + +form = cgi.FieldStorage() + +if form.getvalue('serial_number'): + sn = (form.getvalue('serial_number')) + + home_page_list.add_module(sn) + + print('
') + print('
') + print('

List of All Boards

' ) + print('(Sorted by Serial Number)') + print('
') + print('
') + print('') + print('') + print('') + print('
') + print('
') + + print('

') + + + home_page_list.render_list_module() + + base.bottom() + + +else: + print('
') + print('
') + print('

FAILED. Enter SERIAL NUMBER

') + print('
') + print('
') + + home_page_list.add_module_form() + + + print('
') + print('
') + print('

List of All Boards

' ) + print('(Sorted by Serial Number)') + print('
') + print('
') + + print('

') + + home_page_list.render_list_module() + + base.bottom() + + + + diff --git a/cgi-bin/EngineDB/add_new_test_template.py b/cgi-bin/EngineDB/add_new_test_template.py new file mode 100755 index 0000000..f57dc2e --- /dev/null +++ b/cgi-bin/EngineDB/add_new_test_template.py @@ -0,0 +1,17 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list +import add_test_functions + + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Add New Test Template') +base.top() + +add_test_functions.add_new_test_template() + +base.bottom() diff --git a/cgi-bin/EngineDB/add_new_test_template2.py b/cgi-bin/EngineDB/add_new_test_template2.py new file mode 100755 index 0000000..da08347 --- /dev/null +++ b/cgi-bin/EngineDB/add_new_test_template2.py @@ -0,0 +1,27 @@ +#!/usr/bin/python3 + +import cgi +import base +import add_test_functions +import os +import connect + +base_url = connect.get_base_url() + +print("Location: %s/summary.py\n\n" % base_url) +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +test_name = cgi.escape(form.getvalue("test_name")) +required = base.cleanCGInumber(form.getvalue("required")) +test_desc_short = cgi.escape(form.getvalue("test_desc_short")) +test_desc_long = cgi.escape(form.getvalue("test_desc_long")) +password = cgi.escape(form.getvalue("password")) + +base.header(title='Add New Test Template') +base.top() + +test_id=add_test_functions.add_new_test(test_name, required, test_desc_short, test_desc_long, password) + +base.bottom() diff --git a/cgi-bin/EngineDB/add_new_user_ID.py b/cgi-bin/EngineDB/add_new_user_ID.py new file mode 100644 index 0000000..13968cf --- /dev/null +++ b/cgi-bin/EngineDB/add_new_user_ID.py @@ -0,0 +1,16 @@ +#!/usr/bin/python3 + +import cgi +import base +import module_functions +import os + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Add New User') +base.top() + +tests = module_functions.add_new_user_ID() + +base.bottom() diff --git a/cgi-bin/EngineDB/add_test.py b/cgi-bin/EngineDB/add_test.py new file mode 100755 index 0000000..d234a47 --- /dev/null +++ b/cgi-bin/EngineDB/add_test.py @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list +import add_test_functions + + +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +#card_id = form.getvalue('card_id') +serial_num = base.cleanCGInumber(form.getvalue('serial_num')) +suggested_test = base.cleanCGInumber(form.getvalue('suggested')) + +base.header(title='Add Test') +base.top() + +add_test_functions.add_test_template(serial_num, suggested_test) + +base.bottom() diff --git a/cgi-bin/EngineDB/add_test2.py b/cgi-bin/EngineDB/add_test2.py new file mode 100755 index 0000000..d2776ae --- /dev/null +++ b/cgi-bin/EngineDB/add_test2.py @@ -0,0 +1,49 @@ +#!/usr/bin/python3 + +import cgi +import base +import add_test_functions +import os +import connect + +base_url = connect.get_base_url() + +print("Location: %s/summary.py\n\n" % base_url) +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +person_id = base.cleanCGInumber(form.getvalue("person_id")) +test_type = base.cleanCGInumber(form.getvalue("test_type")) +serial_num = base.cleanCGInumber(form.getvalue("serial_number")) +success = base.cleanCGInumber(form.getvalue("success")) +comments = form.getvalue("comments") + +if comments: + comments = cgi.escape(comments) + +base.header(title='Add Test') +base.top() + +test_id=add_test_functions.add_test(person_id, test_type, serial_num, success, comments) + +for itest in [1]: + afile = form['attach%d'%(itest)] + if (afile.name): + adesc= form.getvalue("attachdesc%d"%(itest)) + if adesc: + adesc = cgi.escape(adesc) + acomment= form.getvalue("attachcomment%d"%(itest)) + if acomment: + acomment = cgi.escape(acomment) + add_test_functions.add_test_attachment(test_id,afile,adesc,acomment) + elif (afile.filename): + adesc= form.getvalue("attachdesc%d"%(itest)) + if adesc: + adesc = cgi.escape(adesc) + acomment= form.getvalue("attachcomment%d"%(itest)) + if acomment: + acomment = cgi.escape(acomment) + add_test_functions.add_test_attachment_gui(test_id,afile,adesc,acomment) + +base.bottom() diff --git a/cgi-bin/EngineDB/add_test_functions.py b/cgi-bin/EngineDB/add_test_functions.py new file mode 100755 index 0000000..e19e04c --- /dev/null +++ b/cgi-bin/EngineDB/add_test_functions.py @@ -0,0 +1,517 @@ +#!/usr/bin/python3 +from connect import connect, connect_admin +#import mysql.connector +import base +import cgi, os +import cgitb; cgitb.enable() +import settings +import json + + +# Adds a new user to the DB +def add_new_user_ID(): + pass + + + +# Returns the JSONs for a specified test ID +def get_test_attachments(test_ID): + db = connect(0) + cur = db.cursor() + + cur.execute("SELECT attach FROM Attachments,Test WHERE Attachments.test_id=Test.test_id AND Test.test_type_id={};".format(test_ID)) + + all_attachments = cur.fetchall() + + decoded_attachments = [] + for attachment in all_attachments: + decoded_attachments.append(json.loads(attachment[0].decode('UTF-8'))) + + return decoded_attachments + + +# Returns the datetime objects for all of the completed tests + # If issues, check if returning a tuple +def get_test_completion_times(): + db = connect(0) + cur = db.cursor() + + cur.execute("SELECT day FROM Test;") + + all_test_times = cur.fetchall() + + if not all_test_times: + print("Uh oh... there were no test times to be received") + + return all_test_times + + +# Returns the datetime objects for all of the successful tests + # If issues, check if returning a tuple +def get_successful_times(): + + db = connect(0) + cur = db.cursor() + + cur.execute("SELECT day FROM Test WHERE successful = 1;") + successful_tests = cur.fetchall() + + if not successful_tests: + print("Uh oh... there were no successful test times to be received") + + return successful_tests + + +def verify_person(name): + db = connect(0) + cur = db.cursor() + + cur.execute("SELECT person_id FROM People WHERE person_name = '%s'"%name) + people = cur.fetchone() + + if not people: + print("Could not find tester") + return "INVALID_TESTER" + + else: + print(people) + return people + + +def is_new_board(serial_number): + db = connect(0) + cur = db.cursor() + + is_new_board_bool = False + + + cur.execute("SELECT board_id FROM Board WHERE full_id = {}".format(serial_number)) + board_matching_sn = cur.fetchone() + + if not board_matching_sn: + is_new_board_bool = True + + return is_new_board_bool + + + + + +def get_usernames(): + db = connect(0) + cur = db.cursor() + + cur.execute("SELECT person_name FROM People") + people = cur.fetchall() + + if not people: + print("Could not find any testers") + + else: + return people + + +def get_test_completion_status(serial_num): + db = connect(0) + cur = db.cursor() + + # TODO + cur.execute("SELECT board_id FROM Board WHERE full_id = %" %{"n":serial_num}) + board_ID = cur.fetchone() + + if not board_ID: + return False + else: + return True + + +def get_previous_test_results(serial_num): + + db = connect(0) + cur = db.cursor() + # TODO + cur.execute("SELECT board_id FROM Board WHERE full_id = {}".format(serial_num)) + board_id = cur.fetchone()[0] + cur.execute("SELECT test_type_id, successful FROM Test WHERE board_id = {}".format( board_id)) + test_results_list = cur.fetchall() + + + if not test_results_list: + print("Uh oh... it looks like there is no previous test results") + + # 2D results list is returned + # Test Type in COL 1 and Pass/Fail in COL 2 + + return test_results_list + + + + +def add_test(person_id, test_type, serial_num, success, comments): + if success: + success = 1 + else: + success = 0 + + db = connect(1) + cur = db.cursor() + + if type(person_id) == type(""): + person_id = verify_person(person_id) + + if serial_num: + cur.execute("SELECT board_id FROM Board WHERE full_id = {}".format(serial_num)) + row = cur.fetchone() + print("The Card_ID=", row[0]) + card_id = row[0] + + sql="INSERT INTO Test (person_id, test_type_id, board_id, successful, comments, day) VALUES (%s,%s,%s,%s,%s,NOW())" + # This is safer because Python takes care of escaping any illegal/invalid text + items=(person_id,test_type,card_id,success,comments) + cur.execute(sql,items) + test_id = cur.lastrowid + + print(test_id) + + db.commit() + + return test_id + + else: + print('
') + print('
') + print('

Attempt Failed. Please Specify Testers Name

') + print('
') + print('
') + + # add_test_template(serial_num) + + +# Adds a tester person +def add_tester(person_name, passwd): + try: + db = connect_admin(passwd) + except Exception as e: + print(e) + print("Administrative access denied") + return + cur = db.cursor() + + if person_name: + sql="INSERT INTO People (person_name) VALUES ('%s')"%person_name + print(sql) + # This is safer because Python takes care of escaping any illegal/invalid text + items=(person_name) + cur.execute(sql) + + print("%s"%(person_name)) + + db.commit() + + else: + print('
') + print('
') + print('

Attempt Failed. Please Specify Serial Number

') + print('
') + print('
') + +def add_board_type(name, type_sn, required_tests, passwd): + + try: + db = connect_admin(passwd) + except Exception as e: + print(e) + print("Administrative access denied") + return + cur = db.cursor() + + if name: + sql="INSERT INTO Board_type (name, type_sn) VALUES ('%s', '%s')"%(name, type_sn) + print(sql) + # This is safer because Python takes care of escaping any illegal/invalid text + cur.execute(sql) + + db.commit() + + # Query for test type and board type ID's to place in the stitch table + cur.execute("SELECT type_id FROM Board_type WHERE name = '%s'"%(name)) + board_id = cur.fetchone()[0] + + for req in required_tests: + + sql = "INSERT INTO Type_test_stitch (type_id, test_type_id) VALUES ({}, {})".format(board_id, req) + cur.execute(sql) + + db.commit() + + else: + print('
') + print('
') + print('

Attempt Failed. Please Specify Serial Number

') + print('
') + print('
') + + +def add_new_test(test_name, required, test_desc_short, test_desc_long, relative_order, passwd): + try: + db = connect_admin(passwd) + except Exception: + print("Administrative access denied") + cur = db.cursor() + + if test_name and required and test_desc_short and test_desc_long: + sql="INSERT INTO Test_Type (name, required, desc_short, desc_long, relative_order) VALUES ('%s', '%s', '%s', '%s', '%s')"%(test_name, required, test_desc_short, test_desc_long, relative_order) + print(sql) + # This is safer because Python takes care of escaping any illegal/invalid text + cur.execute(sql) + + db.commit() + + else: + print('
') + print('
') + print('

Attempt Failed. Please Specify Serial Number

') + print('
') + print('
') + +def add_init_tests(serial_num, tester, test_results, comments): + db = connect(1) + cur = db.cursor() + + if serial_num and tester: + cur.execute("SELECT board_id FROM Board WHERE full_id = %(n)d" %{"n":serial_num}) + row = cur.fetchone() + card_id = row[0] + + cur.execute("SELECT person_id FROM People WHERE person_name = '%s'" % (tester)) + + row = cur.fetchone() + person_id = row[0] + + test_ids = [] + + for x in test_results.items(): + cur.execute("SELECT test_type FROM Test_Type WHERE name = '%s'" % (x[0])) + row = cur.fetchone() + test_type_id = row[0] + + sql="INSERT INTO Test (person_id, test_type_id, board_id, successful, comments, day) VALUES (%s,%s,%s,%s,%s,NOW())" + items=(person_id,test_type_id,card_id,x[1],comments) + cur.execute(sql,items) + test_ids.append(cur.lastrowid) + + db.commit() + + return test_ids + else: + print('
') + print('
') + print('

Attempt Failed. Please Specify Serial Number and Tester

') + print('
') + print('
') + + #add_test_template(serial_num) + +def add_test_attachment(test_id, afile, desc, comments): + print("Adding attachment...") + if afile.filename: + db = connect(1) + cur = db.cursor() + originalname = os.path.basename(afile.name) + + f = afile.file.read().decode('utf-8') + + cur.execute("INSERT INTO Attachments (test_id,attach,attachmime,attachdesc,comments,originalname) VALUES (%s,%s,%s,%s,%s,%s)", + (test_id,f,afile.type,desc,comments,originalname)); + att_id=cur.lastrowid + db.commit() + #ofn=settings.getAttachmentPathFor(int(test_id),int(att_id)); + #sub_path = os.path.dirname(ofn) + #if not os.path.exists(sub_path): + # os.mkdir(sub_path) + #open(ofn,'wb').write(afile.file.read()) + print('
The file %s was uploaded successfully.
' % (originalname)) + +def add_test_template(serial_number, suggested_test): + db = connect(0) + cur = db.cursor() + + print('
') + print('' % (serial_number)) + print('
') + print('
') + print('

Add Test for Card %d

' %serial_number) + print('
') + print('
') + + #print('

') + + cur.execute("Select person_id, person_name from People;") + + print('
') + print('
') + print('') + print('
') + cur.execute("select test_type, name from Test_Type order by relative_order ASC;") + print('
') + print('') + print('
') + print('
') + #print '

' + + #print '
' + #print '
' + #print '' + #print '
' + #print '
' + + #print('

') + + print('
') + print('
') + print('') + print('
') + print('
') + print('

') + print('') + print('

') + print('
') + + #print('

') + print('
') + print('
') + print('') + print('
') + print('
') + for iattach in (1,2,3): + print('


' ) + print('
') + print('
') + print("Attachment %d:" % (iattach)) + print('
') + print(""% (iattach) ) + print('
') + print(" "% (iattach) ) + print('
') + print('
') + print('
') + print('
') + print('') + print('' % (iattach) ) + print('
') + print('
') + + #print('



') + + print('
') + print('
') + print('') + print('
') + print('
') + + #print('



') + + print('
') + +def add_new_test_template(): + print('
') + print('
') + print('
') + print('

Add New Test Template

') + print('
') + print('
') + + print('
') + print('
') + print('

') + print('') + print('

') + + print('
') + print('') + print('') + print('
') + print('
') + + print('
') + print('
') + print('

') + print('') + print('

') + print('
') + + print('
') + print('
') + print('

') + print('') + print('

') + print('
') + + print("
") + print('
') + print("") + print("") + print("
") + print("
") + + print('
') + print('
') + print('') + print('
') + print('
') + + print('
') + +def add_tester_template(): + print('
') + print('
') + print('
') + print('

Add New Tester

') + print('
') + print('
') + + print('
') + print('
') + print('

') + print('') + print('

') + + print("
") + print('
') + print("") + print("") + print("
") + print("
") + + print("
") + print('
') + print('') + print('
') + print('
') + + print('') diff --git a/cgi-bin/EngineDB/add_test_functions.pyc b/cgi-bin/EngineDB/add_test_functions.pyc new file mode 100644 index 0000000..60705c6 Binary files /dev/null and b/cgi-bin/EngineDB/add_test_functions.pyc differ diff --git a/cgi-bin/EngineDB/add_test_json.py b/cgi-bin/EngineDB/add_test_json.py new file mode 100755 index 0000000..dc3079e --- /dev/null +++ b/cgi-bin/EngineDB/add_test_json.py @@ -0,0 +1,165 @@ +#!/usr/bin/python3 + +import connect +import json +import cgi +import base +import add_test_functions + +def parse_data(form): + try: + serial = (form.getvalue('serial_num')) + print("serial_num:", serial) + + # board_type is a str + board_type = str(serial)[4:10] + print("board_type:", board_type) + tester = cgi.escape(form.getvalue('tester')) + print("tester:", tester) + + # test_type is an integer + test_type = int(cgi.escape(form.getvalue('test_type'))) + print("test_type:", test_type) + successful = base.cleanCGInumber(form.getvalue('successful')) + print("successful:", successful) + comments = cgi.escape(form.getvalue('comments')) + print("comments:", comments) + + try: + data = form.getvalue('data') + except Exception as e: + print(e) + print("Data could not be retrieved from the JSON") + + except KeyError: + print('Json must contain at least the following entries:\nserial\nboard_type\ntester\ntest\nsucessful\ncomments\n\nPlease double check your json file for these fields') + + db = connect.connect(0) + cur = db.cursor() + + cur.execute('SELECT person_id, person_name FROM People;') + + user_dict = cur.fetchall() + + person_id = 123 + valid_tester = False + for i in user_dict: + if i[1].lower() == tester.lower(): + valid_tester = True + person_id = i[0] + + + if not valid_tester: + print("Invalid tester (for writting priveldges, please access DB administrators)") + return None + + + #################### + # Tester has been verified + #################### + + cur.execute('SELECT test_type, name FROM Test_Type;') + test_dict0 = cur.fetchall() + + test_name = "" + valid_test = False + for i in test_dict0: + print("Current index value:", i, " ") + if int(i[0]) == test_type: + test_name = str(i[1]) + valid_test = True + + + # test_type_data = [(x,y) for x,y in cur if y.lower() == test.lower()] + + if not valid_test: + print("Invalid test type, see Wagon DB webpage for valid test types") + return None + + #################### + # Test type has been verified + #################### + + + cur.execute('SELECT type_sn FROM Board_type;') + type_id_dict = cur.fetchall() + + + valid_board_ID = False + + for i in type_id_dict: + if i[0] == board_type: + valid_board_ID = True + + + if not valid_board_ID: + print('Please enter a valid board type id') + print("Board_type", board_type) + # return None + + if comments == "": + print("Please enter comments for this test") + return None + + + ####################### + # Valid Test Board + ####################### + + + + cur.execute('SELECT type_id, test_type_id FROM Type_test_stitch WHERE type_id = %s AND test_type_id = %s;' % (board_type, test_type)) + + if not cur: + print('Invalid test for this board type. Check the DB webpage for valid tests') + return None + + + + # Creates outpur + test_dict = {'serial_num': serial, 'board_type': board_type, 'tester': tester, 'person_id': person_id, 'test': test_name, 'test_type': test_type, 'successful': successful, 'comments': comments} + + + print(" RETURNING TEST_DICT ") + return test_dict + + + + + +################################################################## + + + + +base_url = connect.get_base_url() + +#cgi header +print("Content-type: text/html\n") + +base.header(title="Add Test From JSON") +base.top() + +form = cgi.FieldStorage() +test_dict = parse_data(form) + +test_id = add_test_functions.add_test(test_dict['person_id'], test_dict['test_type'], test_dict['serial_num'], test_dict['successful'], test_dict['comments']) + + +for itest in range(1,4): + if not form.getvalue('attach%d'%(itest)): continue + afile = form['attach%d'%(itest)] + filename = form.getvalue('attachname%d'%(itest)) + if (afile.filename): + adesc= form.getvalue("attachdesc%d"%(itest)) + if adesc: + adesc = cgi.escape(adesc) + acomment= form.getvalue("attachcomment%d"%(itest)) + if acomment: + acomment = cgi.escape(acomment) + add_test_functions.add_test_attachment(test_id,afile,adesc,acomment) + +base.bottom() + +#print(test_dict) + diff --git a/cgi-bin/EngineDB/add_tester.py b/cgi-bin/EngineDB/add_tester.py new file mode 100755 index 0000000..1ba7422 --- /dev/null +++ b/cgi-bin/EngineDB/add_tester.py @@ -0,0 +1,16 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list +import add_test_functions + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Add Tester') +base.top() + +add_test_functions.add_tester_template() + +base.bottom() diff --git a/cgi-bin/EngineDB/add_tester2.py b/cgi-bin/EngineDB/add_tester2.py new file mode 100755 index 0000000..4882bda --- /dev/null +++ b/cgi-bin/EngineDB/add_tester2.py @@ -0,0 +1,26 @@ +#!/usr/bin/python3 + +import cgi +import base +import add_test_functions +import os +import connect + +base_url = connect.get_base_url() + +print("Location: %s/testers.py\n\n" % base_url) +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +person_name = cgi.escape(form.getvalue("person_name")) +password = cgi.escape(form.getvalue("password")) + +base.header(title='Add Tester') +base.top() + + +print(person_name) +test_id=add_test_functions.add_tester(person_name, password) + +base.bottom() diff --git a/cgi-bin/EngineDB/analytics.py b/cgi-bin/EngineDB/analytics.py new file mode 100755 index 0000000..3811223 --- /dev/null +++ b/cgi-bin/EngineDB/analytics.py @@ -0,0 +1,177 @@ +#!/usr/bin/python3 + +import datetime +import os, sys +import cgi +import cgitb +import pylab +### Begin Comment Out For Server ### +import numpy as np +import matplotlib +import matplotlib.pyplot as plt +### End Comment Out For Server ### +import base +import add_test_functions + +cgitb.enable() + +# chose a non-GUI backend +# matplotlib.use( 'Agg' ) +print("Content-type: text/html\n") + +base.header(title='Analytics') +base.top() + + +form = cgi.FieldStorage() + + +####################################################### + + +total_tests_w_times = add_test_functions.get_test_completion_times() +successful_tests_w_times = add_test_functions.get_successful_times() +new_date_time = [] + +oldest_day = datetime.datetime(year = total_tests_w_times[0][0].year, month = total_tests_w_times[0][0].month, day = total_tests_w_times[0][0].day) +newest_day = datetime.datetime(year = total_tests_w_times[-1][0].year, month = total_tests_w_times[-1][0].month, day = total_tests_w_times[-1][0].day) + +# Split the boards by timeframes +tests_in_intervals = [] +successful_in_intervals = [] + + + +########## For Total Tests ########## +# Find the range of days (newest_day - oldest_day) +day_range = (total_tests_w_times[-1][0] - oldest_day).days + 1 + + +# List of the difference in days from first test until current test for each test +diff_in_days_vals = [] +for item in total_tests_w_times: + diff_in_days_vals.append((item[0]-oldest_day).days) + +########## For Total Tests ########## + + + + +########## For Successful Tests ########## + +# List of the difference in days from first test until current test for each test +diff_in_days_vals_success = [] +for item in successful_tests_w_times: + diff_in_days_vals_success.append((item[0]-oldest_day).days) + +########## For Successful Tests ########## + +########## Creating Bins ########## + +bin_list = [] +temp_month = oldest_day.month +temp_day = oldest_day.day +temp_year = oldest_day.year +datetime_diff = newest_day - oldest_day +day_diff = int(datetime_diff / datetime.timedelta(days = 1)) +for index in range(day_diff + 1): + try: + bin_time_str = "{Month}-{Day}-{Year}".format(Year = temp_year, Month = temp_month, Day = temp_day) + temp_bin_time = datetime.datetime.strptime(bin_time_str, '%m-%d-%Y') + bin_list.append(bin_time_str) + except: + if temp_month >= 12: + temp_month = 1 + temp_year += 1 + temp_day = 1 + else: + temp_month += 1 + temp_day = 1 + bin_time_str = "{Month}-{Day}-{Year}".format(Year = temp_year, Month = temp_month, Day = temp_day) + bin_list.append(bin_time_str) + temp_day += 1 +print(bin_list) + +########## Creating Bins ########## +hist_list = [] +hist_list.append(diff_in_days_vals) +hist_list.append(diff_in_days_vals_success) + +#TODO more elegant +num_bins = day_range +bin_edge_list = [] +for i in range(num_bins+1): + bin_edge_list.append(i) + +# Consider finding a different way to establish bins so dates are on the x-axis. +print("HIST", hist_list, "NUM", num_bins, "LEN", len(bin_list)) +plt.hist(hist_list, bin_edge_list, density=False, histtype='bar', label=['Tests Completed', 'Tests Successful']) +plt.legend(prop={'size': 12}) +plt.title("Completed Tests vs. Successful Tests per Day") +plt.xlabel('Date') +plt.xticks(np.arange(0.5,len(bin_list)+0.5, 1), labels = bin_list) +plt.xlim(0,len(bin_list)) +plt.ylabel("Number of Tests") +plt.grid(True) +#plt.show() +plt.savefig('../static/files/completed_vs_successful.png') + +####################################################### +plt.close() +####################################################### + + +# Fetches a list of datetime objects +test_times_datetime = add_test_functions.get_test_completion_times() + +# Find the range of days (newest_day - oldest_day) +num_days = (test_times_datetime[-1][0] - oldest_day).days + 1 + +# List of the difference in days from first test until current test for each test +day_vals = [] +for item in test_times_datetime: + day_vals.append((item[0]-oldest_day).days) + +# Creates a list of the number of tests completed by a certain date +total_completed_by_time = [] +for i in range(0,num_days): + temp = 0 + for val in day_vals: + # Increases the number of completed tests if the difference in days is less than the day (number) associated with the respective bin + if val <= i: + temp = temp + 1 + # Appends the value of the number of tests completed to the list + total_completed_by_time.append(temp) + +print("TOTAL_Completed", total_completed_by_time) +plt.plot(total_completed_by_time) +plt.title("Total Number of Completed Tests vs. Time") +plt.xlabel('Date') +locs, labels = plt.xticks() +plt.xticks(np.arange(0,len(bin_list), 1), labels = bin_list) +plt.grid(True) +plt.ylabel('Total Tests Completed') + +plt.savefig('../static/files/completed_over_time.png') + + + +######################################################## + + +print('') + +print('') + + + + +base.bottom() + + + + + + + + diff --git a/cgi-bin/EngineDB/base.py b/cgi-bin/EngineDB/base.py new file mode 100755 index 0000000..dfae7c9 --- /dev/null +++ b/cgi-bin/EngineDB/base.py @@ -0,0 +1,256 @@ +#!/usr/bin/python3 + +import re +import sys +import connect + +def header(title=''): + print('') + print('') + print('') + if len(sys.argv) == 1: + print('') + print('') + #print('') + #print('') + else: + print('') + print('') + #print('') + #print('') + print(' %s ' %title) + print('') + +def top(): + print('') + print('''
+
+
+ ''') + if len(sys.argv) == 1: + print(''' +

HGCAL Board Test

+
+ ''') + print('''
+
Maintained by the University of Minnesota CMS Group
+
+
+
+ +
+
+
+ ''') + else: + print(''' +

HGCAL Board Test

+
+ ''') + + print('''
+
Maintained by the University of Minnesota CMS Group
+
+
+
+ +
+ + + ''') + if len(sys.argv) == 1: + print(''' +'''%connect.get_db_name()) + + else: + print(''' +'''%connect.get_db_name()) + +def bottom(): + + if len(sys.argv) == 1: + print(''' +''') + else: + print(''' +''') + + print('') + print('') + print('') + print('') + +def cleanCGInumber(cgitext): + if cgitext is None: + return 0 + return int(re.sub('[^0-9]','',cgitext)) + diff --git a/cgi-bin/EngineDB/base.pyc b/cgi-bin/EngineDB/base.pyc new file mode 100644 index 0000000..96f2f8d Binary files /dev/null and b/cgi-bin/EngineDB/base.pyc differ diff --git a/cgi-bin/EngineDB/bert_analytics.py b/cgi-bin/EngineDB/bert_analytics.py new file mode 100755 index 0000000..ad1a711 --- /dev/null +++ b/cgi-bin/EngineDB/bert_analytics.py @@ -0,0 +1,120 @@ +#!/usr/bin/python3 + + +import os, sys +import cgi +import cgitb +import pylab +import json + +import matplotlib +import matplotlib.pyplot as plt +import numpy as np + +import base +import add_test_functions + +def create_generic_hist(attachments1, title, number_val, stats): + + # Handles one value under graph_title in 'module 1' + graph_title = title + + values = [] + for attachment in attachments1: + if not attachment[str(number_val)] == None: + if not attachment[str(number_val)][graph_title] == None: + values.append(attachment[str(number_val)][graph_title]) + + + # if no values, can't make graph, so return + if len(values) == 0: + return + + + step = 10 + num_of_bins = 15 + + if not (max(values) - min(values)) == 0: + step = round(max(values) - min(values)) / num_of_bins + + + start = np.floor(min(values) / step) * step + stop = max(values) + step + bin_edges = np.arange(start, stop, step=step) + + + plt.hist(values, bins=bin_edges, density=False, histtype='bar') + plt.xlabel(graph_title + " Values") + plt.ylabel('Occurances') + full_title = graph_title + " " + str(number_val) + " Values" + plt.title(full_title) + plt.grid(True) + plt.xticks(np.arange(start, stop, step = step), rotation = 90) + + plt.tight_layout() + + plt.savefig('../static/files/bert/{0}_{1}.png'.format(graph_title, number_val)) + plt.close() + + + print(''.format(graph_title, number_val)) + + + add_to_stats(stats, full_title, values) + +# Adds statistics to the "stats" python dictionary +def add_to_stats(stats, full_title, values): + mean = sum(values) / len(values) + stand_deviation = np.std(values) + + stats['{}'.format(full_title)] = { + 'STD': stand_deviation, + 'range': max(values) - min(values), + 'mean': mean, + 'max': max(values), + 'min': min(values), + 'passing_range': ( mean - stand_deviation, mean + stand_deviation ) + } + + +#############End of Functions########################## + + + +cgitb.enable() + +# chose a non-GUI backend +# matplotlib.use( 'Agg' ) +print("Content-type: text/html\n") + +base.header(title='Analytics') +base.top() + + +form = cgi.FieldStorage() + +# Gets the attachment from the DB +attachments4 = add_test_functions.get_test_attachments(4) +stats = {'analytic_type': "Bit Error Rate Test"} + +######################################################## + +for index in range(1, 11): + create_generic_hist(attachments4, 'Midpoint', index, stats) + create_generic_hist(attachments4, 'Eye Opening', index, stats) + +######################################################## + +print(json.dumps(stats, indent = 4)) + +with open('../static/files/bert/bert_stats.json', 'w') as open_file: + json.dump(stats, open_file, indent = 4) + +# TODO Actually print out all of the graphs after matplotlib is installed +# Done in the generic and sub_generic functions + + + + +base.bottom() + diff --git a/cgi-bin/EngineDB/board_check_functions.py b/cgi-bin/EngineDB/board_check_functions.py new file mode 100755 index 0000000..1790718 --- /dev/null +++ b/cgi-bin/EngineDB/board_check_functions.py @@ -0,0 +1,194 @@ +#!/usr/bin/python3 + +from connect import connect +import cgi +import cgitb; cgitb.enable() +import base +import home_page_list +import add_test_functions + +def board_checkout_form_sn(sn): + db = connect(0) + cur = db.cursor() + + print('
') + print("
") + print('
') + print('

Board Checkout

') + print("
") + print("
") + + print("
") + print('
') + print('') + print(''%sn) + print("
") + + cur.execute("Select person_id, person_name from People;") + + print('
') + print('') + print('
') + + print("
") + print('
') + print("") + cur.execute("select test_type, name from Test_Type order by relative_order ASC;") + print('') + print("
") + print("
") + + print("
") + print('
') + print('

') + print('') + print('

') + print('
') + + print("
") + print('
') + print('') + print("
") + print("
") + print("
") + print("
") + print("") + +def board_checkout(serial_num, person_id, test_type, comments): + db = connect(1) + cur = db.cursor() + + try: + cur.execute("SELECT sn FROM Board WHERE '%s' = full_id" % serial_num) + board_id = cur.fetchone()[0] + + sql = "SELECT checkout_id, person_id FROM Check_Out WHERE board_id = %s" % board_id + cur.execute(sql) + checkouts = cur.fetchall() + if checkouts: + checkout_id = checkouts[-1][0] + checkout_person = checkouts[-1][1] + sql = "SELECT Check_In.checkout_id FROM Check_In, Check_Out WHERE Check_In.checkout_id = %s AND Check_Out.checkout_id = %s" % (checkout_id, checkout_id) + cur.execute(sql) + results = cur.fetchall() + if results: + sql = "INSERT INTO Check_Out (board_id, test_type, person_id, comment, checkout_date) VALUES (%s, %s, %s, '%s', NOW())" % (board_id, test_type, person_id, comments) + cur.execute(sql) + + db.commit() + else: + cur.execute("SELECT People.person_name FROM People WHERE People.person_id = %s" % person_id) + tester = cur.fetchone()[0] + + print('
') + print('
') + print('

This board is currently checked out by %s

' % tester) + print('
') + print('
') + + print('
') + print('') + print('
') + else: + sql = "INSERT INTO Check_Out (board_id, test_type, person_id, comment, checkout_date) VALUES (%s, %s, %s, '%s', NOW())" % (board_id, test_type, person_id, comments) + cur.execute(sql) + + db.commit() + + + except Exception as e: + print(e) + + print('
') + print('
') + print('

Attempt Failed. Please ensure all fields are filled.

') + print('
') + print('
') + + +def board_checkin_form_sn(sn): + db = connect(0) + cur = db.cursor() + + print('
') + print("
") + print('
') + print('

Board Checkin

') + print("
") + print("
") + + print("
") + print('
') + print('') + print('') + print("
") + print("
") + + print("
") + print('
') + print('') + print("
") + print("
") + print("
") + print("
") + print("
") + +def board_checkin(board_id): + db = connect(1) + cur = db.cursor() + + try: + cur.execute("SELECT checkout_id FROM Check_Out WHERE board_id = %s" % board_id) + checkout_id = cur.fetchall()[0] + + sql = "INSERT INTO Check_In (checkout_id, checkin_date) VALUES (%s, NOW())" % (checkout_id) + cur.execute(sql) + + db.commit() + + except Exception as e: + print(e) + print(cur.fetchall()) + + print('
') + print('
') + print('

Attempt Failed. Please ensure all fields are filled.

') + print('
') + print('
') diff --git a/cgi-bin/EngineDB/board_check_functions.pyc b/cgi-bin/EngineDB/board_check_functions.pyc new file mode 100644 index 0000000..5f1c40e Binary files /dev/null and b/cgi-bin/EngineDB/board_check_functions.pyc differ diff --git a/cgi-bin/EngineDB/board_checkin.py b/cgi-bin/EngineDB/board_checkin.py new file mode 100755 index 0000000..7ce347c --- /dev/null +++ b/cgi-bin/EngineDB/board_checkin.py @@ -0,0 +1,25 @@ +#!/usr/bin/python3 + +import cgi +import cgitb; cgitb.enable() +import base +import home_page_list +import board_check_functions + + +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +#url = form.getvalue("url") +board_id = base.cleanCGInumber(form.getvalue("board_id")) + +base.header(title='Board Check In') +base.top() + +if board_id: + board_check_functions.board_checkin_form_sn(board_id) +else: + board_check_functions.board_checkin_form_sn("") + +base.bottom() diff --git a/cgi-bin/EngineDB/board_checkin2.py b/cgi-bin/EngineDB/board_checkin2.py new file mode 100755 index 0000000..03de9b6 --- /dev/null +++ b/cgi-bin/EngineDB/board_checkin2.py @@ -0,0 +1,24 @@ +#!/usr/bin/python3 + +import cgi +import cgitb; cgitb.enable() +import base +import board_check_functions +import os +import connect + +base_url = connect.get_base_url() + +#print("Location: %s/summary.py\n\n" % base_url) +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +board_id = base.cleanCGInumber(form.getvalue("board_id")) + +base.header(title='Board Check In') +base.top() + +board_check_functions.board_checkin(board_id) + +base.bottom() diff --git a/cgi-bin/EngineDB/board_checkout.py b/cgi-bin/EngineDB/board_checkout.py new file mode 100755 index 0000000..48b642a --- /dev/null +++ b/cgi-bin/EngineDB/board_checkout.py @@ -0,0 +1,24 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list +import board_check_functions + + +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +#url = form.getvalue("url") +serial_num = base.cleanCGInumber(form.getvalue("serial_num")) + +base.header(title='Board Checkout') +base.top() + +if serial_num: + board_check_functions.board_checkout_form_sn(serial_num) +else: + board_check_functions.board_checkout_form_sn("") + +base.bottom() diff --git a/cgi-bin/EngineDB/board_checkout2.py b/cgi-bin/EngineDB/board_checkout2.py new file mode 100755 index 0000000..034cf92 --- /dev/null +++ b/cgi-bin/EngineDB/board_checkout2.py @@ -0,0 +1,30 @@ +#!/usr/bin/python3 + +import cgi +import cgitb; cgitb.enable() +import base +import board_check_functions +import os +import connect + +base_url = connect.get_base_url() + +print("Location: %s/summary.py\n\n" % base_url) +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +serial_num = base.cleanCGInumber(form.getvalue("serial_number")) +person_id = base.cleanCGInumber(form.getvalue("person_id")) +test_type = base.cleanCGInumber(form.getvalue("test_type")) +comments = form.getvalue("comments") + +if comments: + comments = cgi.escape(comments) + +base.header(title='Board Checkout') +base.top() + +board_check_functions.board_checkout(serial_num, person_id, test_type, comments) + +base.bottom() diff --git a/cgi-bin/EngineDB/check_sn.py b/cgi-bin/EngineDB/check_sn.py new file mode 100755 index 0000000..b5dfcf5 --- /dev/null +++ b/cgi-bin/EngineDB/check_sn.py @@ -0,0 +1,74 @@ +#!/usr/bin/python3 + +from connect import connect +import sys +#import mysql.connector + +base_url = connect.get_base_url() + +print("Location: %s/summary.py\n\n"%(base_url)) + +import os + +print(os.environ.get("QUERY_STRING", "No Query String in url")) + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Adding a new module...') +base.top() + +form = cgi.FieldStorage() + +if form.getvalue('serial_number'): + sn = cgi.escape(form.getvalue('serial_number')) + + #print '
Serial Number = %(s)s , )s
' %{'s': sn} + home_page_list.add_module(sn) + + print('
') + print('
') + print('

List of All Boards

' ) + print('(Sorted by Serial Number)') + print('
') + print('') + print('
') + + print('

') + + + home_page_list.render_list_module() + + base.bottom() + + +else: + print('
') + print('
') + print('

FAILED. Enter SERIAL NUMBER

') + print('
') + print('
') + + home_page_list.add_module_form() + + + print('
') + print('
') + print('

List of All Boards

' ) + print('(Sorted by Serial Number)') + print('
') + print('
') + + print('

') + + home_page_list.render_list_module() + + base.bottom() + + + + diff --git a/cgi-bin/EngineDB/checkout_summary.py b/cgi-bin/EngineDB/checkout_summary.py new file mode 100755 index 0000000..3487289 --- /dev/null +++ b/cgi-bin/EngineDB/checkout_summary.py @@ -0,0 +1,83 @@ +#!/usr/bin/python3 + +import cgi +import base +from connect import connect +#import mysql.connector +from summary_functions import get +import module_functions +import sys + +if len(sys.argv) != 1: + sys.stdout = open('%(loc)s/summary.html' %{'loc':sys.argv[1]}, 'w') + +else: + #cgi header + print("Content-type: text/html\n") + +base.header(title='Summary') +base.top() + +List_of_rows = get() + +print('
') +print('

Test Summary

') +print('
') +print('
') +print('
') +print('
') +print('') +print('') +print('') +print('') +print('') +#print '' +print('') +print('') +print('') + +for row in List_of_rows: + print('') + if len(sys.argv) == 1: + print('' %{'serial':row[2], 'id':row[1]}) + #print '' %row[1] + else: + print('' %{'serial':row[2]}) + print('') + + print('') + + print('') + + print('') + + print('') + +print('
S/N Tests Passed Tests Remaining Final Status
%(serial)s %s %(serial)s
    ') + for tests in row[3][0:][::2]: + print('
  • %s' %tests) + print('
    ') + for tests in row[3][1:][::2]: + print('
  • %s' %tests) + print('
    ') + if len(sys.argv) == 1: + for tests in row[4][0:][::2]: + print('
  • %s' %(row[0],tests[1],tests[0])) + + else: + for tests in row[4][0:][::2]: + print('
  • %s' %tests[0] ) + print('
    ') + if len(sys.argv) == 1: + for tests in row[4][1:][::2]: + print('
  • %s' %(row[0],tests[1],tests[0])) + else: + for tests in row[4][1:][::2]: + print('
  • %s' %tests[0]) + print('
') + + +base.bottom() + + + diff --git a/cgi-bin/EngineDB/connect.py b/cgi-bin/EngineDB/connect.py new file mode 100755 index 0000000..7a0fb78 --- /dev/null +++ b/cgi-bin/EngineDB/connect.py @@ -0,0 +1,47 @@ +#!/usr/bin/python3 + +import mysql.connector + +def connect( num ): + if(num==1): + + connection = mysql.connector.connect( + host = 'localhost', + user='EngineDBInserter', + password='HGCALrocks', + database=get_db_name(), + #cursorclass=mysql.connector.cursors.DictCursor + ) + + if(num==0): + + connection = mysql.connector.connect( + host = 'localhost', + user='EngineDBReadUser', + password='HGCALrocks', + database=get_db_name(), + #cursorclass=mysql.connector.cursors.DictCursor + ) + + return connection + +def connect_admin(passwd): + + connection = mysql.connector.connect( + host = 'localhost', + user='EngineDBAdmin', + password=passwd, + database=get_db_name(), + #cursorclass=mysql.connector.cursors.DictCursor + ) + + return connection + +def get_base_url(): + base = "http://cmslab3.umncmslab/~cros0400/cgi-bin/EngineDB/" + return base + +def get_db_name(): + name = "EngineDB" + return name + diff --git a/cgi-bin/EngineDB/connect.pyc b/cgi-bin/EngineDB/connect.pyc new file mode 100644 index 0000000..a41e644 Binary files /dev/null and b/cgi-bin/EngineDB/connect.pyc differ diff --git a/cgi-bin/EngineDB/dump.sql b/cgi-bin/EngineDB/dump.sql new file mode 100644 index 0000000..735d9f7 --- /dev/null +++ b/cgi-bin/EngineDB/dump.sql @@ -0,0 +1,236 @@ +-- MySQL dump 10.14 Distrib 5.5.68-MariaDB, for Linux (x86_64) +-- +-- Host: localhost Database: WagonDB +-- ------------------------------------------------------ +-- Server version 5.5.68-MariaDB + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `Attachments` +-- + +DROP TABLE IF EXISTS `Attachments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Attachments` ( + `attach_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `test_id` int(11) DEFAULT NULL, + `attachmime` varchar(30) DEFAULT NULL, + `attachdesc` varchar(120) DEFAULT NULL, + `comments` varchar(200) DEFAULT NULL, + `originalname` varchar(200) DEFAULT NULL, + PRIMARY KEY (`attach_id`), + KEY `test_id` (`test_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Attachments` +-- + +LOCK TABLES `Attachments` WRITE; +/*!40000 ALTER TABLE `Attachments` DISABLE KEYS */; +/*!40000 ALTER TABLE `Attachments` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `People` +-- + +DROP TABLE IF EXISTS `People`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `People` ( + `person_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `person_name` varchar(100) DEFAULT NULL, + PRIMARY KEY (`person_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `People` +-- + +LOCK TABLES `People` WRITE; +/*!40000 ALTER TABLE `People` DISABLE KEYS */; +INSERT INTO `People` VALUES (1,'Bryan'); +/*!40000 ALTER TABLE `People` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Test` +-- + +DROP TABLE IF EXISTS `Test`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Test` ( + `test_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `test_type_id` int(11) NOT NULL, + `wagon_id` int(11) NOT NULL, + `person_id` int(11) NOT NULL, + `day` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `successful` tinyint(1) NOT NULL, + `comments` varchar(320) DEFAULT NULL, + PRIMARY KEY (`test_id`), + KEY `wagon_id` (`wagon_id`), + KEY `person_id` (`person_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Test` +-- + +LOCK TABLES `Test` WRITE; +/*!40000 ALTER TABLE `Test` DISABLE KEYS */; +/*!40000 ALTER TABLE `Test` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `TestRevoke` +-- + +DROP TABLE IF EXISTS `TestRevoke`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `TestRevoke` ( + `test_id` int(10) unsigned NOT NULL, + `comment` varchar(120) DEFAULT NULL, + PRIMARY KEY (`test_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `TestRevoke` +-- + +LOCK TABLES `TestRevoke` WRITE; +/*!40000 ALTER TABLE `TestRevoke` DISABLE KEYS */; +/*!40000 ALTER TABLE `TestRevoke` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Test_Type` +-- + +DROP TABLE IF EXISTS `Test_Type`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Test_Type` ( + `test_type` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(30) DEFAULT NULL, + `required` tinyint(1) NOT NULL, + `desc_short` varchar(50) DEFAULT NULL, + `desc_long` varchar(250) DEFAULT NULL, + `relative_order` int(11) NOT NULL, + PRIMARY KEY (`test_type`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Test_Type` +-- + +LOCK TABLES `Test_Type` WRITE; +/*!40000 ALTER TABLE `Test_Type` DISABLE KEYS */; +INSERT INTO `Test_Type` VALUES (1,'test',1,'test','test',1); +/*!40000 ALTER TABLE `Test_Type` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Wagon` +-- + +DROP TABLE IF EXISTS `Wagon`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Wagon` ( + `sn` int(11) NOT NULL, + `wagon_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`wagon_id`), + UNIQUE KEY `sn` (`sn`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Wagon` +-- + +LOCK TABLES `Wagon` WRITE; +/*!40000 ALTER TABLE `Wagon` DISABLE KEYS */; +/*!40000 ALTER TABLE `Wagon` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Wagon_Info` +-- + +DROP TABLE IF EXISTS `Wagon_Info`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Wagon_Info` ( + `info_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `wagon_id` int(11) NOT NULL, + `info_type` int(11) NOT NULL, + `info` varchar(300) DEFAULT NULL, + PRIMARY KEY (`info_id`), + KEY `wagon_id` (`wagon_id`), + KEY `info_type` (`info_type`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Wagon_Info` +-- + +LOCK TABLES `Wagon_Info` WRITE; +/*!40000 ALTER TABLE `Wagon_Info` DISABLE KEYS */; +/*!40000 ALTER TABLE `Wagon_Info` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Wagon_Info_Types` +-- + +DROP TABLE IF EXISTS `Wagon_Info_Types`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Wagon_Info_Types` ( + `info_type_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `Info_Name` varchar(30) DEFAULT NULL, + `Info_Desc_Short` varchar(100) DEFAULT NULL, + `Info_Desc_Long` varchar(300) DEFAULT NULL, + PRIMARY KEY (`info_type_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Wagon_Info_Types` +-- + +LOCK TABLES `Wagon_Info_Types` WRITE; +/*!40000 ALTER TABLE `Wagon_Info_Types` DISABLE KEYS */; +/*!40000 ALTER TABLE `Wagon_Info_Types` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2021-07-13 16:05:26 diff --git a/cgi-bin/EngineDB/gen_res_analytics.py b/cgi-bin/EngineDB/gen_res_analytics.py new file mode 100755 index 0000000..999abc0 --- /dev/null +++ b/cgi-bin/EngineDB/gen_res_analytics.py @@ -0,0 +1,174 @@ +#!/usr/bin/python3 + + +import os, sys +import cgi +import cgitb +import pylab +import json + +import matplotlib +import matplotlib.pyplot as plt +import numpy as np + +import base +import add_test_functions + +def create_generic_hist(attachments1, title, stats): + + # Handles one value under graph_title in 'module 1' + graph_title = title + + values = [] + for attachment in attachments1: + values.append(attachment['module 1'][graph_title]) + + + + # Temporary step value + step = 0.01 + + num_of_bins = 15 + + if not (max(values) - min(values)) == 0: + step = round(max(values) - min(values)) / num_of_bins + + + + start = np.floor(min(values) / step) * step + stop = max(values) + step + bin_edges = np.arange(start, stop, step=step) + + + plt.hist(values, bins=bin_edges, density=False, histtype='bar') + plt.xlabel(graph_title + " Values") + plt.ylabel('Occurances') + plt.title(graph_title + " Values") + plt.grid(True) + plt.xticks(np.arange(start, stop, step = step), rotation = 90) + + plt.tight_layout() + plt.savefig('../static/files/gen_res/{}.png'.format(graph_title)) + plt.close() + + + + print(''.format(graph_title)) + + add_to_stats(stats, graph_title, values) + +def create_sub_generic_hist(attachments1, title, list_index, stats): + # Handles a list under graph_title in 'module 1' + graph_title = title + + values = [] + for attachment in attachments1: + values.append(attachment['module 1'][graph_title][list_index]) + + # Temporary step value + step = 0.01 + + num_of_bins = 15 + + if not (max(values) - min(values)) == 0: + step = round(max(values) - min(values)) / num_of_bins + + + start = np.floor(min(values) / step) * step + stop = max(values) + step + bin_edges = np.arange(start, stop, step=step) + + + plt.hist(values, bin_edges, density=False, histtype='bar', color='red') + plt.xlabel(graph_title + " Values") + plt.ylabel('Occurances') + plt.title(graph_title + " Values") + plt.grid(True) + plt.xticks(np.arange(start, stop, step = step), rotation = 90) + + plt.tight_layout() + plt.savefig('../static/files/gen_res/{}.png'.format(graph_title)) + plt.close() + + + + print(''.format(graph_title)) + + + add_to_stats(stats, graph_title, values) + +# Adds statistics to the "stats" python dictionary +def add_to_stats(stats, full_title, values): + mean = sum(values) / len(values) + stand_deviation = np.std(values) + + stats['{}'.format(full_title)] = { + 'STD': stand_deviation, + 'range': max(values) - min(values), + 'mean': mean, + 'max': max(values), + 'min': min(values), + 'passing_range': ( mean - stand_deviation, mean + stand_deviation ) + } +#############End of Functions########################## + + + +cgitb.enable() + +# chose a non-GUI backend +# matplotlib.use( 'Agg' ) +print("Content-type: text/html\n") + +base.header(title='Analytics') +base.top() + + +form = cgi.FieldStorage() + +# Gets the attachment from the DB +attachments1 = add_test_functions.get_test_attachments(1) + +stats = {'analytic_type': 'General Resistance Test'} + +####################################################### + +create_generic_hist(attachments1, 'RTD -> VMON_LVS', stats) + +####################################################### + +create_sub_generic_hist(attachments1, 'ECON_RE_Sb -> HGCROC_RE_Sb', 0, stats) + +####################################################### + +create_sub_generic_hist(attachments1, 'PWR_EN -> PG_LDO', 0, stats) + +######################################################## + +create_generic_hist(attachments1, 'RTD -> HGCROC_RE_Sb', stats) + +######################################################## + +create_sub_generic_hist(attachments1, 'HGCROC_RE_Hb -> HGCROC_RE_Sb', 0, stats) + +######################################################## + +create_sub_generic_hist(attachments1, 'PG_DCDC -> ECON_RE_Hb', 0, stats) + +######################################################## + +print(json.dumps(stats, indent = 4)) + +with open('../static/files/gen_res/gen_res_stats.json', 'w') as open_file: + json.dump(stats, open_file, indent = 4) + + +# TODO Actually print out all of the graphs after matplotlib is installed +# Done in the generic and sub_generic functions + + + + +base.bottom() + + diff --git a/cgi-bin/EngineDB/get_attach.py b/cgi-bin/EngineDB/get_attach.py new file mode 100755 index 0000000..e1cfe3c --- /dev/null +++ b/cgi-bin/EngineDB/get_attach.py @@ -0,0 +1,60 @@ +#!/usr/bin/python3 + +import cgi +import base +from connect import connect +import settings +import os.path +import sys + +if __name__ == "__main__": + form = cgi.FieldStorage() + attach_id = base.cleanCGInumber(form.getvalue('attach_id')) + + db=connect(0) + cur=db.cursor() + + if(attach_id != 0): + cur.execute("SELECT test_id, attachmime, originalname, attach FROM Attachments WHERE attach_id=%d" % (attach_id)); + + if not cur.with_rows: + print("Content-type: text/html\n") + base.header("Attachment Request Error") + base.top() + print('
') + print("

Attachment not available

") + print('
') + base.bottom() + else: + thevals=cur.fetchall() + f = thevals[0][3] + attpath=settings.getAttachmentPathFor(thevals[0][0],attach_id) + if not f: + print("Content-type: text/html\n") + base.header("Attachment Request Error") + base.top() + print("

Attachment not found

") + base.bottom() + else: + print('Content-type: %s \n\n' % (thevals[0][1])) + print(f.decode("utf-8")) + + cur.close() + +def save(attach_id): + db=connect(0) + cur=db.cursor() + + cur.execute("SELECT test_id, attachmime, originalname FROM Attachments WHERE attach_id=%d" % (attach_id)); + + if not cur.with_rows: + print("

Attachment not available

") + else: + thevals=cur.fetchall(); + attpath=settings.getAttachmentPathFor(thevals[0][0],attach_id) + if not os.path.isfile(attpath): + print("

Attachment not found

") + else: + statinfo = os.stat(attpath) + sys.stdout.write(file(attpath,"rb").read() ) + cur.close() diff --git a/cgi-bin/EngineDB/get_attach.pyc b/cgi-bin/EngineDB/get_attach.pyc new file mode 100644 index 0000000..b4251bb Binary files /dev/null and b/cgi-bin/EngineDB/get_attach.pyc differ diff --git a/cgi-bin/EngineDB/get_previous_test_results.py b/cgi-bin/EngineDB/get_previous_test_results.py new file mode 100755 index 0000000..c81eec5 --- /dev/null +++ b/cgi-bin/EngineDB/get_previous_test_results.py @@ -0,0 +1,30 @@ +#!/usr/bin/python3 + +import cgi +import base +import add_test_functions +import os + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Get Previous Test Results') +base.top() + +form = cgi.FieldStorage() + +if form.getvalue('serial_number'): + serial_number = cgi.escape(form.getvalue('serial_number')) + + tests = add_test_functions.get_previous_test_results(serial_number) + + print('Begin') + + for t in tests: + print(t) + + print('End') + +else: + print('No serial number sent.') +base.bottom() diff --git a/cgi-bin/EngineDB/get_test_completion_status.py b/cgi-bin/EngineDB/get_test_completion_status.py new file mode 100755 index 0000000..bb01075 --- /dev/null +++ b/cgi-bin/EngineDB/get_test_completion_status.py @@ -0,0 +1,23 @@ +#!/usr/bin/python3 + +import cgi +import base +import module_functions +import os + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Get Test Completion Status') +base.top() + +tests = module_functions.get_test_completion_status() + +print('Begin') + +for t in tests: + print(t) + +print('End') + +base.bottom() diff --git a/cgi-bin/EngineDB/get_test_types.py b/cgi-bin/EngineDB/get_test_types.py new file mode 100755 index 0000000..d28191b --- /dev/null +++ b/cgi-bin/EngineDB/get_test_types.py @@ -0,0 +1,23 @@ +#!/usr/bin/python3 + +import cgi +import base +import module_functions +import os + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Get Test Types') +base.top() + +tests = module_functions.get_test_types() + +print('Begin') + +for t in tests: + print(t) + +print('End') + +base.bottom() diff --git a/cgi-bin/EngineDB/get_usernames.py b/cgi-bin/EngineDB/get_usernames.py new file mode 100755 index 0000000..ae987f7 --- /dev/null +++ b/cgi-bin/EngineDB/get_usernames.py @@ -0,0 +1,23 @@ +#!/usr/bin/python3 + +import cgi +import base +import add_test_functions +import os + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Get Usernames') +base.top() + +usernames = add_test_functions.get_usernames() + +print('Begin') + +for t in usernames: + print(t[0]) + +print('End') + +base.bottom() diff --git a/cgi-bin/EngineDB/home_page.py b/cgi-bin/EngineDB/home_page.py new file mode 100755 index 0000000..3618671 --- /dev/null +++ b/cgi-bin/EngineDB/home_page.py @@ -0,0 +1,58 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list +import sys + +if(len(sys.argv) != 1): + stdout = sys.stdout + sys.stdout = open('%(loc)s/index.html' %{ 'loc':sys.argv[1]}, 'w') +else: + #cgi header + print("content-type: text/html\n\n") + +base.header(title='Wagon Test Home Page') +base.top() + +print() +print('
') +print('
') +print('

Count by Test

' ) +print('
') +print('
') + +home_page_list.render_list_tests() +print('
') + +print('
') +print('
') +print('

List of All Boards

' ) +print('(Sorted by Serial Number)Successful Tests') +print('
') +print('
') +if len(sys.argv) == 1: + print('
') + print('
') + print('') + print('') + print('') + print('
') +else: + print('
') + print('
') + print('') + print('') + print('') + print('
') +print('
') +print('

') + + +home_page_list.render_list_module() + +base.bottom() + +if len(sys.argv) != 1: + sys.stdout.close() + sys.stdout = stdout diff --git a/cgi-bin/EngineDB/home_page_list.py b/cgi-bin/EngineDB/home_page_list.py new file mode 100755 index 0000000..f65f190 --- /dev/null +++ b/cgi-bin/EngineDB/home_page_list.py @@ -0,0 +1,221 @@ +#!/usr/bin/python3 + +from connect import connect +import sys +import cgitb + +cgitb.enable() + +def fetch_list_tests(): + db = connect(0) + cur=db.cursor() + cur.execute("select Test_Type.name,COUNT(DISTINCT Test.test_id),COUNT(DISTINCT Test.board_id) from Test,Test_Type WHERE Test.successful=1 and Test.test_type_id=Test_Type.test_type GROUP BY Test.test_type_id ORDER BY Test_Type.relative_order"); + rows = cur.fetchall() + cur.execute("select Test_Type.name,COUNT(*) from Test,Test_Type WHERE Test.test_type_id=Test_Type.test_type GROUP BY Test.test_type_id ORDER BY Test_Type.relative_order"); + rows2 = cur.fetchall() + cur.execute("select Test_Type.name,Count(*) from TestRevoke,Test_Type,Test WHERE Test.test_type_id=Test_Type.test_type and Test.successful=1 and Test.test_id=TestRevoke.test_id GROUP BY Test.test_type_id ORDER BY Test_Type.relative_order") + rows3 = cur.fetchall() + + for i,r in enumerate(rows): + if rows3: + for row in rows3: + if row[0] == r[0]: + rows[i] = (r[0], r[1]-row[1], r[2]) + else: + rows[i] = (r[0], r[1], r[2]) + finalrows = () + for i in range (0,len(rows)): + arow=(rows[i][0], rows[i][1],rows[i][2],rows2[i][1]) + finalrows=finalrows+(arow,) + return finalrows + +def render_list_tests(): + rows = fetch_list_tests() + + print('
') + print('
') + print('') +# print '
Total Tests
' +# print '
Total Successful Tests
' +# print '
Total Cards with Successful Tests
' + for test in rows: +# print '
' + print('
' ) + print('
TestTotal TestsTotal Successful TestsTotal Wagons with Successful Tests
%s' % (test[0])) + print('%s' % (test[3])) + print('%s' % (test[1])) + print('%s' % (test[2])) + print('
') + +def fetch_list_module(): + db = connect(0) + cur = db.cursor() + + cur.execute("SELECT full_id, Board_id FROM Board ORDER by Board.sn ASC") + rows = cur.fetchall() + return rows + + +def render_list_module(): + + db = connect(0) + cur=db.cursor() + row = fetch_list_module() + n = 0 + + col1='' + col2='' + col3='' + cur.execute('SELECT COUNT(*) FROM Test_Type') + total = cur.fetchall()[0][0] + if len(sys.argv) == 1: + for boards in row: + query = 'SELECT COUNT(DISTINCT Test.test_id),COUNT(DISTINCT TestRevoke.test_id, case when TestRevoke.test_id = Test.test_id then TestRevoke.test_id end),Test.test_type_id FROM Test,TestRevoke WHERE Test.board_id=%s and Test.successful=1 GROUP BY Test.test_type_id' % (boards[1]) + cur.execute(query) + successful = cur.fetchall() + if not successful: + query = 'SELECT COUNT(DISTINCT Test.test_id),0,Test.test_type_id FROM Test WHERE Test.board_id=%s and Test.successful=1 GROUP BY Test.test_type_id' % (boards[1]) + cur.execute(query) + successful = cur.fetchall() + num = 0 + for s in successful: + total_success = s[0] + total_revoke = s[1] + if total_success > total_revoke: + num += 1 + else: + num += 0 + if not num: + num = 0 + if num < total: + temp_col = ' %(serial)s %(success)s/%(total)s' %{'serial':boards[0], 'id':boards[1], 'success': num, 'total': total} + else: + temp_col = ' %(serial)s Done' %{'serial':boards[0], 'id':boards[1]} + if n%3 == 0: + col1 += temp_col + if n%3 == 1: + col2 += temp_col + if n%3 == 2: + col3 += temp_col + n += 1 + else: + for boards in row: + query = 'SELECT SUM(successful) AS "sum_successful" FROM Test WHERE Test.board_id = %s' % (boards[1]) + cur.execute(query) + successful = cur.fetchall() + num = successful[0][0] + if not num: + num = 0 + temp_col = ' %(serial)s %(success)s' %{'serial':boards[0], 'id':boards[1], 'success': num} + if n%3 == 0: + col1 += temp_col + if n%3 == 1: + col2 += temp_col + if n%3 == 2: + col3 += temp_col + n += 1 + print('
') + print('
') + print('
    ') + print(col1) + print('
') + print('
') + print(col2) + print('
') + print('
') + print(col3) + print('
') + print('
') + +def add_module_form(): + + print('
') + print('
') + print('
') + print('

Adding a new Test Board

') + print('
') + print('
') + + print('
') + print('
') + print('') + print('
') + print('
') + print('') + print('
') + print('
') + + print('
') + + print('
') + +def add_board_info_form(sn, board_id): + + print('
') + print('
') + print('
') + print('

Adding Extra Board Information

') + print('
') + print('
') + + print('' % sn) + print('' % board_id) + print('
') + print('
') + print('') + print('
') + print('
') + print('
') + print('
') + print('') + print('
') + print('
') + print('
') + print('
') + print('') + print('
') + print('
') + print('
') + print('') + print('
') + print('
') + print('
') + print('') + print('
') + print('
') + print('
') + print('
') + print('') + print('
') + print('
') + + print('
') + print('
') + + print('') + + print('
') + +def add_module(serial_number): + try: + db = connect(1) + cur = db.cursor() + + sn = serial_number[10:15] + type_id = serial_number[4:10] + + cur.execute("SELECT board_id FROM Board WHERE full_id = %s" % (serial_number)) + + rows = cur.fetchall() + + if not rows: + cur.execute("INSERT INTO Board (sn, full_id, type_id) VALUES (%s, %s, %s); " % (sn, serial_number, type_id)) + #print '
INSERT INTO Card set sn = %s;
' %(serial_number) + db.commit() + db.close() + else: + print("

Serial number already exists!

") + except mysql.connector.Error as err: + print("

Serial number already exists!

") + print(err) + diff --git a/cgi-bin/EngineDB/home_page_list.pyc b/cgi-bin/EngineDB/home_page_list.pyc new file mode 100644 index 0000000..474bd5d Binary files /dev/null and b/cgi-bin/EngineDB/home_page_list.pyc differ diff --git a/cgi-bin/EngineDB/id_res_analytics.py b/cgi-bin/EngineDB/id_res_analytics.py new file mode 100755 index 0000000..5f4503f --- /dev/null +++ b/cgi-bin/EngineDB/id_res_analytics.py @@ -0,0 +1,158 @@ +#!/usr/bin/python3 + + +import os, sys +import cgi +import cgitb +import pylab +import json + +import matplotlib +import matplotlib.pyplot as plt +import numpy as np + +import base +import add_test_functions + +def create_generic_hist(attachments, title, stats): + + # Handles one value under graph_title in 'module 1' + graph_title = title + + values = [] + for attachment in attachments: + values.append(attachment['wagon type chip'][graph_title]) + + + # Temporary step value + step = 0.01 + + num_of_bins = 15 + + if not (max(values) - min(values)) == 0: + step = round(max(values) - min(values)) / num_of_bins + + start = np.floor(min(values) / step) * step + stop = max(values) + step + bin_edges = np.arange(start, stop, step=step) + + + plt.hist(values, bins=bin_edges, density=False, histtype='bar') + plt.xlabel(graph_title + " Values") + plt.ylabel('Occurances') + plt.title(graph_title + " Values") + plt.grid(True) + plt.xticks(np.arange(start, stop, step = step), rotation = 90) + + plt.tight_layout() + + plt.savefig('../static/files/id_res/{}.png'.format(graph_title)) + plt.close() + + + print(''.format(graph_title)) + + + add_to_stats(stats, graph_title, values) + +def create_sub_generic_hist(attachments1, title, list_index, stats): + # Handles a list under graph_title in 'module 1' + graph_title = title + + values = [] + for attachment in attachments1: + values.append(attachment['wagon type chip'][graph_title][list_index]) + + # Temporary step value + step = 0.01 + + num_of_bins = 15 + + if not (max(values) - min(values)) == 0: + step = round(max(values) - min(values)) / num_of_bins + + + start = np.floor(min(values) / step) * step + stop = max(values) + step + bin_edges = np.arange(start, stop, step=step) + + + plt.hist(values, bin_edges, density=False, histtype='bar', color='red') + plt.xlabel(graph_title + " Values") + plt.ylabel('Occurances') + plt.title(graph_title + " Values") + plt.grid(True) + plt.xticks(np.arange(start, stop, step = step), rotation = 90) + + plt.tight_layout() + plt.savefig('../static/files/id_res/{}.png'.format(graph_title)) + plt.close() + + + + print(''.format(graph_title)) + + + add_to_stats(stats, graph_title, values) + + +# Adds statistics to the "stats" python dictionary +def add_to_stats(stats, full_title, values): + mean = sum(values) / len(values) + stand_deviation = np.std(values) + + stats['{}'.format(full_title)] = { + 'STD': stand_deviation, + 'range': max(values) - min(values), + 'mean': mean, + 'max': max(values), + 'min': min(values), + 'passing_range': ( mean - stand_deviation, mean + stand_deviation ) + } + + +#############End of Functions########################## + + + +cgitb.enable() + +# chose a non-GUI backend +# matplotlib.use( 'Agg' ) +print("Content-type: text/html\n") + +base.header(title='Analytics') +base.top() + + +form = cgi.FieldStorage() + +# Gets the attachment from the DB +attachments2 = add_test_functions.get_test_attachments(2) +stats = {'analytic_type': 'ID Resistor Test'} + +####################################################### + +create_generic_hist(attachments2, 'WAGON_TYPE -> GND', stats) + +######################################################## + +create_sub_generic_hist(attachments2, 'VMON_REF0 -> PROBE_DC', 0, stats) + + +print(json.dumps(stats, indent = 4)) + +with open('../static/files/id_res/id_res_stats.json', 'w') as open_file: + json.dump(stats, open_file, indent = 4) + + + +# TODO Actually print out all of the graphs after matplotlib is installed +# Done in the generic and sub_generic functions + + + + +base.bottom() + + diff --git a/cgi-bin/EngineDB/iic_analytics.py b/cgi-bin/EngineDB/iic_analytics.py new file mode 100755 index 0000000..2a0231e --- /dev/null +++ b/cgi-bin/EngineDB/iic_analytics.py @@ -0,0 +1,159 @@ +#!/usr/bin/python3 + + +import os, sys +import cgi +import cgitb +import pylab +import json + +import matplotlib +import matplotlib.pyplot as plt +import numpy as np + +import base +import add_test_functions + +def create_generic_hist(attachments1, title, stats): + + # Handles one value under graph_title in 'module 1' + graph_title = title + + values = [] + for attachment in attachments1: + values.append(attachment[graph_title]) + + + # Temporary step value + step = 0.01 + + num_of_bins = 15 + + if not (max(values) - min(values)) == 0: + step = round(max(values) - min(values)) / num_of_bins + + + start = np.floor(min(values) / step) * step + stop = max(values) + step + bin_edges = np.arange(start, stop, step=step) + + + plt.hist(values, bins=bin_edges, density=False, histtype='bar') + plt.xlabel(graph_title + " Values") + plt.ylabel('Occurances') + plt.title(graph_title + " Values") + plt.grid(True) + plt.xticks(np.arange(start, stop, step = step), rotation = 90) + + plt.tight_layout() + + plt.savefig('../static/files/iic/{}.png'.format(graph_title)) + plt.close() + + + print(''.format(graph_title)) + + + add_to_stats(stats, graph_title, values) + +def create_sub_generic_hist(attachments1, title, list_index, stats): + # Handles a list under graph_title in 'module 1' + graph_title = title + + values = [] + for attachment in attachments1: + values.append(attachment[graph_title][list_index]) + + + # Temporary step value + step = 0.01 + + num_of_bins = 15 + + if not (max(values) - min(values)) == 0: + step = round(max(values) - min(values)) / num_of_bins + + + start = np.floor(min(values) / step) * step + stop = max(values) + step + bin_edges = np.arange(start, stop, step=step) + + + plt.hist(values, bin_edges, density=False, histtype='bar', color='red') + plt.xlabel(graph_title + " Values") + plt.ylabel('Occurances') + plt.title(graph_title + " Values") + plt.grid(True) + plt.xticks(np.arange(start, stop, step = step), rotation = 90) + + plt.tight_layout() + + plt.savefig('../static/files/iic/{}.png'.format(graph_title)) + plt.close() + + + print(''.format(graph_title)) + + + add_to_stats(stats, graph_title, values) + + +# Adds statistics to the "stats" python dictionary +def add_to_stats(stats, full_title, values): + mean = sum(values) / len(values) + stand_deviation = np.std(values) + + stats['{}'.format(full_title)] = { + 'STD': stand_deviation, + 'range': max(values) - min(values), + 'mean': mean, + 'max': max(values), + 'min': min(values), + 'passing_range': ( mean - stand_deviation, mean + stand_deviation ) + } + + +#############End of Functions########################## + + + +cgitb.enable() + +# chose a non-GUI backend +# matplotlib.use( 'Agg' ) +print("Content-type: text/html\n") + +base.header(title='Analytics') +base.top() + + +form = cgi.FieldStorage() + +# Gets the attachment from the DB +attachments3 = add_test_functions.get_test_attachments(3) +stats = {'analytic_type': "IIC Test"} + +####################################################### + +create_generic_hist(attachments3, 'num_iic_correct', stats) + +######################################################## + +create_generic_hist(attachments3, 'num_iic_checks', stats) + +######################################################## + +print(json.dumps(stats, indent = 4)) + +with open('../static/files/iic/iic_stats.json', 'w') as open_file: + json.dump(stats, open_file, indent = 4) + + +# TODO Actually print out all of the graphs after matplotlib is installed +# Done in the generic and sub_generic functions + + + + +base.bottom() + diff --git a/cgi-bin/EngineDB/is_new_board.py b/cgi-bin/EngineDB/is_new_board.py new file mode 100755 index 0000000..4617c7d --- /dev/null +++ b/cgi-bin/EngineDB/is_new_board.py @@ -0,0 +1,36 @@ +#!/usr/bin/python3 + + +import cgi +import base +import add_test_functions +import os + + +print("Content-type: text/html\n") + +base.header(title='is_new_board') +base.top() + + +form = cgi.FieldStorage() + +if form.getvalue('serial_number'): + serial_number = cgi.escape(form.getvalue('serial_number')) + + + is_new_board_bool = add_test_functions.is_new_board(serial_number) + + print('Begin') + + print(is_new_board_bool) + + print('End') + + +else: + print ("NO SERIAL SENT") + + +base.bottom() + diff --git a/cgi-bin/EngineDB/loadDBInfo.py b/cgi-bin/EngineDB/loadDBInfo.py new file mode 100755 index 0000000..5c48897 --- /dev/null +++ b/cgi-bin/EngineDB/loadDBInfo.py @@ -0,0 +1,97 @@ +#!/usr/bin/python3 + +import argparse +import add_test_functions +import connect +import getpass +import importlib.util +import json + +def load_config(path): + + base = path.split("/")[-1][:-3] + + spec = importlib.util.spec_from_file_location(base, path) + cfg = importlib.util.module_from_spec(spec) + + spec.loader.exec_module(cfg) + + config = cfg.masterCfg + return config + +def add_tests(test_list, passwd): + + order = 1 + for test in test_list: + print("Adding new test type: {}".format(test["name"])) + try: + add_test_functions.add_new_test(test["name"], test["required"], test["desc_short"], test["desc_long"], order, passwd) + order += 1 + except Exception as e: + print("Test malformated or already in DB: {}. Check config file before proceeding.".format(test["name"])) + quit() + +def add_people(people_list, passwd): + + for person in people_list: + print("Adding new tester: {}".format(person)) + try: + add_test_functions.add_tester(person, passwd) + except Exception as e: + print("Tester could not be added to the database: {}. Check config file before proceeding.".format(person)) + quit() + +def add_boards(board_type_list, passwd): + + for board in board_type_list: + print("Adding new board type: {}".format(board["name"])) + try: + add_test_functions.add_board_type(board["name"], board["type_sn"], board["requiredTests"], passwd) + except Exception as e: + print(e) + print("Board type could not be added: {}. Check config file before proceeding".format(board["name"])) + quit() + + +def main(): + + parser = argparse.ArgumentParser() + + parser.add_argument("--config", action="store", type=str, help="Input path for config (should be a static directory)") + + args = parser.parse_args() + + # Get configuration file with test types, people, board types, and DB info + try: + + config = load_config(args.config) + + except Exception as e: + + print("No file found") + quit() + + passwd = getpass.getpass(prompt="{} Admin Password: ".format(config["DBInfo"]["name"])) + + # Password verification + try: + + conn = connect.connect_admin(passwd) + + except Exception as e: + + print("Invalid Password. Try Again.") + quit() + + print("\n-----------------------------") + print(" DB Connection Established ") + print("-----------------------------\n") + + add_tests(config["Test"], passwd) + add_boards(config["Board_type"], passwd) + add_people(config["People"], passwd) + + print("Database updated with information from {}!".format(args.config)) + +if __name__ == "__main__": + main() diff --git a/cgi-bin/EngineDB/module.py b/cgi-bin/EngineDB/module.py new file mode 100755 index 0000000..74fa259 --- /dev/null +++ b/cgi-bin/EngineDB/module.py @@ -0,0 +1,37 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list +import module_functions +from connect import connect + +#cgi header +print("Content-type: text/html\n") + + +form = cgi.FieldStorage() +board_id = base.cleanCGInumber(form.getvalue('board_id')) +serial_num = base.cleanCGInumber(form.getvalue('serial_num')) +base.header(title='Wagon DB') +base.top() +#print('card_id = ', card_id) +#print 'serial_num = ', serial_num + +module_functions.add_test_tab(serial_num, board_id) + +db = connect(0) +cur = db.cursor() + +revokes=module_functions.Portage_fetch_revokes(board_id) + +cur.execute("SELECT location, daq_chip_id, trigger_chip_1_id, trigger_chip_2_id, info FROM Board_Info WHERE board_id = %s" % board_id) +info = cur.fetchall() + +module_functions.board_info(info) + +cur.execute("select test_type, name from Test_Type where required = 1 order by relative_order ASC") +for test_type in cur: + module_functions.ePortageTest(test_type[0], serial_num, test_type[1], revokes) + +base.bottom() diff --git a/cgi-bin/EngineDB/module_functions.py b/cgi-bin/EngineDB/module_functions.py new file mode 100755 index 0000000..f8fd321 --- /dev/null +++ b/cgi-bin/EngineDB/module_functions.py @@ -0,0 +1,250 @@ +#!/usr/bin/python3 +from connect import connect +import sys +#import mysql.connector +from get_attach import save +import home_page_list + +def Portage_fetch(test_type_id, board_sn): + db = connect(0) + cur = db.cursor() + cur.execute("SELECT People.person_name, Test.day, Test.successful, Test.comments, Test_Type.name, Test.test_id FROM Test, Test_Type, People, Board WHERE Test_Type.test_type = %(test_id)s AND Board.full_id = %(sn)s AND People.person_id = Test.person_id AND Test_Type.test_type=Test.test_type_id AND Test.board_id = Board.board_id ORDER BY Test.day ASC" %{'test_id':test_type_id, 'sn':board_sn}) + return cur.fetchall() + +def Portage_fetch_revokes(board_sn): + db=connect(0) + cur = db.cursor() + cur.execute("SELECT TestRevoke.test_id, TestRevoke.comment FROM TestRevoke,Test,Board WHERE Board.sn = %(sn)s AND Board.board_id = Test.board_id AND Test.test_id = TestRevoke.test_id" %{'sn':board_sn}) + # build a dictionary + revoked={} + for fromdb in cur.fetchall(): + revoked[fromdb[0]]=fromdb[1] + return revoked + +def Portage_fetch_attach(test_id): + db = connect(0) + cur = db.cursor() + cur.execute('SELECT attach_id, attachmime, attachdesc, originalname FROM Attachments WHERE test_id=%(tid)s ORDER BY attach_id' % {'tid':test_id}) + return cur.fetchall() + +def add_test_tab(sn, board_id): + + print('
') + print('
') + print('

Wagon Test Info for %d

' %sn) + print('
') + print('
') + + print('') + + + +def ePortageTest(test_type_id, board_sn, test_name, revokes): + attempts = Portage_fetch(test_type_id, board_sn) + print('
') + print('
') + print('
') + print('

%(name)s

' %{ "name":test_name}) + print('
') + + n = 0 + for attempt in attempts: + n += 1 + + print('

Attempt: %d

'%n) + print('') + print('') + print('') + print('') + print('') + print('') +# print '' + print('') + print('') + print('' %{ "pname":attempt[0]}) + print('' %{ "when":attempt[1]}) + if attempt[2] == 1: + if attempt[5] in revokes: + print('' %{ "comment":revokes[attempt[5]] }) + else: + print('') + if len(sys.argv) == 1: + print("" %{ "id":attempt[5]}) + + else: + print('') + print('') + print('') + print('' ) + print('' %{ "comm":attempt[3]}) + print('') + attachments=Portage_fetch_attach(attempt[5]) + for afile in attachments: + if len(sys.argv) == 1: + print('' % (afile[0],afile[3],afile[2])) + else: + print('' % (afile[0], afile[3], afile[2])) + stdout = sys.stdout + sys.stdout = open("%(loc)s/%(f)s.html" %{'loc':sys.argv[1], 'f':afile[0]},'w') + save(afile[0]) + sys.stdout.close() + sys.stdout = stdout + + print('') + print('
NameDateSuccessful?Comments
%(pname)s %(when)s Revoked: %(comment)s Yes RevokeNo
Comments: %(comm)s
Attachment: %s%s
Attachment: %s%s
') + + print('
') + print('
') + +def board_info(info): + if info and len(info[0]) == 5: + location = info[0][0] + daq_chip_id = info[0][1] + trigger_chip_1_id = info[0][2] + trigger_chip_2_id = info[0][3] + info_com = info[0][4] + + else: + location, daq_chip_id, trigger_chip_1_id, trigger_chip_2_id, info_com = "None", "None", "None", "None", "None" + + print('
') + print('') + print('') + print('') + print('') + print('') + print('') + print('') + print('') + print('') + print('' % location) + if daq_chip_id != "0" and trigger_chip_1_id != "0" and trigger_chip_2_id != "0": + print('' % daq_chip_id) + print('' % trigger_chip_1_id) + print('' % trigger_chip_2_id) + else: + print('') + print('') + print('') + + print('') + print('') + print('') + print('') + print('' % info_com) + print('') + print('') + print('
LocationDAQ Chip IDTrigger Chip 1 IDTrigger Chip 2 ID
%s%s%s%sNoneNoneNone
Comments
%s
') + print('
') + +def add_board_info(board_id, sn, location, daqid, trig1id, trig2id, info): + db = connect(1) + cur = db.cursor() + + if not board_id: + try: + cur.execute('SELECT board_id FROM Board WHERE full_id = %s;' % sn) + rows = cur.fetchall() + + if not rows: + home_page_list.add_module(sn) + cur.execute('SELECT board_id FROM Board WHERE full_id = %s;' % sn) + board_id = cur.fetchall()[0][0] + else: + board_id = rows[0][0] + + except mysql.connector.Error as err: + print("CONNECTION ERROR") + print(err) + + try: + cur.execute('INSERT INTO Board_Info (board_id, info_type, info, daq_chip_id, trigger_chip_1_id, trigger_chip_2_id, location) VALUES (%i, %i, "%s", "%s", "%s", "%s", "%s");' % (board_id, 0, info, daqid, trig1id, trig2id, location)) + + db.commit() + db.close() + + except mysql.connector.Error as err: + print("CONNECTION ERROR") + print(err) + +def add_revoke(test_id): + db = connect(0) + cur = db.cursor() + + cur.execute("SELECT test_type_id, board_id FROM Test WHERE test_id = %s" % test_id) + test_type_id, board_id = cur.fetchall()[0] + + cur.execute("SELECT name FROM Test_Type WHERE test_type = %s" % test_type_id) + name = cur.fetchall()[0][0] + + cur.execute("Select full_id FROM Board WHERE board_id = %s" % board_id) + full_id = cur.fetchall()[0][0] + + print('
') + print('
') + print('

Revoke %s for Board %s

' % (name, full_id)) + print('
') + print('
') + + print('
') + print('' % test_id) + print('
') + print('') + print('') + print('
') + print('
') + print('
') + print('') + print('') + +def revoke_success(test_id, comments): + db = connect(1) + cur = db.cursor() + + try: + cur.execute('INSERT INTO TestRevoke (test_id, comment) VALUES (%s, "%s")' % (test_id, comments)) + + db.commit() + db.close() + + except mysql.connector.Error as err: + print("CONNECTION ERROR") + print(err) + +def get_test_types(): + db = connect(0) + cur = db.cursor() + + try: + cur.execute('SELECT name, test_type FROM Test_Type') + + rows = cur.fetchall() + tests = [[r[0],r[1]] for r in rows] + + return tests + + except mysql.connector.Error as err: + print("CONNECTION ERROR") + print(err) + diff --git a/cgi-bin/EngineDB/module_functions.pyc b/cgi-bin/EngineDB/module_functions.pyc new file mode 100644 index 0000000..bfd74e5 Binary files /dev/null and b/cgi-bin/EngineDB/module_functions.pyc differ diff --git a/cgi-bin/EngineDB/password_entry.py b/cgi-bin/EngineDB/password_entry.py new file mode 100755 index 0000000..4229d54 --- /dev/null +++ b/cgi-bin/EngineDB/password_entry.py @@ -0,0 +1,40 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list +import add_test_functions + + +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +url = form.getvalue("url") + +base.header(title='Admin Access') +base.top() + +print('
') +print(''%url) +print("
") +print('
') +print('

Admin Access

') +print("

") +print("
") + +print("
") +print('
') +print("") +print("") +print("
") + +print('
') +print('') +print("
") +print("
") +print("
") + +print("
") + +base.bottom() diff --git a/cgi-bin/EngineDB/password_entry2.py b/cgi-bin/EngineDB/password_entry2.py new file mode 100755 index 0000000..b7daa4f --- /dev/null +++ b/cgi-bin/EngineDB/password_entry2.py @@ -0,0 +1,50 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list +import add_test_functions +import hashlib +import connect + +try: + base_url = connect.get_base_url() + + form = cgi.FieldStorage() + url = form.getvalue("url") + password = form.getvalue("password") + + correct_password = "8ae3ce28c2aecce334e4c2395b86066b" + + if hashlib.md5(password.encode('utf-8')).hexdigest() == correct_password: + print("Location: %s/%s\n\n" % (base_url,url)) + + print("Content-type: text/html\n") + + base.header(title='Access Granted') + base.top() + + print("
") + print('
') + print('

Access Granted

') + print("
") + print("
") + + base.bottom() + + else: + print("Content-type: text/html\n") + + base.header(title='Access Denied') + base.top() + + print("
") + print('
') + print('

Access Denied

') + print("
") + print("
") + + base.bottom() +except Exception as e: + print("content-type: text/html\n") + print(e) diff --git a/cgi-bin/EngineDB/publish.py b/cgi-bin/EngineDB/publish.py new file mode 100755 index 0000000..63946aa --- /dev/null +++ b/cgi-bin/EngineDB/publish.py @@ -0,0 +1,54 @@ +#!/usr/bin/python3 +import sys +import os + +if len(sys.argv) == 1: + print("Please input a destination directory after the script call.") + sys.exit() +else: + if not os.path.isdir(sys.argv[1]): + os.makedirs(sys.argv[1]) +import base +from home_page_list import fetch_list_module +from connect import connect +import home_page +import module_functions +import summary +from summary_functions import get +import shutil + +def copytree(src, dst, symlinks=False, ignore=None): + for item in os.listdir(src): + s = os.path.join(src, item) + d = os.path.join(dst, item) + if os.path.isdir(s): + shutil.copytree(s, d, symlinks, ignore) + else: + shutil.copy2(s, d) + +row = fetch_list_module() + +for cards in row: + stdout = sys.stdout + sys.stdout = open('%(loc)s/card_%(sn)s.html' %{ 'loc':sys.argv[1],'sn':cards[0]}, 'w') + serial_num = cards[0] + card_id = cards[1] + base.header(title='uHTR ePortage') + base.top() + revokes=module_functions.Portage_fetch_revokes(serial_num) + + db= connect(0) + cur = db.cursor() + + cur.execute("select test_type, name from Test_Type where required = 1 order by relative_order ASC") + for test_type in cur: + module_functions.ePortageTest(test_type[0], serial_num, test_type[1], revokes) + sys.stdout.close() + sys.stdout = stdout + + base.bottom() + +copytree('../static/css', '%s' %(sys.argv[1])) + +copytree('../static/files' , '%s' %sys.argv[1]) + diff --git a/cgi-bin/EngineDB/revoke_success.py b/cgi-bin/EngineDB/revoke_success.py new file mode 100755 index 0000000..ef5a0b1 --- /dev/null +++ b/cgi-bin/EngineDB/revoke_success.py @@ -0,0 +1,23 @@ +#!/usr/bin/python3 + +import cgi +import cgitb +import base +import home_page_list +import module_functions +from connect import connect + +cgitb.enable() + +#cgi header +print("Content-type: text/html\n") + + +form = cgi.FieldStorage() +test_id = base.cleanCGInumber(form.getvalue('test_id')) +base.header(title='Revoke Test') +base.top() + +module_functions.add_revoke(test_id) + +base.bottom() diff --git a/cgi-bin/EngineDB/revoke_success2.py b/cgi-bin/EngineDB/revoke_success2.py new file mode 100755 index 0000000..3c8d99a --- /dev/null +++ b/cgi-bin/EngineDB/revoke_success2.py @@ -0,0 +1,31 @@ +#!/usr/bin/python3 + +import cgi +import cgitb +import base +import module_functions +import connect + +cgitb.enable() + +base_url = connect.get_base_url() + +print("Location: %s/summary.py\n\n"%(base_url)) +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +test_id = base.cleanCGInumber(form.getvalue("test_id")) +comments = form.getvalue("revokeComments") + +if comments: + comments = cgi.escape(comments) + +base.header(title='Revoke Success') +base.top() + +module_functions.revoke_success(test_id, comments) + +base.bottom() + + diff --git a/cgi-bin/EngineDB/settings.py b/cgi-bin/EngineDB/settings.py new file mode 100755 index 0000000..29efbc4 --- /dev/null +++ b/cgi-bin/EngineDB/settings.py @@ -0,0 +1,7 @@ +#!/usr/bin/python3 +def getAttachmentBasePath(): + return "/home/jmmans/tmp/ePortage" +# return "/home/daq/ePortageArchive/uHTR" + +def getAttachmentPathFor(test_id,attach_id): + return "%s/%d/%d" % (getAttachmentBasePath(),test_id,attach_id) diff --git a/cgi-bin/EngineDB/settings.pyc b/cgi-bin/EngineDB/settings.pyc new file mode 100644 index 0000000..7ac922c Binary files /dev/null and b/cgi-bin/EngineDB/settings.pyc differ diff --git a/cgi-bin/EngineDB/static/config.json b/cgi-bin/EngineDB/static/config.json new file mode 100644 index 0000000..6ba5807 --- /dev/null +++ b/cgi-bin/EngineDB/static/config.json @@ -0,0 +1,408 @@ +{ + "vars": { + "@gray-base": "#000", + "@gray-darker": "lighten(@gray-base, 13.5%)", + "@gray-dark": "lighten(@gray-base, 20%)", + "@gray": "lighten(@gray-base, 33.5%)", + "@gray-light": "lighten(@gray-base, 46.7%)", + "@gray-lighter": "lighten(@gray-base, 93.5%)", + "@brand-primary": "darken(#428bca, 6.5%)", + "@brand-success": "#5cb85c", + "@brand-info": "#5bc0de", + "@brand-warning": "#f0ad4e", + "@brand-danger": "#d9534f", + "@body-bg": "#fff", + "@text-color": "@gray-dark", + "@link-color": "@brand-primary", + "@link-hover-color": "darken(@link-color, 15%)", + "@link-hover-decoration": "underline", + "@font-family-sans-serif": "\"Helvetica Neue\", Helvetica, Arial, sans-serif", + "@font-family-serif": "Georgia, \"Times New Roman\", Times, serif", + "@font-family-monospace": "Menlo, Monaco, Consolas, \"Courier New\", monospace", + "@font-family-base": "@font-family-sans-serif", + "@font-size-base": "14px", + "@font-size-large": "ceil((@font-size-base * 1.25))", + "@font-size-small": "ceil((@font-size-base * 0.85))", + "@font-size-h1": "floor((@font-size-base * 2.6))", + "@font-size-h2": "floor((@font-size-base * 2.15))", + "@font-size-h3": "ceil((@font-size-base * 1.7))", + "@font-size-h4": "ceil((@font-size-base * 1.25))", + "@font-size-h5": "@font-size-base", + "@font-size-h6": "ceil((@font-size-base * 0.85))", + "@line-height-base": "1.428571429", + "@line-height-computed": "floor((@font-size-base * @line-height-base))", + "@headings-font-family": "inherit", + "@headings-font-weight": "500", + "@headings-line-height": "1.1", + "@headings-color": "inherit", + "@icon-font-path": "\"../fonts/\"", + "@icon-font-name": "\"glyphicons-halflings-regular\"", + "@icon-font-svg-id": "\"glyphicons_halflingsregular\"", + "@padding-base-vertical": "6px", + "@padding-base-horizontal": "12px", + "@padding-large-vertical": "10px", + "@padding-large-horizontal": "16px", + "@padding-small-vertical": "5px", + "@padding-small-horizontal": "10px", + "@padding-xs-vertical": "1px", + "@padding-xs-horizontal": "5px", + "@line-height-large": "1.3333333", + "@line-height-small": "1.5", + "@border-radius-base": "4px", + "@border-radius-large": "6px", + "@border-radius-small": "3px", + "@component-active-color": "#fff", + "@component-active-bg": "@brand-primary", + "@caret-width-base": "4px", + "@caret-width-large": "5px", + "@table-cell-padding": "8px", + "@table-condensed-cell-padding": "5px", + "@table-bg": "transparent", + "@table-bg-accent": "#f9f9f9", + "@table-bg-hover": "#f5f5f5", + "@table-bg-active": "@table-bg-hover", + "@table-border-color": "#ddd", + "@btn-font-weight": "normal", + "@btn-default-color": "#333", + "@btn-default-bg": "#fff", + "@btn-default-border": "#ccc", + "@btn-primary-color": "#fff", + "@btn-primary-bg": "@brand-primary", + "@btn-primary-border": "darken(@btn-primary-bg, 5%)", + "@btn-success-color": "#fff", + "@btn-success-bg": "@brand-success", + "@btn-success-border": "darken(@btn-success-bg, 5%)", + "@btn-info-color": "#fff", + "@btn-info-bg": "@brand-info", + "@btn-info-border": "darken(@btn-info-bg, 5%)", + "@btn-warning-color": "#fff", + "@btn-warning-bg": "@brand-warning", + "@btn-warning-border": "darken(@btn-warning-bg, 5%)", + "@btn-danger-color": "#fff", + "@btn-danger-bg": "@brand-danger", + "@btn-danger-border": "darken(@btn-danger-bg, 5%)", + "@btn-link-disabled-color": "@gray-light", + "@input-bg": "#fff", + "@input-bg-disabled": "@gray-lighter", + "@input-color": "@gray", + "@input-border": "#ccc", + "@input-border-radius": "@border-radius-base", + "@input-border-radius-large": "@border-radius-large", + "@input-border-radius-small": "@border-radius-small", + "@input-border-focus": "#66afe9", + "@input-color-placeholder": "#999", + "@input-height-base": "(@line-height-computed + (@padding-base-vertical * 2) + 2)", + "@input-height-large": "(ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2)", + "@input-height-small": "(floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2)", + "@legend-color": "@gray-dark", + "@legend-border-color": "#e5e5e5", + "@input-group-addon-bg": "@gray-lighter", + "@input-group-addon-border-color": "@input-border", + "@cursor-disabled": "not-allowed", + "@dropdown-bg": "#fff", + "@dropdown-border": "rgba(0,0,0,.15)", + "@dropdown-fallback-border": "#ccc", + "@dropdown-divider-bg": "#e5e5e5", + "@dropdown-link-color": "@gray-dark", + "@dropdown-link-hover-color": "darken(@gray-dark, 5%)", + "@dropdown-link-hover-bg": "#f5f5f5", + "@dropdown-link-active-color": "@component-active-color", + "@dropdown-link-active-bg": "@component-active-bg", + "@dropdown-link-disabled-color": "@gray-light", + "@dropdown-header-color": "@gray-light", + "@dropdown-caret-color": "#000", + "@screen-xs": "480px", + "@screen-xs-min": "@screen-xs", + "@screen-phone": "@screen-xs-min", + "@screen-sm": "768px", + "@screen-sm-min": "@screen-sm", + "@screen-tablet": "@screen-sm-min", + "@screen-md": "992px", + "@screen-md-min": "@screen-md", + "@screen-desktop": "@screen-md-min", + "@screen-lg": "1200px", + "@screen-lg-min": "@screen-lg", + "@screen-lg-desktop": "@screen-lg-min", + "@screen-xs-max": "(@screen-sm-min - 1)", + "@screen-sm-max": "(@screen-md-min - 1)", + "@screen-md-max": "(@screen-lg-min - 1)", + "@grid-columns": "12", + "@grid-gutter-width": "30px", + "@grid-float-breakpoint": "@screen-sm-min", + "@grid-float-breakpoint-max": "(@grid-float-breakpoint - 1)", + "@container-tablet": "(720px + @grid-gutter-width)", + "@container-sm": "@container-tablet", + "@container-desktop": "(940px + @grid-gutter-width)", + "@container-md": "@container-desktop", + "@container-large-desktop": "(1140px + @grid-gutter-width)", + "@container-lg": "@container-large-desktop", + "@navbar-height": "50px", + "@navbar-margin-bottom": "@line-height-computed", + "@navbar-border-radius": "@border-radius-base", + "@navbar-padding-horizontal": "floor((@grid-gutter-width / 2))", + "@navbar-padding-vertical": "((@navbar-height - @line-height-computed) / 2)", + "@navbar-collapse-max-height": "340px", + "@navbar-default-color": "#777", + "@navbar-default-bg": "#f8f8f8", + "@navbar-default-border": "darken(@navbar-default-bg, 6.5%)", + "@navbar-default-link-color": "#777", + "@navbar-default-link-hover-color": "#333", + "@navbar-default-link-hover-bg": "transparent", + "@navbar-default-link-active-color": "#555", + "@navbar-default-link-active-bg": "darken(@navbar-default-bg, 6.5%)", + "@navbar-default-link-disabled-color": "#ccc", + "@navbar-default-link-disabled-bg": "transparent", + "@navbar-default-brand-color": "@navbar-default-link-color", + "@navbar-default-brand-hover-color": "darken(@navbar-default-brand-color, 10%)", + "@navbar-default-brand-hover-bg": "transparent", + "@navbar-default-toggle-hover-bg": "#ddd", + "@navbar-default-toggle-icon-bar-bg": "#888", + "@navbar-default-toggle-border-color": "#ddd", + "@navbar-inverse-color": "lighten(@gray-light, 15%)", + "@navbar-inverse-bg": "#222", + "@navbar-inverse-border": "darken(@navbar-inverse-bg, 10%)", + "@navbar-inverse-link-color": "lighten(@gray-light, 15%)", + "@navbar-inverse-link-hover-color": "#fff", + "@navbar-inverse-link-hover-bg": "transparent", + "@navbar-inverse-link-active-color": "@navbar-inverse-link-hover-color", + "@navbar-inverse-link-active-bg": "darken(@navbar-inverse-bg, 10%)", + "@navbar-inverse-link-disabled-color": "#444", + "@navbar-inverse-link-disabled-bg": "transparent", + "@navbar-inverse-brand-color": "@navbar-inverse-link-color", + "@navbar-inverse-brand-hover-color": "#fff", + "@navbar-inverse-brand-hover-bg": "transparent", + "@navbar-inverse-toggle-hover-bg": "#333", + "@navbar-inverse-toggle-icon-bar-bg": "#fff", + "@navbar-inverse-toggle-border-color": "#333", + "@nav-link-padding": "10px 15px", + "@nav-link-hover-bg": "@gray-lighter", + "@nav-disabled-link-color": "@gray-light", + "@nav-disabled-link-hover-color": "@gray-light", + "@nav-tabs-border-color": "#ddd", + "@nav-tabs-link-hover-border-color": "@gray-lighter", + "@nav-tabs-active-link-hover-bg": "@body-bg", + "@nav-tabs-active-link-hover-color": "@gray", + "@nav-tabs-active-link-hover-border-color": "#ddd", + "@nav-tabs-justified-link-border-color": "#ddd", + "@nav-tabs-justified-active-link-border-color": "@body-bg", + "@nav-pills-border-radius": "@border-radius-base", + "@nav-pills-active-link-hover-bg": "@component-active-bg", + "@nav-pills-active-link-hover-color": "@component-active-color", + "@pagination-color": "@link-color", + "@pagination-bg": "#fff", + "@pagination-border": "#ddd", + "@pagination-hover-color": "@link-hover-color", + "@pagination-hover-bg": "@gray-lighter", + "@pagination-hover-border": "#ddd", + "@pagination-active-color": "#fff", + "@pagination-active-bg": "@brand-primary", + "@pagination-active-border": "@brand-primary", + "@pagination-disabled-color": "@gray-light", + "@pagination-disabled-bg": "#fff", + "@pagination-disabled-border": "#ddd", + "@pager-bg": "@pagination-bg", + "@pager-border": "@pagination-border", + "@pager-border-radius": "15px", + "@pager-hover-bg": "@pagination-hover-bg", + "@pager-active-bg": "@pagination-active-bg", + "@pager-active-color": "@pagination-active-color", + "@pager-disabled-color": "@pagination-disabled-color", + "@jumbotron-padding": "30px", + "@jumbotron-color": "inherit", + "@jumbotron-bg": "@gray-lighter", + "@jumbotron-heading-color": "inherit", + "@jumbotron-font-size": "ceil((@font-size-base * 1.5))", + "@state-success-text": "#3c763d", + "@state-success-bg": "#dff0d8", + "@state-success-border": "darken(spin(@state-success-bg, -10), 5%)", + "@state-info-text": "#31708f", + "@state-info-bg": "#d9edf7", + "@state-info-border": "darken(spin(@state-info-bg, -10), 7%)", + "@state-warning-text": "#8a6d3b", + "@state-warning-bg": "#fcf8e3", + "@state-warning-border": "darken(spin(@state-warning-bg, -10), 5%)", + "@state-danger-text": "#a94442", + "@state-danger-bg": "#f2dede", + "@state-danger-border": "darken(spin(@state-danger-bg, -10), 5%)", + "@tooltip-max-width": "200px", + "@tooltip-color": "#fff", + "@tooltip-bg": "#000", + "@tooltip-opacity": ".9", + "@tooltip-arrow-width": "5px", + "@tooltip-arrow-color": "@tooltip-bg", + "@popover-bg": "#fff", + "@popover-max-width": "276px", + "@popover-border-color": "rgba(0,0,0,.2)", + "@popover-fallback-border-color": "#ccc", + "@popover-title-bg": "darken(@popover-bg, 3%)", + "@popover-arrow-width": "10px", + "@popover-arrow-color": "@popover-bg", + "@popover-arrow-outer-width": "(@popover-arrow-width + 1)", + "@popover-arrow-outer-color": "fadein(@popover-border-color, 5%)", + "@popover-arrow-outer-fallback-color": "darken(@popover-fallback-border-color, 20%)", + "@label-default-bg": "@gray-light", + "@label-primary-bg": "@brand-primary", + "@label-success-bg": "@brand-success", + "@label-info-bg": "@brand-info", + "@label-warning-bg": "@brand-warning", + "@label-danger-bg": "@brand-danger", + "@label-color": "#fff", + "@label-link-hover-color": "#fff", + "@modal-inner-padding": "15px", + "@modal-title-padding": "15px", + "@modal-title-line-height": "@line-height-base", + "@modal-content-bg": "#fff", + "@modal-content-border-color": "rgba(0,0,0,.2)", + "@modal-content-fallback-border-color": "#999", + "@modal-backdrop-bg": "#000", + "@modal-backdrop-opacity": ".5", + "@modal-header-border-color": "#e5e5e5", + "@modal-footer-border-color": "@modal-header-border-color", + "@modal-lg": "900px", + "@modal-md": "600px", + "@modal-sm": "300px", + "@alert-padding": "15px", + "@alert-border-radius": "@border-radius-base", + "@alert-link-font-weight": "bold", + "@alert-success-bg": "@state-success-bg", + "@alert-success-text": "@state-success-text", + "@alert-success-border": "@state-success-border", + "@alert-info-bg": "@state-info-bg", + "@alert-info-text": "@state-info-text", + "@alert-info-border": "@state-info-border", + "@alert-warning-bg": "@state-warning-bg", + "@alert-warning-text": "@state-warning-text", + "@alert-warning-border": "@state-warning-border", + "@alert-danger-bg": "@state-danger-bg", + "@alert-danger-text": "@state-danger-text", + "@alert-danger-border": "@state-danger-border", + "@progress-bg": "#f5f5f5", + "@progress-bar-color": "#fff", + "@progress-border-radius": "@border-radius-base", + "@progress-bar-bg": "@brand-primary", + "@progress-bar-success-bg": "@brand-success", + "@progress-bar-warning-bg": "@brand-warning", + "@progress-bar-danger-bg": "@brand-danger", + "@progress-bar-info-bg": "@brand-info", + "@list-group-bg": "#fff", + "@list-group-border": "#ddd", + "@list-group-border-radius": "@border-radius-base", + "@list-group-hover-bg": "#f5f5f5", + "@list-group-active-color": "@component-active-color", + "@list-group-active-bg": "@component-active-bg", + "@list-group-active-border": "@list-group-active-bg", + "@list-group-active-text-color": "lighten(@list-group-active-bg, 40%)", + "@list-group-disabled-color": "@gray-light", + "@list-group-disabled-bg": "@gray-lighter", + "@list-group-disabled-text-color": "@list-group-disabled-color", + "@list-group-link-color": "#555", + "@list-group-link-hover-color": "@list-group-link-color", + "@list-group-link-heading-color": "#333", + "@panel-bg": "#fff", + "@panel-body-padding": "15px", + "@panel-heading-padding": "10px 15px", + "@panel-footer-padding": "@panel-heading-padding", + "@panel-border-radius": "@border-radius-base", + "@panel-inner-border": "#ddd", + "@panel-footer-bg": "#f5f5f5", + "@panel-default-text": "@gray-dark", + "@panel-default-border": "#ddd", + "@panel-default-heading-bg": "#f5f5f5", + "@panel-primary-text": "#fff", + "@panel-primary-border": "@brand-primary", + "@panel-primary-heading-bg": "@brand-primary", + "@panel-success-text": "@state-success-text", + "@panel-success-border": "@state-success-border", + "@panel-success-heading-bg": "@state-success-bg", + "@panel-info-text": "@state-info-text", + "@panel-info-border": "@state-info-border", + "@panel-info-heading-bg": "@state-info-bg", + "@panel-warning-text": "@state-warning-text", + "@panel-warning-border": "@state-warning-border", + "@panel-warning-heading-bg": "@state-warning-bg", + "@panel-danger-text": "@state-danger-text", + "@panel-danger-border": "@state-danger-border", + "@panel-danger-heading-bg": "@state-danger-bg", + "@thumbnail-padding": "4px", + "@thumbnail-bg": "@body-bg", + "@thumbnail-border": "#ddd", + "@thumbnail-border-radius": "@border-radius-base", + "@thumbnail-caption-color": "@text-color", + "@thumbnail-caption-padding": "9px", + "@well-bg": "#f5f5f5", + "@well-border": "darken(@well-bg, 7%)", + "@badge-color": "#fff", + "@badge-link-hover-color": "#fff", + "@badge-bg": "@gray-light", + "@badge-active-color": "@link-color", + "@badge-active-bg": "#fff", + "@badge-font-weight": "bold", + "@badge-line-height": "1", + "@badge-border-radius": "10px", + "@breadcrumb-padding-vertical": "8px", + "@breadcrumb-padding-horizontal": "15px", + "@breadcrumb-bg": "#f5f5f5", + "@breadcrumb-color": "#ccc", + "@breadcrumb-active-color": "@gray-light", + "@breadcrumb-separator": "\"/\"", + "@carousel-text-shadow": "0 1px 2px rgba(0,0,0,.6)", + "@carousel-control-color": "#fff", + "@carousel-control-width": "15%", + "@carousel-control-opacity": ".5", + "@carousel-control-font-size": "20px", + "@carousel-indicator-active-bg": "#fff", + "@carousel-indicator-border-color": "#fff", + "@carousel-caption-color": "#fff", + "@close-font-weight": "bold", + "@close-color": "#000", + "@close-text-shadow": "0 1px 0 #fff", + "@code-color": "#c7254e", + "@code-bg": "#f9f2f4", + "@kbd-color": "#fff", + "@kbd-bg": "#333", + "@pre-bg": "#f5f5f5", + "@pre-color": "@gray-dark", + "@pre-border-color": "#ccc", + "@pre-scrollable-max-height": "340px", + "@component-offset-horizontal": "180px", + "@text-muted": "@gray-light", + "@abbr-border-color": "@gray-light", + "@headings-small-color": "@gray-light", + "@blockquote-small-color": "@gray-light", + "@blockquote-font-size": "(@font-size-base * 1.25)", + "@blockquote-border-color": "@gray-lighter", + "@page-header-border-color": "@gray-lighter", + "@dl-horizontal-offset": "@component-offset-horizontal", + "@hr-border": "@gray-lighter" + }, + "css": [ + "print.less", + "type.less", + "code.less", + "grid.less", + "tables.less", + "forms.less", + "buttons.less", + "responsive-utilities.less", + "button-groups.less", + "input-groups.less", + "labels.less", + "dropdowns.less", + "modals.less" + ], + "js": [ + "alert.js", + "button.js", + "carousel.js", + "dropdown.js", + "modal.js", + "tooltip.js", + "popover.js", + "tab.js", + "affix.js", + "collapse.js", + "scrollspy.js", + "transition.js" + ], + "customizerUrl": "http://getbootstrap.com/customize/?id=c359f3d5455d568ef741" +} \ No newline at end of file diff --git a/cgi-bin/EngineDB/static/css/bootstrap-theme.css b/cgi-bin/EngineDB/static/css/bootstrap-theme.css new file mode 100644 index 0000000..f3f644f --- /dev/null +++ b/cgi-bin/EngineDB/static/css/bootstrap-theme.css @@ -0,0 +1,479 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c359f3d5455d568ef741) + * Config saved to config.json and https://gist.github.com/c359f3d5455d568ef741 + */ +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + text-shadow: 0 1px 0 #fff; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + 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, +.btn-default[disabled] { + 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:hover, +.btn-primary:focus { + 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, +.btn-primary[disabled] { + 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:hover, +.btn-success:focus { + 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, +.btn-success[disabled] { + 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:hover, +.btn-info:focus { + 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, +.btn-info[disabled] { + 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:hover, +.btn-warning:focus { + 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, +.btn-warning[disabled] { + 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:hover, +.btn-danger:focus { + 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, +.btn-danger[disabled] { + background-color: #c12e2a; + background-image: none; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-color: #e8e8e8; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-color: #2e6da4; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .active > 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +@media (max-width: 767px) { + .navbar .navbar-nav .open .dropdown-menu > .active > a, + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { + 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + } +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); +} +.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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); +} +.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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); + border-color: #2b669a; +} +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); +} +.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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); +} diff --git a/cgi-bin/EngineDB/static/css/bootstrap-theme.min.css b/cgi-bin/EngineDB/static/css/bootstrap-theme.min.css new file mode 100644 index 0000000..a5de857 --- /dev/null +++ b/cgi-bin/EngineDB/static/css/bootstrap-theme.min.css @@ -0,0 +1,10 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c359f3d5455d568ef741) + * Config saved to config.json and https://gist.github.com/c359f3d5455d568ef741 + */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-o-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#e0e0e0));background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:hover,.btn-default:focus{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,.btn-default[disabled]{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, color-stop(0, #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:hover,.btn-primary:focus{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,.btn-primary[disabled]{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, color-stop(0, #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:hover,.btn-success:focus{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,.btn-success[disabled]{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, color-stop(0, #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:hover,.btn-info:focus{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,.btn-info[disabled]{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, color-stop(0, #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:hover,.btn-warning:focus{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,.btn-warning[disabled]{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, color-stop(0, #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:hover,.btn-danger:focus{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,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-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, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{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, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-o-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#f8f8f8));background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>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, color-stop(0, #dbdbdb), to(#e2e2e2));background-image:linear-gradient(to bottom, #dbdbdb 0, #e2e2e2 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-o-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #3c3c3c), to(#222));background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>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, color-stop(0, #080808), to(#0f0f0f));background-image:linear-gradient(to bottom, #080808 0, #0f0f0f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus{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, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0)}}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dff0d8), to(#c8e5bc));background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);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, color-stop(0, #d9edf7), to(#b9def0));background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);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, color-stop(0, #fcf8e3), to(#f8efc0));background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);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, color-stop(0, #f2dede), to(#e7c3c3));background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);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, color-stop(0, #ebebeb), to(#f5f5f5));background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top, #337ab7 0, #286090 100%);background-image:-o-linear-gradient(top, #337ab7 0, #286090 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#286090));background-image:linear-gradient(to bottom, #337ab7 0, #286090 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0)}.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, color-stop(0, #5cb85c), to(#449d44));background-image:linear-gradient(to bottom, #5cb85c 0, #449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-o-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5bc0de), to(#31b0d5));background-image:linear-gradient(to bottom, #5bc0de 0, #31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-o-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f0ad4e), to(#ec971f));background-image:linear-gradient(to bottom, #f0ad4e 0, #ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-o-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9534f), to(#c9302c));background-image:linear-gradient(to bottom, #d9534f 0, #c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #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, color-stop(0, #337ab7), to(#2b669a));background-image:linear-gradient(to bottom, #337ab7 0, #2b669a 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0)}.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, color-stop(0, #dff0d8), to(#d0e9c6));background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9edf7), to(#c4e3f3));background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fcf8e3), to(#faf2cc));background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-o-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2dede), to(#ebcccc));background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #e8e8e8), to(#f5f5f5));background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} \ No newline at end of file diff --git a/cgi-bin/EngineDB/static/css/bootstrap.css b/cgi-bin/EngineDB/static/css/bootstrap.css new file mode 100644 index 0000000..e2d6448 --- /dev/null +++ b/cgi-bin/EngineDB/static/css/bootstrap.css @@ -0,0 +1,3489 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c359f3d5455d568ef741) + * Config saved to config.json and https://gist.github.com/c359f3d5455d568ef741 + */ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +mark { + background: #ff0; + color: #000; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333333; + background-color: #ffffff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + padding: 4px; + line-height: 1.42857143; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + background-color: #fcf8e3; + padding: .2em; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eeeeee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; + text-align: right; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #ffffff; + background-color: #333333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.row { + margin-left: -15px; + margin-right: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0%; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #dddddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #dddddd; +} +.table .table { + background-color: #ffffff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #dddddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #dddddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + float: none; + display: table-column; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + overflow-x: auto; + min-height: 0.01%; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #dddddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); +} +.form-control::-moz-placeholder { + color: #999999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999999; +} +.form-control::-webkit-input-placeholder { + color: #999999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eeeeee; + opacity: 1; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-left: 0; + padding-right: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.form-group-sm .form-control { + height: 30px; + line-height: 30px; +} +textarea.form-group-sm .form-control, +select[multiple].form-group-sm .form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.form-group-lg .form-control { + height: 46px; + line-height: 46px; +} +textarea.form-group-lg .form-control, +select[multiple].form-group-lg .form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + border-color: #3c763d; + background-color: #dff0d8; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + border-color: #8a6d3b; + background-color: #fcf8e3; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + border-color: #a94442; + background-color: #f2dede; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 7px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 7px; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.333333px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + } +} +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333333; + text-decoration: none; +} +.btn:active, +.btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default { + color: #333333; + background-color: #ffffff; + border-color: #cccccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #ffffff; + border-color: #cccccc; +} +.btn-default .badge { + color: #ffffff; + background-color: #333333; +} +.btn-primary { + color: #ffffff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #ffffff; +} +.btn-success { + color: #ffffff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #ffffff; +} +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #ffffff; +} +.btn-warning { + color: #ffffff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #ffffff; +} +.btn-danger { + color: #ffffff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #ffffff; +} +.btn-link { + color: #337ab7; + font-weight: normal; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + -webkit-background-clip: padding-box; + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #337ab7; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + left: auto; + right: 0; +} +.dropdown-menu-left { + left: 0; + right: auto; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 4px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.modal-open { + overflow: hidden; +} +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + -webkit-background-clip: padding-box; + background-clip: padding-box; + outline: 0; +} +.modal-backdrop { + position: absolute; + top: 0; + right: 0; + left: 0; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; + min-height: 16.42857143px; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.modal-footer:before, +.modal-footer:after { + content: " "; + display: table; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; + visibility: hidden !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} diff --git a/cgi-bin/EngineDB/static/css/bootstrap.min.css b/cgi-bin/EngineDB/static/css/bootstrap.min.css new file mode 100644 index 0000000..6d14b1b --- /dev/null +++ b/cgi-bin/EngineDB/static/css/bootstrap.min.css @@ -0,0 +1,10 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c359f3d5455d568ef741) + * Config saved to config.json and https://gist.github.com/c359f3d5455d568ef741 + *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}textarea.form-group-sm .form-control,select[multiple].form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}textarea.form-group-lg .form-control,select[multiple].form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.333333px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}} \ No newline at end of file diff --git a/cgi-bin/EngineDB/static/css/style.css b/cgi-bin/EngineDB/static/css/style.css new file mode 100644 index 0000000..5ad9224 --- /dev/null +++ b/cgi-bin/EngineDB/static/css/style.css @@ -0,0 +1,29 @@ +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.uHTR_body{ + background-color: #CCAA44 +} + + +.sub-card-form{ + background-color: rgb(199, 215, 190); +} +.sub-card{ + color: red; +} +.sub-card-submit{ + color: red; +} + +.Portage_table{ + border-spacing: 2px; + border-color: gray; + background-color: rgb(215, 255, 202); + margin-left: 25px; +} + diff --git a/cgi-bin/EngineDB/static/files/Thumbs.db b/cgi-bin/EngineDB/static/files/Thumbs.db new file mode 100644 index 0000000..74f1401 Binary files /dev/null and b/cgi-bin/EngineDB/static/files/Thumbs.db differ diff --git a/cgi-bin/EngineDB/static/files/cmslogo.jpg b/cgi-bin/EngineDB/static/files/cmslogo.jpg new file mode 100644 index 0000000..4a9ab9d Binary files /dev/null and b/cgi-bin/EngineDB/static/files/cmslogo.jpg differ diff --git a/cgi-bin/EngineDB/static/files/goldy.pdf b/cgi-bin/EngineDB/static/files/goldy.pdf new file mode 100644 index 0000000..6a94620 Binary files /dev/null and b/cgi-bin/EngineDB/static/files/goldy.pdf differ diff --git a/cgi-bin/EngineDB/static/files/goldy2.png b/cgi-bin/EngineDB/static/files/goldy2.png new file mode 100644 index 0000000..ea1d206 Binary files /dev/null and b/cgi-bin/EngineDB/static/files/goldy2.png differ diff --git a/cgi-bin/EngineDB/static/files/us-cms.gif b/cgi-bin/EngineDB/static/files/us-cms.gif new file mode 100644 index 0000000..47c369f Binary files /dev/null and b/cgi-bin/EngineDB/static/files/us-cms.gif differ diff --git a/cgi-bin/EngineDB/static/js/bootstrap.js b/cgi-bin/EngineDB/static/js/bootstrap.js new file mode 100644 index 0000000..e10492d --- /dev/null +++ b/cgi-bin/EngineDB/static/js/bootstrap.js @@ -0,0 +1,2309 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c359f3d5455d568ef741) + * Config saved to config.json and https://gist.github.com/c359f3d5455d568ef741 + */ +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.2 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.2' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.2 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.2' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state = state + 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked') && this.$element.hasClass('active')) changed = false + else $parent.find('.active').removeClass('active') + } + if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + } + + if (changed) this.$element.toggleClass('active') + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + Plugin.call($btn, 'toggle') + e.preventDefault() + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.2 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = + this.sliding = + this.interval = + this.$active = + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.2' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.2 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.2' + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $(' +
+ +
+ +
+ +
+
HGCAL Board Test
+ +

+ Maintained by the UMN CMS Group. For inquiries or to report a bug, contact Bryan Crossman at cros0400@umn.edu +

+
+ +
+
+ +
+
Links
+ + +
+
+
+
''') + else: + print('''
+
+ +
+ +
+ +
+
HGCAL Board Test
+ +

+ Maintained by the UMN CMS Group. For inquiries or to report a bug, contact Bryan Crossman at cros0400@umn.edu +

+
+ +
+
+ +
+
Links
+ + +
+
+
+
''') + + print('
') + print('') + print('') + print('') + +def cleanCGInumber(cgitext): + if cgitext is None: + return 0 + return int(re.sub('[^0-9]','',cgitext)) + diff --git a/cgi-bin/WagonDB/base.pyc b/cgi-bin/WagonDB/base.pyc new file mode 100644 index 0000000..96f2f8d Binary files /dev/null and b/cgi-bin/WagonDB/base.pyc differ diff --git a/cgi-bin/WagonDB/bert_analytics.py b/cgi-bin/WagonDB/bert_analytics.py new file mode 100755 index 0000000..ad1a711 --- /dev/null +++ b/cgi-bin/WagonDB/bert_analytics.py @@ -0,0 +1,120 @@ +#!/usr/bin/python3 + + +import os, sys +import cgi +import cgitb +import pylab +import json + +import matplotlib +import matplotlib.pyplot as plt +import numpy as np + +import base +import add_test_functions + +def create_generic_hist(attachments1, title, number_val, stats): + + # Handles one value under graph_title in 'module 1' + graph_title = title + + values = [] + for attachment in attachments1: + if not attachment[str(number_val)] == None: + if not attachment[str(number_val)][graph_title] == None: + values.append(attachment[str(number_val)][graph_title]) + + + # if no values, can't make graph, so return + if len(values) == 0: + return + + + step = 10 + num_of_bins = 15 + + if not (max(values) - min(values)) == 0: + step = round(max(values) - min(values)) / num_of_bins + + + start = np.floor(min(values) / step) * step + stop = max(values) + step + bin_edges = np.arange(start, stop, step=step) + + + plt.hist(values, bins=bin_edges, density=False, histtype='bar') + plt.xlabel(graph_title + " Values") + plt.ylabel('Occurances') + full_title = graph_title + " " + str(number_val) + " Values" + plt.title(full_title) + plt.grid(True) + plt.xticks(np.arange(start, stop, step = step), rotation = 90) + + plt.tight_layout() + + plt.savefig('../static/files/bert/{0}_{1}.png'.format(graph_title, number_val)) + plt.close() + + + print(''.format(graph_title, number_val)) + + + add_to_stats(stats, full_title, values) + +# Adds statistics to the "stats" python dictionary +def add_to_stats(stats, full_title, values): + mean = sum(values) / len(values) + stand_deviation = np.std(values) + + stats['{}'.format(full_title)] = { + 'STD': stand_deviation, + 'range': max(values) - min(values), + 'mean': mean, + 'max': max(values), + 'min': min(values), + 'passing_range': ( mean - stand_deviation, mean + stand_deviation ) + } + + +#############End of Functions########################## + + + +cgitb.enable() + +# chose a non-GUI backend +# matplotlib.use( 'Agg' ) +print("Content-type: text/html\n") + +base.header(title='Analytics') +base.top() + + +form = cgi.FieldStorage() + +# Gets the attachment from the DB +attachments4 = add_test_functions.get_test_attachments(4) +stats = {'analytic_type': "Bit Error Rate Test"} + +######################################################## + +for index in range(1, 11): + create_generic_hist(attachments4, 'Midpoint', index, stats) + create_generic_hist(attachments4, 'Eye Opening', index, stats) + +######################################################## + +print(json.dumps(stats, indent = 4)) + +with open('../static/files/bert/bert_stats.json', 'w') as open_file: + json.dump(stats, open_file, indent = 4) + +# TODO Actually print out all of the graphs after matplotlib is installed +# Done in the generic and sub_generic functions + + + + +base.bottom() + diff --git a/cgi-bin/WagonDB/board_check_functions.py b/cgi-bin/WagonDB/board_check_functions.py new file mode 100755 index 0000000..1790718 --- /dev/null +++ b/cgi-bin/WagonDB/board_check_functions.py @@ -0,0 +1,194 @@ +#!/usr/bin/python3 + +from connect import connect +import cgi +import cgitb; cgitb.enable() +import base +import home_page_list +import add_test_functions + +def board_checkout_form_sn(sn): + db = connect(0) + cur = db.cursor() + + print('
') + print("
") + print('
') + print('

Board Checkout

') + print("
") + print("
") + + print("
") + print('
') + print('') + print(''%sn) + print("
") + + cur.execute("Select person_id, person_name from People;") + + print('
') + print('') + print('
') + + print("
") + print('
') + print("") + cur.execute("select test_type, name from Test_Type order by relative_order ASC;") + print('') + print("
") + print("
") + + print("
") + print('
') + print('

') + print('') + print('

') + print('
') + + print("
") + print('
') + print('') + print("
") + print("
") + print("
") + print("
") + print("") + +def board_checkout(serial_num, person_id, test_type, comments): + db = connect(1) + cur = db.cursor() + + try: + cur.execute("SELECT sn FROM Board WHERE '%s' = full_id" % serial_num) + board_id = cur.fetchone()[0] + + sql = "SELECT checkout_id, person_id FROM Check_Out WHERE board_id = %s" % board_id + cur.execute(sql) + checkouts = cur.fetchall() + if checkouts: + checkout_id = checkouts[-1][0] + checkout_person = checkouts[-1][1] + sql = "SELECT Check_In.checkout_id FROM Check_In, Check_Out WHERE Check_In.checkout_id = %s AND Check_Out.checkout_id = %s" % (checkout_id, checkout_id) + cur.execute(sql) + results = cur.fetchall() + if results: + sql = "INSERT INTO Check_Out (board_id, test_type, person_id, comment, checkout_date) VALUES (%s, %s, %s, '%s', NOW())" % (board_id, test_type, person_id, comments) + cur.execute(sql) + + db.commit() + else: + cur.execute("SELECT People.person_name FROM People WHERE People.person_id = %s" % person_id) + tester = cur.fetchone()[0] + + print('
') + print('
') + print('

This board is currently checked out by %s

' % tester) + print('
') + print('
') + + print('
') + print('') + print('
') + else: + sql = "INSERT INTO Check_Out (board_id, test_type, person_id, comment, checkout_date) VALUES (%s, %s, %s, '%s', NOW())" % (board_id, test_type, person_id, comments) + cur.execute(sql) + + db.commit() + + + except Exception as e: + print(e) + + print('
') + print('
') + print('

Attempt Failed. Please ensure all fields are filled.

') + print('
') + print('
') + + +def board_checkin_form_sn(sn): + db = connect(0) + cur = db.cursor() + + print('
') + print("
") + print('
') + print('

Board Checkin

') + print("
") + print("
") + + print("
") + print('
') + print('') + print('') + print("
") + print("
") + + print("
") + print('
') + print('') + print("
") + print("
") + print("
") + print("
") + print("
") + +def board_checkin(board_id): + db = connect(1) + cur = db.cursor() + + try: + cur.execute("SELECT checkout_id FROM Check_Out WHERE board_id = %s" % board_id) + checkout_id = cur.fetchall()[0] + + sql = "INSERT INTO Check_In (checkout_id, checkin_date) VALUES (%s, NOW())" % (checkout_id) + cur.execute(sql) + + db.commit() + + except Exception as e: + print(e) + print(cur.fetchall()) + + print('
') + print('
') + print('

Attempt Failed. Please ensure all fields are filled.

') + print('
') + print('
') diff --git a/cgi-bin/WagonDB/board_check_functions.pyc b/cgi-bin/WagonDB/board_check_functions.pyc new file mode 100644 index 0000000..5f1c40e Binary files /dev/null and b/cgi-bin/WagonDB/board_check_functions.pyc differ diff --git a/cgi-bin/WagonDB/board_checkin.py b/cgi-bin/WagonDB/board_checkin.py new file mode 100755 index 0000000..7ce347c --- /dev/null +++ b/cgi-bin/WagonDB/board_checkin.py @@ -0,0 +1,25 @@ +#!/usr/bin/python3 + +import cgi +import cgitb; cgitb.enable() +import base +import home_page_list +import board_check_functions + + +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +#url = form.getvalue("url") +board_id = base.cleanCGInumber(form.getvalue("board_id")) + +base.header(title='Board Check In') +base.top() + +if board_id: + board_check_functions.board_checkin_form_sn(board_id) +else: + board_check_functions.board_checkin_form_sn("") + +base.bottom() diff --git a/cgi-bin/WagonDB/board_checkin2.py b/cgi-bin/WagonDB/board_checkin2.py new file mode 100755 index 0000000..03de9b6 --- /dev/null +++ b/cgi-bin/WagonDB/board_checkin2.py @@ -0,0 +1,24 @@ +#!/usr/bin/python3 + +import cgi +import cgitb; cgitb.enable() +import base +import board_check_functions +import os +import connect + +base_url = connect.get_base_url() + +#print("Location: %s/summary.py\n\n" % base_url) +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +board_id = base.cleanCGInumber(form.getvalue("board_id")) + +base.header(title='Board Check In') +base.top() + +board_check_functions.board_checkin(board_id) + +base.bottom() diff --git a/cgi-bin/WagonDB/board_checkout.py b/cgi-bin/WagonDB/board_checkout.py new file mode 100755 index 0000000..3580924 --- /dev/null +++ b/cgi-bin/WagonDB/board_checkout.py @@ -0,0 +1,24 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list +import board_check_functions + + +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +#url = form.getvalue("url") +serial_num = cgi.escape(form.getvalue("serial_num")) + +base.header(title='Board Checkout') +base.top() + +if serial_num: + board_check_functions.board_checkout_form_sn(serial_num) +else: + board_check_functions.board_checkout_form_sn("") + +base.bottom() diff --git a/cgi-bin/WagonDB/board_checkout2.py b/cgi-bin/WagonDB/board_checkout2.py new file mode 100755 index 0000000..edb403a --- /dev/null +++ b/cgi-bin/WagonDB/board_checkout2.py @@ -0,0 +1,30 @@ +#!/usr/bin/python3 + +import cgi +import cgitb; cgitb.enable() +import base +import board_check_functions +import os +import connect + +base_url = connect.get_base_url() + +print("Location: %s/summary.py\n\n" % base_url) +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +serial_num = cgi.escape(form.getvalue("serial_number")) +person_id = base.cleanCGInumber(form.getvalue("person_id")) +test_type = base.cleanCGInumber(form.getvalue("test_type")) +comments = form.getvalue("comments") + +if comments: + comments = cgi.escape(comments) + +base.header(title='Board Checkout') +base.top() + +board_check_functions.board_checkout(serial_num, person_id, test_type, comments) + +base.bottom() diff --git a/cgi-bin/WagonDB/check_sn.py b/cgi-bin/WagonDB/check_sn.py new file mode 100755 index 0000000..b5dfcf5 --- /dev/null +++ b/cgi-bin/WagonDB/check_sn.py @@ -0,0 +1,74 @@ +#!/usr/bin/python3 + +from connect import connect +import sys +#import mysql.connector + +base_url = connect.get_base_url() + +print("Location: %s/summary.py\n\n"%(base_url)) + +import os + +print(os.environ.get("QUERY_STRING", "No Query String in url")) + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Adding a new module...') +base.top() + +form = cgi.FieldStorage() + +if form.getvalue('serial_number'): + sn = cgi.escape(form.getvalue('serial_number')) + + #print '
Serial Number = %(s)s , )s
' %{'s': sn} + home_page_list.add_module(sn) + + print('
') + print('
') + print('

List of All Boards

' ) + print('(Sorted by Serial Number)') + print('
') + print('') + print('
') + + print('

') + + + home_page_list.render_list_module() + + base.bottom() + + +else: + print('
') + print('
') + print('

FAILED. Enter SERIAL NUMBER

') + print('
') + print('
') + + home_page_list.add_module_form() + + + print('
') + print('
') + print('

List of All Boards

' ) + print('(Sorted by Serial Number)') + print('
') + print('
') + + print('

') + + home_page_list.render_list_module() + + base.bottom() + + + + diff --git a/cgi-bin/WagonDB/checkout_summary.py b/cgi-bin/WagonDB/checkout_summary.py new file mode 100755 index 0000000..3487289 --- /dev/null +++ b/cgi-bin/WagonDB/checkout_summary.py @@ -0,0 +1,83 @@ +#!/usr/bin/python3 + +import cgi +import base +from connect import connect +#import mysql.connector +from summary_functions import get +import module_functions +import sys + +if len(sys.argv) != 1: + sys.stdout = open('%(loc)s/summary.html' %{'loc':sys.argv[1]}, 'w') + +else: + #cgi header + print("Content-type: text/html\n") + +base.header(title='Summary') +base.top() + +List_of_rows = get() + +print('
') +print('

Test Summary

') +print('
') +print('
') +print('
') +print('
') +print('') +print('') +print('') +print('') +print('') +#print '' +print('') +print('') +print('') + +for row in List_of_rows: + print('') + if len(sys.argv) == 1: + print('' %{'serial':row[2], 'id':row[1]}) + #print '' %row[1] + else: + print('' %{'serial':row[2]}) + print('') + + print('') + + print('') + + print('') + + print('') + +print('
S/N Tests Passed Tests Remaining Final Status
%(serial)s %s %(serial)s
    ') + for tests in row[3][0:][::2]: + print('
  • %s' %tests) + print('
    ') + for tests in row[3][1:][::2]: + print('
  • %s' %tests) + print('
    ') + if len(sys.argv) == 1: + for tests in row[4][0:][::2]: + print('
  • %s' %(row[0],tests[1],tests[0])) + + else: + for tests in row[4][0:][::2]: + print('
  • %s' %tests[0] ) + print('
    ') + if len(sys.argv) == 1: + for tests in row[4][1:][::2]: + print('
  • %s' %(row[0],tests[1],tests[0])) + else: + for tests in row[4][1:][::2]: + print('
  • %s' %tests[0]) + print('
') + + +base.bottom() + + + diff --git a/cgi-bin/WagonDB/connect.py b/cgi-bin/WagonDB/connect.py new file mode 100755 index 0000000..a736779 --- /dev/null +++ b/cgi-bin/WagonDB/connect.py @@ -0,0 +1,47 @@ +#!/usr/bin/python3 + +import mysql.connector + +def connect( num ): + if(num==1): + + connection = mysql.connector.connect( + host = 'localhost', + user='WagonDBInserter', + password='HGCALrocks', + database=get_db_name(), + #cursorclass=mysql.connector.cursors.DictCursor + ) + + if(num==0): + + connection = mysql.connector.connect( + host = 'localhost', + user='WagonDBReadUser', + password='HGCALrocks', + database=get_db_name(), + #cursorclass=mysql.connector.cursors.DictCursor + ) + + return connection + +def connect_admin(passwd): + + connection = mysql.connector.connect( + host = 'localhost', + user='WagonDBAdmin', + password=passwd, + database=get_db_name(), + #cursorclass=mysql.connector.cursors.DictCursor + ) + + return connection + +def get_base_url(): + base = "http://cmslab3.umncmslab/~cros0400/cgi-bin/WagonDB" + return base + +def get_db_name(): + name = "WagonDB" + return name + diff --git a/cgi-bin/WagonDB/connect.pyc b/cgi-bin/WagonDB/connect.pyc new file mode 100644 index 0000000..5b31826 Binary files /dev/null and b/cgi-bin/WagonDB/connect.pyc differ diff --git a/cgi-bin/WagonDB/dump.sql b/cgi-bin/WagonDB/dump.sql new file mode 100644 index 0000000..735d9f7 --- /dev/null +++ b/cgi-bin/WagonDB/dump.sql @@ -0,0 +1,236 @@ +-- MySQL dump 10.14 Distrib 5.5.68-MariaDB, for Linux (x86_64) +-- +-- Host: localhost Database: WagonDB +-- ------------------------------------------------------ +-- Server version 5.5.68-MariaDB + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `Attachments` +-- + +DROP TABLE IF EXISTS `Attachments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Attachments` ( + `attach_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `test_id` int(11) DEFAULT NULL, + `attachmime` varchar(30) DEFAULT NULL, + `attachdesc` varchar(120) DEFAULT NULL, + `comments` varchar(200) DEFAULT NULL, + `originalname` varchar(200) DEFAULT NULL, + PRIMARY KEY (`attach_id`), + KEY `test_id` (`test_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Attachments` +-- + +LOCK TABLES `Attachments` WRITE; +/*!40000 ALTER TABLE `Attachments` DISABLE KEYS */; +/*!40000 ALTER TABLE `Attachments` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `People` +-- + +DROP TABLE IF EXISTS `People`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `People` ( + `person_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `person_name` varchar(100) DEFAULT NULL, + PRIMARY KEY (`person_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `People` +-- + +LOCK TABLES `People` WRITE; +/*!40000 ALTER TABLE `People` DISABLE KEYS */; +INSERT INTO `People` VALUES (1,'Bryan'); +/*!40000 ALTER TABLE `People` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Test` +-- + +DROP TABLE IF EXISTS `Test`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Test` ( + `test_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `test_type_id` int(11) NOT NULL, + `wagon_id` int(11) NOT NULL, + `person_id` int(11) NOT NULL, + `day` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `successful` tinyint(1) NOT NULL, + `comments` varchar(320) DEFAULT NULL, + PRIMARY KEY (`test_id`), + KEY `wagon_id` (`wagon_id`), + KEY `person_id` (`person_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Test` +-- + +LOCK TABLES `Test` WRITE; +/*!40000 ALTER TABLE `Test` DISABLE KEYS */; +/*!40000 ALTER TABLE `Test` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `TestRevoke` +-- + +DROP TABLE IF EXISTS `TestRevoke`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `TestRevoke` ( + `test_id` int(10) unsigned NOT NULL, + `comment` varchar(120) DEFAULT NULL, + PRIMARY KEY (`test_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `TestRevoke` +-- + +LOCK TABLES `TestRevoke` WRITE; +/*!40000 ALTER TABLE `TestRevoke` DISABLE KEYS */; +/*!40000 ALTER TABLE `TestRevoke` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Test_Type` +-- + +DROP TABLE IF EXISTS `Test_Type`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Test_Type` ( + `test_type` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(30) DEFAULT NULL, + `required` tinyint(1) NOT NULL, + `desc_short` varchar(50) DEFAULT NULL, + `desc_long` varchar(250) DEFAULT NULL, + `relative_order` int(11) NOT NULL, + PRIMARY KEY (`test_type`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Test_Type` +-- + +LOCK TABLES `Test_Type` WRITE; +/*!40000 ALTER TABLE `Test_Type` DISABLE KEYS */; +INSERT INTO `Test_Type` VALUES (1,'test',1,'test','test',1); +/*!40000 ALTER TABLE `Test_Type` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Wagon` +-- + +DROP TABLE IF EXISTS `Wagon`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Wagon` ( + `sn` int(11) NOT NULL, + `wagon_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`wagon_id`), + UNIQUE KEY `sn` (`sn`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Wagon` +-- + +LOCK TABLES `Wagon` WRITE; +/*!40000 ALTER TABLE `Wagon` DISABLE KEYS */; +/*!40000 ALTER TABLE `Wagon` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Wagon_Info` +-- + +DROP TABLE IF EXISTS `Wagon_Info`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Wagon_Info` ( + `info_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `wagon_id` int(11) NOT NULL, + `info_type` int(11) NOT NULL, + `info` varchar(300) DEFAULT NULL, + PRIMARY KEY (`info_id`), + KEY `wagon_id` (`wagon_id`), + KEY `info_type` (`info_type`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Wagon_Info` +-- + +LOCK TABLES `Wagon_Info` WRITE; +/*!40000 ALTER TABLE `Wagon_Info` DISABLE KEYS */; +/*!40000 ALTER TABLE `Wagon_Info` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Wagon_Info_Types` +-- + +DROP TABLE IF EXISTS `Wagon_Info_Types`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Wagon_Info_Types` ( + `info_type_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `Info_Name` varchar(30) DEFAULT NULL, + `Info_Desc_Short` varchar(100) DEFAULT NULL, + `Info_Desc_Long` varchar(300) DEFAULT NULL, + PRIMARY KEY (`info_type_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Wagon_Info_Types` +-- + +LOCK TABLES `Wagon_Info_Types` WRITE; +/*!40000 ALTER TABLE `Wagon_Info_Types` DISABLE KEYS */; +/*!40000 ALTER TABLE `Wagon_Info_Types` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2021-07-13 16:05:26 diff --git a/cgi-bin/WagonDB/gen_res_analytics.py b/cgi-bin/WagonDB/gen_res_analytics.py new file mode 100755 index 0000000..999abc0 --- /dev/null +++ b/cgi-bin/WagonDB/gen_res_analytics.py @@ -0,0 +1,174 @@ +#!/usr/bin/python3 + + +import os, sys +import cgi +import cgitb +import pylab +import json + +import matplotlib +import matplotlib.pyplot as plt +import numpy as np + +import base +import add_test_functions + +def create_generic_hist(attachments1, title, stats): + + # Handles one value under graph_title in 'module 1' + graph_title = title + + values = [] + for attachment in attachments1: + values.append(attachment['module 1'][graph_title]) + + + + # Temporary step value + step = 0.01 + + num_of_bins = 15 + + if not (max(values) - min(values)) == 0: + step = round(max(values) - min(values)) / num_of_bins + + + + start = np.floor(min(values) / step) * step + stop = max(values) + step + bin_edges = np.arange(start, stop, step=step) + + + plt.hist(values, bins=bin_edges, density=False, histtype='bar') + plt.xlabel(graph_title + " Values") + plt.ylabel('Occurances') + plt.title(graph_title + " Values") + plt.grid(True) + plt.xticks(np.arange(start, stop, step = step), rotation = 90) + + plt.tight_layout() + plt.savefig('../static/files/gen_res/{}.png'.format(graph_title)) + plt.close() + + + + print(''.format(graph_title)) + + add_to_stats(stats, graph_title, values) + +def create_sub_generic_hist(attachments1, title, list_index, stats): + # Handles a list under graph_title in 'module 1' + graph_title = title + + values = [] + for attachment in attachments1: + values.append(attachment['module 1'][graph_title][list_index]) + + # Temporary step value + step = 0.01 + + num_of_bins = 15 + + if not (max(values) - min(values)) == 0: + step = round(max(values) - min(values)) / num_of_bins + + + start = np.floor(min(values) / step) * step + stop = max(values) + step + bin_edges = np.arange(start, stop, step=step) + + + plt.hist(values, bin_edges, density=False, histtype='bar', color='red') + plt.xlabel(graph_title + " Values") + plt.ylabel('Occurances') + plt.title(graph_title + " Values") + plt.grid(True) + plt.xticks(np.arange(start, stop, step = step), rotation = 90) + + plt.tight_layout() + plt.savefig('../static/files/gen_res/{}.png'.format(graph_title)) + plt.close() + + + + print(''.format(graph_title)) + + + add_to_stats(stats, graph_title, values) + +# Adds statistics to the "stats" python dictionary +def add_to_stats(stats, full_title, values): + mean = sum(values) / len(values) + stand_deviation = np.std(values) + + stats['{}'.format(full_title)] = { + 'STD': stand_deviation, + 'range': max(values) - min(values), + 'mean': mean, + 'max': max(values), + 'min': min(values), + 'passing_range': ( mean - stand_deviation, mean + stand_deviation ) + } +#############End of Functions########################## + + + +cgitb.enable() + +# chose a non-GUI backend +# matplotlib.use( 'Agg' ) +print("Content-type: text/html\n") + +base.header(title='Analytics') +base.top() + + +form = cgi.FieldStorage() + +# Gets the attachment from the DB +attachments1 = add_test_functions.get_test_attachments(1) + +stats = {'analytic_type': 'General Resistance Test'} + +####################################################### + +create_generic_hist(attachments1, 'RTD -> VMON_LVS', stats) + +####################################################### + +create_sub_generic_hist(attachments1, 'ECON_RE_Sb -> HGCROC_RE_Sb', 0, stats) + +####################################################### + +create_sub_generic_hist(attachments1, 'PWR_EN -> PG_LDO', 0, stats) + +######################################################## + +create_generic_hist(attachments1, 'RTD -> HGCROC_RE_Sb', stats) + +######################################################## + +create_sub_generic_hist(attachments1, 'HGCROC_RE_Hb -> HGCROC_RE_Sb', 0, stats) + +######################################################## + +create_sub_generic_hist(attachments1, 'PG_DCDC -> ECON_RE_Hb', 0, stats) + +######################################################## + +print(json.dumps(stats, indent = 4)) + +with open('../static/files/gen_res/gen_res_stats.json', 'w') as open_file: + json.dump(stats, open_file, indent = 4) + + +# TODO Actually print out all of the graphs after matplotlib is installed +# Done in the generic and sub_generic functions + + + + +base.bottom() + + diff --git a/cgi-bin/WagonDB/get_attach.py b/cgi-bin/WagonDB/get_attach.py new file mode 100755 index 0000000..e1cfe3c --- /dev/null +++ b/cgi-bin/WagonDB/get_attach.py @@ -0,0 +1,60 @@ +#!/usr/bin/python3 + +import cgi +import base +from connect import connect +import settings +import os.path +import sys + +if __name__ == "__main__": + form = cgi.FieldStorage() + attach_id = base.cleanCGInumber(form.getvalue('attach_id')) + + db=connect(0) + cur=db.cursor() + + if(attach_id != 0): + cur.execute("SELECT test_id, attachmime, originalname, attach FROM Attachments WHERE attach_id=%d" % (attach_id)); + + if not cur.with_rows: + print("Content-type: text/html\n") + base.header("Attachment Request Error") + base.top() + print('
') + print("

Attachment not available

") + print('
') + base.bottom() + else: + thevals=cur.fetchall() + f = thevals[0][3] + attpath=settings.getAttachmentPathFor(thevals[0][0],attach_id) + if not f: + print("Content-type: text/html\n") + base.header("Attachment Request Error") + base.top() + print("

Attachment not found

") + base.bottom() + else: + print('Content-type: %s \n\n' % (thevals[0][1])) + print(f.decode("utf-8")) + + cur.close() + +def save(attach_id): + db=connect(0) + cur=db.cursor() + + cur.execute("SELECT test_id, attachmime, originalname FROM Attachments WHERE attach_id=%d" % (attach_id)); + + if not cur.with_rows: + print("

Attachment not available

") + else: + thevals=cur.fetchall(); + attpath=settings.getAttachmentPathFor(thevals[0][0],attach_id) + if not os.path.isfile(attpath): + print("

Attachment not found

") + else: + statinfo = os.stat(attpath) + sys.stdout.write(file(attpath,"rb").read() ) + cur.close() diff --git a/cgi-bin/WagonDB/get_attach.pyc b/cgi-bin/WagonDB/get_attach.pyc new file mode 100644 index 0000000..b4251bb Binary files /dev/null and b/cgi-bin/WagonDB/get_attach.pyc differ diff --git a/cgi-bin/WagonDB/get_previous_test_results.py b/cgi-bin/WagonDB/get_previous_test_results.py new file mode 100755 index 0000000..c81eec5 --- /dev/null +++ b/cgi-bin/WagonDB/get_previous_test_results.py @@ -0,0 +1,30 @@ +#!/usr/bin/python3 + +import cgi +import base +import add_test_functions +import os + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Get Previous Test Results') +base.top() + +form = cgi.FieldStorage() + +if form.getvalue('serial_number'): + serial_number = cgi.escape(form.getvalue('serial_number')) + + tests = add_test_functions.get_previous_test_results(serial_number) + + print('Begin') + + for t in tests: + print(t) + + print('End') + +else: + print('No serial number sent.') +base.bottom() diff --git a/cgi-bin/WagonDB/get_test_completion_status.py b/cgi-bin/WagonDB/get_test_completion_status.py new file mode 100755 index 0000000..bb01075 --- /dev/null +++ b/cgi-bin/WagonDB/get_test_completion_status.py @@ -0,0 +1,23 @@ +#!/usr/bin/python3 + +import cgi +import base +import module_functions +import os + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Get Test Completion Status') +base.top() + +tests = module_functions.get_test_completion_status() + +print('Begin') + +for t in tests: + print(t) + +print('End') + +base.bottom() diff --git a/cgi-bin/WagonDB/get_test_types.py b/cgi-bin/WagonDB/get_test_types.py new file mode 100755 index 0000000..d28191b --- /dev/null +++ b/cgi-bin/WagonDB/get_test_types.py @@ -0,0 +1,23 @@ +#!/usr/bin/python3 + +import cgi +import base +import module_functions +import os + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Get Test Types') +base.top() + +tests = module_functions.get_test_types() + +print('Begin') + +for t in tests: + print(t) + +print('End') + +base.bottom() diff --git a/cgi-bin/WagonDB/get_usernames.py b/cgi-bin/WagonDB/get_usernames.py new file mode 100755 index 0000000..ae987f7 --- /dev/null +++ b/cgi-bin/WagonDB/get_usernames.py @@ -0,0 +1,23 @@ +#!/usr/bin/python3 + +import cgi +import base +import add_test_functions +import os + +#cgi header +print("Content-type: text/html\n") + +base.header(title='Get Usernames') +base.top() + +usernames = add_test_functions.get_usernames() + +print('Begin') + +for t in usernames: + print(t[0]) + +print('End') + +base.bottom() diff --git a/cgi-bin/WagonDB/home_page.py b/cgi-bin/WagonDB/home_page.py new file mode 100755 index 0000000..3618671 --- /dev/null +++ b/cgi-bin/WagonDB/home_page.py @@ -0,0 +1,58 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list +import sys + +if(len(sys.argv) != 1): + stdout = sys.stdout + sys.stdout = open('%(loc)s/index.html' %{ 'loc':sys.argv[1]}, 'w') +else: + #cgi header + print("content-type: text/html\n\n") + +base.header(title='Wagon Test Home Page') +base.top() + +print() +print('
') +print('
') +print('

Count by Test

' ) +print('
') +print('
') + +home_page_list.render_list_tests() +print('
') + +print('
') +print('
') +print('

List of All Boards

' ) +print('(Sorted by Serial Number)Successful Tests') +print('
') +print('
') +if len(sys.argv) == 1: + print('
') + print('
') + print('') + print('') + print('') + print('
') +else: + print('
') + print('
') + print('') + print('') + print('') + print('
') +print('
') +print('

') + + +home_page_list.render_list_module() + +base.bottom() + +if len(sys.argv) != 1: + sys.stdout.close() + sys.stdout = stdout diff --git a/cgi-bin/WagonDB/home_page_list.py b/cgi-bin/WagonDB/home_page_list.py new file mode 100755 index 0000000..a28f9be --- /dev/null +++ b/cgi-bin/WagonDB/home_page_list.py @@ -0,0 +1,222 @@ +#!/usr/bin/python3 + +from connect import connect +import sys +import cgitb +import mysql + +cgitb.enable() + +def fetch_list_tests(): + db = connect(0) + cur=db.cursor() + cur.execute("select Test_Type.name,COUNT(DISTINCT Test.test_id),COUNT(DISTINCT Test.board_id) from Test,Test_Type WHERE Test.successful=1 and Test.test_type_id=Test_Type.test_type GROUP BY Test.test_type_id ORDER BY Test_Type.relative_order"); + rows = cur.fetchall() + cur.execute("select Test_Type.name,COUNT(*) from Test,Test_Type WHERE Test.test_type_id=Test_Type.test_type GROUP BY Test.test_type_id ORDER BY Test_Type.relative_order"); + rows2 = cur.fetchall() + cur.execute("select Test_Type.name,Count(*) from TestRevoke,Test_Type,Test WHERE Test.test_type_id=Test_Type.test_type and Test.successful=1 and Test.test_id=TestRevoke.test_id GROUP BY Test.test_type_id ORDER BY Test_Type.relative_order") + rows3 = cur.fetchall() + + for i,r in enumerate(rows): + if rows3: + for row in rows3: + if row[0] == r[0]: + rows[i] = (r[0], r[1]-row[1], r[2]) + else: + rows[i] = (r[0], r[1], r[2]) + finalrows = () + for i in range (0,len(rows)): + arow=(rows[i][0], rows[i][1],rows[i][2],rows2[i][1]) + finalrows=finalrows+(arow,) + return finalrows + +def render_list_tests(): + rows = fetch_list_tests() + + print('
') + print('
') + print('') +# print '
Total Tests
' +# print '
Total Successful Tests
' +# print '
Total Cards with Successful Tests
' + for test in rows: +# print '
' + print('
' ) + print('
TestTotal TestsTotal Successful TestsTotal Wagons with Successful Tests
%s' % (test[0])) + print('%s' % (test[3])) + print('%s' % (test[1])) + print('%s' % (test[2])) + print('
') + +def fetch_list_module(): + db = connect(0) + cur = db.cursor() + + cur.execute("SELECT full_id, Board_id FROM Board ORDER by Board.sn ASC") + rows = cur.fetchall() + return rows + + +def render_list_module(): + + db = connect(0) + cur=db.cursor() + row = fetch_list_module() + n = 0 + + col1='' + col2='' + col3='' + cur.execute('SELECT COUNT(*) FROM Test_Type') + total = cur.fetchall()[0][0] + if len(sys.argv) == 1: + for boards in row: + query = 'SELECT COUNT(DISTINCT Test.test_id),COUNT(DISTINCT TestRevoke.test_id, case when TestRevoke.test_id = Test.test_id then TestRevoke.test_id end),Test.test_type_id FROM Test,TestRevoke WHERE Test.board_id=%s and Test.successful=1 GROUP BY Test.test_type_id' % (boards[1]) + cur.execute(query) + successful = cur.fetchall() + if not successful: + query = 'SELECT COUNT(DISTINCT Test.test_id),0,Test.test_type_id FROM Test WHERE Test.board_id=%s and Test.successful=1 GROUP BY Test.test_type_id' % (boards[1]) + cur.execute(query) + successful = cur.fetchall() + num = 0 + for s in successful: + total_success = s[0] + total_revoke = s[1] + if total_success > total_revoke: + num += 1 + else: + num += 0 + if not num: + num = 0 + if num < total: + temp_col = ' %(serial)s %(success)s/%(total)s' %{'serial':boards[0], 'id':boards[1], 'success': num, 'total': total} + else: + temp_col = ' %(serial)s Done' %{'serial':boards[0], 'id':boards[1]} + if n%3 == 0: + col1 += temp_col + if n%3 == 1: + col2 += temp_col + if n%3 == 2: + col3 += temp_col + n += 1 + else: + for boards in row: + query = 'SELECT SUM(successful) AS "sum_successful" FROM Test WHERE Test.board_id = %s' % (boards[1]) + cur.execute(query) + successful = cur.fetchall() + num = successful[0][0] + if not num: + num = 0 + temp_col = ' %(serial)s %(success)s' %{'serial':boards[0], 'id':boards[1], 'success': num} + if n%3 == 0: + col1 += temp_col + if n%3 == 1: + col2 += temp_col + if n%3 == 2: + col3 += temp_col + n += 1 + print('
') + print('
') + print('
    ') + print(col1) + print('
') + print('
') + print(col2) + print('
') + print('
') + print(col3) + print('
') + print('
') + +def add_module_form(): + + print('
') + print('
') + print('
') + print('

Adding a new Test Board

') + print('
') + print('
') + + print('
') + print('
') + print('') + print('
') + print('
') + print('') + print('
') + print('
') + + print('
') + + print('
') + +def add_board_info_form(sn, board_id): + + print('
') + print('
') + print('
') + print('

Adding Extra Board Information

') + print('
') + print('
') + + print('' % sn) + print('' % board_id) + print('
') + print('
') + print('') + print('
') + print('
') + print('
') + print('
') + print('') + print('
') + print('
') + print('
') + print('
') + print('') + print('
') + print('
') + print('
') + print('') + print('
') + print('
') + print('
') + print('') + print('
') + print('
') + print('
') + print('
') + print('') + print('
') + print('
') + + print('
') + print('
') + + print('') + + print('
') + +def add_module(serial_number): + try: + db = connect(1) + cur = db.cursor() + + sn = serial_number[9:15] + type_id = serial_number[3:9] + + cur.execute("SELECT board_id FROM Board WHERE Board.full_id = '%s'" % (serial_number)) + + rows = cur.fetchall() + + if not rows: + cur.execute("INSERT INTO Board (sn, full_id, type_id) VALUES (%s, '%s', '%s'); " % (sn, serial_number, type_id)) + #print '
INSERT INTO Card set sn = %s;
' %(serial_number) + db.commit() + db.close() + else: + print("

Serial number already exists!

") + except mysql.connector.Error as err: + print("

Serial number already exists!

") + print(err) + diff --git a/cgi-bin/WagonDB/home_page_list.pyc b/cgi-bin/WagonDB/home_page_list.pyc new file mode 100644 index 0000000..474bd5d Binary files /dev/null and b/cgi-bin/WagonDB/home_page_list.pyc differ diff --git a/cgi-bin/WagonDB/id_res_analytics.py b/cgi-bin/WagonDB/id_res_analytics.py new file mode 100755 index 0000000..5f4503f --- /dev/null +++ b/cgi-bin/WagonDB/id_res_analytics.py @@ -0,0 +1,158 @@ +#!/usr/bin/python3 + + +import os, sys +import cgi +import cgitb +import pylab +import json + +import matplotlib +import matplotlib.pyplot as plt +import numpy as np + +import base +import add_test_functions + +def create_generic_hist(attachments, title, stats): + + # Handles one value under graph_title in 'module 1' + graph_title = title + + values = [] + for attachment in attachments: + values.append(attachment['wagon type chip'][graph_title]) + + + # Temporary step value + step = 0.01 + + num_of_bins = 15 + + if not (max(values) - min(values)) == 0: + step = round(max(values) - min(values)) / num_of_bins + + start = np.floor(min(values) / step) * step + stop = max(values) + step + bin_edges = np.arange(start, stop, step=step) + + + plt.hist(values, bins=bin_edges, density=False, histtype='bar') + plt.xlabel(graph_title + " Values") + plt.ylabel('Occurances') + plt.title(graph_title + " Values") + plt.grid(True) + plt.xticks(np.arange(start, stop, step = step), rotation = 90) + + plt.tight_layout() + + plt.savefig('../static/files/id_res/{}.png'.format(graph_title)) + plt.close() + + + print(''.format(graph_title)) + + + add_to_stats(stats, graph_title, values) + +def create_sub_generic_hist(attachments1, title, list_index, stats): + # Handles a list under graph_title in 'module 1' + graph_title = title + + values = [] + for attachment in attachments1: + values.append(attachment['wagon type chip'][graph_title][list_index]) + + # Temporary step value + step = 0.01 + + num_of_bins = 15 + + if not (max(values) - min(values)) == 0: + step = round(max(values) - min(values)) / num_of_bins + + + start = np.floor(min(values) / step) * step + stop = max(values) + step + bin_edges = np.arange(start, stop, step=step) + + + plt.hist(values, bin_edges, density=False, histtype='bar', color='red') + plt.xlabel(graph_title + " Values") + plt.ylabel('Occurances') + plt.title(graph_title + " Values") + plt.grid(True) + plt.xticks(np.arange(start, stop, step = step), rotation = 90) + + plt.tight_layout() + plt.savefig('../static/files/id_res/{}.png'.format(graph_title)) + plt.close() + + + + print(''.format(graph_title)) + + + add_to_stats(stats, graph_title, values) + + +# Adds statistics to the "stats" python dictionary +def add_to_stats(stats, full_title, values): + mean = sum(values) / len(values) + stand_deviation = np.std(values) + + stats['{}'.format(full_title)] = { + 'STD': stand_deviation, + 'range': max(values) - min(values), + 'mean': mean, + 'max': max(values), + 'min': min(values), + 'passing_range': ( mean - stand_deviation, mean + stand_deviation ) + } + + +#############End of Functions########################## + + + +cgitb.enable() + +# chose a non-GUI backend +# matplotlib.use( 'Agg' ) +print("Content-type: text/html\n") + +base.header(title='Analytics') +base.top() + + +form = cgi.FieldStorage() + +# Gets the attachment from the DB +attachments2 = add_test_functions.get_test_attachments(2) +stats = {'analytic_type': 'ID Resistor Test'} + +####################################################### + +create_generic_hist(attachments2, 'WAGON_TYPE -> GND', stats) + +######################################################## + +create_sub_generic_hist(attachments2, 'VMON_REF0 -> PROBE_DC', 0, stats) + + +print(json.dumps(stats, indent = 4)) + +with open('../static/files/id_res/id_res_stats.json', 'w') as open_file: + json.dump(stats, open_file, indent = 4) + + + +# TODO Actually print out all of the graphs after matplotlib is installed +# Done in the generic and sub_generic functions + + + + +base.bottom() + + diff --git a/cgi-bin/WagonDB/iic_analytics.py b/cgi-bin/WagonDB/iic_analytics.py new file mode 100755 index 0000000..2a0231e --- /dev/null +++ b/cgi-bin/WagonDB/iic_analytics.py @@ -0,0 +1,159 @@ +#!/usr/bin/python3 + + +import os, sys +import cgi +import cgitb +import pylab +import json + +import matplotlib +import matplotlib.pyplot as plt +import numpy as np + +import base +import add_test_functions + +def create_generic_hist(attachments1, title, stats): + + # Handles one value under graph_title in 'module 1' + graph_title = title + + values = [] + for attachment in attachments1: + values.append(attachment[graph_title]) + + + # Temporary step value + step = 0.01 + + num_of_bins = 15 + + if not (max(values) - min(values)) == 0: + step = round(max(values) - min(values)) / num_of_bins + + + start = np.floor(min(values) / step) * step + stop = max(values) + step + bin_edges = np.arange(start, stop, step=step) + + + plt.hist(values, bins=bin_edges, density=False, histtype='bar') + plt.xlabel(graph_title + " Values") + plt.ylabel('Occurances') + plt.title(graph_title + " Values") + plt.grid(True) + plt.xticks(np.arange(start, stop, step = step), rotation = 90) + + plt.tight_layout() + + plt.savefig('../static/files/iic/{}.png'.format(graph_title)) + plt.close() + + + print(''.format(graph_title)) + + + add_to_stats(stats, graph_title, values) + +def create_sub_generic_hist(attachments1, title, list_index, stats): + # Handles a list under graph_title in 'module 1' + graph_title = title + + values = [] + for attachment in attachments1: + values.append(attachment[graph_title][list_index]) + + + # Temporary step value + step = 0.01 + + num_of_bins = 15 + + if not (max(values) - min(values)) == 0: + step = round(max(values) - min(values)) / num_of_bins + + + start = np.floor(min(values) / step) * step + stop = max(values) + step + bin_edges = np.arange(start, stop, step=step) + + + plt.hist(values, bin_edges, density=False, histtype='bar', color='red') + plt.xlabel(graph_title + " Values") + plt.ylabel('Occurances') + plt.title(graph_title + " Values") + plt.grid(True) + plt.xticks(np.arange(start, stop, step = step), rotation = 90) + + plt.tight_layout() + + plt.savefig('../static/files/iic/{}.png'.format(graph_title)) + plt.close() + + + print(''.format(graph_title)) + + + add_to_stats(stats, graph_title, values) + + +# Adds statistics to the "stats" python dictionary +def add_to_stats(stats, full_title, values): + mean = sum(values) / len(values) + stand_deviation = np.std(values) + + stats['{}'.format(full_title)] = { + 'STD': stand_deviation, + 'range': max(values) - min(values), + 'mean': mean, + 'max': max(values), + 'min': min(values), + 'passing_range': ( mean - stand_deviation, mean + stand_deviation ) + } + + +#############End of Functions########################## + + + +cgitb.enable() + +# chose a non-GUI backend +# matplotlib.use( 'Agg' ) +print("Content-type: text/html\n") + +base.header(title='Analytics') +base.top() + + +form = cgi.FieldStorage() + +# Gets the attachment from the DB +attachments3 = add_test_functions.get_test_attachments(3) +stats = {'analytic_type': "IIC Test"} + +####################################################### + +create_generic_hist(attachments3, 'num_iic_correct', stats) + +######################################################## + +create_generic_hist(attachments3, 'num_iic_checks', stats) + +######################################################## + +print(json.dumps(stats, indent = 4)) + +with open('../static/files/iic/iic_stats.json', 'w') as open_file: + json.dump(stats, open_file, indent = 4) + + +# TODO Actually print out all of the graphs after matplotlib is installed +# Done in the generic and sub_generic functions + + + + +base.bottom() + diff --git a/cgi-bin/WagonDB/is_new_board.py b/cgi-bin/WagonDB/is_new_board.py new file mode 100755 index 0000000..4617c7d --- /dev/null +++ b/cgi-bin/WagonDB/is_new_board.py @@ -0,0 +1,36 @@ +#!/usr/bin/python3 + + +import cgi +import base +import add_test_functions +import os + + +print("Content-type: text/html\n") + +base.header(title='is_new_board') +base.top() + + +form = cgi.FieldStorage() + +if form.getvalue('serial_number'): + serial_number = cgi.escape(form.getvalue('serial_number')) + + + is_new_board_bool = add_test_functions.is_new_board(serial_number) + + print('Begin') + + print(is_new_board_bool) + + print('End') + + +else: + print ("NO SERIAL SENT") + + +base.bottom() + diff --git a/cgi-bin/WagonDB/makePlots.py b/cgi-bin/WagonDB/makePlots.py new file mode 100755 index 0000000..8d0a8f1 --- /dev/null +++ b/cgi-bin/WagonDB/makePlots.py @@ -0,0 +1,321 @@ +#!/usr/bin/python3 + +import pandas as pd +import matplotlib.pyplot as plt +import csv +import cgitb +import numpy as np +import datetime +import matplotlib.dates as mdates +from matplotlib.axis import Axis + +cgitb.enable() + +def makePlot(Test, Data, Board, SN, BitError, Tester): + TestData = pd.read_csv('./static/files/Test.csv', parse_dates=['Time']) + BoardData = pd.read_csv('./static/files/Board.csv') + PeopleData = pd.read_csv('./static/files/People.csv') + name = None + + if SN is not None: + board_temp = BoardData.query('`Full ID` == @SN')['Board ID'] + Board_ID = board_temp.values.tolist() + if Tester is not None: + person_temp = PeopleData.query('`Person Name` == @Tester')['Person ID'] + person_id = person_temp.values.tolist() + tests_temp = TestData.query('`Board ID` == @Board_ID & `Person ID` == @person_id')['Test ID'] + for i in Tester: + if i is Tester[0]: + name = ' for ' + i + else: + name += i + if i is not Tester[-1]: + name += ', ' + else: + tests_temp = TestData.query('`Board ID` == @Board_ID')['Test ID'] + for i in SN: + if name is not None: + if i is SN[0]: + name += ' for ' + i + else: + name += i + if i is not SN[-1]: + name += ', ' + else: + if i is SN[0]: + name = ' for ' + i + else: + name += i + if i is not SN[-1]: + name += ', ' + elif Board is not None: + board_temp = BoardData.query('`Type ID` == @Board')['Board ID'] + board_ids = board_temp.values.tolist() + if Tester is not None: + person_temp = PeopleData.query('`Person Name` == @Tester')['Person ID'] + person_id = person_temp.values.tolist() + tests_temp = TestData.query('`Board ID` == @board_ids & `Person ID` == @person_id')['Test ID'] + for i in Tester: + if i is Tester[0]: + name = ' for ' + i + else: + name += i + if i is not Tester[-1]: + name += ', ' + else: + tests_temp = TestData.query('`Board ID` == @board_ids')['Test ID'] + + for i in Board: + if name is not None: + if i is Board[0]: + name += ' for ' + i + else: + name += i + if i is not Board[-1]: + name += ', ' + else: + if i is Board[0]: + name = ' for ' + i + else: + name += i + if i is not Board[-1]: + name += ', ' + else: + tests_temp = TestData.iloc[:, 0] + + if Board is None and SN is None and Tester is not None: + person_temp = PeopleData.query('`Person Name` == @Tester')['Person ID'] + person_id = person_temp.values.tolist() + tests_temp = TestData.query('`Person ID` == @person_id')['Test ID'] + for i in Tester: + if i is Tester[0]: + name = ' for ' + i + else: + name += i + if i is not Tester[-1]: + name += ', ' + + tests = tests_temp.values.tolist() + + if name is not None and Test is not None: + title = Test + name + else: + title = Test + + if Test is None: + dates = TestData.query('`Test ID` == @tests')['Time'] + successful_dates = TestData.query('`Test ID` == @tests & Successful == 1')['Time'] + time_series_data = [] + time_series_data_successful = [] + first = datetime.datetime(2023, 3, 1, 0, 0, 0) + + while (first <= datetime.datetime.now()): + i = 0 + j = 0 + for d in dates: + if d > first: + break + else: + i += 1 + for d in successful_dates: + if d > first: + break + else: + j += 1 + time_series_data.append([first,i]) + time_series_data_successful.append([first,j]) + first += datetime.timedelta(days=1) + x1,y1 = zip(*time_series_data) + x2,y2 = zip(*time_series_data_successful) + + if name is not None: + title = 'Total Tests Over Time' + name + else: + title = 'Total Tests Over Time' + + fig, ax = plt.subplots() + plt.plot(x1, y1, label = 'Total') + plt.plot(x2, y2, label = 'Successful') + plt.title(title) + plt.xlabel('Date') + plt.ylabel('Number of Tests') + plt.legend() + Axis.set_major_locator(ax.xaxis,mdates.MonthLocator(interval=1)) + plt.gcf().autofmt_xdate() + plt.savefig('../../static/files/TestsOverTime.png') + plt.clf() + + + if Test == 'Resistance Measurement': + df = pd.read_csv('./static/files/Resistance_Measurement.csv') + w = 0.25 + temp_max = 0 + useData = df.query('`Test ID` == @tests') + + for i in range(len(Data)): + if Data[i] == True: + plot_data = useData.iloc[:, i+1] + plt.hist(plot_data, bins=np.arange(min(plot_data), max(plot_data) + w, w), label = useData.columns[i+1]) + temp_max = max(plot_data) if max(plot_data) > temp_max else temp_max + + plt.title(title) + plt.legend(fontsize='xx-small') + plt.xlabel('Resistance') + plt.xlim([0, temp_max*1.5]) + plt.ylabel('Number of Boards') + plt.savefig('../../static/files/Resistance_Measurement.png') + + if Test == 'ID Resistor': + df = pd.read_csv('./static/files/ID_Resistor_Test_Data.csv') + useData = df.query('`Test ID` == @tests') + + plt.hist(useData.iloc[:,1]) + plt.title(title) + plt.xlabel('Resistance') + plt.ylabel('Number of Boards') + plt.savefig('../../static/files/ID_Resistor.png') + + if Test == 'I2C Read/Write': + df = pd.read_csv('./static/files/I2C_ReadWrite_Test_Data.csv') + w = 1000 + useData = df.query('`Test ID` == @tests') + + for i in range(len(Data)): + if Data[i] == True: + plot_data = useData.iloc[:, i+1] + plt.hist(plot_data, bins=np.arange(-1, 11000, 1000), label = useData.columns[i+1], stacked=True) + + plt.title(title) + plt.legend(fontsize='xx-small') + plt.xlabel('Number of Checks') + plt.ylabel('Number of Boards') + plt.savefig('../../static/files/I2C_ReadWrite.png') + + if Test == 'Bit Error Rate': + notData = pd.read_csv('./static/files/Bit_Error_Rate_Test_Data.csv') + df = notData.query('`Test ID` == @tests') + + if Data[0] == True: + w = 5 + if BitError[0] == True: + CLK0 = df.query('`E Link` == "CLK0"')['Midpoint'] + plt.hist(CLK0, label = 'CLK0', bins=np.arange(0,400+w,w), stacked=True) + if BitError[1] == True: + CLK1 = df.query('`E Link` == "CLK1"')['Midpoint'] + plt.hist(CLK1, label = 'CLK1', bins=np.arange(0,400+w,w), stacked=True) + if BitError[2] == True: + CLK2 = df.query('`E Link` == "CLK2"')['Midpoint'] + plt.hist(CLK2, label = 'CLK2', bins=np.arange(0,400+w,w), stacked=True) + if BitError[3] == True: + TRIG0 = df.query('`E Link` == "TRIG0"')['Midpoint'] + plt.hist(TRIG0, label = 'TRIG0', bins=np.arange(0,400+w,w), stacked=True) + if BitError[4] == True: + TRIG1 = df.query('`E Link` == "TRIG1"')['Midpoint'] + plt.hist(TRIG1, label = 'TRIG1', bins=np.arange(0,400+w,w), stacked=True) + if BitError[5] == True: + TRIG2 = df.query('`E Link` == "TRIG2"')['Midpoint'] + plt.hist(TRIG2, label = 'TRIG2', bins=np.arange(0,400+w,w), stacked=True) + if BitError[6] == True: + TRIG3 = df.query('`E Link` == "TRIG3"')['Midpoint'] + plt.hist(TRIG3, label = 'TRIG3', bins=np.arange(0,400+w,w), stacked=True) + if BitError[7] == True: + TRIG4 = df.query('`E Link` == "TRIG4"')['Midpoint'] + plt.hist(TRIG4, label = 'TRIG4', bins=np.arange(0,400+w,w), stacked=True) + if BitError[8] == True: + TRIG5 = df.query('`E Link` == "TRIG5"')['Midpoint'] + plt.hist(TRIG5, label = 'TRIG5', bins=np.arange(0,400+w,w), stacked=True) + if BitError[9] == True: + TRIG6 = df.query('`E Link` == "TRIG6"')['Midpoint'] + plt.hist(TRIG6, label = 'TRIG6', bins=np.arange(0,400+w,w), stacked=True) + if BitError[10] == True: + TRIG7 = df.query('`E Link` == "TRIG7"')['Midpoint'] + plt.hist(TRIG7, label = 'TRIG7', bins=np.arange(0,400+w,w), stacked=True) + + plt.title(title + ': Midpoint') + plt.xlabel('DAQ Delay') + plt.ylabel('Number of Boards') + plt.legend() + plt.savefig('../../static/files/Bit_Error_Rate_Midpoint') + + if Data[1] == True: + w = 5 + plt.clf() + if BitError[0] == True: + CLK0 = df.query('`E Link` == "CLK0"')['Eye Opening'] + plt.hist(CLK0, label = 'CLK0', bins=np.arange(0,450+w,w), stacked=True) + CLK0 = CLK0.values.tolist() + else: + CLK0 = [] + if BitError[1] == True: + CLK1 = df.query('`E Link` == "CLK1"')['Eye Opening'] + plt.hist(CLK1, label = 'CLK1', bins=np.arange(0,450+w,w), stacked=True) + CLK1 = CLK1.values.tolist() + else: + CLK1 = [] + if BitError[2] == True: + CLK2 = df.query('`E Link` == "CLK2"')['Eye Opening'] + plt.hist(CLK2, label = 'CLK2', bins=np.arange(0,450+w,w), stacked=True) + CLK2 = CLK2.values.tolist() + else: + CLK2 = [] + if BitError[3] == True: + TRIG0 = df.query('`E Link` == "TRIG0"')['Eye Opening'] + plt.hist(TRIG0, label = 'TRIG0', bins=np.arange(0,450+w,w), stacked=True) + TRIG0 = TRIG0.values.tolist() + else: + TRIG0 = [] + if BitError[4] == True: + TRIG1 = df.query('`E Link` == "TRIG1"')['Eye Opening'] + plt.hist(TRIG1, label = 'TRIG1', bins=np.arange(0,450+w,w), stacked=True) + TRIG1 = TRIG1.values.tolist() + else: + TRIG1 = [] + if BitError[5] == True: + TRIG2 = df.query('`E Link` == "TRIG2"')['Eye Opening'] + plt.hist(TRIG2, label = 'TRIG2', bins=np.arange(0,450+w,w), stacked=True) + TRIG2 = TRIG2.values.tolist() + else: + TRIG2 = [] + if BitError[6] == True: + TRIG3 = df.query('`E Link` == "TRIG3"')['Eye Opening'] + plt.hist(TRIG3, label = 'TRIG3', bins=np.arange(0,450+w,w), stacked=True) + TRIG3 = TRIG3.values.tolist() + else: + TRIG3 = [] + if BitError[7] == True: + TRIG4 = df.query('`E Link` == "TRIG4"')['Eye Opening'] + plt.hist(TRIG4, label = 'TRIG4', bins=np.arange(0,450+w,w), stacked=True) + TRIG4 = TRIG4.values.tolist() + else: + TRIG4 = [] + if BitError[8] == True: + TRIG5 = df.query('`E Link` == "TRIG5"')['Eye Opening'] + plt.hist(TRIG5, label = 'TRIG5', bins=np.arange(0,450+w,w), stacked=True) + TRIG5 = TRIG5.values.tolist() + else: + TRIG5 = [] + if BitError[9] == True: + TRIG6 = df.query('`E Link` == "TRIG6"')['Eye Opening'] + plt.hist(TRIG6, label = 'TRIG6', bins=np.arange(0,450+w,w), stacked=True) + TRIG6 = TRIG6.values.tolist() + else: + TRIG6 = [] + if BitError[10] == True: + TRIG7 = df.query('`E Link` == "TRIG7"')['Eye Opening'] + plt.hist(TRIG7, label = 'TRIG7', bins=np.arange(0,450+w,w), stacked=True) + TRIG7 = TRIG7.values.tolist() + else: + TRIG7 = [] + + total_data = CLK0+CLK1+CLK2+TRIG0+TRIG1+TRIG2+TRIG3+TRIG4+TRIG5+TRIG6+TRIG7 + std = np.std(total_data) + plt.title(title + ': Eye Opening') + plt.xlabel('DAQ Delay') + plt.ylabel('Number of Boards') + plt.legend() + ax = plt.gca() + plt.text(0.02, 0.95, r'$\sigma=%.2f$' % (std, ), transform = ax.transAxes) + plt.savefig('../../static/files/Bit_Error_Rate_EyeOpening') + + +makePlot('Bit Error Rate', [True,True,True], None, None, [True,True,False,False,False,True,False,False,False,False,False], ['Bryan']) diff --git a/cgi-bin/WagonDB/makeTestingData.py b/cgi-bin/WagonDB/makeTestingData.py new file mode 100644 index 0000000..c084eb4 --- /dev/null +++ b/cgi-bin/WagonDB/makeTestingData.py @@ -0,0 +1,195 @@ +from connect import connect +import numpy as np +import json +import csv + +db = connect(0) +cur = db.cursor() + +with open('./static/files/Test.csv', mode='w') as csv_file: + columns = ['Test ID', 'Test Type ID', 'Board ID', 'Person ID', 'Time', 'Successful','comments'] + writer = csv.writer(csv_file) + writer.writerow(columns) + + cur.execute('select * from Test') + Test_Data = cur.fetchall() + writer.writerows(Test_Data) + +with open('./static/files/ID_Resistor_Test_Data.csv', mode='w') as csv_file: + header = ['Test ID','Resistance'] + writer = csv.DictWriter(csv_file, fieldnames = header) + + cur.execute('select test_type from Test_Type where name="ID Resistor Measurement"') + test_type_id = cur.fetchall()[0][0] + + cur.execute('select test_id from Test where test_type_id="{}"'.format(test_type_id)) + TestIDs = cur.fetchall() + + query = 'select attach from Attachments where ' + for i in TestIDs: + query += 'test_id={}'.format(i[0]) + if i is not TestIDs[-1]: + query += ' or ' + cur.execute(query) + Attach = cur.fetchall() + Attach_Data = [] + for i in Attach: + Attach_Data.append(json.loads(i[0])) + Resistance = [] + for i in Attach_Data: + Resistance.append(i['wagon type chip']['WAGON_TYPE -> GND']) + + writer.writeheader() + for i in range(len(TestIDs)): + writer.writerow({'Test ID':TestIDs[i][0], 'Resistance':Resistance[i]}) + +with open('./static/files/I2C_ReadWrite_Test_Data.csv', mode='w') as csv_file: + header= ['Test ID', 'Checks', 'Correct at Module 1', 'Correct at Module 2'] + writer = csv.DictWriter(csv_file, fieldnames = header) + + cur.execute('select test_type from Test_Type where name="I2C Read/Write"') + test_type_id = cur.fetchall()[0][0] + + cur.execute('select test_id from Test where test_type_id="{}"'.format(test_type_id)) + TestIDs = cur.fetchall() + + query = 'select attach from Attachments where ' + for i in TestIDs: + query += 'test_id={}'.format(i[0]) + if i is not TestIDs[-1]: + query += ' or ' + cur.execute(query) + Attach = cur.fetchall() + Attach_Data = [] + for i in Attach: + Attach_Data.append(json.loads(i[0])) + mod9999 = [] + mod0 = [] + mod1 = [] + for i in Attach_Data: + mod9999.append(i['num_iic_checks_mod9999']) + mod0.append(i['num_iic_correct_mod0']) + try: + mod1.append(i['num_iic_correct_mod1']) + except KeyError as e: + mod1.append(-1) + + writer.writeheader() + for i in range(len(TestIDs)): + writer.writerow({'Test ID':TestIDs[i][0], 'Checks':mod9999[i], 'Correct at Module 1':mod0[i], 'Correct at Module 2':mod1[i]}) + +with open('./static/files/Resistance_Measurement.csv', mode='w') as csv_file: + header = ['Test ID','RTD -> VMON_LVS Module 1', 'ECON_RE_Sb -> HGCROC_RE_Sb Module 1', 'PWR_EN -> PG_LDO Module 1', 'RTD -> HGCROC_RE_Sb Module 1', 'HGCROC_RE_Hb -> HGCROC_RE_Sb Module 1', 'PG_DCDC -> ECON_RE_Hb Module 1', 'RTD -> VMON_LVS Module 2', 'ECON_RE_Sb -> HGCROC_RE_Sb Module 2', 'PWR_EN -> PG_LDO Module 2', 'RTD -> HGCROC_RE_Sb Module 2', 'HGCROC_RE_Hb -> HGCROC_RE_Sb Module 2', 'PG_DCDC -> ECON_RE_Hb Module 2'] + writer = csv.DictWriter(csv_file, fieldnames = header) + + cur.execute('select test_type from Test_Type where name="Resistance Measurement"') + test_type_id = cur.fetchall()[0][0] + + cur.execute('select test_id from Test where test_type_id="{}"'.format(test_type_id)) + TestIDs = cur.fetchall() + + query = 'select attach from Attachments where ' + + for i in TestIDs: + query += 'test_id={}'.format(i[0]) + if i is not TestIDs[-1]: + query += ' or ' + cur.execute(query) + Attach = cur.fetchall() + Attach_Data = [] + for i in Attach: + Attach_Data.append(json.loads(i[0])) + + RTD_VMON_1 = [] + ECON_HG_1 = [] + PWR_PG_1 = [] + RTD_HG_1 = [] + HG_HG_1 = [] + PG_ECON_1 = [] + RTD_VMON_2 = [] + ECON_HG_2 = [] + PWR_PG_2 = [] + RTD_HG_2 = [] + HG_HG_2 = [] + PG_ECON_2 = [] + + for i in Attach_Data: + RTD_VMON_1.append(i["module 1"]["RTD -> VMON_LVS"]) + ECON_HG_1.append(i["module 1"]["ECON_RE_Sb -> HGCROC_RE_Sb"][0]) + PWR_PG_1.append(i["module 1"]["PWR_EN -> PG_LDO"][0]) + RTD_HG_1.append(i["module 1"]["RTD -> HGCROC_RE_Sb"]) + HG_HG_1.append(i["module 1"]["HGCROC_RE_Hb -> HGCROC_RE_Sb"][0]) + PG_ECON_1.append(i["module 1"]["PG_DCDC -> ECON_RE_Hb"][0]) + try: + RTD_VMON_2.append(i["module 2"]["RTD -> VMON_LVS"]) + except KeyError as e: + RTD_VMON_2.append(-1) + try: + ECON_HG_2.append(i["module 2"]["ECON_RE_Sb -> HGCROC_RE_Sb"][0]) + except KeyError as e: + ECON_HG_2.append(-1) + try: + PWR_PG_2.append(i["module 2"]["PWR_EN -> PG_LDO"][0]) + except KeyError as e: + PWR_PG_2.append(-1) + try: + RTD_HG_2.append(i["module 2"]["RTD -> HGCROC_RE_Sb"]) + except KeyError as e: + RTD_HG_2.append(-1) + try: + HG_HG_2.append(i["module 2"]["HGCROC_RE_Hb -> HGCROC_RE_Sb"][0]) + except KeyError as e: + HG_HG_2.append(-1) + try: + PG_ECON_2.append(i["module 2"]["PG_DCDC -> ECON_RE_Hb"][0]) + except KeyError as e: + PG_ECON_2.append(-1) + + writer.writeheader() + for i in range(len(TestIDs)): + writer.writerow({'Test ID':TestIDs[i][0], 'RTD -> VMON_LVS Module 1':RTD_VMON_1[i], 'ECON_RE_Sb -> HGCROC_RE_Sb Module 1':ECON_HG_1[i], 'PWR_EN -> PG_LDO Module 1':PWR_PG_1[i], 'RTD -> HGCROC_RE_Sb Module 1':RTD_HG_1[i], 'HGCROC_RE_Hb -> HGCROC_RE_Sb Module 1':HG_HG_1[i], 'PG_DCDC -> ECON_RE_Hb Module 1':PG_ECON_1[i], 'RTD -> VMON_LVS Module 2':RTD_VMON_2[i], 'ECON_RE_Sb -> HGCROC_RE_Sb Module 2':ECON_HG_2[i], 'PWR_EN -> PG_LDO Module 2':PWR_PG_2[i], 'RTD -> HGCROC_RE_Sb Module 2':RTD_HG_2[i], 'HGCROC_RE_Hb -> HGCROC_RE_Sb Module 2':HG_HG_2[i], 'PG_DCDC -> ECON_RE_Hb Module 2':PG_ECON_2[i]}) + +with open('./static/files/Bit_Error_Rate_Test_Data.csv', mode='w') as csv_file: + header = ['Test ID', 'E Link', 'Midpoint', 'Eye Opening', 'Passed', 'Midpoint Errors'] + writer = csv.DictWriter(csv_file, fieldnames=header) + writer.writeheader() + + cur.execute('select test_type from Test_Type where name="Bit Error Rate Test"') + test_type_id = cur.fetchall()[0][0] + + cur.execute('select test_id from Test where test_type_id="{}"'.format(test_type_id)) + TestIDs = cur.fetchall() + + query = 'select attach from Attachments where ' + for i in TestIDs: + query += 'test_id={}'.format(i[0]) + if i is not TestIDs[-1]: + query += ' or ' + cur.execute(query) + Attach = cur.fetchall() + Attach_Data = [] + for i in Attach: + Attach_Data.append(json.loads(i[0])) + + for n in range(len(Attach_Data)): + keys = Attach_Data[n].keys() + for j in keys: + writer.writerow({'Test ID':TestIDs[n][0], 'E Link':j, 'Midpoint':Attach_Data[n][j]['Midpoint'], 'Eye Opening':Attach_Data[n][j]['Eye Opening'], 'Passed':Attach_Data[n][j]['passed'], 'Midpoint Errors':Attach_Data[n][j]['Midpoint Errors']}) + +with open('./static/files/Board.csv', mode='w') as csv_file: + header = ['Full ID', 'Board ID', 'Type ID'] + writer = csv.writer(csv_file) + writer.writerow(header) + + cur.execute('select full_id,board_id,type_id from Board') + Board_Data = cur.fetchall() + writer.writerows(Board_Data) + +with open('./static/files/People.csv', mode='w') as csv_file: + header = ['Person ID', 'Person Name'] + writer = csv.writer(csv_file) + writer.writerow(header) + + cur.execute('select * from People') + People_Data = cur.fetchall() + writer.writerows(People_Data) diff --git a/cgi-bin/WagonDB/module.py b/cgi-bin/WagonDB/module.py new file mode 100755 index 0000000..233719d --- /dev/null +++ b/cgi-bin/WagonDB/module.py @@ -0,0 +1,37 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list +import module_functions +from connect import connect + +#cgi header +print("Content-type: text/html\n") + + +form = cgi.FieldStorage() +board_id = base.cleanCGInumber(form.getvalue('board_id')) +serial_num = form.getvalue('serial_num') +base.header(title='Wagon DB') +base.top() +#print('card_id = ', card_id) +#print 'serial_num = ', serial_num + +module_functions.add_test_tab(serial_num, board_id) + +db = connect(0) +cur = db.cursor() + +revokes=module_functions.Portage_fetch_revokes(board_id) + +cur.execute("SELECT location, daq_chip_id, trigger_chip_1_id, trigger_chip_2_id, info FROM Board_Info WHERE board_id = %s" % board_id) +info = cur.fetchall() + +module_functions.board_info(info) + +cur.execute("select test_type, name from Test_Type where required = 1 order by relative_order ASC") +for test_type in cur: + module_functions.ePortageTest(test_type[0], serial_num, test_type[1], revokes) + +base.bottom() diff --git a/cgi-bin/WagonDB/module_functions.py b/cgi-bin/WagonDB/module_functions.py new file mode 100755 index 0000000..80cf558 --- /dev/null +++ b/cgi-bin/WagonDB/module_functions.py @@ -0,0 +1,250 @@ +#!/usr/bin/python3 +from connect import connect +import sys +#import mysql.connector +from get_attach import save +import home_page_list + +def Portage_fetch(test_type_id, board_sn): + db = connect(0) + cur = db.cursor() + cur.execute("SELECT People.person_name, Test.day, Test.successful, Test.comments, Test_Type.name, Test.test_id FROM Test, Test_Type, People, Board WHERE Test_Type.test_type = %(test_id)s AND Board.full_id = '%(sn)s' AND People.person_id = Test.person_id AND Test_Type.test_type=Test.test_type_id AND Test.board_id = Board.board_id ORDER BY Test.day ASC" %{'test_id':test_type_id, 'sn':board_sn}) + return cur.fetchall() + +def Portage_fetch_revokes(board_sn): + db=connect(0) + cur = db.cursor() + cur.execute("SELECT TestRevoke.test_id, TestRevoke.comment FROM TestRevoke,Test,Board WHERE Board.sn = %(sn)s AND Board.board_id = Test.board_id AND Test.test_id = TestRevoke.test_id" %{'sn':board_sn}) + # build a dictionary + revoked={} + for fromdb in cur.fetchall(): + revoked[fromdb[0]]=fromdb[1] + return revoked + +def Portage_fetch_attach(test_id): + db = connect(0) + cur = db.cursor() + cur.execute('SELECT attach_id, attachmime, attachdesc, originalname FROM Attachments WHERE test_id=%(tid)s ORDER BY attach_id' % {'tid':test_id}) + return cur.fetchall() + +def add_test_tab(sn, board_id): + + print('
') + print('
') + print('

Wagon Test Info for %s

' %sn) + print('
') + print('
') + + print('') + + + +def ePortageTest(test_type_id, board_sn, test_name, revokes): + attempts = Portage_fetch(test_type_id, board_sn) + print('
') + print('
') + print('
') + print('

%(name)s

' %{ "name":test_name}) + print('
') + + n = 0 + for attempt in attempts: + n += 1 + + print('

Attempt: %d

'%n) + print('') + print('') + print('') + print('') + print('') + print('') +# print '' + print('') + print('') + print('' %{ "pname":attempt[0]}) + print('' %{ "when":attempt[1]}) + if attempt[2] == 1: + if attempt[5] in revokes: + print('' %{ "comment":revokes[attempt[5]] }) + else: + print('') + if len(sys.argv) == 1: + print("" %{ "id":attempt[5]}) + + else: + print('') + print('') + print('') + print('' ) + print('' %{ "comm":attempt[3]}) + print('') + attachments=Portage_fetch_attach(attempt[5]) + for afile in attachments: + if len(sys.argv) == 1: + print('' % (afile[0],afile[3],afile[2])) + else: + print('' % (afile[0], afile[3], afile[2])) + stdout = sys.stdout + sys.stdout = open("%(loc)s/%(f)s.html" %{'loc':sys.argv[1], 'f':afile[0]},'w') + save(afile[0]) + sys.stdout.close() + sys.stdout = stdout + + print('') + print('
NameDateSuccessful?Comments
%(pname)s %(when)s Revoked: %(comment)s Yes RevokeNo
Comments: %(comm)s
Attachment: %s%s
Attachment: %s%s
') + + print('
') + print('
') + +def board_info(info): + if info and len(info[0]) == 5: + location = info[0][0] + daq_chip_id = info[0][1] + trigger_chip_1_id = info[0][2] + trigger_chip_2_id = info[0][3] + info_com = info[0][4] + + else: + location, daq_chip_id, trigger_chip_1_id, trigger_chip_2_id, info_com = "None", "None", "None", "None", "None" + + print('
') + print('') + print('') + print('') + print('') + print('') + print('') + print('') + print('') + print('') + print('' % location) + if daq_chip_id != "0" and trigger_chip_1_id != "0" and trigger_chip_2_id != "0": + print('' % daq_chip_id) + print('' % trigger_chip_1_id) + print('' % trigger_chip_2_id) + else: + print('') + print('') + print('') + + print('') + print('') + print('') + print('') + print('' % info_com) + print('') + print('') + print('
LocationDAQ Chip IDTrigger Chip 1 IDTrigger Chip 2 ID
%s%s%s%sNoneNoneNone
Comments
%s
') + print('
') + +def add_board_info(board_id, sn, location, daqid, trig1id, trig2id, info): + db = connect(1) + cur = db.cursor() + + if not board_id: + try: + cur.execute("SELECT board_id FROM Board WHERE full_id = '%s';" % sn) + rows = cur.fetchall() + + if not rows: + home_page_list.add_module(sn) + cur.execute("SELECT board_id FROM Board WHERE full_id = '%s';" % sn) + board_id = cur.fetchall()[0][0] + else: + board_id = rows[0][0] + + except mysql.connector.Error as err: + print("CONNECTION ERROR") + print(err) + + try: + cur.execute('INSERT INTO Board_Info (board_id, info_type, info, daq_chip_id, trigger_chip_1_id, trigger_chip_2_id, location) VALUES (%i, %i, "%s", "%s", "%s", "%s", "%s");' % (board_id, 0, info, daqid, trig1id, trig2id, location)) + + db.commit() + db.close() + + except mysql.connector.Error as err: + print("CONNECTION ERROR") + print(err) + +def add_revoke(test_id): + db = connect(0) + cur = db.cursor() + + cur.execute("SELECT test_type_id, board_id FROM Test WHERE test_id = %s" % test_id) + test_type_id, board_id = cur.fetchall()[0] + + cur.execute("SELECT name FROM Test_Type WHERE test_type = %s" % test_type_id) + name = cur.fetchall()[0][0] + + cur.execute("Select full_id FROM Board WHERE board_id = %s" % board_id) + full_id = cur.fetchall()[0][0] + + print('
') + print('
') + print('

Revoke %s for Board %s

' % (name, full_id)) + print('
') + print('
') + + print('
') + print('' % test_id) + print('
') + print('') + print('') + print('
') + print('
') + print('
') + print('') + print('') + +def revoke_success(test_id, comments): + db = connect(1) + cur = db.cursor() + + try: + cur.execute('INSERT INTO TestRevoke (test_id, comment) VALUES (%s, "%s")' % (test_id, comments)) + + db.commit() + db.close() + + except mysql.connector.Error as err: + print("CONNECTION ERROR") + print(err) + +def get_test_types(): + db = connect(0) + cur = db.cursor() + + try: + cur.execute('SELECT name, test_type FROM Test_Type') + + rows = cur.fetchall() + tests = [[r[0],r[1]] for r in rows] + + return tests + + except mysql.connector.Error as err: + print("CONNECTION ERROR") + print(err) + diff --git a/cgi-bin/WagonDB/module_functions.pyc b/cgi-bin/WagonDB/module_functions.pyc new file mode 100644 index 0000000..bfd74e5 Binary files /dev/null and b/cgi-bin/WagonDB/module_functions.pyc differ diff --git a/cgi-bin/WagonDB/password_entry.py b/cgi-bin/WagonDB/password_entry.py new file mode 100755 index 0000000..4229d54 --- /dev/null +++ b/cgi-bin/WagonDB/password_entry.py @@ -0,0 +1,40 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list +import add_test_functions + + +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +url = form.getvalue("url") + +base.header(title='Admin Access') +base.top() + +print('
') +print(''%url) +print("
") +print('
') +print('

Admin Access

') +print("

") +print("
") + +print("
") +print('
') +print("") +print("") +print("
") + +print('
') +print('') +print("
") +print("
") +print("
") + +print("
") + +base.bottom() diff --git a/cgi-bin/WagonDB/password_entry2.py b/cgi-bin/WagonDB/password_entry2.py new file mode 100755 index 0000000..b7daa4f --- /dev/null +++ b/cgi-bin/WagonDB/password_entry2.py @@ -0,0 +1,50 @@ +#!/usr/bin/python3 + +import cgi +import base +import home_page_list +import add_test_functions +import hashlib +import connect + +try: + base_url = connect.get_base_url() + + form = cgi.FieldStorage() + url = form.getvalue("url") + password = form.getvalue("password") + + correct_password = "8ae3ce28c2aecce334e4c2395b86066b" + + if hashlib.md5(password.encode('utf-8')).hexdigest() == correct_password: + print("Location: %s/%s\n\n" % (base_url,url)) + + print("Content-type: text/html\n") + + base.header(title='Access Granted') + base.top() + + print("
") + print('
') + print('

Access Granted

') + print("
") + print("
") + + base.bottom() + + else: + print("Content-type: text/html\n") + + base.header(title='Access Denied') + base.top() + + print("
") + print('
') + print('

Access Denied

') + print("
") + print("
") + + base.bottom() +except Exception as e: + print("content-type: text/html\n") + print(e) diff --git a/cgi-bin/WagonDB/plottingTest.py b/cgi-bin/WagonDB/plottingTest.py new file mode 100644 index 0000000..919cfcd --- /dev/null +++ b/cgi-bin/WagonDB/plottingTest.py @@ -0,0 +1,192 @@ +from connect import connect +import matplotlib +import matplotlib.pyplot as plt +import numpy as np +import datetime +import matplotlib.dates as mdates +from matplotlib.axis import Axis +import json + + +db = connect(0) + +cur = db.cursor() + +cur.execute('SELECT person_id FROM People WHERE person_name="Bryan"') + +IDtemp = cur.fetchone() +myID = IDtemp[0] + +cur.execute("SELECT test_id FROM Test WHERE person_id={} AND successful=1".format(myID)) + +passed_tests = cur.fetchall() + +print(len(passed_tests)) + +def select_test_per_board(SN): + print("Getting tests for board with Serial number {}".format(SN)) + db = connect(0) + cur = db.cursor() + + cur.execute('select board_id from Board where full_id="{}"'.format(SN)) + BoardID = cur.fetchall()[0][0] + print(BoardID) + + cur.execute('select test_id,successful from Test where board_id={}'.format(BoardID)) + tests = cur.fetchall() + print(tests) + return tests + +#tests = select_test_per_board("320WW20A1000005") +#npresults = np.array([t[1] for t in tests]) +#print(npresults) +#plt.hist(npresults, bins=2) +#plt.savefig("./test.png") + +def tests_over_time(SerialNumber=None,SubType=None,Tester=None): + db = connect(0) + cur = db.cursor() + + query = "select day from Test" + title = "Tests over Time" + + if SerialNumber is not None: + cur.execute('select board_id from Board where full_id="{}"'.format(SerialNumber)) + BoardID = cur.fetchall()[0][0] + query += ' where board_id="{}"'.format(BoardID) + title += " for " + SerialNumber + + if SubType is not None: + if SerialNumber is not None: + query += ' and' + title += " and " + else: + query += ' where' + title += " for " + cur.execute('select board_id from Board where type_id="{}"'.format(SubType)) + BoardID = cur.fetchall() + for i in BoardID: + query += ' board_id={}'.format(i[0]) + if i is not BoardID[-1]: + query += ' or' + title += SubType + + if Tester is not None: + cur.execute('select person_id from People where person_name="{}"'.format(Tester)) + person_id = cur.fetchall()[0][0] + if SerialNumber is not None or SubType is not None: + query += ' and' + title += " and " + else: + query += ' where' + title += " for " + query += ' person_id="{}"'.format(person_id) + title += Tester + + cur.execute(query) + dates = cur.fetchall() + #print(dates) + first = datetime.datetime(2023, 1, 1, 12, 0, 0) + + query2 = "select day from Test where successful=1" + + if SerialNumber is not None: + cur.execute('select board_id from Board where full_id="{}"'.format(SerialNumber)) + BoardID = cur.fetchall()[0][0] + query2 += ' and board_id="{}"'.format(BoardID) + + elif SubType is not None: + cur.execute('select board_id from Board where type_id="{}"'.format(SubType)) + BoardID = cur.fetchall() + query2 += " and" + for i in BoardID: + query2 += ' board_id={}'.format(i[0]) + if i is not BoardID[-1]: + query2 += ' or' + + elif Tester is not None: + cur.execute('select person_id from People where person_name="{}"'.format(Tester)) + person_id = cur.fetchall()[0][0] + query2 += ' and person_id="{}"'.format(person_id) + + cur.execute(query2) + successful_dates = cur.fetchall() + #print(successful_dates) + + time_series_data = [] + time_series_data_successful = [] + + while (first <= datetime.datetime.now()): + i = 0 + j = 0 + for d in dates: + if d[0] > first: + break + else: + i += 1 + for d in successful_dates: + if d[0] > first: + break + else: + j += 1 + time_series_data.append([first,i]) + time_series_data_successful.append([first,j]) + first += datetime.timedelta(days=7) + tempx1,tempy1 = zip(*time_series_data) + tempx2,tempy2 = zip(*time_series_data_successful) + + fig, ax = plt.subplots() + plt.plot(tempx1,tempy1,label = "Total") + plt.plot(tempx2,tempy2,label = "Successful") + plt.title(title) + plt.xlabel("Date") + plt.ylabel("Number of Tests") + plt.legend() + Axis.set_major_locator(ax.xaxis,mdates.MonthLocator(interval=1)) + plt.gcf().autofmt_xdate() + + FileName = "./tests_over_time" + + if SerialNumber is not None: + FileName += "_SN"+SerialNumber + + if SubType is not None: + FileName += "_SubType"+SubType + + if Tester is not None: + FileName += "_Tester"+Tester + + plt.savefig(FileName + ".png") + + +def data_from_test_type(TestType): + db = connect(0) + cur = db.cursor() + + cur.execute('select test_type from Test_Type where name="{}"'.format(TestType)) + test_type_id = cur.fetchall()[0][0] + + cur.execute('select test_id from Test where test_type_id="{}"'.format(test_type_id)) + TestIDs = cur.fetchall() + + query = 'select attach from Attachments where ' + for i in TestIDs: + query += 'test_id={}'.format(i[0]) + if i is not TestIDs[-1]: + query += ' or ' + + cur.execute(query) + Attach = cur.fetchall() + Data = [] + for i in Attach: + Data.append(json.loads(i[0])) + Resistance = [] + for i in Data: + Resistance.append(i['wagon type chip']['WAGON_TYPE -> GND']) + plt.hist(Resistance) + plt.xlabel("Resistance (Ohms)") + plt.ylabel("Number of Boards") + plt.title("ID Resistor Measurements") + plt.savefig("./ID_Resistor_Data.png") + +data_from_test_type("ID Resistor Measurement") diff --git a/cgi-bin/WagonDB/publish.py b/cgi-bin/WagonDB/publish.py new file mode 100755 index 0000000..63946aa --- /dev/null +++ b/cgi-bin/WagonDB/publish.py @@ -0,0 +1,54 @@ +#!/usr/bin/python3 +import sys +import os + +if len(sys.argv) == 1: + print("Please input a destination directory after the script call.") + sys.exit() +else: + if not os.path.isdir(sys.argv[1]): + os.makedirs(sys.argv[1]) +import base +from home_page_list import fetch_list_module +from connect import connect +import home_page +import module_functions +import summary +from summary_functions import get +import shutil + +def copytree(src, dst, symlinks=False, ignore=None): + for item in os.listdir(src): + s = os.path.join(src, item) + d = os.path.join(dst, item) + if os.path.isdir(s): + shutil.copytree(s, d, symlinks, ignore) + else: + shutil.copy2(s, d) + +row = fetch_list_module() + +for cards in row: + stdout = sys.stdout + sys.stdout = open('%(loc)s/card_%(sn)s.html' %{ 'loc':sys.argv[1],'sn':cards[0]}, 'w') + serial_num = cards[0] + card_id = cards[1] + base.header(title='uHTR ePortage') + base.top() + revokes=module_functions.Portage_fetch_revokes(serial_num) + + db= connect(0) + cur = db.cursor() + + cur.execute("select test_type, name from Test_Type where required = 1 order by relative_order ASC") + for test_type in cur: + module_functions.ePortageTest(test_type[0], serial_num, test_type[1], revokes) + sys.stdout.close() + sys.stdout = stdout + + base.bottom() + +copytree('../static/css', '%s' %(sys.argv[1])) + +copytree('../static/files' , '%s' %sys.argv[1]) + diff --git a/cgi-bin/WagonDB/revoke_success.py b/cgi-bin/WagonDB/revoke_success.py new file mode 100755 index 0000000..ef5a0b1 --- /dev/null +++ b/cgi-bin/WagonDB/revoke_success.py @@ -0,0 +1,23 @@ +#!/usr/bin/python3 + +import cgi +import cgitb +import base +import home_page_list +import module_functions +from connect import connect + +cgitb.enable() + +#cgi header +print("Content-type: text/html\n") + + +form = cgi.FieldStorage() +test_id = base.cleanCGInumber(form.getvalue('test_id')) +base.header(title='Revoke Test') +base.top() + +module_functions.add_revoke(test_id) + +base.bottom() diff --git a/cgi-bin/WagonDB/revoke_success2.py b/cgi-bin/WagonDB/revoke_success2.py new file mode 100755 index 0000000..3c8d99a --- /dev/null +++ b/cgi-bin/WagonDB/revoke_success2.py @@ -0,0 +1,31 @@ +#!/usr/bin/python3 + +import cgi +import cgitb +import base +import module_functions +import connect + +cgitb.enable() + +base_url = connect.get_base_url() + +print("Location: %s/summary.py\n\n"%(base_url)) +#cgi header +print("Content-type: text/html\n") + +form = cgi.FieldStorage() +test_id = base.cleanCGInumber(form.getvalue("test_id")) +comments = form.getvalue("revokeComments") + +if comments: + comments = cgi.escape(comments) + +base.header(title='Revoke Success') +base.top() + +module_functions.revoke_success(test_id, comments) + +base.bottom() + + diff --git a/cgi-bin/WagonDB/settings.py b/cgi-bin/WagonDB/settings.py new file mode 100755 index 0000000..29efbc4 --- /dev/null +++ b/cgi-bin/WagonDB/settings.py @@ -0,0 +1,7 @@ +#!/usr/bin/python3 +def getAttachmentBasePath(): + return "/home/jmmans/tmp/ePortage" +# return "/home/daq/ePortageArchive/uHTR" + +def getAttachmentPathFor(test_id,attach_id): + return "%s/%d/%d" % (getAttachmentBasePath(),test_id,attach_id) diff --git a/cgi-bin/WagonDB/settings.pyc b/cgi-bin/WagonDB/settings.pyc new file mode 100644 index 0000000..7ac922c Binary files /dev/null and b/cgi-bin/WagonDB/settings.pyc differ diff --git a/cgi-bin/WagonDB/static/config.json b/cgi-bin/WagonDB/static/config.json new file mode 100644 index 0000000..6ba5807 --- /dev/null +++ b/cgi-bin/WagonDB/static/config.json @@ -0,0 +1,408 @@ +{ + "vars": { + "@gray-base": "#000", + "@gray-darker": "lighten(@gray-base, 13.5%)", + "@gray-dark": "lighten(@gray-base, 20%)", + "@gray": "lighten(@gray-base, 33.5%)", + "@gray-light": "lighten(@gray-base, 46.7%)", + "@gray-lighter": "lighten(@gray-base, 93.5%)", + "@brand-primary": "darken(#428bca, 6.5%)", + "@brand-success": "#5cb85c", + "@brand-info": "#5bc0de", + "@brand-warning": "#f0ad4e", + "@brand-danger": "#d9534f", + "@body-bg": "#fff", + "@text-color": "@gray-dark", + "@link-color": "@brand-primary", + "@link-hover-color": "darken(@link-color, 15%)", + "@link-hover-decoration": "underline", + "@font-family-sans-serif": "\"Helvetica Neue\", Helvetica, Arial, sans-serif", + "@font-family-serif": "Georgia, \"Times New Roman\", Times, serif", + "@font-family-monospace": "Menlo, Monaco, Consolas, \"Courier New\", monospace", + "@font-family-base": "@font-family-sans-serif", + "@font-size-base": "14px", + "@font-size-large": "ceil((@font-size-base * 1.25))", + "@font-size-small": "ceil((@font-size-base * 0.85))", + "@font-size-h1": "floor((@font-size-base * 2.6))", + "@font-size-h2": "floor((@font-size-base * 2.15))", + "@font-size-h3": "ceil((@font-size-base * 1.7))", + "@font-size-h4": "ceil((@font-size-base * 1.25))", + "@font-size-h5": "@font-size-base", + "@font-size-h6": "ceil((@font-size-base * 0.85))", + "@line-height-base": "1.428571429", + "@line-height-computed": "floor((@font-size-base * @line-height-base))", + "@headings-font-family": "inherit", + "@headings-font-weight": "500", + "@headings-line-height": "1.1", + "@headings-color": "inherit", + "@icon-font-path": "\"../fonts/\"", + "@icon-font-name": "\"glyphicons-halflings-regular\"", + "@icon-font-svg-id": "\"glyphicons_halflingsregular\"", + "@padding-base-vertical": "6px", + "@padding-base-horizontal": "12px", + "@padding-large-vertical": "10px", + "@padding-large-horizontal": "16px", + "@padding-small-vertical": "5px", + "@padding-small-horizontal": "10px", + "@padding-xs-vertical": "1px", + "@padding-xs-horizontal": "5px", + "@line-height-large": "1.3333333", + "@line-height-small": "1.5", + "@border-radius-base": "4px", + "@border-radius-large": "6px", + "@border-radius-small": "3px", + "@component-active-color": "#fff", + "@component-active-bg": "@brand-primary", + "@caret-width-base": "4px", + "@caret-width-large": "5px", + "@table-cell-padding": "8px", + "@table-condensed-cell-padding": "5px", + "@table-bg": "transparent", + "@table-bg-accent": "#f9f9f9", + "@table-bg-hover": "#f5f5f5", + "@table-bg-active": "@table-bg-hover", + "@table-border-color": "#ddd", + "@btn-font-weight": "normal", + "@btn-default-color": "#333", + "@btn-default-bg": "#fff", + "@btn-default-border": "#ccc", + "@btn-primary-color": "#fff", + "@btn-primary-bg": "@brand-primary", + "@btn-primary-border": "darken(@btn-primary-bg, 5%)", + "@btn-success-color": "#fff", + "@btn-success-bg": "@brand-success", + "@btn-success-border": "darken(@btn-success-bg, 5%)", + "@btn-info-color": "#fff", + "@btn-info-bg": "@brand-info", + "@btn-info-border": "darken(@btn-info-bg, 5%)", + "@btn-warning-color": "#fff", + "@btn-warning-bg": "@brand-warning", + "@btn-warning-border": "darken(@btn-warning-bg, 5%)", + "@btn-danger-color": "#fff", + "@btn-danger-bg": "@brand-danger", + "@btn-danger-border": "darken(@btn-danger-bg, 5%)", + "@btn-link-disabled-color": "@gray-light", + "@input-bg": "#fff", + "@input-bg-disabled": "@gray-lighter", + "@input-color": "@gray", + "@input-border": "#ccc", + "@input-border-radius": "@border-radius-base", + "@input-border-radius-large": "@border-radius-large", + "@input-border-radius-small": "@border-radius-small", + "@input-border-focus": "#66afe9", + "@input-color-placeholder": "#999", + "@input-height-base": "(@line-height-computed + (@padding-base-vertical * 2) + 2)", + "@input-height-large": "(ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2)", + "@input-height-small": "(floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2)", + "@legend-color": "@gray-dark", + "@legend-border-color": "#e5e5e5", + "@input-group-addon-bg": "@gray-lighter", + "@input-group-addon-border-color": "@input-border", + "@cursor-disabled": "not-allowed", + "@dropdown-bg": "#fff", + "@dropdown-border": "rgba(0,0,0,.15)", + "@dropdown-fallback-border": "#ccc", + "@dropdown-divider-bg": "#e5e5e5", + "@dropdown-link-color": "@gray-dark", + "@dropdown-link-hover-color": "darken(@gray-dark, 5%)", + "@dropdown-link-hover-bg": "#f5f5f5", + "@dropdown-link-active-color": "@component-active-color", + "@dropdown-link-active-bg": "@component-active-bg", + "@dropdown-link-disabled-color": "@gray-light", + "@dropdown-header-color": "@gray-light", + "@dropdown-caret-color": "#000", + "@screen-xs": "480px", + "@screen-xs-min": "@screen-xs", + "@screen-phone": "@screen-xs-min", + "@screen-sm": "768px", + "@screen-sm-min": "@screen-sm", + "@screen-tablet": "@screen-sm-min", + "@screen-md": "992px", + "@screen-md-min": "@screen-md", + "@screen-desktop": "@screen-md-min", + "@screen-lg": "1200px", + "@screen-lg-min": "@screen-lg", + "@screen-lg-desktop": "@screen-lg-min", + "@screen-xs-max": "(@screen-sm-min - 1)", + "@screen-sm-max": "(@screen-md-min - 1)", + "@screen-md-max": "(@screen-lg-min - 1)", + "@grid-columns": "12", + "@grid-gutter-width": "30px", + "@grid-float-breakpoint": "@screen-sm-min", + "@grid-float-breakpoint-max": "(@grid-float-breakpoint - 1)", + "@container-tablet": "(720px + @grid-gutter-width)", + "@container-sm": "@container-tablet", + "@container-desktop": "(940px + @grid-gutter-width)", + "@container-md": "@container-desktop", + "@container-large-desktop": "(1140px + @grid-gutter-width)", + "@container-lg": "@container-large-desktop", + "@navbar-height": "50px", + "@navbar-margin-bottom": "@line-height-computed", + "@navbar-border-radius": "@border-radius-base", + "@navbar-padding-horizontal": "floor((@grid-gutter-width / 2))", + "@navbar-padding-vertical": "((@navbar-height - @line-height-computed) / 2)", + "@navbar-collapse-max-height": "340px", + "@navbar-default-color": "#777", + "@navbar-default-bg": "#f8f8f8", + "@navbar-default-border": "darken(@navbar-default-bg, 6.5%)", + "@navbar-default-link-color": "#777", + "@navbar-default-link-hover-color": "#333", + "@navbar-default-link-hover-bg": "transparent", + "@navbar-default-link-active-color": "#555", + "@navbar-default-link-active-bg": "darken(@navbar-default-bg, 6.5%)", + "@navbar-default-link-disabled-color": "#ccc", + "@navbar-default-link-disabled-bg": "transparent", + "@navbar-default-brand-color": "@navbar-default-link-color", + "@navbar-default-brand-hover-color": "darken(@navbar-default-brand-color, 10%)", + "@navbar-default-brand-hover-bg": "transparent", + "@navbar-default-toggle-hover-bg": "#ddd", + "@navbar-default-toggle-icon-bar-bg": "#888", + "@navbar-default-toggle-border-color": "#ddd", + "@navbar-inverse-color": "lighten(@gray-light, 15%)", + "@navbar-inverse-bg": "#222", + "@navbar-inverse-border": "darken(@navbar-inverse-bg, 10%)", + "@navbar-inverse-link-color": "lighten(@gray-light, 15%)", + "@navbar-inverse-link-hover-color": "#fff", + "@navbar-inverse-link-hover-bg": "transparent", + "@navbar-inverse-link-active-color": "@navbar-inverse-link-hover-color", + "@navbar-inverse-link-active-bg": "darken(@navbar-inverse-bg, 10%)", + "@navbar-inverse-link-disabled-color": "#444", + "@navbar-inverse-link-disabled-bg": "transparent", + "@navbar-inverse-brand-color": "@navbar-inverse-link-color", + "@navbar-inverse-brand-hover-color": "#fff", + "@navbar-inverse-brand-hover-bg": "transparent", + "@navbar-inverse-toggle-hover-bg": "#333", + "@navbar-inverse-toggle-icon-bar-bg": "#fff", + "@navbar-inverse-toggle-border-color": "#333", + "@nav-link-padding": "10px 15px", + "@nav-link-hover-bg": "@gray-lighter", + "@nav-disabled-link-color": "@gray-light", + "@nav-disabled-link-hover-color": "@gray-light", + "@nav-tabs-border-color": "#ddd", + "@nav-tabs-link-hover-border-color": "@gray-lighter", + "@nav-tabs-active-link-hover-bg": "@body-bg", + "@nav-tabs-active-link-hover-color": "@gray", + "@nav-tabs-active-link-hover-border-color": "#ddd", + "@nav-tabs-justified-link-border-color": "#ddd", + "@nav-tabs-justified-active-link-border-color": "@body-bg", + "@nav-pills-border-radius": "@border-radius-base", + "@nav-pills-active-link-hover-bg": "@component-active-bg", + "@nav-pills-active-link-hover-color": "@component-active-color", + "@pagination-color": "@link-color", + "@pagination-bg": "#fff", + "@pagination-border": "#ddd", + "@pagination-hover-color": "@link-hover-color", + "@pagination-hover-bg": "@gray-lighter", + "@pagination-hover-border": "#ddd", + "@pagination-active-color": "#fff", + "@pagination-active-bg": "@brand-primary", + "@pagination-active-border": "@brand-primary", + "@pagination-disabled-color": "@gray-light", + "@pagination-disabled-bg": "#fff", + "@pagination-disabled-border": "#ddd", + "@pager-bg": "@pagination-bg", + "@pager-border": "@pagination-border", + "@pager-border-radius": "15px", + "@pager-hover-bg": "@pagination-hover-bg", + "@pager-active-bg": "@pagination-active-bg", + "@pager-active-color": "@pagination-active-color", + "@pager-disabled-color": "@pagination-disabled-color", + "@jumbotron-padding": "30px", + "@jumbotron-color": "inherit", + "@jumbotron-bg": "@gray-lighter", + "@jumbotron-heading-color": "inherit", + "@jumbotron-font-size": "ceil((@font-size-base * 1.5))", + "@state-success-text": "#3c763d", + "@state-success-bg": "#dff0d8", + "@state-success-border": "darken(spin(@state-success-bg, -10), 5%)", + "@state-info-text": "#31708f", + "@state-info-bg": "#d9edf7", + "@state-info-border": "darken(spin(@state-info-bg, -10), 7%)", + "@state-warning-text": "#8a6d3b", + "@state-warning-bg": "#fcf8e3", + "@state-warning-border": "darken(spin(@state-warning-bg, -10), 5%)", + "@state-danger-text": "#a94442", + "@state-danger-bg": "#f2dede", + "@state-danger-border": "darken(spin(@state-danger-bg, -10), 5%)", + "@tooltip-max-width": "200px", + "@tooltip-color": "#fff", + "@tooltip-bg": "#000", + "@tooltip-opacity": ".9", + "@tooltip-arrow-width": "5px", + "@tooltip-arrow-color": "@tooltip-bg", + "@popover-bg": "#fff", + "@popover-max-width": "276px", + "@popover-border-color": "rgba(0,0,0,.2)", + "@popover-fallback-border-color": "#ccc", + "@popover-title-bg": "darken(@popover-bg, 3%)", + "@popover-arrow-width": "10px", + "@popover-arrow-color": "@popover-bg", + "@popover-arrow-outer-width": "(@popover-arrow-width + 1)", + "@popover-arrow-outer-color": "fadein(@popover-border-color, 5%)", + "@popover-arrow-outer-fallback-color": "darken(@popover-fallback-border-color, 20%)", + "@label-default-bg": "@gray-light", + "@label-primary-bg": "@brand-primary", + "@label-success-bg": "@brand-success", + "@label-info-bg": "@brand-info", + "@label-warning-bg": "@brand-warning", + "@label-danger-bg": "@brand-danger", + "@label-color": "#fff", + "@label-link-hover-color": "#fff", + "@modal-inner-padding": "15px", + "@modal-title-padding": "15px", + "@modal-title-line-height": "@line-height-base", + "@modal-content-bg": "#fff", + "@modal-content-border-color": "rgba(0,0,0,.2)", + "@modal-content-fallback-border-color": "#999", + "@modal-backdrop-bg": "#000", + "@modal-backdrop-opacity": ".5", + "@modal-header-border-color": "#e5e5e5", + "@modal-footer-border-color": "@modal-header-border-color", + "@modal-lg": "900px", + "@modal-md": "600px", + "@modal-sm": "300px", + "@alert-padding": "15px", + "@alert-border-radius": "@border-radius-base", + "@alert-link-font-weight": "bold", + "@alert-success-bg": "@state-success-bg", + "@alert-success-text": "@state-success-text", + "@alert-success-border": "@state-success-border", + "@alert-info-bg": "@state-info-bg", + "@alert-info-text": "@state-info-text", + "@alert-info-border": "@state-info-border", + "@alert-warning-bg": "@state-warning-bg", + "@alert-warning-text": "@state-warning-text", + "@alert-warning-border": "@state-warning-border", + "@alert-danger-bg": "@state-danger-bg", + "@alert-danger-text": "@state-danger-text", + "@alert-danger-border": "@state-danger-border", + "@progress-bg": "#f5f5f5", + "@progress-bar-color": "#fff", + "@progress-border-radius": "@border-radius-base", + "@progress-bar-bg": "@brand-primary", + "@progress-bar-success-bg": "@brand-success", + "@progress-bar-warning-bg": "@brand-warning", + "@progress-bar-danger-bg": "@brand-danger", + "@progress-bar-info-bg": "@brand-info", + "@list-group-bg": "#fff", + "@list-group-border": "#ddd", + "@list-group-border-radius": "@border-radius-base", + "@list-group-hover-bg": "#f5f5f5", + "@list-group-active-color": "@component-active-color", + "@list-group-active-bg": "@component-active-bg", + "@list-group-active-border": "@list-group-active-bg", + "@list-group-active-text-color": "lighten(@list-group-active-bg, 40%)", + "@list-group-disabled-color": "@gray-light", + "@list-group-disabled-bg": "@gray-lighter", + "@list-group-disabled-text-color": "@list-group-disabled-color", + "@list-group-link-color": "#555", + "@list-group-link-hover-color": "@list-group-link-color", + "@list-group-link-heading-color": "#333", + "@panel-bg": "#fff", + "@panel-body-padding": "15px", + "@panel-heading-padding": "10px 15px", + "@panel-footer-padding": "@panel-heading-padding", + "@panel-border-radius": "@border-radius-base", + "@panel-inner-border": "#ddd", + "@panel-footer-bg": "#f5f5f5", + "@panel-default-text": "@gray-dark", + "@panel-default-border": "#ddd", + "@panel-default-heading-bg": "#f5f5f5", + "@panel-primary-text": "#fff", + "@panel-primary-border": "@brand-primary", + "@panel-primary-heading-bg": "@brand-primary", + "@panel-success-text": "@state-success-text", + "@panel-success-border": "@state-success-border", + "@panel-success-heading-bg": "@state-success-bg", + "@panel-info-text": "@state-info-text", + "@panel-info-border": "@state-info-border", + "@panel-info-heading-bg": "@state-info-bg", + "@panel-warning-text": "@state-warning-text", + "@panel-warning-border": "@state-warning-border", + "@panel-warning-heading-bg": "@state-warning-bg", + "@panel-danger-text": "@state-danger-text", + "@panel-danger-border": "@state-danger-border", + "@panel-danger-heading-bg": "@state-danger-bg", + "@thumbnail-padding": "4px", + "@thumbnail-bg": "@body-bg", + "@thumbnail-border": "#ddd", + "@thumbnail-border-radius": "@border-radius-base", + "@thumbnail-caption-color": "@text-color", + "@thumbnail-caption-padding": "9px", + "@well-bg": "#f5f5f5", + "@well-border": "darken(@well-bg, 7%)", + "@badge-color": "#fff", + "@badge-link-hover-color": "#fff", + "@badge-bg": "@gray-light", + "@badge-active-color": "@link-color", + "@badge-active-bg": "#fff", + "@badge-font-weight": "bold", + "@badge-line-height": "1", + "@badge-border-radius": "10px", + "@breadcrumb-padding-vertical": "8px", + "@breadcrumb-padding-horizontal": "15px", + "@breadcrumb-bg": "#f5f5f5", + "@breadcrumb-color": "#ccc", + "@breadcrumb-active-color": "@gray-light", + "@breadcrumb-separator": "\"/\"", + "@carousel-text-shadow": "0 1px 2px rgba(0,0,0,.6)", + "@carousel-control-color": "#fff", + "@carousel-control-width": "15%", + "@carousel-control-opacity": ".5", + "@carousel-control-font-size": "20px", + "@carousel-indicator-active-bg": "#fff", + "@carousel-indicator-border-color": "#fff", + "@carousel-caption-color": "#fff", + "@close-font-weight": "bold", + "@close-color": "#000", + "@close-text-shadow": "0 1px 0 #fff", + "@code-color": "#c7254e", + "@code-bg": "#f9f2f4", + "@kbd-color": "#fff", + "@kbd-bg": "#333", + "@pre-bg": "#f5f5f5", + "@pre-color": "@gray-dark", + "@pre-border-color": "#ccc", + "@pre-scrollable-max-height": "340px", + "@component-offset-horizontal": "180px", + "@text-muted": "@gray-light", + "@abbr-border-color": "@gray-light", + "@headings-small-color": "@gray-light", + "@blockquote-small-color": "@gray-light", + "@blockquote-font-size": "(@font-size-base * 1.25)", + "@blockquote-border-color": "@gray-lighter", + "@page-header-border-color": "@gray-lighter", + "@dl-horizontal-offset": "@component-offset-horizontal", + "@hr-border": "@gray-lighter" + }, + "css": [ + "print.less", + "type.less", + "code.less", + "grid.less", + "tables.less", + "forms.less", + "buttons.less", + "responsive-utilities.less", + "button-groups.less", + "input-groups.less", + "labels.less", + "dropdowns.less", + "modals.less" + ], + "js": [ + "alert.js", + "button.js", + "carousel.js", + "dropdown.js", + "modal.js", + "tooltip.js", + "popover.js", + "tab.js", + "affix.js", + "collapse.js", + "scrollspy.js", + "transition.js" + ], + "customizerUrl": "http://getbootstrap.com/customize/?id=c359f3d5455d568ef741" +} \ No newline at end of file diff --git a/cgi-bin/WagonDB/static/css/bootstrap-theme.css b/cgi-bin/WagonDB/static/css/bootstrap-theme.css new file mode 100644 index 0000000..f3f644f --- /dev/null +++ b/cgi-bin/WagonDB/static/css/bootstrap-theme.css @@ -0,0 +1,479 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c359f3d5455d568ef741) + * Config saved to config.json and https://gist.github.com/c359f3d5455d568ef741 + */ +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + text-shadow: 0 1px 0 #fff; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + 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, +.btn-default[disabled] { + 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:hover, +.btn-primary:focus { + 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, +.btn-primary[disabled] { + 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:hover, +.btn-success:focus { + 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, +.btn-success[disabled] { + 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:hover, +.btn-info:focus { + 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, +.btn-info[disabled] { + 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:hover, +.btn-warning:focus { + 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, +.btn-warning[disabled] { + 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:hover, +.btn-danger:focus { + 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, +.btn-danger[disabled] { + background-color: #c12e2a; + background-image: none; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-color: #e8e8e8; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-color: #2e6da4; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .active > 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +@media (max-width: 767px) { + .navbar .navbar-nav .open .dropdown-menu > .active > a, + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { + 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + } +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + 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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); +} +.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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); +} +.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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); + border-color: #2b669a; +} +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); +} +.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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -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%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); +} diff --git a/cgi-bin/WagonDB/static/css/bootstrap-theme.min.css b/cgi-bin/WagonDB/static/css/bootstrap-theme.min.css new file mode 100644 index 0000000..a5de857 --- /dev/null +++ b/cgi-bin/WagonDB/static/css/bootstrap-theme.min.css @@ -0,0 +1,10 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c359f3d5455d568ef741) + * Config saved to config.json and https://gist.github.com/c359f3d5455d568ef741 + */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-o-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#e0e0e0));background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:hover,.btn-default:focus{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,.btn-default[disabled]{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, color-stop(0, #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:hover,.btn-primary:focus{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,.btn-primary[disabled]{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, color-stop(0, #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:hover,.btn-success:focus{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,.btn-success[disabled]{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, color-stop(0, #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:hover,.btn-info:focus{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,.btn-info[disabled]{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, color-stop(0, #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:hover,.btn-warning:focus{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,.btn-warning[disabled]{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, color-stop(0, #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:hover,.btn-danger:focus{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,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-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, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{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, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-o-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#f8f8f8));background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>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, color-stop(0, #dbdbdb), to(#e2e2e2));background-image:linear-gradient(to bottom, #dbdbdb 0, #e2e2e2 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-o-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #3c3c3c), to(#222));background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>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, color-stop(0, #080808), to(#0f0f0f));background-image:linear-gradient(to bottom, #080808 0, #0f0f0f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus{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, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0)}}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dff0d8), to(#c8e5bc));background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);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, color-stop(0, #d9edf7), to(#b9def0));background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);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, color-stop(0, #fcf8e3), to(#f8efc0));background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);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, color-stop(0, #f2dede), to(#e7c3c3));background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);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, color-stop(0, #ebebeb), to(#f5f5f5));background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top, #337ab7 0, #286090 100%);background-image:-o-linear-gradient(top, #337ab7 0, #286090 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#286090));background-image:linear-gradient(to bottom, #337ab7 0, #286090 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0)}.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, color-stop(0, #5cb85c), to(#449d44));background-image:linear-gradient(to bottom, #5cb85c 0, #449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-o-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5bc0de), to(#31b0d5));background-image:linear-gradient(to bottom, #5bc0de 0, #31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-o-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f0ad4e), to(#ec971f));background-image:linear-gradient(to bottom, #f0ad4e 0, #ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-o-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9534f), to(#c9302c));background-image:linear-gradient(to bottom, #d9534f 0, #c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #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, color-stop(0, #337ab7), to(#2b669a));background-image:linear-gradient(to bottom, #337ab7 0, #2b669a 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0)}.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, color-stop(0, #dff0d8), to(#d0e9c6));background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9edf7), to(#c4e3f3));background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fcf8e3), to(#faf2cc));background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-o-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2dede), to(#ebcccc));background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #e8e8e8), to(#f5f5f5));background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} \ No newline at end of file diff --git a/cgi-bin/WagonDB/static/css/bootstrap.css b/cgi-bin/WagonDB/static/css/bootstrap.css new file mode 100644 index 0000000..e2d6448 --- /dev/null +++ b/cgi-bin/WagonDB/static/css/bootstrap.css @@ -0,0 +1,3489 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c359f3d5455d568ef741) + * Config saved to config.json and https://gist.github.com/c359f3d5455d568ef741 + */ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +mark { + background: #ff0; + color: #000; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333333; + background-color: #ffffff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + padding: 4px; + line-height: 1.42857143; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + background-color: #fcf8e3; + padding: .2em; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eeeeee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; + text-align: right; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #ffffff; + background-color: #333333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.row { + margin-left: -15px; + margin-right: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0%; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #dddddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #dddddd; +} +.table .table { + background-color: #ffffff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #dddddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #dddddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + float: none; + display: table-column; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + overflow-x: auto; + min-height: 0.01%; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #dddddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); +} +.form-control::-moz-placeholder { + color: #999999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999999; +} +.form-control::-webkit-input-placeholder { + color: #999999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eeeeee; + opacity: 1; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-left: 0; + padding-right: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.form-group-sm .form-control { + height: 30px; + line-height: 30px; +} +textarea.form-group-sm .form-control, +select[multiple].form-group-sm .form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.form-group-lg .form-control { + height: 46px; + line-height: 46px; +} +textarea.form-group-lg .form-control, +select[multiple].form-group-lg .form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + border-color: #3c763d; + background-color: #dff0d8; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + border-color: #8a6d3b; + background-color: #fcf8e3; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + border-color: #a94442; + background-color: #f2dede; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 7px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 7px; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.333333px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + } +} +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333333; + text-decoration: none; +} +.btn:active, +.btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default { + color: #333333; + background-color: #ffffff; + border-color: #cccccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #ffffff; + border-color: #cccccc; +} +.btn-default .badge { + color: #ffffff; + background-color: #333333; +} +.btn-primary { + color: #ffffff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #ffffff; +} +.btn-success { + color: #ffffff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #ffffff; +} +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #ffffff; +} +.btn-warning { + color: #ffffff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #ffffff; +} +.btn-danger { + color: #ffffff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #ffffff; +} +.btn-link { + color: #337ab7; + font-weight: normal; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + -webkit-background-clip: padding-box; + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #337ab7; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + left: auto; + right: 0; +} +.dropdown-menu-left { + left: 0; + right: auto; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 4px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.modal-open { + overflow: hidden; +} +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + -webkit-background-clip: padding-box; + background-clip: padding-box; + outline: 0; +} +.modal-backdrop { + position: absolute; + top: 0; + right: 0; + left: 0; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; + min-height: 16.42857143px; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.modal-footer:before, +.modal-footer:after { + content: " "; + display: table; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; + visibility: hidden !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} diff --git a/cgi-bin/WagonDB/static/css/bootstrap.min.css b/cgi-bin/WagonDB/static/css/bootstrap.min.css new file mode 100644 index 0000000..6d14b1b --- /dev/null +++ b/cgi-bin/WagonDB/static/css/bootstrap.min.css @@ -0,0 +1,10 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c359f3d5455d568ef741) + * Config saved to config.json and https://gist.github.com/c359f3d5455d568ef741 + *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}textarea.form-group-sm .form-control,select[multiple].form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}textarea.form-group-lg .form-control,select[multiple].form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.333333px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}} \ No newline at end of file diff --git a/cgi-bin/WagonDB/static/css/style.css b/cgi-bin/WagonDB/static/css/style.css new file mode 100644 index 0000000..5ad9224 --- /dev/null +++ b/cgi-bin/WagonDB/static/css/style.css @@ -0,0 +1,29 @@ +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.uHTR_body{ + background-color: #CCAA44 +} + + +.sub-card-form{ + background-color: rgb(199, 215, 190); +} +.sub-card{ + color: red; +} +.sub-card-submit{ + color: red; +} + +.Portage_table{ + border-spacing: 2px; + border-color: gray; + background-color: rgb(215, 255, 202); + margin-left: 25px; +} + diff --git a/cgi-bin/WagonDB/static/figures/ID_Resistor.png b/cgi-bin/WagonDB/static/figures/ID_Resistor.png new file mode 100755 index 0000000..5da6f60 Binary files /dev/null and b/cgi-bin/WagonDB/static/figures/ID_Resistor.png differ diff --git a/cgi-bin/WagonDB/static/figures/Resistance_Measurement.png b/cgi-bin/WagonDB/static/figures/Resistance_Measurement.png new file mode 100755 index 0000000..0096803 Binary files /dev/null and b/cgi-bin/WagonDB/static/figures/Resistance_Measurement.png differ diff --git a/cgi-bin/WagonDB/static/files/Bit_Error_Rate_Test_Data.csv b/cgi-bin/WagonDB/static/files/Bit_Error_Rate_Test_Data.csv new file mode 100644 index 0000000..809305f --- /dev/null +++ b/cgi-bin/WagonDB/static/files/Bit_Error_Rate_Test_Data.csv @@ -0,0 +1,321 @@ +Test ID,E Link,Midpoint,Eye Opening,Passed,Midpoint Errors +235,CLK1,331.0,195.0,True,0 +235,CLK0,274.0,203.0,True,0 +235,TRIG6,270.0,200.0,True,0 +235,TRIG5,248.0,199.0,True,0 +235,TRIG4,244.0,197.0,True,0 +235,TRIG3,300.0,201.0,True,0 +235,TRIG2,178.0,202.0,True,0 +235,TRIG1,182.0,202.0,True,0 +235,TRIG0,344.0,202.0,True,0 +239,CLK1,335.0,196.0,True,0 +239,CLK0,276.0,204.0,True,0 +239,TRIG6,271.0,199.0,True,0 +239,TRIG5,249.0,199.0,True,0 +239,TRIG4,245.0,197.0,True,0 +239,TRIG3,301.0,200.0,True,0 +239,TRIG2,179.0,203.0,True,0 +239,TRIG1,183.0,204.0,True,0 +239,TRIG0,345.0,202.0,True,0 +243,CLK0,300.0,200.0,True,0 +243,TRIG3,229.0,200.0,True,0 +243,TRIG2,197.0,202.0,True,0 +243,TRIG1,200.0,200.0,True,0 +243,TRIG0,254.0,421.0,False,94089219 +247,CLK0,300.0,200.0,True,0 +247,TRIG3,229.0,200.0,True,0 +247,TRIG2,197.0,202.0,True,0 +247,TRIG1,200.0,200.0,True,0 +247,TRIG0,363.0,202.0,True,0 +251,CLK0,296.0,199.0,True,0 +251,TRIG3,227.0,199.0,True,0 +251,TRIG2,194.0,201.0,True,0 +251,TRIG1,197.0,199.0,True,0 +251,TRIG0,360.0,202.0,True,0 +255,CLK0,297.0,198.0,True,0 +255,TRIG3,227.0,199.0,True,0 +255,TRIG2,195.0,200.0,True,0 +255,TRIG1,198.0,198.0,True,0 +255,TRIG0,361.0,202.0,True,0 +259,CLK0,300.0,195.0,True,0 +259,TRIG3,229.0,200.0,True,0 +259,TRIG2,198.0,201.0,True,0 +259,TRIG1,200.0,199.0,True,0 +259,TRIG0,364.0,202.0,True,0 +263,CLK0,240.0,202.0,True,0 +263,CLK1,270.0,192.0,True,0 +263,TRIG4,219.0,0.0,False,238897915 +263,TRIG3,199.0,298.0,True,0 +263,TRIG2,339.0,202.0,True,0 +263,TRIG1,264.0,429.0,False,94975955 +263,TRIG0,323.0,199.0,True,0 +268,CLK1,266.0,193.0,True,0 +268,CLK0,240.0,201.0,True,0 +268,TRIG6,193.0,202.0,True,0 +268,TRIG5,186.0,200.0,True,0 +268,TRIG4,176.0,198.0,True,0 +268,TRIG3,250.0,203.0,True,0 +268,TRIG2,338.0,202.0,True,0 +268,TRIG1,264.0,428.0,False,93729188 +268,TRIG0,324.0,199.0,True,0 +269,CLK1,266.0,189.0,True,0 +269,CLK0,240.0,202.0,True,0 +269,TRIG6,193.0,202.0,True,0 +269,TRIG5,186.0,200.0,True,0 +269,TRIG4,176.0,198.0,True,0 +269,TRIG3,249.0,203.0,True,0 +269,TRIG2,338.0,202.0,True,0 +269,TRIG1,261.0,434.0,False,93709556 +269,TRIG0,324.0,199.0,True,0 +271,CLK1,265.0,186.0,True,0 +271,CLK0,240.0,202.0,True,0 +271,TRIG6,193.0,202.0,True,0 +271,TRIG5,186.0,201.0,True,0 +271,TRIG4,176.0,198.0,True,0 +271,TRIG3,249.0,203.0,True,0 +271,TRIG2,338.0,202.0,True,0 +271,TRIG1,156.0,207.0,True,0 +271,TRIG0,324.0,199.0,True,0 +288,CLK0,281.0,201.0,True,0 +288,TRIG3,188.0,204.0,True,0 +288,TRIG2,173.0,203.0,True,0 +288,TRIG1,199.0,200.0,True,0 +288,TRIG0,151.0,201.0,True,0 +292,CLK0,278.0,201.0,True,0 +292,TRIG3,184.0,204.0,True,0 +292,TRIG2,170.0,203.0,True,0 +292,TRIG1,196.0,201.0,True,0 +292,TRIG0,148.0,200.0,True,0 +296,CLK0,276.0,202.0,True,0 +296,TRIG3,182.0,204.0,True,0 +296,TRIG2,168.0,203.0,True,0 +296,TRIG1,194.0,201.0,True,0 +296,TRIG0,145.0,200.0,True,0 +300,CLK0,281.0,201.0,True,0 +300,TRIG3,187.0,204.0,True,0 +300,TRIG2,172.0,203.0,True,0 +300,TRIG1,198.0,200.0,True,0 +300,TRIG0,150.0,200.0,True,0 +304,CLK1,259.0,198.0,True,0 +304,CLK0,235.0,200.0,True,0 +304,TRIG6,189.0,202.0,True,0 +304,TRIG5,184.0,200.0,True,0 +304,TRIG4,175.0,199.0,True,0 +304,TRIG3,247.0,204.0,True,0 +304,TRIG2,118.0,200.0,True,0 +304,TRIG1,155.0,206.0,True,0 +304,TRIG0,323.0,199.0,True,0 +308,CLK1,261.0,198.0,True,0 +308,CLK0,235.0,200.0,True,0 +308,TRIG6,194.0,202.0,True,0 +308,TRIG5,188.0,201.0,True,0 +308,TRIG4,178.0,199.0,True,0 +308,TRIG3,250.0,204.0,True,0 +308,TRIG2,115.0,200.0,True,0 +308,TRIG1,152.0,205.0,True,0 +308,TRIG0,321.0,200.0,True,0 +317,CLK0,240.0,201.0,True,0 +317,CLK1,273.0,198.0,True,0 +317,TRIG4,141.0,198.0,True,0 +317,TRIG3,213.0,204.0,True,0 +317,TRIG2,118.0,200.0,True,0 +317,TRIG1,238.0,205.0,True,0 +317,TRIG0,187.0,202.0,True,0 +348,CLK1,114.0,197.0,True,0 +348,CLK0,276.0,202.0,True,0 +348,TRIG6,57.0,0.0,False,239885093 +348,TRIG5,245.0,199.0,True,0 +348,TRIG4,241.0,197.0,True,0 +348,TRIG3,298.0,200.0,True,0 +348,TRIG2,183.0,203.0,True,0 +348,TRIG1,187.0,203.0,True,0 +348,TRIG0,131.0,202.0,True,0 +352,CLK1,113.0,197.0,True,0 +352,CLK0,275.0,202.0,True,0 +352,TRIG6,55.0,0.0,False,239854631 +352,TRIG5,245.0,199.0,True,0 +352,TRIG4,241.0,197.0,True,0 +352,TRIG3,298.0,200.0,True,0 +352,TRIG2,183.0,204.0,True,0 +352,TRIG1,186.0,203.0,True,0 +352,TRIG0,131.0,202.0,True,0 +354,CLK1,113.0,197.0,True,0 +354,CLK0,275.0,202.0,True,0 +354,TRIG6,267.0,199.0,True,0 +354,TRIG5,245.0,199.0,True,0 +354,TRIG4,6.0,0.0,False,15009233 +354,TRIG3,278.0,231.0,True,0 +354,TRIG2,183.0,203.0,True,0 +354,TRIG1,186.0,203.0,True,0 +354,TRIG0,131.0,202.0,True,0 +358,CLK1,113.0,198.0,True,0 +358,CLK0,276.0,202.0,True,0 +358,TRIG6,267.0,199.0,True,0 +358,TRIG5,245.0,199.0,True,0 +358,TRIG4,241.0,197.0,True,0 +358,TRIG3,298.0,200.0,True,0 +358,TRIG2,183.0,203.0,True,0 +358,TRIG1,187.0,203.0,True,0 +358,TRIG0,131.0,202.0,True,0 +362,CLK1,113.0,198.0,True,0 +362,CLK0,275.0,202.0,True,0 +362,TRIG6,267.0,199.0,True,0 +362,TRIG5,245.0,199.0,True,0 +362,TRIG4,241.0,197.0,True,0 +362,TRIG3,298.0,200.0,True,0 +362,TRIG2,183.0,203.0,True,0 +362,TRIG1,186.0,203.0,True,0 +362,TRIG0,131.0,202.0,True,0 +370,CLK1,113.0,197.0,True,0 +370,CLK0,275.0,202.0,True,0 +370,TRIG6,267.0,199.0,True,0 +370,TRIG5,245.0,199.0,True,0 +370,TRIG4,241.0,197.0,True,0 +370,TRIG3,298.0,200.0,True,0 +370,TRIG2,183.0,203.0,True,0 +370,TRIG1,186.0,203.0,True,0 +370,TRIG0,131.0,202.0,True,0 +374,CLK1,113.0,198.0,True,0 +374,CLK0,276.0,202.0,True,0 +374,TRIG6,267.0,199.0,True,0 +374,TRIG5,245.0,199.0,True,0 +374,TRIG4,241.0,197.0,True,0 +374,TRIG3,298.0,200.0,True,0 +374,TRIG2,183.0,203.0,True,0 +374,TRIG1,186.0,203.0,True,0 +374,TRIG0,131.0,202.0,True,0 +378,CLK1,113.0,197.0,True,0 +378,CLK0,276.0,202.0,True,0 +378,TRIG6,267.0,199.0,True,0 +378,TRIG5,245.0,199.0,True,0 +378,TRIG4,241.0,197.0,True,0 +378,TRIG3,298.0,200.0,True,0 +378,TRIG2,183.0,203.0,True,0 +378,TRIG1,187.0,203.0,True,0 +378,TRIG0,131.0,202.0,True,0 +382,CLK1,113.0,197.0,True,0 +382,CLK0,276.0,202.0,True,0 +382,TRIG6,267.0,199.0,True,0 +382,TRIG5,245.0,199.0,True,0 +382,TRIG4,241.0,197.0,True,0 +382,TRIG3,298.0,200.0,True,0 +382,TRIG2,183.0,203.0,True,0 +382,TRIG1,187.0,203.0,True,0 +382,TRIG0,131.0,202.0,True,0 +388,CLK1,113.0,197.0,True,0 +388,CLK0,276.0,202.0,True,0 +388,TRIG6,267.0,199.0,True,0 +388,TRIG5,245.0,199.0,True,0 +388,TRIG4,241.0,197.0,True,0 +388,TRIG3,298.0,200.0,True,0 +388,TRIG2,183.0,203.0,True,0 +388,TRIG1,187.0,203.0,True,0 +388,TRIG0,131.0,202.0,True,0 +396,CLK1,113.0,197.0,True,0 +396,CLK0,276.0,202.0,True,0 +396,TRIG6,267.0,199.0,True,0 +396,TRIG5,245.0,199.0,True,0 +396,TRIG4,241.0,197.0,True,0 +396,TRIG3,298.0,200.0,True,0 +396,TRIG2,183.0,203.0,True,0 +396,TRIG1,186.0,203.0,True,0 +396,TRIG0,131.0,202.0,True,0 +400,CLK1,113.0,197.0,True,0 +400,CLK0,275.0,202.0,True,0 +400,TRIG6,267.0,199.0,True,0 +400,TRIG5,245.0,199.0,True,0 +400,TRIG4,241.0,197.0,True,0 +400,TRIG3,298.0,200.0,True,0 +400,TRIG2,183.0,203.0,True,0 +400,TRIG1,186.0,203.0,True,0 +400,TRIG0,131.0,202.0,True,0 +404,CLK1,113.0,198.0,True,0 +404,CLK0,276.0,202.0,True,0 +404,TRIG6,267.0,199.0,True,0 +404,TRIG5,245.0,199.0,True,0 +404,TRIG4,241.0,197.0,True,0 +404,TRIG3,298.0,200.0,True,0 +404,TRIG2,183.0,203.0,True,0 +404,TRIG1,186.0,203.0,True,0 +404,TRIG0,131.0,202.0,True,0 +408,CLK1,113.0,198.0,True,0 +408,CLK0,276.0,202.0,True,0 +408,TRIG6,267.0,199.0,True,0 +408,TRIG5,245.0,199.0,True,0 +408,TRIG4,241.0,197.0,True,0 +408,TRIG3,298.0,200.0,True,0 +408,TRIG2,183.0,203.0,True,0 +408,TRIG1,187.0,203.0,True,0 +408,TRIG0,131.0,202.0,True,0 +413,CLK1,114.0,198.0,True,0 +413,CLK0,276.0,202.0,True,0 +413,TRIG6,267.0,199.0,True,0 +413,TRIG5,245.0,199.0,True,0 +413,TRIG4,241.0,197.0,True,0 +413,TRIG3,298.0,200.0,True,0 +413,TRIG2,183.0,203.0,True,0 +413,TRIG1,187.0,203.0,True,0 +413,TRIG0,131.0,202.0,True,0 +417,CLK1,113.0,197.0,True,0 +417,CLK0,276.0,202.0,True,0 +417,TRIG6,267.0,199.0,True,0 +417,TRIG5,245.0,199.0,True,0 +417,TRIG4,241.0,197.0,True,0 +417,TRIG3,298.0,200.0,True,0 +417,TRIG2,183.0,203.0,True,0 +417,TRIG1,187.0,203.0,True,0 +417,TRIG0,131.0,202.0,True,0 +421,CLK1,113.0,198.0,True,0 +421,CLK0,276.0,202.0,True,0 +421,TRIG6,267.0,199.0,True,0 +421,TRIG5,245.0,199.0,True,0 +421,TRIG4,241.0,197.0,True,0 +421,TRIG3,298.0,200.0,True,0 +421,TRIG2,183.0,203.0,True,0 +421,TRIG1,187.0,203.0,True,0 +421,TRIG0,131.0,202.0,True,0 +425,CLK1,114.0,197.0,True,0 +425,CLK0,276.0,202.0,True,0 +425,TRIG6,267.0,199.0,True,0 +425,TRIG5,245.0,199.0,True,0 +425,TRIG4,241.0,197.0,True,0 +425,TRIG3,298.0,200.0,True,0 +425,TRIG2,183.0,203.0,True,0 +425,TRIG1,187.0,203.0,True,0 +425,TRIG0,131.0,202.0,True,0 +429,CLK1,113.0,197.0,True,0 +429,CLK0,276.0,202.0,True,0 +429,TRIG6,267.0,199.0,True,0 +429,TRIG5,245.0,199.0,True,0 +429,TRIG4,241.0,197.0,True,0 +429,TRIG3,298.0,200.0,True,0 +429,TRIG2,183.0,203.0,True,0 +429,TRIG1,186.0,203.0,True,0 +429,TRIG0,131.0,202.0,True,0 +435,CLK1,114.0,198.0,True,0 +435,CLK0,276.0,202.0,True,0 +435,TRIG6,267.0,199.0,True,0 +435,TRIG5,245.0,199.0,True,0 +435,TRIG4,242.0,197.0,True,0 +435,TRIG3,298.0,200.0,True,0 +435,TRIG2,183.0,203.0,True,0 +435,TRIG1,187.0,203.0,True,0 +435,TRIG0,131.0,202.0,True,0 +439,CLK1,114.0,198.0,True,0 +439,CLK0,276.0,202.0,True,0 +439,TRIG6,267.0,199.0,True,0 +439,TRIG5,245.0,199.0,True,0 +439,TRIG4,241.0,197.0,True,0 +439,TRIG3,298.0,200.0,True,0 +439,TRIG2,183.0,203.0,True,0 +439,TRIG1,187.0,203.0,True,0 +439,TRIG0,131.0,202.0,True,0 +443,CLK1,113.0,197.0,True,0 +443,CLK0,276.0,202.0,True,0 +443,TRIG6,267.0,199.0,True,0 +443,TRIG5,244.0,199.0,True,0 +443,TRIG4,241.0,197.0,True,0 +443,TRIG3,298.0,200.0,True,0 +443,TRIG2,183.0,203.0,True,0 +443,TRIG1,186.0,203.0,True,0 +443,TRIG0,131.0,202.0,True,0 diff --git a/cgi-bin/WagonDB/static/files/Board.csv b/cgi-bin/WagonDB/static/files/Board.csv new file mode 100644 index 0000000..f587275 --- /dev/null +++ b/cgi-bin/WagonDB/static/files/Board.csv @@ -0,0 +1,16 @@ +Full ID,Board ID,Type ID +320WW20A1000005,19,WW20A1 +320WW20A1000004,20,WW20A1 +320WW10A1000005,21,WW10A1 +320WW10A1000007,22,WW10A1 +320WW10A1000008,23,WW10A1 +320WW10A1000004,24,WW10A1 +320WE20B1000004,25,WE20B1 +320WE20A1000004,26,WE20A1 +320WE20B1000006,27,WE20B1 +320WE10A1000004,28,WE10A1 +320WE10A1000008,29,WE10A1 +320WE10A1000007,30,WE10A1 +320WE10A1000005,31,WE10A1 +320WE20A1000005,32,WE20A1 +320WW30A3000005,33,WW30A3 diff --git a/cgi-bin/WagonDB/static/files/I2C_ReadWrite_Test_Data.csv b/cgi-bin/WagonDB/static/files/I2C_ReadWrite_Test_Data.csv new file mode 100644 index 0000000..8bb8cc1 --- /dev/null +++ b/cgi-bin/WagonDB/static/files/I2C_ReadWrite_Test_Data.csv @@ -0,0 +1,43 @@ +Test ID,Checks,Correct at Module 1,Correct at Module 2 +234,10000,10000,10000 +238,10000,10000,10000 +242,10000,10000,-1 +246,10000,10000,-1 +250,10000,10000,-1 +254,10000,10000,-1 +258,10000,10000,-1 +262,10000,10000,10000 +267,10000,10000,10000 +278,10000,10000,10000 +281,10000,10000,-1 +284,10000,10000,-1 +287,10000,10000,-1 +291,10000,10000,-1 +295,10000,10000,-1 +299,10000,10000,-1 +303,10000,10000,10000 +313,10000,10000,10000 +316,10000,10000,10000 +341,10000,10000,10000 +344,10000,10000,10000 +347,10000,10000,10000 +351,10000,10000,10000 +357,10000,10000,10000 +361,10000,10000,10000 +369,10000,10000,10000 +373,10000,10000,10000 +377,10000,10000,10000 +381,10000,10000,10000 +387,10000,10000,10000 +395,10000,10000,10000 +399,10000,10000,10000 +403,10000,10000,10000 +407,10000,10000,10000 +412,10000,10000,10000 +416,10000,10000,10000 +420,10000,10000,10000 +424,10000,10000,10000 +428,10000,10000,10000 +434,10000,10000,10000 +438,10000,10000,10000 +442,10000,10000,10000 diff --git a/cgi-bin/WagonDB/static/files/ID_Resistor_Test_Data.csv b/cgi-bin/WagonDB/static/files/ID_Resistor_Test_Data.csv new file mode 100644 index 0000000..e5dd4ab --- /dev/null +++ b/cgi-bin/WagonDB/static/files/ID_Resistor_Test_Data.csv @@ -0,0 +1,61 @@ +Test ID,Resistance +227,499.49750304222107 +229,499.49944019317627 +231,499.4983971118927 +233,499.50703978538513 +237,497.58464097976685 +241,496.843159198761 +245,496.8443512916565 +249,497.7552592754364 +253,497.22179770469666 +257,498.8810420036316 +261,497.28497862815857 +266,496.75479531288147 +273,496.2867498397827 +275,496.2889850139618 +277,497.27484583854675 +280,496.23623490333557 +283,496.2320625782013 +286,496.2363839149475 +290,496.71679735183716 +294,497.0960319042206 +298,497.836172580719 +302,497.37825989723206 +306,496.281236410141 +312,497.2861707210541 +315,497.2808063030243 +323,497.59015440940857 +325,497.59596586227417 +328,497.5832998752594 +330,497.58225679397583 +334,497.58613109588623 +336,497.5926876068115 +338,497.60326743125916 +340,497.6096749305725 +343,497.6069927215576 +346,497.61220812797546 +350,497.6320266723633 +356,497.6119101047516 +360,497.6138472557068 +364,497.6184666156769 +366,497.6172745227814 +368,497.6236820220947 +372,497.6186156272888 +376,497.6236820220947 +380,497.6172745227814 +384,497.60952591896057 +386,497.60445952415466 +390,497.6186156272888 +392,497.60937690734863 +394,497.6092278957367 +398,497.6154863834381 +402,497.6099729537964 +406,497.6041615009308 +411,497.6123571395874 +415,497.6101219654083 +419,497.61325120925903 +423,497.61369824409485 +427,497.60475754737854 +433,497.6111650466919 +437,497.610867023468 +441,497.60475754737854 diff --git a/cgi-bin/WagonDB/static/files/People.csv b/cgi-bin/WagonDB/static/files/People.csv new file mode 100644 index 0000000..91d9839 --- /dev/null +++ b/cgi-bin/WagonDB/static/files/People.csv @@ -0,0 +1,11 @@ +Person ID,Person Name +1,Bryan +2,Garrett +3,Andrew +4,Josh +5,Garrett Schindler +6,Andrew K. +7,Bryan C. +8,The Garrett +9,Shardul +10,Billy diff --git a/cgi-bin/WagonDB/static/files/Resistance_Measurement.csv b/cgi-bin/WagonDB/static/files/Resistance_Measurement.csv new file mode 100644 index 0000000..e4cb99e --- /dev/null +++ b/cgi-bin/WagonDB/static/files/Resistance_Measurement.csv @@ -0,0 +1,78 @@ +Test ID,RTD -> VMON_LVS Module 1,ECON_RE_Sb -> HGCROC_RE_Sb Module 1,PWR_EN -> PG_LDO Module 1,RTD -> HGCROC_RE_Sb Module 1,HGCROC_RE_Hb -> HGCROC_RE_Sb Module 1,PG_DCDC -> ECON_RE_Hb Module 1,RTD -> VMON_LVS Module 2,ECON_RE_Sb -> HGCROC_RE_Sb Module 2,PWR_EN -> PG_LDO Module 2,RTD -> HGCROC_RE_Sb Module 2,HGCROC_RE_Hb -> HGCROC_RE_Sb Module 2,PG_DCDC -> ECON_RE_Hb Module 2 +225,3.2463669776916504,20.38276195526123,2.557814121246338,28.863966464996338,1.2837350368499756,2.729475498199463,4.310131072998047,21.80272340774536,4.278063774108887,34.92027521133423,2.043694257736206,4.360437393188477 +226,3.247082233428955,20.382285118103027,2.558290958404541,28.867363929748535,1.2849271297454834,2.7306675910949707,4.311919212341309,21.80260419845581,4.279375076293945,34.92242097854614,2.04429030418396,4.361152648925781 +228,3.2449960708618164,20.383179187774658,2.557516098022461,28.868019580841064,1.284182071685791,2.729177474975586,4.311203956604004,21.80349826812744,4.278242588043213,34.919798374176025,2.0444393157958984,4.35870885848999 +230,3.2488107681274414,20.381629467010498,2.55662202835083,28.866946697235107,1.283884048461914,2.730250358581543,4.310667514801025,21.80427312850952,4.279792308807373,34.92087125778198,2.04429030418396,4.3624043464660645 +232,3.247678279876709,20.38395404815674,2.555727958679199,28.867602348327637,1.283884048461914,2.729356288909912,4.31215763092041,21.80635929107666,4.278361797332764,34.926414489746094,2.042800188064575,4.360973834991455 +236,3.3493638038635254,20.50679922103882,2.654552459716797,29.30539846420288,1.3658404350280762,2.846062183380127,5.109727382659912,22.7014422416687,5.056858062744141,38.18535804748535,2.5115907192230225,5.147278308868408 +240,3.3356547355651855,20.517289638519287,2.637922763824463,29.253840446472168,1.3330578804016113,2.80916690826416,-1,-1,-1,-1,-1,-1 +244,3.3437609672546387,20.525991916656494,2.6430487632751465,29.27786111831665,1.334846019744873,2.8180480003356934,-1,-1,-1,-1,-1,-1 +248,3.2032132148742676,20.37888765335083,2.515077590942383,28.72699499130249,1.2411177158355713,2.6797056198120117,-1,-1,-1,-1,-1,-1 +252,3.245115280151367,20.427405834197998,2.561211585998535,28.914809226989746,1.2674927711486816,2.7285218238830566,-1,-1,-1,-1,-1,-1 +256,3.2861828804016113,20.48414945602417,2.60317325592041,29.089033603668213,1.3014674186706543,2.7664899826049805,-1,-1,-1,-1,-1,-1 +260,3.893435001373291,20.96998691558838,3.5018324851989746,31.806468963623047,1.7152726650238037,3.488898277282715,6.00820779800415,23.178815841674805,5.810856819152832,40.94111919403076,2.7771294116973877,5.768895149230957 +264,3.896057605743408,20.973145961761475,3.5043954849243164,31.810283660888672,1.714080572128296,3.488004207611084,6.010234355926514,23.18626642227173,5.814492702484131,40.95005989074707,2.7798116207122803,5.772948265075684 +265,3.9129257202148438,20.98667621612549,3.4886598587036133,31.881272792816162,48.75645041465759,3.5446882247924805,5.908846855163574,23.15700054168701,5.673527717590332,40.564119815826416,2.8896331787109375,5.6594014167785645 +270,3.925204277038574,20.996689796447754,3.4926533699035645,31.923532485961914,50.94945430755615,3.5567879676818848,5.944788455963135,23.19389581680298,5.70911169052124,40.70580005645752,2.915710210800171,5.692780017852783 +272,3.4787654876708984,20.523905754089355,3.1173229217529297,30.156314373016357,1.4546513557434082,3.089606761932373,4.840254783630371,22.052109241485596,4.617154598236084,36.302924156188965,2.133995294570923,4.621982574462891 +274,3.4837722778320312,20.525455474853516,3.1444430351257324,30.20155429840088,1.4588236808776855,3.0944347381591797,4.860103130340576,22.069096565246582,4.6364665031433105,36.37737035751343,2.1404027938842773,4.642724990844727 +276,3.891468048095703,20.962655544281006,3.498077392578125,31.78703784942627,1.7130374908447266,3.48508358001709,5.986571311950684,23.161351680755615,5.794107913970947,40.85826873779297,2.7638673782348633,5.748450756072998 +279,3.8014650344848633,20.77394723892212,3.2609105110168457,31.10647201538086,1.538395881652832,3.3216476440429688,-1,-1,-1,-1,-1,-1 +282,3.8062334060668945,20.78002691268921,3.2683610916137695,31.129658222198486,1.5394389629364014,3.325223922729492,-1,-1,-1,-1,-1,-1 +285,3.809332847595215,20.781338214874268,3.269970417022705,31.13389015197754,1.539289951324463,3.3274292945861816,-1,-1,-1,-1,-1,-1 +289,3.48663330078125,20.47884464263916,2.9778480529785156,29.90776300430298,1.389533281326294,3.0167102813720703,-1,-1,-1,-1,-1,-1 +293,3.4748315811157227,20.395934581756592,2.9163360595703125,29.70808744430542,1.3424456119537354,2.971649169921875,-1,-1,-1,-1,-1,-1 +297,3.856062889099121,20.857155323028564,3.3319592475891113,31.355619430541992,1.5750527381896973,3.3611655235290527,-1,-1,-1,-1,-1,-1 +301,3.5367608070373535,20.62469720840454,3.2066702842712402,30.474543571472168,1.5522539615631104,3.1578540802001953,4.886150360107422,22.049546241760254,4.739940166473389,36.54593229293823,2.2289156913757324,4.697561264038086 +305,3.491044044494629,20.57582139968872,3.0570626258850098,30.163824558258057,1.4510750770568848,3.093242645263672,4.835724830627441,22.007286548614502,4.631221294403076,36.26471757888794,2.1345913410186768,4.6225786209106445 +307,3.5547614097595215,20.682930946350098,3.193795680999756,30.544817447662354,1.5610456466674805,3.162205219268799,4.885554313659668,22.005200386047363,4.760026931762695,36.52828931808472,2.2311508655548096,4.709184169769287 +309,3.55684757232666,20.684897899627686,3.193020820617676,30.543386936187744,1.5604496002197266,3.1598806381225586,4.888057708740234,22.006511688232422,4.758358001708984,36.53573989868164,2.229362726211548,4.71121072769165 +310,3.556191921234131,20.684242248535156,3.1925439834594727,30.546963214874268,1.5625357627868652,3.1626224517822266,4.887819290161133,22.00835943222046,4.76151704788208,36.54181957244873,2.230703830718994,4.709482192993164 +311,3.896176815032959,21.014869213104248,3.483712673187256,31.827330589294434,1.7111003398895264,3.477811813354492,5.956709384918213,23.09316396713257,5.781233310699463,40.73131084442139,2.758800983428955,5.730271339416504 +314,3.8974881172180176,21.01534605026245,3.484666347503662,31.831800937652588,1.7125904560089111,3.478884696960449,5.967140197753906,23.10359477996826,5.793094635009766,40.77845811843872,2.7655065059661865,5.743443965911865 +318,3.325521945953369,20.451903343200684,2.649962902069092,29.21605110168457,1.354813575744629,2.840697765350342,5.125939846038818,22.774577140808105,5.0476789474487305,38.28519582748413,2.5263428688049316,5.1631927490234375 +319,3.3254623413085938,20.452797412872314,2.647221088409424,29.21348810195923,1.3561546802520752,2.840697765350342,5.127370357513428,22.778689861297607,5.048394203186035,38.291990756988525,2.526193857192993,5.166888236999512 +320,3.323078155517578,20.451605319976807,2.6451945304870605,29.21384572982788,1.3568997383117676,2.839028835296631,5.127549171447754,22.77451753616333,5.048990249633789,38.28740119934082,2.528280019760132,5.163013935089111 +321,3.321409225463867,20.450472831726074,2.6465654373168945,29.21539545059204,1.3546645641326904,2.840697765350342,5.129218101501465,22.776782512664795,5.051016807556152,38.29604387283325,2.5294721126556396,5.166769027709961 +322,3.325819969177246,20.45154571533203,2.649247646331787,29.21241521835327,1.3560056686401367,2.842426300048828,5.128264427185059,22.777080535888672,5.048155784606934,38.29324245452881,2.527683973312378,5.166828632354736 +324,3.3246874809265137,20.451903343200684,2.6456117630004883,29.217123985290527,1.3527274131774902,2.8394460678100586,5.1274895668029785,22.779464721679688,5.051255226135254,38.29598426818848,2.527683973312378,5.166411399841309 +326,3.3248066902160645,20.449578762054443,2.64662504196167,29.2130708694458,1.353919506072998,2.8414130210876465,5.128264427185059,22.775113582611084,5.047023296356201,38.28144073486328,2.524852752685547,5.163431167602539 +327,3.3219456672668457,20.449280738830566,2.647280693054199,29.209494590759277,1.353621482849121,2.839207649230957,5.1250457763671875,22.773325443267822,5.046188831329346,38.27309608459473,2.524256706237793,5.15979528427124 +329,3.3229589462280273,20.44832706451416,2.6467442512512207,29.211223125457764,1.3525784015655518,2.8391480445861816,5.125820636749268,22.77296781539917,5.04612922668457,38.27357292175293,2.5275349617004395,5.1613450050354 +331,3.3220648765563965,20.450472831726074,2.6463866233825684,29.208481311798096,1.3534724712371826,2.8397440910339355,5.126059055328369,22.773921489715576,5.044758319854736,38.27911615371704,2.526193857192993,5.161762237548828 +332,3.323495388031006,20.450115203857422,2.645134925842285,29.210448265075684,1.3540685176849365,2.8375983238220215,5.126893520355225,22.77696132659912,5.047798156738281,38.28626871109009,2.5266408920288086,5.162417888641357 +333,3.3249855041503906,20.450711250305176,2.64817476272583,29.211997985839844,1.3540685176849365,2.8403401374816895,5.125105381011963,22.7738618850708,5.047976970672607,38.281261920928955,2.525448799133301,5.160272121429443 +335,3.3240914344787598,20.452439785003662,2.6476383209228516,29.211759567260742,1.3530254364013672,2.8409361839294434,5.12540340423584,22.774457931518555,5.046844482421875,38.27852010726929,2.5263428688049316,5.161702632904053 +337,3.325521945953369,20.4542875289917,2.6453733444213867,29.216885566711426,1.3519823551177979,2.841174602508545,5.128264427185059,22.777199745178223,5.048632621765137,38.29067945480347,2.523064613342285,5.165040493011475 +339,3.327786922454834,20.45351266860962,2.6478171348571777,29.218673706054688,1.353919506072998,2.8429031372070312,5.131065845489502,22.78059720993042,5.051910877227783,38.29985857009888,2.5281310081481934,5.16897439956665 +342,3.3248066902160645,20.45196294784546,2.64585018157959,29.21450138092041,1.3512372970581055,2.8403401374816895,5.126774311065674,22.777140140533447,5.047500133514404,38.28984498977661,2.527683973312378,5.161523818969727 +345,3.3226609230041504,20.449817180633545,2.6445984840393066,29.210269451141357,1.3534724712371826,2.837657928466797,5.122244358062744,22.77398109436035,5.044043064117432,38.271963596343994,2.522766590118408,5.159437656402588 +349,3.326594829559326,20.45387029647827,2.650320529937744,29.223144054412842,1.354217529296875,2.8439760208129883,5.131185054779053,22.78083562850952,5.0553083419799805,38.30915689468384,2.527683973312378,5.171418190002441 +353,3.3266544342041016,20.454585552215576,2.6497244834899902,29.222071170806885,1.3566017150878906,2.841353416442871,5.131363868713379,22.781789302825928,5.053579807281494,38.30397129058838,2.527981996536255,5.16664981842041 +355,3.322601318359375,20.452558994293213,2.6474595069885254,29.218077659606934,1.3551115989685059,2.840697765350342,5.134761333465576,22.78047800064087,5.053520202636719,38.30844163894653,2.527981996536255,5.169570446014404 +359,3.3257007598876953,20.45154571533203,2.647101879119873,29.215872287750244,1.353919506072998,2.8443336486816406,5.132555961608887,22.782623767852783,5.052447319030762,38.30903768539429,2.5284290313720703,5.1711201667785645 +363,3.325521945953369,20.454108715057373,2.6477575302124023,29.219746589660645,1.3558566570281982,2.8427839279174805,5.135595798492432,22.783339023590088,5.056262016296387,38.31923007965088,2.5288760662078857,5.1727294921875 +365,3.325164318084717,20.45261859893799,2.647995948791504,29.221534729003906,1.3568997383117676,2.8420090675354004,5.138397216796875,22.78614044189453,5.054891109466553,38.31988573074341,2.530217170715332,5.1721930503845215 +367,3.3246278762817383,20.45363187789917,2.64894962310791,29.21736240386963,1.3555586338043213,2.841651439666748,5.1313042640686035,22.78083562850952,5.053341388702393,38.30897808074951,2.5284290313720703,5.167245864868164 +371,3.324568271636963,20.453453063964844,2.6462674140930176,29.214799404144287,1.3534724712371826,2.8409361839294434,5.131781101226807,22.77994155883789,5.049645900726318,38.29538822174072,2.5260448455810547,5.164742469787598 +375,3.3240318298339844,20.452499389648438,2.647519111633301,29.216468334197998,1.3552606105804443,2.8439760208129883,5.133092403411865,22.78149127960205,5.053102970123291,38.3070707321167,2.5284290313720703,5.169272422790527 +379,3.322720527648926,20.45232057571411,2.6482343673706055,29.211819171905518,1.353919506072998,2.8405189514160156,5.127072334289551,22.77696132659912,5.047619342803955,38.28698396682739,2.524852752685547,5.1613450050354 +383,3.3268332481384277,20.453155040740967,2.6462674140930176,29.211699962615967,1.354515552520752,2.8403401374816895,5.131244659423828,22.77761697769165,5.051553249359131,38.299500942230225,2.52649188041687,5.16742467880249 +385,3.3216476440429688,20.453214645385742,2.646207809448242,29.21128273010254,1.3540685176849365,2.8394460678100586,5.131542682647705,22.777676582336426,5.050361156463623,38.29085826873779,2.5255978107452393,5.166947841644287 +389,3.323972225189209,20.45118808746338,2.644836902618408,29.212534427642822,1.3530254364013672,2.8395652770996094,5.127131938934326,22.777915000915527,5.050182342529297,38.286805152893066,2.5266408920288086,5.164921283721924 +391,3.3231377601623535,20.454227924346924,2.6466846466064453,29.212236404418945,1.350492238998413,2.8401613235473633,5.130350589752197,22.778332233428955,5.049288272857666,38.292646408081055,2.5263428688049316,5.164742469787598 +393,3.3231377601623535,20.451009273529053,2.647519111633301,29.21271324157715,1.3564527034759521,2.8402209281921387,5.130529403686523,22.777199745178223,5.049645900726318,38.28990459442139,2.5247037410736084,5.164861679077148 +397,3.323495388031006,20.452558994293213,2.646505832672119,29.21760082244873,1.3534724712371826,2.8401613235473633,5.1323771476745605,22.776246070861816,5.051612854003906,38.298964500427246,2.527683973312378,5.1670074462890625 +401,3.326237201690674,20.451903343200684,2.647995948791504,29.215693473815918,1.3519823551177979,2.8421878814697266,5.130350589752197,22.77839183807373,5.0498247146606445,38.29604387283325,2.5260448455810547,5.168139934539795 +405,3.3226609230041504,20.453333854675293,2.64817476272583,29.213905334472656,1.354813575744629,2.840876579284668,5.128741264343262,22.77696132659912,5.050897598266602,38.29216957092285,2.5250017642974854,5.165219306945801 +409,3.322720527648926,20.450294017791748,2.6443004608154297,29.212355613708496,1.3531744480133057,2.8400421142578125,5.126535892486572,22.77517318725586,5.047619342803955,38.28394412994385,2.524852752685547,5.163729190826416 +410,3.3246874809265137,20.453333854675293,2.647280693054199,29.209375381469727,1.3533234596252441,2.840578556060791,5.132436752319336,22.778213024139404,5.050599575042725,38.29753398895264,2.5269389152526855,5.168437957763672 +414,3.3243298530578613,20.45285701751709,2.6471614837646484,29.21473979949951,1.3531744480133057,2.839982509613037,5.133330821990967,22.781431674957275,5.054593086242676,38.30766677856445,2.525895833969116,5.168735980987549 +418,3.3252835273742676,20.451605319976807,2.64662504196167,29.21605110168457,1.356750726699829,2.8417110443115234,5.131006240844727,22.78059720993042,5.053699016571045,38.30474615097046,2.529621124267578,5.17040491104126 +422,3.3217668533325195,20.451247692108154,2.646505832672119,29.213309288024902,1.3530254364013672,2.839207649230957,5.134344100952148,22.782564163208008,5.054235458374023,38.3104681968689,2.531707286834717,5.171418190002441 +426,3.3233165740966797,20.45464515686035,2.647519111633301,29.217064380645752,1.3533234596252441,2.83968448638916,5.134642124176025,22.78059720993042,5.055069923400879,38.31517696380615,2.530217170715332,5.169808864593506 +430,3.3285021781921387,20.452141761779785,2.647221088409424,29.22213077545166,1.3557076454162598,2.842068672180176,5.136549472808838,22.787034511566162,5.058646202087402,38.322627544403076,2.5288760662078857,5.173981189727783 +431,3.3245086669921875,20.45416831970215,2.6463866233825684,29.217064380645752,1.354217529296875,2.8434395790100098,5.134701728820801,22.785067558288574,5.054950714111328,38.31809759140015,2.5291740894317627,5.17427921295166 +432,3.3255815505981445,20.451903343200684,2.6488900184631348,29.219210147857666,1.3557076454162598,2.841949462890625,5.134761333465576,22.7850079536438,5.056321620941162,38.31976652145386,2.5288760662078857,5.174100399017334 +436,3.3216476440429688,20.451486110687256,2.644956111907959,29.212474822998047,1.354515552520752,2.8401613235473633,5.134224891662598,22.78006076812744,5.051851272583008,38.30653429031372,2.529919147491455,5.16963005065918 +440,3.324449062347412,20.454108715057373,2.6482343673706055,29.219985008239746,1.353919506072998,2.842426300048828,5.1378607749938965,22.784411907196045,5.0553083419799805,38.32274675369263,2.5284290313720703,5.174994468688965 diff --git a/cgi-bin/WagonDB/static/files/Resistance_Measurement.png b/cgi-bin/WagonDB/static/files/Resistance_Measurement.png new file mode 100644 index 0000000..2b9cc20 Binary files /dev/null and b/cgi-bin/WagonDB/static/files/Resistance_Measurement.png differ diff --git a/cgi-bin/WagonDB/static/files/Test.csv b/cgi-bin/WagonDB/static/files/Test.csv new file mode 100644 index 0000000..7456048 --- /dev/null +++ b/cgi-bin/WagonDB/static/files/Test.csv @@ -0,0 +1,220 @@ +Test ID,Test Type ID,Board ID,Person ID,Time,Successful,comments +225,1,19,1,2023-03-14 13:48:13,1,_ +226,1,19,1,2023-03-14 13:55:54,1,_ +227,2,19,1,2023-03-14 13:56:03,0,_ +228,1,19,1,2023-03-14 14:00:04,1,_ +229,2,19,1,2023-03-14 14:00:08,0,_ +230,1,19,1,2023-03-14 14:01:03,1,_ +231,2,19,1,2023-03-14 14:01:07,0,_ +232,1,19,1,2023-03-14 14:02:43,1,_ +233,2,19,1,2023-03-14 14:02:47,1,_ +234,3,19,1,2023-03-14 14:03:06,1,_ +235,4,19,1,2023-03-14 14:04:48,1,_ +236,1,20,1,2023-03-14 14:32:06,1,_ +237,2,20,1,2023-03-14 14:32:09,1,_ +238,3,20,1,2023-03-14 14:32:28,1,_ +239,4,20,1,2023-03-14 14:34:10,1,_ +240,1,21,1,2023-03-14 14:34:56,1,_ +241,2,21,1,2023-03-14 14:35:00,1,_ +242,3,21,1,2023-03-14 14:35:15,1,_ +243,4,21,1,2023-03-14 14:36:55,0,_ +244,1,21,1,2023-03-14 14:43:21,1,_ +245,2,21,1,2023-03-14 14:43:25,1,_ +246,3,21,1,2023-03-14 14:43:37,1,_ +247,4,21,1,2023-03-14 14:45:16,1,_ +248,1,22,1,2023-03-14 14:45:57,1,_ +249,2,22,1,2023-03-14 14:46:02,1,_ +250,3,22,1,2023-03-14 14:46:14,1,_ +251,4,22,1,2023-03-14 14:47:56,1,_ +252,1,23,1,2023-03-14 14:48:37,1,_ +253,2,23,1,2023-03-14 14:48:44,1,_ +254,3,23,1,2023-03-14 14:48:56,1,_ +255,4,23,1,2023-03-14 14:50:36,1,_ +256,1,24,1,2023-03-14 14:51:14,1,_ +257,2,24,1,2023-03-14 14:51:19,1,_ +258,3,24,1,2023-03-14 14:51:30,1,_ +259,4,24,1,2023-03-14 14:53:09,1,_ +260,1,25,1,2023-03-14 15:08:38,1,_ +261,2,25,1,2023-03-14 15:08:42,1,_ +262,3,25,1,2023-03-14 15:09:01,1,_ +263,4,25,1,2023-03-14 15:10:42,0,_ +264,1,25,1,2023-03-14 15:22:14,1,_ +265,1,26,1,2023-03-14 15:25:21,1,_ +266,2,26,1,2023-03-14 15:25:24,1,_ +267,3,26,1,2023-03-14 15:25:43,1,_ +268,4,26,1,2023-03-14 15:27:24,0,_ +269,4,26,1,2023-03-14 15:35:30,0,_ +270,1,26,1,2023-03-14 16:17:47,1,_ +271,4,26,1,2023-03-14 16:19:30,1,_ +272,1,27,1,2023-03-14 16:22:39,1,_ +273,2,27,1,2023-03-14 16:22:48,1,_ +274,1,27,1,2023-03-14 16:24:33,1,_ +275,2,27,1,2023-03-14 16:24:37,1,_ +276,1,25,1,2023-03-14 16:26:26,1,_ +277,2,25,1,2023-03-14 16:26:31,1,_ +278,3,25,1,2023-03-14 16:26:51,1,_ +279,1,28,1,2023-03-14 16:30:23,1,_ +280,2,28,1,2023-03-14 16:30:27,1,_ +281,3,28,1,2023-03-14 16:30:37,1,_ +282,1,28,1,2023-03-14 16:33:54,1,_ +283,2,28,1,2023-03-14 16:33:58,1,_ +284,3,28,1,2023-03-14 16:34:09,1,_ +285,1,28,1,2023-03-14 16:47:32,1,_ +286,2,28,1,2023-03-14 16:47:36,1,_ +287,3,28,1,2023-03-14 16:47:47,1,_ +288,4,28,1,2023-03-14 16:49:28,1,_ +289,1,29,1,2023-03-14 16:52:22,1,_ +290,2,29,1,2023-03-14 16:52:26,1,_ +291,3,29,1,2023-03-14 16:52:37,1,_ +292,4,29,1,2023-03-14 16:54:18,1,_ +293,1,30,1,2023-03-14 16:54:53,1,_ +294,2,30,1,2023-03-14 16:54:56,1,_ +295,3,30,1,2023-03-14 16:55:07,1,_ +296,4,30,1,2023-03-14 16:56:49,1,_ +297,1,31,1,2023-03-14 16:57:27,1,_ +298,2,31,1,2023-03-14 16:58:02,1,_ +299,3,31,1,2023-03-14 16:58:15,1,_ +300,4,31,1,2023-03-14 16:59:57,1,_ +301,1,32,1,2023-03-14 17:00:52,1,_ +302,2,32,1,2023-03-14 17:00:55,1,_ +303,3,32,1,2023-03-14 17:01:14,1,_ +304,4,32,1,2023-03-14 17:02:57,1,_ +305,1,27,1,2023-03-17 13:20:44,1,_ +306,2,27,1,2023-03-17 13:21:02,1,_ +307,1,32,1,2023-03-17 13:48:44,1,_ +308,4,32,1,2023-03-17 13:50:39,1,_ +309,1,32,1,2023-03-17 14:07:14,1,_ +310,1,32,1,2023-03-17 14:40:39,1,_ +311,1,25,1,2023-03-17 15:48:02,1,_ +312,2,25,1,2023-03-17 15:48:07,1,_ +313,3,25,1,2023-03-17 15:48:26,1,_ +314,1,25,1,2023-03-21 10:37:22,1,_ +315,2,25,1,2023-03-21 10:37:27,1,_ +316,3,25,1,2023-03-21 10:37:49,1,_ +317,4,25,1,2023-03-21 10:41:57,1,_ +318,1,20,1,2023-03-24 16:57:18,1,_ +319,1,20,1,2023-03-24 16:58:46,1,_ +320,1,20,1,2023-03-24 16:59:51,1,_ +321,1,20,1,2023-03-24 17:02:17,1,_ +322,1,20,1,2023-03-24 17:04:12,1,_ +323,2,20,1,2023-03-24 17:04:20,1,_ +324,1,20,1,2023-03-24 17:06:37,1,_ +325,2,20,1,2023-03-24 17:06:43,1,_ +326,1,20,1,2023-03-24 17:08:06,1,_ +327,1,20,1,2023-03-24 17:09:28,1,_ +328,2,20,1,2023-03-24 17:09:35,1,_ +329,1,20,1,2023-03-24 17:11:50,1,_ +330,2,20,1,2023-03-24 17:12:06,1,_ +331,1,20,1,2023-03-24 17:14:19,1,_ +332,1,20,1,2023-03-24 17:15:23,1,_ +333,1,20,1,2023-03-24 17:16:33,1,_ +334,2,20,1,2023-03-24 17:16:43,1,_ +335,1,20,1,2023-03-24 17:20:57,1,_ +336,2,20,1,2023-03-24 17:21:03,1,_ +337,1,20,1,2023-03-27 09:57:38,1,_ +338,2,20,1,2023-03-27 09:57:45,1,_ +339,1,20,1,2023-03-27 10:01:19,1,_ +340,2,20,1,2023-03-27 10:01:25,1,_ +341,3,20,1,2023-03-27 10:01:48,1,_ +342,1,20,1,2023-03-27 10:02:57,1,_ +343,2,20,1,2023-03-27 10:03:04,1,_ +344,3,20,1,2023-03-27 10:03:26,1,_ +345,1,20,1,2023-03-27 10:08:39,1,_ +346,2,20,1,2023-03-27 10:08:45,1,_ +347,3,20,1,2023-03-27 10:09:07,1,_ +348,4,20,1,2023-03-27 10:10:53,0,_ +349,1,20,1,2023-03-27 10:14:29,1,_ +350,2,20,1,2023-03-27 10:14:37,1,_ +351,3,20,1,2023-03-27 10:14:58,1,_ +352,4,20,1,2023-03-27 10:16:41,0,_ +353,1,20,1,2023-03-27 10:20:44,1,_ +354,4,20,1,2023-03-27 10:22:30,0,_ +355,1,20,1,2023-03-27 10:37:00,1,_ +356,2,20,1,2023-03-27 10:37:05,1,_ +357,3,20,1,2023-03-27 10:37:25,1,_ +358,4,20,1,2023-03-27 10:39:16,1,_ +359,1,20,1,2023-03-27 10:46:48,1,_ +360,2,20,1,2023-03-27 10:46:54,1,_ +361,3,20,1,2023-03-27 10:47:20,1,_ +362,4,20,1,2023-03-27 10:49:07,1,_ +363,1,20,1,2023-03-27 10:50:27,1,_ +364,2,20,1,2023-03-27 10:50:33,1,_ +365,1,20,1,2023-03-27 10:51:57,1,_ +366,2,20,1,2023-03-27 10:52:03,1,_ +367,1,20,1,2023-03-27 10:54:33,1,_ +368,2,20,1,2023-03-27 10:54:45,1,_ +369,3,20,1,2023-03-27 10:55:11,1,_ +370,4,20,1,2023-03-27 10:57:01,1,_ +371,1,20,1,2023-03-27 10:58:17,1,_ +372,2,20,1,2023-03-27 10:58:28,1,_ +373,3,20,1,2023-03-27 10:58:52,1,_ +374,4,20,1,2023-03-27 11:00:38,1,_ +375,1,20,1,2023-03-27 11:04:48,1,_ +376,2,20,1,2023-03-27 11:04:55,1,_ +377,3,20,1,2023-03-27 11:05:17,1,_ +378,4,20,1,2023-03-27 11:07:09,1,_ +379,1,20,1,2023-03-27 11:13:57,1,_ +380,2,20,1,2023-03-27 11:14:04,1,_ +381,3,20,1,2023-03-27 11:14:28,1,_ +382,4,20,1,2023-03-27 11:16:18,1,_ +383,1,20,1,2023-03-27 11:23:54,1,_ +384,2,20,1,2023-03-27 11:24:30,1,_ +385,1,20,1,2023-03-27 11:25:42,1,_ +386,2,20,1,2023-03-27 11:25:50,1,_ +387,3,20,1,2023-03-27 11:26:13,1,_ +388,4,20,1,2023-03-27 11:30:07,1,_ +389,1,20,1,2023-03-27 11:34:50,1,_ +390,2,20,1,2023-03-27 11:34:57,1,_ +391,1,20,1,2023-03-27 11:36:31,1,_ +392,2,20,1,2023-03-27 11:36:37,1,_ +393,1,20,1,2023-03-27 11:39:16,1,_ +394,2,20,1,2023-03-27 11:39:22,1,_ +395,3,20,1,2023-03-27 11:39:44,1,_ +396,4,20,1,2023-03-27 11:45:31,1,_ +397,1,20,1,2023-03-27 11:50:02,1,_ +398,2,20,1,2023-03-27 11:50:08,1,_ +399,3,20,1,2023-03-27 11:50:31,1,_ +400,4,20,1,2023-03-27 11:52:32,1,_ +401,1,20,1,2023-03-27 11:54:57,1,_ +402,2,20,1,2023-03-27 11:55:05,1,_ +403,3,20,1,2023-03-27 11:55:26,1,_ +404,4,20,1,2023-03-27 11:57:21,1,_ +405,1,20,1,2023-03-27 12:00:06,1,_ +406,2,20,1,2023-03-27 12:00:49,1,_ +407,3,20,1,2023-03-27 12:01:40,1,_ +408,4,20,1,2023-03-27 12:03:26,1,_ +409,1,20,1,2023-03-27 12:04:46,1,_ +410,1,20,1,2023-03-27 12:09:53,1,_ +411,2,20,1,2023-03-27 12:13:56,1,_ +412,3,20,1,2023-03-27 12:14:42,1,_ +413,4,20,1,2023-03-27 12:16:34,1,_ +414,1,20,1,2023-03-27 12:18:57,1,_ +415,2,20,1,2023-03-27 12:19:07,1,_ +416,3,20,1,2023-03-27 12:19:36,1,_ +417,4,20,1,2023-03-27 12:21:22,1,_ +418,1,20,1,2023-03-27 12:24:51,1,_ +419,2,20,1,2023-03-27 12:26:01,1,_ +420,3,20,1,2023-03-27 12:26:25,1,_ +421,4,20,1,2023-03-27 12:28:16,1,_ +422,1,20,1,2023-03-27 12:30:03,1,_ +423,2,20,1,2023-03-27 12:30:10,1,_ +424,3,20,1,2023-03-27 12:30:37,1,_ +425,4,20,1,2023-03-27 12:32:49,1,_ +426,1,20,1,2023-03-27 12:34:51,1,_ +427,2,20,1,2023-03-27 12:34:57,1,_ +428,3,20,1,2023-03-27 12:35:20,1,_ +429,4,20,1,2023-03-27 12:37:08,1,_ +430,1,20,1,2023-03-27 12:37:37,1,_ +431,1,20,1,2023-03-27 12:44:12,1,_ +432,1,20,1,2023-03-27 12:47:07,1,_ +433,2,20,1,2023-03-27 12:47:13,1,_ +434,3,20,1,2023-03-27 12:47:35,1,_ +435,4,20,1,2023-03-27 12:50:20,1,_ +436,1,20,1,2023-03-27 12:52:29,1,_ +437,2,20,1,2023-03-27 12:52:35,1,_ +438,3,20,1,2023-03-27 12:52:58,1,_ +439,4,20,1,2023-03-27 12:54:43,1,_ +440,1,20,1,2023-03-30 13:02:47,1,_ +441,2,20,1,2023-03-30 13:02:56,1,_ +442,3,20,1,2023-03-30 13:03:20,1,_ +443,4,20,1,2023-03-30 13:05:08,1,_ diff --git a/cgi-bin/WagonDB/static/files/TestsOverTime.png b/cgi-bin/WagonDB/static/files/TestsOverTime.png new file mode 100644 index 0000000..3286015 Binary files /dev/null and b/cgi-bin/WagonDB/static/files/TestsOverTime.png differ diff --git a/cgi-bin/WagonDB/static/files/Thumbs.db b/cgi-bin/WagonDB/static/files/Thumbs.db new file mode 100644 index 0000000..74f1401 Binary files /dev/null and b/cgi-bin/WagonDB/static/files/Thumbs.db differ diff --git a/cgi-bin/WagonDB/static/files/cmslogo.jpg b/cgi-bin/WagonDB/static/files/cmslogo.jpg new file mode 100644 index 0000000..4a9ab9d Binary files /dev/null and b/cgi-bin/WagonDB/static/files/cmslogo.jpg differ diff --git a/cgi-bin/WagonDB/static/files/goldy.pdf b/cgi-bin/WagonDB/static/files/goldy.pdf new file mode 100644 index 0000000..6a94620 Binary files /dev/null and b/cgi-bin/WagonDB/static/files/goldy.pdf differ diff --git a/cgi-bin/WagonDB/static/files/goldy2.png b/cgi-bin/WagonDB/static/files/goldy2.png new file mode 100644 index 0000000..ea1d206 Binary files /dev/null and b/cgi-bin/WagonDB/static/files/goldy2.png differ diff --git a/cgi-bin/WagonDB/static/files/us-cms.gif b/cgi-bin/WagonDB/static/files/us-cms.gif new file mode 100644 index 0000000..47c369f Binary files /dev/null and b/cgi-bin/WagonDB/static/files/us-cms.gif differ diff --git a/cgi-bin/WagonDB/static/js/bootstrap.js b/cgi-bin/WagonDB/static/js/bootstrap.js new file mode 100644 index 0000000..e10492d --- /dev/null +++ b/cgi-bin/WagonDB/static/js/bootstrap.js @@ -0,0 +1,2309 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c359f3d5455d568ef741) + * Config saved to config.json and https://gist.github.com/c359f3d5455d568ef741 + */ +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.2 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.2' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.2 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.2' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state = state + 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked') && this.$element.hasClass('active')) changed = false + else $parent.find('.active').removeClass('active') + } + if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + } + + if (changed) this.$element.toggleClass('active') + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + Plugin.call($btn, 'toggle') + e.preventDefault() + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.2 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = + this.sliding = + this.interval = + this.$active = + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.2' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.2 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.2' + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $('