From 4c8a93380f9b1baff46614bf6208ba53ac1a7a27 Mon Sep 17 00:00:00 2001 From: hyh123a Date: Wed, 25 Aug 2021 15:13:34 +0800 Subject: [PATCH 01/87] add the log function and test in equipments --- myems-api/core/equipment.py | 41 +++++++++++ myems-api/log.py | 140 ++++++++++++++++++++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 myems-api/log.py diff --git a/myems-api/core/equipment.py b/myems-api/core/equipment.py index ee9f59aa..ec62daac 100644 --- a/myems-api/core/equipment.py +++ b/myems-api/core/equipment.py @@ -3,19 +3,23 @@ import simplejson as json import mysql.connector import config import uuid +from log import decorator_record_action_log class EquipmentCollection: @staticmethod + @decorator_record_action_log def __init__(): """Initializes EquipmentCollection""" pass @staticmethod + @decorator_record_action_log def on_options(req, resp): resp.status = falcon.HTTP_200 @staticmethod + @decorator_record_action_log def on_get(req, resp): cnx = mysql.connector.connect(**config.myems_system_db) cursor = cnx.cursor(dictionary=True) @@ -58,6 +62,7 @@ class EquipmentCollection: resp.body = json.dumps(result) @staticmethod + @decorator_record_action_log def on_post(req, resp): """Handles POST requests""" try: @@ -145,15 +150,18 @@ class EquipmentCollection: class EquipmentItem: @staticmethod + @decorator_record_action_log def __init__(): """Initializes EquipmentItem""" pass @staticmethod + @decorator_record_action_log def on_options(req, resp, id_): resp.status = falcon.HTTP_200 @staticmethod + @decorator_record_action_log def on_get(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -200,6 +208,7 @@ class EquipmentItem: resp.body = json.dumps(meta_result) @staticmethod + @decorator_record_action_log def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -286,6 +295,7 @@ class EquipmentItem: resp.status = falcon.HTTP_204 @staticmethod + @decorator_record_action_log def on_put(req, resp, id_): """Handles PUT requests""" if not id_.isdigit() or int(id_) <= 0: @@ -382,6 +392,7 @@ class EquipmentItem: # Clone an Equipment @staticmethod + @decorator_record_action_log def on_post(req, resp, id_): """Handles PUT requests""" if not id_.isdigit() or int(id_) <= 0: @@ -527,15 +538,18 @@ class EquipmentItem: class EquipmentParameterCollection: @staticmethod + @decorator_record_action_log def __init__(): """Initializes EquipmentParameterCollection""" pass @staticmethod + @decorator_record_action_log def on_options(req, resp, id_): resp.status = falcon.HTTP_200 @staticmethod + @decorator_record_action_log def on_get(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -658,6 +672,7 @@ class EquipmentParameterCollection: resp.body = json.dumps(result) @staticmethod + @decorator_record_action_log def on_post(req, resp, id_): """Handles POST requests""" if not id_.isdigit() or int(id_) <= 0: @@ -841,15 +856,18 @@ class EquipmentParameterCollection: class EquipmentParameterItem: @staticmethod + @decorator_record_action_log def __init__(): """Initializes EquipmentParameterItem""" pass @staticmethod + @decorator_record_action_log def on_options(req, resp, id_, pid): resp.status = falcon.HTTP_200 @staticmethod + @decorator_record_action_log def on_get(req, resp, id_, pid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -966,6 +984,7 @@ class EquipmentParameterItem: resp.body = json.dumps(meta_result) @staticmethod + @decorator_record_action_log def on_delete(req, resp, id_, pid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1012,6 +1031,7 @@ class EquipmentParameterItem: resp.status = falcon.HTTP_204 @staticmethod + @decorator_record_action_log def on_put(req, resp, id_, pid): """Handles POST requests""" if not id_.isdigit() or int(id_) <= 0: @@ -1213,15 +1233,18 @@ class EquipmentParameterItem: class EquipmentMeterCollection: @staticmethod + @decorator_record_action_log def __init__(): """Initializes EquipmentMeterCollection""" pass @staticmethod + @decorator_record_action_log def on_options(req, resp, id_): resp.status = falcon.HTTP_200 @staticmethod + @decorator_record_action_log def on_get(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1270,6 +1293,7 @@ class EquipmentMeterCollection: resp.body = json.dumps(result) @staticmethod + @decorator_record_action_log def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1341,15 +1365,18 @@ class EquipmentMeterCollection: class EquipmentMeterItem: @staticmethod + @decorator_record_action_log def __init__(): """Initializes EquipmentMeterItem""" pass @staticmethod + @decorator_record_action_log def on_options(req, resp, id_, mid): resp.status = falcon.HTTP_200 @staticmethod + @decorator_record_action_log def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1400,15 +1427,18 @@ class EquipmentMeterItem: class EquipmentOfflineMeterCollection: @staticmethod + @decorator_record_action_log def __init__(): """Initializes EquipmentOfflineMeterCollection""" pass @staticmethod + @decorator_record_action_log def on_options(req, resp, id_): resp.status = falcon.HTTP_200 @staticmethod + @decorator_record_action_log def on_get(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1457,6 +1487,7 @@ class EquipmentOfflineMeterCollection: resp.body = json.dumps(result) @staticmethod + @decorator_record_action_log def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1528,15 +1559,18 @@ class EquipmentOfflineMeterCollection: class EquipmentOfflineMeterItem: @staticmethod + @decorator_record_action_log def __init__(): """Initializes EquipmentOfflineMeterItem""" pass @staticmethod + @decorator_record_action_log def on_options(req, resp, id_, mid): resp.status = falcon.HTTP_200 @staticmethod + @decorator_record_action_log def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1588,15 +1622,18 @@ class EquipmentOfflineMeterItem: class EquipmentVirtualMeterCollection: @staticmethod + @decorator_record_action_log def __init__(): """Initializes EquipmentVirtualMeterCollection""" pass @staticmethod + @decorator_record_action_log def on_options(req, resp, id_): resp.status = falcon.HTTP_200 @staticmethod + @decorator_record_action_log def on_get(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1645,6 +1682,7 @@ class EquipmentVirtualMeterCollection: resp.body = json.dumps(result) @staticmethod + @decorator_record_action_log def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1716,15 +1754,18 @@ class EquipmentVirtualMeterCollection: class EquipmentVirtualMeterItem: @staticmethod + @decorator_record_action_log def __init__(): """Initializes EquipmentVirtualMeterItem""" pass @staticmethod + @decorator_record_action_log def on_options(req, resp, id_, mid): resp.status = falcon.HTTP_200 @staticmethod + @decorator_record_action_log def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/log.py b/myems-api/log.py new file mode 100644 index 00000000..383db162 --- /dev/null +++ b/myems-api/log.py @@ -0,0 +1,140 @@ +import os +from functools import wraps +import config +import mysql.connector +from datetime import datetime, timezone +import uuid +from gunicorn.http.body import Body + + +def write_log(user_uuid, action, _class, record_id, record_text): + """ + :param user_uuid: user_uuid + :param action: create, update, delete and others: login, logout, reset password, change password + :param _class: class_name + :param record_id: int + :param record_text: str + """ + now = datetime.now() + cnx = None + cursor = None + try: + cnx = mysql.connector.connect(**config.myems_user_db) + cursor = cnx.cursor() + cursor.execute(" SELECT display_name " + " FROM tbl_users " + " WHERE uuid = %s ", + (user_uuid,)) + row = cursor.fetchone() + user = dict() + if row is not None and len(row) > 0: + user["name"] = row[0] + else: + user["name"] = "visitor" + + cnx = mysql.connector.connect(**config.myems_user_db) + cursor = cnx.cursor() + add_row = (" INSERT INTO tbl_action_logs " + " (user_name, date_time, action, class, record_id, record_text) " + " VALUES (%s, %s, %s, %s, %s , %s) ") + cursor.execute(add_row, (user['name'], + now, + action, + _class, + record_id if record_id else None, + record_text if record_text else None, + )) + cnx.commit() + except Exception as e: + print(str(e)) + if cnx: + cnx.disconnect() + if cursor: + cursor.close() + finally: + if cnx: + cnx.disconnect() + if cursor: + cursor.close() + + +def decorator_record_action_log(func): + @wraps(func) + def log_fun(*args, **kwargs): + type_dict = { + "on_post": "create", + "on_put": "update", + "on_delete": "delete", + } + + func_names = func.__qualname__ + class_name = func_names.split(".")[0] + fun_name = func_names.split(".")[1] + if fun_name not in type_dict.keys(): + return func(*args, **kwargs) + + if len(args) > 1: + req, resp = args + cookies = req.cookies + if cookies is not None and 'user_uuid' in cookies.keys(): + user_uuid = cookies['user_uuid'] + else: + user_uuid = None + else: + return func(*args, **kwargs) + + action = type_dict.get(fun_name) + + if class_name == "UserLogin": + action = "login" + elif class_name == "UserLogout": + action = "logout" + elif class_name == "ResetPassword": + action = "reset password" + elif class_name == "ChangePassword": + action = "change password" + else: + pass + + if fun_name == "on_post": + file_name = str(uuid.uuid4()) + with open(file_name, "wb") as fw: + reads = req.stream.read() + fw.write(reads) + raw_json = reads.decode('utf-8') + + with open(file_name, "rb") as fr: + req.stream = Body(fr) + write_log(user_uuid=user_uuid, action=action, _class=class_name, + record_id=None, record_text=raw_json) + func(*args, **kwargs) + os.remove(file_name) + return + + elif fun_name == "on_put": + id_ = kwargs.get('id_') + file_name = str(uuid.uuid4()) + with open(file_name, "wb") as fw: + reads = req.stream.read() + fw.write(reads) + raw_json = reads.decode('utf-8') + + with open(file_name, "rb") as fr: + req.stream = Body(fr) + write_log(user_uuid=user_uuid, action=action, _class=class_name, + record_id=id_, record_text=raw_json) + func(*args, **kwargs) + os.remove(file_name) + return + + elif fun_name == "on_delete": + id_ = kwargs.get('id_') + write_log(user_uuid=user_uuid, action=action, _class=class_name, + record_id=id_, record_text=None) + func(*args, **kwargs) + return + else: + func(*args, **kwargs) + return + + return log_fun From fd7a12cefd5140177fd20a96859d28489a760e39 Mon Sep 17 00:00:00 2001 From: hyh123a Date: Wed, 25 Aug 2021 15:14:25 +0800 Subject: [PATCH 02/87] add the tbl_action_logs --- database/myems_user_db.sql | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/database/myems_user_db.sql b/database/myems_user_db.sql index 92a477cb..a65c6799 100644 --- a/database/myems_user_db.sql +++ b/database/myems_user_db.sql @@ -87,3 +87,20 @@ CREATE TABLE IF NOT EXISTS `myems_user_db`.`tbl_notifications` ( `url` VARCHAR(128), PRIMARY KEY (`id`)); CREATE INDEX `tbl_notifications_index_1` ON `myems_user_db`.`tbl_notifications` (`user_id`, `created_datetime_utc`, `status`); + + +-- --------------------------------------------------------------------------------------------------------------------- +-- Table `myems_user_db`.`tbl_action_logs` +-- --------------------------------------------------------------------------------------------------------------------- +DROP TABLE IF EXISTS `myems_user_db`.`tbl_action_logs` ; + +CREATE TABLE IF NOT EXISTS `myems_user_db`.`tbl_action_logs` ( + `id` BIGINT NOT NULL AUTO_INCREMENT, + `user_name` VARCHAR(256) NOT NULL, + `date_time` DATETIME NOT NULL, + `action` VARCHAR(256) NOT NULL, + `class` VARCHAR(256) NOT NULL, + `record_id` BIGINT NULL, + `record_text` JSON NULL, + PRIMARY KEY (`id`)); +CREATE INDEX `tbl_action_logs_index_1` ON `myems_user_db`.`tbl_action_logs` (`user_name`, `date_time`, `action`); From 4f1d2f5ad478b2186d7302f8b803289647485a0b Mon Sep 17 00:00:00 2001 From: hyh123a Date: Wed, 25 Aug 2021 15:49:18 +0800 Subject: [PATCH 03/87] add the judge for admin --- myems-api/log.py | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/myems-api/log.py b/myems-api/log.py index 383db162..d89903c4 100644 --- a/myems-api/log.py +++ b/myems-api/log.py @@ -58,6 +58,37 @@ def write_log(user_uuid, action, _class, record_id, record_text): cursor.close() +def judge_admin(user_uuid): + cnx = None + cursor = None + try: + cnx = mysql.connector.connect(**config.myems_user_db) + cursor = cnx.cursor() + cursor.execute(" SELECT is_admin " + " FROM tbl_users " + " WHERE uuid = %s ", + (user_uuid,)) + row = cursor.fetchone() + user = dict() + if row is not None and len(row) > 0: + user["admin"] = True if row[0] == 1 else False + else: + user["admin"] = False + return user["admin"] + except Exception as e: + print(str(e)) + if cnx: + cnx.disconnect() + if cursor: + cursor.close() + return False + finally: + if cnx: + cnx.disconnect() + if cursor: + cursor.close() + + def decorator_record_action_log(func): @wraps(func) def log_fun(*args, **kwargs): @@ -70,20 +101,27 @@ def decorator_record_action_log(func): func_names = func.__qualname__ class_name = func_names.split(".")[0] fun_name = func_names.split(".")[1] + + # Judge on_post, on_put, on_delete if fun_name not in type_dict.keys(): return func(*args, **kwargs) + action = type_dict.get(fun_name) + + # Judge is_admin or not if len(args) > 1: req, resp = args cookies = req.cookies if cookies is not None and 'user_uuid' in cookies.keys(): user_uuid = cookies['user_uuid'] + is_admin = judge_admin(user_uuid) else: user_uuid = None + is_admin = False else: return func(*args, **kwargs) - - action = type_dict.get(fun_name) + if not is_admin: + return func(*args, **kwargs) if class_name == "UserLogin": action = "login" From 61fdc9ca7470682b5368d754a1c6b7a69b502337 Mon Sep 17 00:00:00 2001 From: hyh123a Date: Thu, 26 Aug 2021 10:02:30 +0800 Subject: [PATCH 04/87] modify the date_time to utc --- database/myems_user_db.sql | 4 ++-- myems-api/log.py | 12 ++---------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/database/myems_user_db.sql b/database/myems_user_db.sql index a65c6799..c23aacb2 100644 --- a/database/myems_user_db.sql +++ b/database/myems_user_db.sql @@ -97,10 +97,10 @@ DROP TABLE IF EXISTS `myems_user_db`.`tbl_action_logs` ; CREATE TABLE IF NOT EXISTS `myems_user_db`.`tbl_action_logs` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `user_name` VARCHAR(256) NOT NULL, - `date_time` DATETIME NOT NULL, + `date_time_utc` DATETIME NOT NULL, `action` VARCHAR(256) NOT NULL, `class` VARCHAR(256) NOT NULL, `record_id` BIGINT NULL, `record_text` JSON NULL, PRIMARY KEY (`id`)); -CREATE INDEX `tbl_action_logs_index_1` ON `myems_user_db`.`tbl_action_logs` (`user_name`, `date_time`, `action`); +CREATE INDEX `tbl_action_logs_index_1` ON `myems_user_db`.`tbl_action_logs` (`user_name`, `date_time_utc`, `action`); diff --git a/myems-api/log.py b/myems-api/log.py index d89903c4..dc3e89e0 100644 --- a/myems-api/log.py +++ b/myems-api/log.py @@ -15,7 +15,7 @@ def write_log(user_uuid, action, _class, record_id, record_text): :param record_id: int :param record_text: str """ - now = datetime.now() + now = datetime.utcnow() cnx = None cursor = None try: @@ -35,7 +35,7 @@ def write_log(user_uuid, action, _class, record_id, record_text): cnx = mysql.connector.connect(**config.myems_user_db) cursor = cnx.cursor() add_row = (" INSERT INTO tbl_action_logs " - " (user_name, date_time, action, class, record_id, record_text) " + " (user_name, date_time_utc, action, class, record_id, record_text) " " VALUES (%s, %s, %s, %s, %s , %s) ") cursor.execute(add_row, (user['name'], now, @@ -47,10 +47,6 @@ def write_log(user_uuid, action, _class, record_id, record_text): cnx.commit() except Exception as e: print(str(e)) - if cnx: - cnx.disconnect() - if cursor: - cursor.close() finally: if cnx: cnx.disconnect() @@ -77,10 +73,6 @@ def judge_admin(user_uuid): return user["admin"] except Exception as e: print(str(e)) - if cnx: - cnx.disconnect() - if cursor: - cursor.close() return False finally: if cnx: From d27386c57e5579318bcfc1568e44f90ac3f42b6b Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 27 Aug 2021 12:42:12 +0800 Subject: [PATCH 05/87] updated myems_user_db.tbl_logs in database --- database/myems_system_db.sql | 2 +- database/myems_user_db.sql | 26 ++++++-------------------- database/upgrade/upgrade1.2.2.sql | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 21 deletions(-) create mode 100644 database/upgrade/upgrade1.2.2.sql diff --git a/database/myems_system_db.sql b/database/myems_system_db.sql index 9244d43e..3d54cd70 100644 --- a/database/myems_system_db.sql +++ b/database/myems_system_db.sql @@ -1243,6 +1243,6 @@ USE `myems_system_db`; INSERT INTO `myems_system_db`.`tbl_versions` (`id`, `version`, `release_date`) VALUES -(1, '1.2.1', '2021-08-19'); +(1, '1.2.2', '2021-08-28'); COMMIT; diff --git a/database/myems_user_db.sql b/database/myems_user_db.sql index c23aacb2..ac1b26a6 100644 --- a/database/myems_user_db.sql +++ b/database/myems_user_db.sql @@ -67,10 +67,13 @@ DROP TABLE IF EXISTS `myems_user_db`.`tbl_logs` ; CREATE TABLE IF NOT EXISTS `myems_user_db`.`tbl_logs` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `user_id` BIGINT NOT NULL, - `utc_date_time` DATETIME NOT NULL, - `activity` VARCHAR(256) NOT NULL, + `request_datetime_utc` DATETIME NOT NULL, + `request_method` VARCHAR(256) NOT NULL, + `resource_type` VARCHAR(256) NOT NULL, + `resource_id` BIGINT NULL, + `request_body` JSON NULL, PRIMARY KEY (`id`)); - +CREATE INDEX `tbl_logs_index_1` ON `myems_user_db`.`tbl_logs` (`user_id`, `request_datetime_utc`, `request_method`); -- ---------------------------------------------------------------------------------- -- Table `myems_user_db`.`tbl_notifications` @@ -87,20 +90,3 @@ CREATE TABLE IF NOT EXISTS `myems_user_db`.`tbl_notifications` ( `url` VARCHAR(128), PRIMARY KEY (`id`)); CREATE INDEX `tbl_notifications_index_1` ON `myems_user_db`.`tbl_notifications` (`user_id`, `created_datetime_utc`, `status`); - - --- --------------------------------------------------------------------------------------------------------------------- --- Table `myems_user_db`.`tbl_action_logs` --- --------------------------------------------------------------------------------------------------------------------- -DROP TABLE IF EXISTS `myems_user_db`.`tbl_action_logs` ; - -CREATE TABLE IF NOT EXISTS `myems_user_db`.`tbl_action_logs` ( - `id` BIGINT NOT NULL AUTO_INCREMENT, - `user_name` VARCHAR(256) NOT NULL, - `date_time_utc` DATETIME NOT NULL, - `action` VARCHAR(256) NOT NULL, - `class` VARCHAR(256) NOT NULL, - `record_id` BIGINT NULL, - `record_text` JSON NULL, - PRIMARY KEY (`id`)); -CREATE INDEX `tbl_action_logs_index_1` ON `myems_user_db`.`tbl_action_logs` (`user_name`, `date_time_utc`, `action`); diff --git a/database/upgrade/upgrade1.2.2.sql b/database/upgrade/upgrade1.2.2.sql new file mode 100644 index 00000000..e93bdd63 --- /dev/null +++ b/database/upgrade/upgrade1.2.2.sql @@ -0,0 +1,15 @@ +DROP TABLE IF EXISTS `myems_user_db`.`tbl_logs` ; + +CREATE TABLE IF NOT EXISTS `myems_user_db`.`tbl_logs` ( + `id` BIGINT NOT NULL AUTO_INCREMENT, + `user_id` BIGINT NOT NULL, + `request_datetime_utc` DATETIME NOT NULL, + `request_method` VARCHAR(256) NOT NULL, + `resource_type` VARCHAR(256) NOT NULL, + `resource_id` BIGINT NULL, + `request_body` JSON NULL, + PRIMARY KEY (`id`)); +CREATE INDEX `tbl_logs_index_1` ON `myems_user_db`.`tbl_logs` (`user_id`, `request_datetime_utc`, `request_method`); + +-- UPDATE VERSION NUMBER +UPDATE myems_system_db.tbl_versions SET version='1.2.2', release_date='2021-08-28' WHERE id=1; From 91a0342c2f07b6171ae398acde6d8f1d6a193508 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 27 Aug 2021 17:21:01 +0800 Subject: [PATCH 06/87] updated userlogger in API --- database/myems_user_db.sql | 8 +- database/upgrade/upgrade1.2.2.sql | 4 +- myems-api/core/equipment.py | 56 +++------- myems-api/core/userlogger.py | 107 +++++++++++++++++++ myems-api/log.py | 170 ------------------------------ 5 files changed, 128 insertions(+), 217 deletions(-) create mode 100644 myems-api/core/userlogger.py delete mode 100644 myems-api/log.py diff --git a/database/myems_user_db.sql b/database/myems_user_db.sql index ac1b26a6..8fe493f8 100644 --- a/database/myems_user_db.sql +++ b/database/myems_user_db.sql @@ -66,18 +66,18 @@ DROP TABLE IF EXISTS `myems_user_db`.`tbl_logs` ; CREATE TABLE IF NOT EXISTS `myems_user_db`.`tbl_logs` ( `id` BIGINT NOT NULL AUTO_INCREMENT, - `user_id` BIGINT NOT NULL, + `user_uuid` CHAR(36) NOT NULL, `request_datetime_utc` DATETIME NOT NULL, `request_method` VARCHAR(256) NOT NULL, `resource_type` VARCHAR(256) NOT NULL, `resource_id` BIGINT NULL, `request_body` JSON NULL, PRIMARY KEY (`id`)); -CREATE INDEX `tbl_logs_index_1` ON `myems_user_db`.`tbl_logs` (`user_id`, `request_datetime_utc`, `request_method`); +CREATE INDEX `tbl_logs_index_1` ON `myems_user_db`.`tbl_logs` (`user_uuid`, `request_datetime_utc`, `request_method`); --- ---------------------------------------------------------------------------------- +-- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_user_db`.`tbl_notifications` --- ---------------------------------------------------------------------------------- +-- --------------------------------------------------------------------------------------------------------------------- DROP TABLE IF EXISTS `myems_user_db`.`tbl_notifications` ; CREATE TABLE IF NOT EXISTS `myems_user_db`.`tbl_notifications` ( diff --git a/database/upgrade/upgrade1.2.2.sql b/database/upgrade/upgrade1.2.2.sql index e93bdd63..1e1240ca 100644 --- a/database/upgrade/upgrade1.2.2.sql +++ b/database/upgrade/upgrade1.2.2.sql @@ -2,14 +2,14 @@ DROP TABLE IF EXISTS `myems_user_db`.`tbl_logs` ; CREATE TABLE IF NOT EXISTS `myems_user_db`.`tbl_logs` ( `id` BIGINT NOT NULL AUTO_INCREMENT, - `user_id` BIGINT NOT NULL, + `user_uuid` CHAR(36) NOT NULL, `request_datetime_utc` DATETIME NOT NULL, `request_method` VARCHAR(256) NOT NULL, `resource_type` VARCHAR(256) NOT NULL, `resource_id` BIGINT NULL, `request_body` JSON NULL, PRIMARY KEY (`id`)); -CREATE INDEX `tbl_logs_index_1` ON `myems_user_db`.`tbl_logs` (`user_id`, `request_datetime_utc`, `request_method`); +CREATE INDEX `tbl_logs_index_1` ON `myems_user_db`.`tbl_logs` (`user_uuid`, `request_datetime_utc`, `request_method`); -- UPDATE VERSION NUMBER UPDATE myems_system_db.tbl_versions SET version='1.2.2', release_date='2021-08-28' WHERE id=1; diff --git a/myems-api/core/equipment.py b/myems-api/core/equipment.py index ec62daac..42f39db3 100644 --- a/myems-api/core/equipment.py +++ b/myems-api/core/equipment.py @@ -3,23 +3,20 @@ import simplejson as json import mysql.connector import config import uuid -from log import decorator_record_action_log +from core.userlogger import user_logger class EquipmentCollection: @staticmethod - @decorator_record_action_log def __init__(): """Initializes EquipmentCollection""" pass @staticmethod - @decorator_record_action_log def on_options(req, resp): resp.status = falcon.HTTP_200 @staticmethod - @decorator_record_action_log def on_get(req, resp): cnx = mysql.connector.connect(**config.myems_system_db) cursor = cnx.cursor(dictionary=True) @@ -62,7 +59,7 @@ class EquipmentCollection: resp.body = json.dumps(result) @staticmethod - @decorator_record_action_log + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -150,18 +147,15 @@ class EquipmentCollection: class EquipmentItem: @staticmethod - @decorator_record_action_log def __init__(): """Initializes EquipmentItem""" pass @staticmethod - @decorator_record_action_log def on_options(req, resp, id_): resp.status = falcon.HTTP_200 @staticmethod - @decorator_record_action_log def on_get(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -208,7 +202,7 @@ class EquipmentItem: resp.body = json.dumps(meta_result) @staticmethod - @decorator_record_action_log + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -295,7 +289,7 @@ class EquipmentItem: resp.status = falcon.HTTP_204 @staticmethod - @decorator_record_action_log + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" if not id_.isdigit() or int(id_) <= 0: @@ -392,7 +386,7 @@ class EquipmentItem: # Clone an Equipment @staticmethod - @decorator_record_action_log + @user_logger def on_post(req, resp, id_): """Handles PUT requests""" if not id_.isdigit() or int(id_) <= 0: @@ -538,18 +532,15 @@ class EquipmentItem: class EquipmentParameterCollection: @staticmethod - @decorator_record_action_log def __init__(): """Initializes EquipmentParameterCollection""" pass @staticmethod - @decorator_record_action_log def on_options(req, resp, id_): resp.status = falcon.HTTP_200 @staticmethod - @decorator_record_action_log def on_get(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -672,7 +663,7 @@ class EquipmentParameterCollection: resp.body = json.dumps(result) @staticmethod - @decorator_record_action_log + @user_logger def on_post(req, resp, id_): """Handles POST requests""" if not id_.isdigit() or int(id_) <= 0: @@ -856,18 +847,16 @@ class EquipmentParameterCollection: class EquipmentParameterItem: @staticmethod - @decorator_record_action_log + @user_logger def __init__(): """Initializes EquipmentParameterItem""" pass @staticmethod - @decorator_record_action_log def on_options(req, resp, id_, pid): resp.status = falcon.HTTP_200 @staticmethod - @decorator_record_action_log def on_get(req, resp, id_, pid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -984,7 +973,7 @@ class EquipmentParameterItem: resp.body = json.dumps(meta_result) @staticmethod - @decorator_record_action_log + @user_logger def on_delete(req, resp, id_, pid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1031,7 +1020,7 @@ class EquipmentParameterItem: resp.status = falcon.HTTP_204 @staticmethod - @decorator_record_action_log + @user_logger def on_put(req, resp, id_, pid): """Handles POST requests""" if not id_.isdigit() or int(id_) <= 0: @@ -1233,18 +1222,15 @@ class EquipmentParameterItem: class EquipmentMeterCollection: @staticmethod - @decorator_record_action_log def __init__(): """Initializes EquipmentMeterCollection""" pass @staticmethod - @decorator_record_action_log def on_options(req, resp, id_): resp.status = falcon.HTTP_200 @staticmethod - @decorator_record_action_log def on_get(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1293,7 +1279,7 @@ class EquipmentMeterCollection: resp.body = json.dumps(result) @staticmethod - @decorator_record_action_log + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1365,18 +1351,16 @@ class EquipmentMeterCollection: class EquipmentMeterItem: @staticmethod - @decorator_record_action_log def __init__(): """Initializes EquipmentMeterItem""" pass @staticmethod - @decorator_record_action_log def on_options(req, resp, id_, mid): resp.status = falcon.HTTP_200 @staticmethod - @decorator_record_action_log + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1427,18 +1411,15 @@ class EquipmentMeterItem: class EquipmentOfflineMeterCollection: @staticmethod - @decorator_record_action_log def __init__(): """Initializes EquipmentOfflineMeterCollection""" pass @staticmethod - @decorator_record_action_log def on_options(req, resp, id_): resp.status = falcon.HTTP_200 @staticmethod - @decorator_record_action_log def on_get(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1487,7 +1468,7 @@ class EquipmentOfflineMeterCollection: resp.body = json.dumps(result) @staticmethod - @decorator_record_action_log + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1559,18 +1540,16 @@ class EquipmentOfflineMeterCollection: class EquipmentOfflineMeterItem: @staticmethod - @decorator_record_action_log def __init__(): """Initializes EquipmentOfflineMeterItem""" pass @staticmethod - @decorator_record_action_log def on_options(req, resp, id_, mid): resp.status = falcon.HTTP_200 @staticmethod - @decorator_record_action_log + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1622,18 +1601,15 @@ class EquipmentOfflineMeterItem: class EquipmentVirtualMeterCollection: @staticmethod - @decorator_record_action_log def __init__(): """Initializes EquipmentVirtualMeterCollection""" pass @staticmethod - @decorator_record_action_log def on_options(req, resp, id_): resp.status = falcon.HTTP_200 @staticmethod - @decorator_record_action_log def on_get(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1682,7 +1658,7 @@ class EquipmentVirtualMeterCollection: resp.body = json.dumps(result) @staticmethod - @decorator_record_action_log + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1754,18 +1730,16 @@ class EquipmentVirtualMeterCollection: class EquipmentVirtualMeterItem: @staticmethod - @decorator_record_action_log def __init__(): """Initializes EquipmentVirtualMeterItem""" pass @staticmethod - @decorator_record_action_log def on_options(req, resp, id_, mid): resp.status = falcon.HTTP_200 @staticmethod - @decorator_record_action_log + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/userlogger.py b/myems-api/core/userlogger.py new file mode 100644 index 00000000..0e48a0c8 --- /dev/null +++ b/myems-api/core/userlogger.py @@ -0,0 +1,107 @@ +import os +from functools import wraps +import config +import mysql.connector +from datetime import datetime +import uuid +from gunicorn.http.body import Body +import simplejson as json + + +def write_log(user_uuid, request_method, resource_type, resource_id, request_body): + """ + :param user_uuid: user_uuid + :param request_method: 'POST', 'PUT', 'DELETE' + :param resource_type: class_name + :param resource_id: int + :param request_body: json in raw string + """ + cnx = None + cursor = None + try: + cnx = mysql.connector.connect(**config.myems_user_db) + cursor = cnx.cursor() + add_row = (" INSERT INTO tbl_logs " + " (user_uuid, request_datetime_utc, request_method, resource_type, resource_id, request_body) " + " VALUES (%s, %s, %s, %s, %s , %s) ") + cursor.execute(add_row, (user_uuid, + datetime.utcnow(), + request_method, + resource_type, + resource_id if resource_id else None, + request_body if request_body else None, + )) + cnx.commit() + except Exception as e: + print(str(e)) + finally: + if cnx: + cnx.disconnect() + if cursor: + cursor.close() + + +def user_logger(func): + @wraps(func) + def logger(*args, **kwargs): + qualified_name = func.__qualname__ + class_name = qualified_name.split(".")[0] + func_name = qualified_name.split(".")[1] + + if func_name not in ("on_post", "on_put", "on_delete"): + # do not log for other HTTP Methods + func(*args, **kwargs) + return + req, resp = args + cookies = req.cookies + if cookies is not None and 'user_uuid' in cookies.keys(): + user_uuid = cookies['user_uuid'] + else: + # todo: deal with requests with NULL user_uuid + print('user_logger: user_uuid is NULL') + # do not log for NULL user_uuid + func(*args, **kwargs) + return + + if func_name == "on_post": + try: + file_name = str(uuid.uuid4()) + with open(file_name, "wb") as fw: + reads = req.stream.read() + fw.write(reads) + raw_json = reads.decode('utf-8') + with open(file_name, "rb") as fr: + req.stream = Body(fr) + func(*args, **kwargs) + write_log(user_uuid=user_uuid, request_method='POST', resource_type=class_name, + resource_id=kwargs.get('id_'), request_body=raw_json) + os.remove(file_name) + except Exception as e: + print('user_logger:' + str(e)) + return + elif func_name == "on_put": + try: + file_name = str(uuid.uuid4()) + with open(file_name, "wb") as fw: + reads = req.stream.read() + fw.write(reads) + raw_json = reads.decode('utf-8') + with open(file_name, "rb") as fr: + req.stream = Body(fr) + func(*args, **kwargs) + write_log(user_uuid=user_uuid, request_method="POST", resource_type=class_name, + resource_id=kwargs.get('id_'), request_body=raw_json) + os.remove(file_name) + except Exception as e: + print('user_logger:' + str(e)) + return + elif func_name == "on_delete": + try: + func(*args, **kwargs) + write_log(user_uuid=user_uuid, request_method="DELETE", resource_type=class_name, + resource_id=kwargs.get('id_'), request_body=json.dumps(kwargs)) + except Exception as e: + print('user_logger:' + str(e)) + return + + return logger diff --git a/myems-api/log.py b/myems-api/log.py deleted file mode 100644 index dc3e89e0..00000000 --- a/myems-api/log.py +++ /dev/null @@ -1,170 +0,0 @@ -import os -from functools import wraps -import config -import mysql.connector -from datetime import datetime, timezone -import uuid -from gunicorn.http.body import Body - - -def write_log(user_uuid, action, _class, record_id, record_text): - """ - :param user_uuid: user_uuid - :param action: create, update, delete and others: login, logout, reset password, change password - :param _class: class_name - :param record_id: int - :param record_text: str - """ - now = datetime.utcnow() - cnx = None - cursor = None - try: - cnx = mysql.connector.connect(**config.myems_user_db) - cursor = cnx.cursor() - cursor.execute(" SELECT display_name " - " FROM tbl_users " - " WHERE uuid = %s ", - (user_uuid,)) - row = cursor.fetchone() - user = dict() - if row is not None and len(row) > 0: - user["name"] = row[0] - else: - user["name"] = "visitor" - - cnx = mysql.connector.connect(**config.myems_user_db) - cursor = cnx.cursor() - add_row = (" INSERT INTO tbl_action_logs " - " (user_name, date_time_utc, action, class, record_id, record_text) " - " VALUES (%s, %s, %s, %s, %s , %s) ") - cursor.execute(add_row, (user['name'], - now, - action, - _class, - record_id if record_id else None, - record_text if record_text else None, - )) - cnx.commit() - except Exception as e: - print(str(e)) - finally: - if cnx: - cnx.disconnect() - if cursor: - cursor.close() - - -def judge_admin(user_uuid): - cnx = None - cursor = None - try: - cnx = mysql.connector.connect(**config.myems_user_db) - cursor = cnx.cursor() - cursor.execute(" SELECT is_admin " - " FROM tbl_users " - " WHERE uuid = %s ", - (user_uuid,)) - row = cursor.fetchone() - user = dict() - if row is not None and len(row) > 0: - user["admin"] = True if row[0] == 1 else False - else: - user["admin"] = False - return user["admin"] - except Exception as e: - print(str(e)) - return False - finally: - if cnx: - cnx.disconnect() - if cursor: - cursor.close() - - -def decorator_record_action_log(func): - @wraps(func) - def log_fun(*args, **kwargs): - type_dict = { - "on_post": "create", - "on_put": "update", - "on_delete": "delete", - } - - func_names = func.__qualname__ - class_name = func_names.split(".")[0] - fun_name = func_names.split(".")[1] - - # Judge on_post, on_put, on_delete - if fun_name not in type_dict.keys(): - return func(*args, **kwargs) - - action = type_dict.get(fun_name) - - # Judge is_admin or not - if len(args) > 1: - req, resp = args - cookies = req.cookies - if cookies is not None and 'user_uuid' in cookies.keys(): - user_uuid = cookies['user_uuid'] - is_admin = judge_admin(user_uuid) - else: - user_uuid = None - is_admin = False - else: - return func(*args, **kwargs) - if not is_admin: - return func(*args, **kwargs) - - if class_name == "UserLogin": - action = "login" - elif class_name == "UserLogout": - action = "logout" - elif class_name == "ResetPassword": - action = "reset password" - elif class_name == "ChangePassword": - action = "change password" - else: - pass - - if fun_name == "on_post": - file_name = str(uuid.uuid4()) - with open(file_name, "wb") as fw: - reads = req.stream.read() - fw.write(reads) - raw_json = reads.decode('utf-8') - - with open(file_name, "rb") as fr: - req.stream = Body(fr) - write_log(user_uuid=user_uuid, action=action, _class=class_name, - record_id=None, record_text=raw_json) - func(*args, **kwargs) - os.remove(file_name) - return - - elif fun_name == "on_put": - id_ = kwargs.get('id_') - file_name = str(uuid.uuid4()) - with open(file_name, "wb") as fw: - reads = req.stream.read() - fw.write(reads) - raw_json = reads.decode('utf-8') - - with open(file_name, "rb") as fr: - req.stream = Body(fr) - write_log(user_uuid=user_uuid, action=action, _class=class_name, - record_id=id_, record_text=raw_json) - func(*args, **kwargs) - os.remove(file_name) - return - - elif fun_name == "on_delete": - id_ = kwargs.get('id_') - write_log(user_uuid=user_uuid, action=action, _class=class_name, - record_id=id_, record_text=None) - func(*args, **kwargs) - return - else: - func(*args, **kwargs) - return - - return log_fun From ce55c0484f20e22f50f09afe86dcaf955e86e3c2 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 27 Aug 2021 18:09:47 +0800 Subject: [PATCH 07/87] added user_logger decorators to all on_put, on_post and on_delete actions in API --- myems-api/core/combinedequipment.py | 16 ++++++++++++++++ myems-api/core/contact.py | 4 ++++ myems-api/core/costcenter.py | 6 ++++++ myems-api/core/costfile.py | 3 +++ myems-api/core/datasource.py | 4 ++++ myems-api/core/distributioncircuit.py | 6 ++++++ myems-api/core/distributionsystem.py | 4 ++++ myems-api/core/emailmessage.py | 2 ++ myems-api/core/emailserver.py | 4 ++++ myems-api/core/energycategory.py | 4 ++++ myems-api/core/energyflowdiagram.py | 10 ++++++++++ myems-api/core/energyitem.py | 4 ++++ myems-api/core/equipment.py | 1 + myems-api/core/gateway.py | 4 ++++ myems-api/core/gsmmodem.py | 4 ++++ myems-api/core/knowledgefile.py | 3 +++ myems-api/core/menu.py | 2 ++ myems-api/core/meter.py | 6 ++++++ myems-api/core/notification.py | 3 +++ myems-api/core/offlinemeter.py | 4 ++++ myems-api/core/offlinemeterfile.py | 3 +++ myems-api/core/point.py | 4 ++++ myems-api/core/privilege.py | 4 ++++ myems-api/core/rule.py | 6 +++++- myems-api/core/sensor.py | 6 ++++++ myems-api/core/shopfloor.py | 16 ++++++++++++++++ myems-api/core/space.py | 24 ++++++++++++++++++++++++ myems-api/core/store.py | 14 ++++++++++++++ myems-api/core/storetype.py | 4 ++++ myems-api/core/tariff.py | 4 ++++ myems-api/core/tenant.py | 14 ++++++++++++++ myems-api/core/tenanttype.py | 4 ++++ myems-api/core/textmessage.py | 2 ++ myems-api/core/timezone.py | 2 ++ myems-api/core/user.py | 8 ++++++++ myems-api/core/virtualmeter.py | 4 ++++ myems-api/core/webmessage.py | 3 +++ myems-api/core/wechatmessage.py | 2 ++ 38 files changed, 217 insertions(+), 1 deletion(-) diff --git a/myems-api/core/combinedequipment.py b/myems-api/core/combinedequipment.py index b15d843a..453f1d0b 100644 --- a/myems-api/core/combinedequipment.py +++ b/myems-api/core/combinedequipment.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class CombinedEquipmentCollection: @@ -58,6 +59,7 @@ class CombinedEquipmentCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -200,6 +202,7 @@ class CombinedEquipmentItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -273,6 +276,7 @@ class CombinedEquipmentItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" if not id_.isdigit() or int(id_) <= 0: @@ -369,6 +373,7 @@ class CombinedEquipmentItem: # Clone a Combined Equipment @staticmethod + @user_logger def on_post(req, resp, id_): """Handles PUT requests""" if not id_.isdigit() or int(id_) <= 0: @@ -558,6 +563,7 @@ class CombinedEquipmentEquipmentCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -632,6 +638,7 @@ class CombinedEquipmentEquipmentItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, eid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -814,6 +821,7 @@ class CombinedEquipmentParameterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" if not id_.isdigit() or int(id_) <= 0: @@ -1122,6 +1130,7 @@ class CombinedEquipmentParameterItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_, pid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1168,6 +1177,7 @@ class CombinedEquipmentParameterItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_, pid): """Handles POST requests""" if not id_.isdigit() or int(id_) <= 0: @@ -1426,6 +1436,7 @@ class CombinedEquipmentMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1506,6 +1517,7 @@ class CombinedEquipmentMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1614,6 +1626,7 @@ class CombinedEquipmentOfflineMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1695,6 +1708,7 @@ class CombinedEquipmentOfflineMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1803,6 +1817,7 @@ class CombinedEquipmentVirtualMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1884,6 +1899,7 @@ class CombinedEquipmentVirtualMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/contact.py b/myems-api/core/contact.py index 407688b4..1fd8cd01 100644 --- a/myems-api/core/contact.py +++ b/myems-api/core/contact.py @@ -4,6 +4,7 @@ import mysql.connector import config import uuid import re +from core.userlogger import user_logger class ContactCollection: @@ -44,6 +45,7 @@ class ContactCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -156,6 +158,7 @@ class ContactItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -230,6 +233,7 @@ class ContactItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/costcenter.py b/myems-api/core/costcenter.py index 49cf22d3..e13a49a8 100644 --- a/myems-api/core/costcenter.py +++ b/myems-api/core/costcenter.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class CostCenterCollection: @@ -37,6 +38,7 @@ class CostCenterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -131,6 +133,7 @@ class CostCenterItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -276,6 +279,7 @@ class CostCenterItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: @@ -403,6 +407,7 @@ class CostCenterTariffCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -471,6 +476,7 @@ class CostCenterTariffItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, tid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/costfile.py b/myems-api/core/costfile.py index fb352833..02d710e0 100644 --- a/myems-api/core/costfile.py +++ b/myems-api/core/costfile.py @@ -5,6 +5,7 @@ import config import uuid from datetime import datetime, timezone import os +from core.userlogger import user_logger class CostFileCollection: @@ -45,6 +46,7 @@ class CostFileCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -182,6 +184,7 @@ class CostFileItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/datasource.py b/myems-api/core/datasource.py index ab72e5aa..40112007 100644 --- a/myems-api/core/datasource.py +++ b/myems-api/core/datasource.py @@ -4,6 +4,7 @@ import mysql.connector import config import uuid from datetime import datetime, timezone +from core.userlogger import user_logger class DataSourceCollection: @@ -59,6 +60,7 @@ class DataSourceCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -189,6 +191,7 @@ class DataSourceItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -230,6 +233,7 @@ class DataSourceItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/distributioncircuit.py b/myems-api/core/distributioncircuit.py index 9d4c655d..d093766b 100644 --- a/myems-api/core/distributioncircuit.py +++ b/myems-api/core/distributioncircuit.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class DistributionCircuitCollection: @@ -59,6 +60,7 @@ class DistributionCircuitCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -228,6 +230,7 @@ class DistributionCircuitItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -258,6 +261,7 @@ class DistributionCircuitItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: @@ -433,6 +437,7 @@ class DistributionCircuitPointCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -500,6 +505,7 @@ class DistributionCircuitPointItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, pid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/distributionsystem.py b/myems-api/core/distributionsystem.py index 28427847..deecd4c3 100644 --- a/myems-api/core/distributionsystem.py +++ b/myems-api/core/distributionsystem.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class DistributionSystemCollection: @@ -43,6 +44,7 @@ class DistributionSystemCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -142,6 +144,7 @@ class DistributionSystemItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -180,6 +183,7 @@ class DistributionSystemItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/emailmessage.py b/myems-api/core/emailmessage.py index f2f0e996..580ff681 100644 --- a/myems-api/core/emailmessage.py +++ b/myems-api/core/emailmessage.py @@ -3,6 +3,7 @@ import json import mysql.connector import config from datetime import datetime, timedelta, timezone +from core.userlogger import user_logger class EmailMessageCollection: @@ -146,6 +147,7 @@ class EmailMessageItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/emailserver.py b/myems-api/core/emailserver.py index a5e8defe..effc7f0d 100644 --- a/myems-api/core/emailserver.py +++ b/myems-api/core/emailserver.py @@ -4,6 +4,7 @@ import mysql.connector import config import base64 import re +from core.userlogger import user_logger class EmailServerCollection: @@ -44,6 +45,7 @@ class EmailServerCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -175,6 +177,7 @@ class EmailServerItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -201,6 +204,7 @@ class EmailServerItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/energycategory.py b/myems-api/core/energycategory.py index 83df4929..7738a903 100644 --- a/myems-api/core/energycategory.py +++ b/myems-api/core/energycategory.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class EnergyCategoryCollection: @@ -38,6 +39,7 @@ class EnergyCategoryCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -145,6 +147,7 @@ class EnergyCategoryItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -225,6 +228,7 @@ class EnergyCategoryItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/energyflowdiagram.py b/myems-api/core/energyflowdiagram.py index 53ad8434..a2e89f61 100644 --- a/myems-api/core/energyflowdiagram.py +++ b/myems-api/core/energyflowdiagram.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class EnergyFlowDiagramCollection: @@ -120,6 +121,7 @@ class EnergyFlowDiagramCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -281,6 +283,7 @@ class EnergyFlowDiagramItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -309,6 +312,7 @@ class EnergyFlowDiagramItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" if not id_.isdigit() or int(id_) <= 0: @@ -470,6 +474,7 @@ class EnergyFlowDiagramLinkCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" if not id_.isdigit() or int(id_) <= 0: @@ -713,6 +718,7 @@ class EnergyFlowDiagramLinkItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_, lid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -759,6 +765,7 @@ class EnergyFlowDiagramLinkItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_, lid): """Handles POST requests""" if not id_.isdigit() or int(id_) <= 0: @@ -964,6 +971,7 @@ class EnergyFlowDiagramNodeCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" if not id_.isdigit() or int(id_) <= 0: @@ -1059,6 +1067,7 @@ class EnergyFlowDiagramNodeItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_, nid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1105,6 +1114,7 @@ class EnergyFlowDiagramNodeItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_, nid): """Handles POST requests""" if not id_.isdigit() or int(id_) <= 0: diff --git a/myems-api/core/energyitem.py b/myems-api/core/energyitem.py index 5e3e9499..a9a12a47 100644 --- a/myems-api/core/energyitem.py +++ b/myems-api/core/energyitem.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class EnergyItemCollection: @@ -51,6 +52,7 @@ class EnergyItemCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -161,6 +163,7 @@ class EnergyItemItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -219,6 +222,7 @@ class EnergyItemItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/equipment.py b/myems-api/core/equipment.py index 42f39db3..6d787151 100644 --- a/myems-api/core/equipment.py +++ b/myems-api/core/equipment.py @@ -203,6 +203,7 @@ class EquipmentItem: @staticmethod @user_logger + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/gateway.py b/myems-api/core/gateway.py index 370ebb64..b75fbf4e 100644 --- a/myems-api/core/gateway.py +++ b/myems-api/core/gateway.py @@ -4,6 +4,7 @@ import mysql.connector import config import uuid from datetime import datetime, timezone +from core.userlogger import user_logger class GatewayCollection: @@ -43,6 +44,7 @@ class GatewayCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -126,6 +128,7 @@ class GatewayItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -164,6 +167,7 @@ class GatewayItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/gsmmodem.py b/myems-api/core/gsmmodem.py index e91ef512..d3d45cb8 100644 --- a/myems-api/core/gsmmodem.py +++ b/myems-api/core/gsmmodem.py @@ -2,6 +2,7 @@ import falcon import json import mysql.connector import config +from core.userlogger import user_logger class GSMModemCollection: @@ -37,6 +38,7 @@ class GSMModemCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -121,6 +123,7 @@ class GSMModemItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -147,6 +150,7 @@ class GSMModemItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/knowledgefile.py b/myems-api/core/knowledgefile.py index b0945cc3..43946971 100644 --- a/myems-api/core/knowledgefile.py +++ b/myems-api/core/knowledgefile.py @@ -7,6 +7,7 @@ from datetime import datetime, timezone, timedelta import os import base64 import sys +from core.userlogger import user_logger class KnowledgeFileCollection: @@ -75,6 +76,7 @@ class KnowledgeFileCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" @@ -230,6 +232,7 @@ class KnowledgeFileItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, diff --git a/myems-api/core/menu.py b/myems-api/core/menu.py index 0d4a3ab4..7c029a12 100644 --- a/myems-api/core/menu.py +++ b/myems-api/core/menu.py @@ -2,6 +2,7 @@ import falcon import simplejson as json import mysql.connector import config +from core.userlogger import user_logger class MenuCollection: @@ -79,6 +80,7 @@ class MenuItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/meter.py b/myems-api/core/meter.py index 19ff22d1..8c792f69 100644 --- a/myems-api/core/meter.py +++ b/myems-api/core/meter.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class MeterCollection: @@ -101,6 +102,7 @@ class MeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -369,6 +371,7 @@ class MeterItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -545,6 +548,7 @@ class MeterItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: @@ -891,6 +895,7 @@ class MeterPointCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -958,6 +963,7 @@ class MeterPointItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, pid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/notification.py b/myems-api/core/notification.py index 7193ae63..e0c36051 100644 --- a/myems-api/core/notification.py +++ b/myems-api/core/notification.py @@ -3,6 +3,7 @@ import json import mysql.connector import config from datetime import datetime, timedelta, timezone +from core.userlogger import user_logger class NotificationCollection: @@ -243,6 +244,7 @@ class NotificationItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: @@ -340,6 +342,7 @@ class NotificationItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/offlinemeter.py b/myems-api/core/offlinemeter.py index bd5806d1..779dedaa 100644 --- a/myems-api/core/offlinemeter.py +++ b/myems-api/core/offlinemeter.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class OfflineMeterCollection: @@ -87,6 +88,7 @@ class OfflineMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -314,6 +316,7 @@ class OfflineMeterItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -468,6 +471,7 @@ class OfflineMeterItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/offlinemeterfile.py b/myems-api/core/offlinemeterfile.py index d40e90c1..e992c9d8 100644 --- a/myems-api/core/offlinemeterfile.py +++ b/myems-api/core/offlinemeterfile.py @@ -5,6 +5,7 @@ import config import uuid from datetime import datetime, timezone import os +from core.userlogger import user_logger class OfflineMeterFileCollection: @@ -45,6 +46,7 @@ class OfflineMeterFileCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -184,6 +186,7 @@ class OfflineMeterFileItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/point.py b/myems-api/core/point.py index 434b067d..d01a1348 100644 --- a/myems-api/core/point.py +++ b/myems-api/core/point.py @@ -2,6 +2,7 @@ import falcon import simplejson as json import mysql.connector import config +from core.userlogger import user_logger class PointCollection: @@ -60,6 +61,7 @@ class PointCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -251,6 +253,7 @@ class PointItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -389,6 +392,7 @@ class PointItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/privilege.py b/myems-api/core/privilege.py index 959cb1b0..096a4815 100644 --- a/myems-api/core/privilege.py +++ b/myems-api/core/privilege.py @@ -2,6 +2,7 @@ import falcon import simplejson as json import mysql.connector import config +from core.userlogger import user_logger class PrivilegeCollection: @@ -38,6 +39,7 @@ class PrivilegeCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -97,6 +99,7 @@ class PrivilegeItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -136,6 +139,7 @@ class PrivilegeItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/rule.py b/myems-api/core/rule.py index f6357503..e2db14d1 100644 --- a/myems-api/core/rule.py +++ b/myems-api/core/rule.py @@ -2,8 +2,9 @@ import falcon import json import mysql.connector import uuid -from datetime import datetime, timezone, timedelta +from datetime import timezone import config +from core.userlogger import user_logger class RuleCollection: @@ -56,6 +57,7 @@ class RuleCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -221,6 +223,7 @@ class RuleItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -248,6 +251,7 @@ class RuleItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/sensor.py b/myems-api/core/sensor.py index 068d63f7..8bc4b428 100644 --- a/myems-api/core/sensor.py +++ b/myems-api/core/sensor.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class SensorCollection: @@ -40,6 +41,7 @@ class SensorCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -129,6 +131,7 @@ class SensorItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -203,6 +206,7 @@ class SensorItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: @@ -313,6 +317,7 @@ class SensorPointCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -380,6 +385,7 @@ class SensorPointItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, pid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/shopfloor.py b/myems-api/core/shopfloor.py index ac4ca2b6..388cbb64 100644 --- a/myems-api/core/shopfloor.py +++ b/myems-api/core/shopfloor.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class ShopfloorCollection: @@ -84,6 +85,7 @@ class ShopfloorCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -274,6 +276,7 @@ class ShopfloorItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -393,6 +396,7 @@ class ShopfloorItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: @@ -557,6 +561,7 @@ class ShopfloorEquipmentCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -631,6 +636,7 @@ class ShopfloorEquipmentItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, eid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -738,6 +744,7 @@ class ShopfloorMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -812,6 +819,7 @@ class ShopfloorMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -918,6 +926,7 @@ class ShopfloorOfflineMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -992,6 +1001,7 @@ class ShopfloorOfflineMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1098,6 +1108,7 @@ class ShopfloorPointCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1172,6 +1183,7 @@ class ShopfloorPointItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, pid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1265,6 +1277,7 @@ class ShopfloorSensorCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1339,6 +1352,7 @@ class ShopfloorSensorItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, sid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1445,6 +1459,7 @@ class ShopfloorVirtualMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1519,6 +1534,7 @@ class ShopfloorVirtualMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/space.py b/myems-api/core/space.py index e2253e33..36f8d988 100644 --- a/myems-api/core/space.py +++ b/myems-api/core/space.py @@ -6,6 +6,7 @@ import uuid from datetime import datetime from anytree import AnyNode from anytree.exporter import JsonExporter +from core.userlogger import user_logger class SpaceCollection: @@ -104,6 +105,7 @@ class SpaceCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -356,6 +358,7 @@ class SpaceItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -512,6 +515,7 @@ class SpaceItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: @@ -854,6 +858,7 @@ class SpaceCombinedEquipmentCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -928,6 +933,7 @@ class SpaceCombinedEquipmentItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, eid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1021,6 +1027,7 @@ class SpaceEquipmentCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1095,6 +1102,7 @@ class SpaceEquipmentItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, eid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1201,6 +1209,7 @@ class SpaceMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1275,6 +1284,7 @@ class SpaceMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1383,6 +1393,7 @@ class SpaceOfflineMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1457,6 +1468,7 @@ class SpaceOfflineMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1563,6 +1575,7 @@ class SpacePointCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1637,6 +1650,7 @@ class SpacePointItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, pid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1730,6 +1744,7 @@ class SpaceSensorCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1804,6 +1819,7 @@ class SpaceSensorItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, sid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1896,6 +1912,7 @@ class SpaceShopfloorCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1970,6 +1987,7 @@ class SpaceShopfloorItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, sid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -2062,6 +2080,7 @@ class SpaceStoreCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -2136,6 +2155,7 @@ class SpaceStoreItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, tid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -2228,6 +2248,7 @@ class SpaceTenantCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -2302,6 +2323,7 @@ class SpaceTenantItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, tid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -2408,6 +2430,7 @@ class SpaceVirtualMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -2482,6 +2505,7 @@ class SpaceVirtualMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/store.py b/myems-api/core/store.py index 91d58a27..c48d9c16 100644 --- a/myems-api/core/store.py +++ b/myems-api/core/store.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class StoreCollection: @@ -90,6 +91,7 @@ class StoreCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -326,6 +328,7 @@ class StoreItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -429,6 +432,7 @@ class StoreItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: @@ -647,6 +651,7 @@ class StoreMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -721,6 +726,7 @@ class StoreMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -827,6 +833,7 @@ class StoreOfflineMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -901,6 +908,7 @@ class StoreOfflineMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1007,6 +1015,7 @@ class StorePointCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1081,6 +1090,7 @@ class StorePointItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, pid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1174,6 +1184,7 @@ class StoreSensorCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1248,6 +1259,7 @@ class StoreSensorItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, sid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1354,6 +1366,7 @@ class StoreVirtualMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1428,6 +1441,7 @@ class StoreVirtualMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/storetype.py b/myems-api/core/storetype.py index dd7c05d2..675cb01e 100644 --- a/myems-api/core/storetype.py +++ b/myems-api/core/storetype.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class StoreTypeCollection: @@ -38,6 +39,7 @@ class StoreTypeCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -146,6 +148,7 @@ class StoreTypeItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -182,6 +185,7 @@ class StoreTypeItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/tariff.py b/myems-api/core/tariff.py index 54224965..33889c21 100644 --- a/myems-api/core/tariff.py +++ b/myems-api/core/tariff.py @@ -4,6 +4,7 @@ import mysql.connector import config import uuid from datetime import datetime, timedelta, timezone +from core.userlogger import user_logger class TariffCollection: @@ -92,6 +93,7 @@ class TariffCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -294,6 +296,7 @@ class TariffItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -350,6 +353,7 @@ class TariffItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/tenant.py b/myems-api/core/tenant.py index 6878e3c9..385aa1b0 100644 --- a/myems-api/core/tenant.py +++ b/myems-api/core/tenant.py @@ -4,6 +4,7 @@ import mysql.connector import config import uuid from datetime import datetime, timedelta, timezone +from core.userlogger import user_logger class TenantCollection: @@ -101,6 +102,7 @@ class TenantCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -383,6 +385,7 @@ class TenantItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -486,6 +489,7 @@ class TenantItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: @@ -744,6 +748,7 @@ class TenantMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -818,6 +823,7 @@ class TenantMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -924,6 +930,7 @@ class TenantOfflineMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -998,6 +1005,7 @@ class TenantOfflineMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1104,6 +1112,7 @@ class TenantPointCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1178,6 +1187,7 @@ class TenantPointItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, pid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1271,6 +1281,7 @@ class TenantSensorCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1345,6 +1356,7 @@ class TenantSensorItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, sid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -1451,6 +1463,7 @@ class TenantVirtualMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp, id_): """Handles POST requests""" try: @@ -1525,6 +1538,7 @@ class TenantVirtualMeterItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_, mid): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/tenanttype.py b/myems-api/core/tenanttype.py index f490c98d..c7b63f87 100644 --- a/myems-api/core/tenanttype.py +++ b/myems-api/core/tenanttype.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class TenantTypeCollection: @@ -38,6 +39,7 @@ class TenantTypeCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -146,6 +148,7 @@ class TenantTypeItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -182,6 +185,7 @@ class TenantTypeItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/textmessage.py b/myems-api/core/textmessage.py index 17c596cf..12016b39 100644 --- a/myems-api/core/textmessage.py +++ b/myems-api/core/textmessage.py @@ -3,6 +3,7 @@ import json import mysql.connector import config from datetime import datetime, timedelta, timezone +from core.userlogger import user_logger class TextMessageCollection: @@ -142,6 +143,7 @@ class TextMessageItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/timezone.py b/myems-api/core/timezone.py index cbcf5885..a9f3551e 100644 --- a/myems-api/core/timezone.py +++ b/myems-api/core/timezone.py @@ -2,6 +2,7 @@ import falcon import simplejson as json import mysql.connector import config +from core.userlogger import user_logger class TimezoneCollection: @@ -73,6 +74,7 @@ class TimezoneItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/user.py b/myems-api/core/user.py index b56700f3..4be6931e 100644 --- a/myems-api/core/user.py +++ b/myems-api/core/user.py @@ -7,6 +7,7 @@ import hashlib import re import os from datetime import datetime, timedelta +from core.userlogger import user_logger class UserCollection: @@ -51,6 +52,7 @@ class UserCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -197,6 +199,7 @@ class UserItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -224,6 +227,7 @@ class UserItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: @@ -348,6 +352,7 @@ class UserLogin: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_put(req, resp): """Handles PUT requests""" try: @@ -463,6 +468,7 @@ class UserLogout: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_put(req, resp): """Handles PUT requests""" @@ -512,6 +518,7 @@ class ChangePassword: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_put(req, resp): """Handles PUT requests""" if 'USER-UUID' not in req.headers or \ @@ -627,6 +634,7 @@ class ResetPassword: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_put(req, resp): """Handles PUT requests""" if 'USER-UUID' not in req.headers or \ diff --git a/myems-api/core/virtualmeter.py b/myems-api/core/virtualmeter.py index e7f55020..a4cc5e66 100644 --- a/myems-api/core/virtualmeter.py +++ b/myems-api/core/virtualmeter.py @@ -3,6 +3,7 @@ import simplejson as json import mysql.connector import config import uuid +from core.userlogger import user_logger class VirtualMeterCollection: @@ -145,6 +146,7 @@ class VirtualMeterCollection: resp.body = json.dumps(result) @staticmethod + @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -503,6 +505,7 @@ class VirtualMeterItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -668,6 +671,7 @@ class VirtualMeterItem: resp.status = falcon.HTTP_204 @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: diff --git a/myems-api/core/webmessage.py b/myems-api/core/webmessage.py index c1d72f13..4dd605ad 100644 --- a/myems-api/core/webmessage.py +++ b/myems-api/core/webmessage.py @@ -3,6 +3,7 @@ import json import mysql.connector import config from datetime import datetime, timedelta, timezone +from core.userlogger import user_logger class WebMessageCollection: @@ -229,6 +230,7 @@ class WebMessageItem: resp.body = json.dumps(meta_result) @staticmethod + @user_logger def on_put(req, resp, id_): """Handles PUT requests""" try: @@ -283,6 +285,7 @@ class WebMessageItem: resp.status = falcon.HTTP_200 @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', diff --git a/myems-api/core/wechatmessage.py b/myems-api/core/wechatmessage.py index 884b8058..4a6a4826 100644 --- a/myems-api/core/wechatmessage.py +++ b/myems-api/core/wechatmessage.py @@ -3,6 +3,7 @@ import json import mysql.connector import config from datetime import datetime, timedelta, timezone +from core.userlogger import user_logger class WechatMessageCollection(object): @@ -124,6 +125,7 @@ class WechatMessageItem: resp.body = json.dumps(result) @staticmethod + @user_logger def on_delete(req, resp, id_): if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', From b7b8f78ba142ed52cf5186fc27bdbf393e83299d Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 27 Aug 2021 18:19:17 +0800 Subject: [PATCH 08/87] removed user_logger decorators from some actions in API --- myems-api/core/user.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/myems-api/core/user.py b/myems-api/core/user.py index 4be6931e..5f2b5644 100644 --- a/myems-api/core/user.py +++ b/myems-api/core/user.py @@ -52,7 +52,6 @@ class UserCollection: resp.body = json.dumps(result) @staticmethod - @user_logger def on_post(req, resp): """Handles POST requests""" try: @@ -352,7 +351,6 @@ class UserLogin: resp.status = falcon.HTTP_200 @staticmethod - @user_logger def on_put(req, resp): """Handles PUT requests""" try: @@ -518,7 +516,6 @@ class ChangePassword: resp.status = falcon.HTTP_200 @staticmethod - @user_logger def on_put(req, resp): """Handles PUT requests""" if 'USER-UUID' not in req.headers or \ @@ -634,7 +631,6 @@ class ResetPassword: resp.status = falcon.HTTP_200 @staticmethod - @user_logger def on_put(req, resp): """Handles PUT requests""" if 'USER-UUID' not in req.headers or \ From 5858943cd7b03955866e05f0ec4f3898530aae92 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 27 Aug 2021 18:29:25 +0800 Subject: [PATCH 09/87] fixed typo in userlogger of API --- myems-api/core/userlogger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/myems-api/core/userlogger.py b/myems-api/core/userlogger.py index 0e48a0c8..718f700c 100644 --- a/myems-api/core/userlogger.py +++ b/myems-api/core/userlogger.py @@ -89,7 +89,7 @@ def user_logger(func): with open(file_name, "rb") as fr: req.stream = Body(fr) func(*args, **kwargs) - write_log(user_uuid=user_uuid, request_method="POST", resource_type=class_name, + write_log(user_uuid=user_uuid, request_method='PUT', resource_type=class_name, resource_id=kwargs.get('id_'), request_body=raw_json) os.remove(file_name) except Exception as e: From 74c847e657d873ce689d827e03b6ffe72800a354 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 27 Aug 2021 18:50:08 +0800 Subject: [PATCH 10/87] fixed typos in API --- myems-api/core/combinedequipment.py | 2 +- myems-api/core/energyflowdiagram.py | 4 ++-- myems-api/core/equipment.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/myems-api/core/combinedequipment.py b/myems-api/core/combinedequipment.py index 453f1d0b..5ba29a9b 100644 --- a/myems-api/core/combinedequipment.py +++ b/myems-api/core/combinedequipment.py @@ -1179,7 +1179,7 @@ class CombinedEquipmentParameterItem: @staticmethod @user_logger def on_put(req, resp, id_, pid): - """Handles POST requests""" + """Handles PUT requests""" if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_COMBINED_EQUIPMENT_ID') diff --git a/myems-api/core/energyflowdiagram.py b/myems-api/core/energyflowdiagram.py index a2e89f61..e412f344 100644 --- a/myems-api/core/energyflowdiagram.py +++ b/myems-api/core/energyflowdiagram.py @@ -767,7 +767,7 @@ class EnergyFlowDiagramLinkItem: @staticmethod @user_logger def on_put(req, resp, id_, lid): - """Handles POST requests""" + """Handles PUT requests""" if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') @@ -1116,7 +1116,7 @@ class EnergyFlowDiagramNodeItem: @staticmethod @user_logger def on_put(req, resp, id_, nid): - """Handles POST requests""" + """Handles PUT requests""" if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') diff --git a/myems-api/core/equipment.py b/myems-api/core/equipment.py index 6d787151..0560d5b3 100644 --- a/myems-api/core/equipment.py +++ b/myems-api/core/equipment.py @@ -1023,7 +1023,7 @@ class EquipmentParameterItem: @staticmethod @user_logger def on_put(req, resp, id_, pid): - """Handles POST requests""" + """Handles PUT requests""" if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_EQUIPMENT_ID') From 25b42b9c8a9edb87adc1b8af36a0a01786eda119 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sat, 28 Aug 2021 11:26:26 +0800 Subject: [PATCH 11/87] added user log to UserLogin, ChangePassword and ResetPassword in API --- myems-api/core/user.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/myems-api/core/user.py b/myems-api/core/user.py index 5f2b5644..b78b5d3f 100644 --- a/myems-api/core/user.py +++ b/myems-api/core/user.py @@ -7,7 +7,7 @@ import hashlib import re import os from datetime import datetime, timedelta -from core.userlogger import user_logger +from core.userlogger import user_logger, write_log class UserCollection: @@ -22,6 +22,7 @@ class UserCollection: @staticmethod def on_get(req, resp): + # todo: add access control cnx = mysql.connector.connect(**config.myems_user_db) cursor = cnx.cursor() @@ -54,6 +55,8 @@ class UserCollection: @staticmethod def on_post(req, resp): """Handles POST requests""" + # todo: add access control + # todo: add user log try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -171,6 +174,7 @@ class UserItem: @staticmethod def on_get(req, resp, id_): + # todo: add access control if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_USER_ID') @@ -453,6 +457,8 @@ class UserLogin: resp.body = json.dumps(result) resp.status = falcon.HTTP_200 + write_log(user_uuid=user_uuid, request_method='PUT', resource_type='UserLogin', + resource_id=None, request_body=None) class UserLogout: @@ -618,6 +624,8 @@ class ChangePassword: cnx.disconnect() resp.body = json.dumps("OK") resp.status = falcon.HTTP_200 + write_log(user_uuid=user_uuid, request_method='PUT', resource_type='ChangePassword', + resource_id=None, request_body=None) class ResetPassword: @@ -708,6 +716,18 @@ class ResetPassword: cursor.execute(update_user, (salt, hashed_password, user_name,)) cnx.commit() + query = (" SELECT id " + " FROM tbl_users " + " WHERE name = %s ") + cursor.execute(query, (user_name,)) + row = cursor.fetchone() + if row is None: + cursor.close() + cnx.disconnect() + raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.INVALID_USERNAME') + + user_id = row[0] + # Refresh administrator session update_session = (" UPDATE tbl_sessions " " SET utc_expires = %s " @@ -720,3 +740,5 @@ class ResetPassword: cnx.disconnect() resp.body = json.dumps("OK") resp.status = falcon.HTTP_200 + write_log(user_uuid=admin_user_uuid, request_method='PUT', resource_type='ResetPassword', + resource_id=user_id, request_body=None) From 89c287148c4692be2087e0b858f03dd632e72804 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sat, 28 Aug 2021 13:32:38 +0800 Subject: [PATCH 12/87] updated README --- admin/README.md | 4 +- database/README.md | 2 +- myems-api/README.md | 792 ++++++++++++++++++++++---------------------- myems-api/config.py | 1 + 4 files changed, 403 insertions(+), 396 deletions(-) diff --git a/admin/README.md b/admin/README.md index 339d9a81..35d468f8 100644 --- a/admin/README.md +++ b/admin/README.md @@ -71,7 +71,7 @@ sudo nano /var/www/html/admin/app/api.js ## NOTE: The 'upload' folder is for user uploaded files. DO NOT delete/move/overwrite the 'upload' folder when you upgraded myems-admin. -``` +```bash /var/www/html/admin/upload ``` @@ -93,7 +93,7 @@ Listen 8001 sudo vi /etc/apache2/sites-available/000-default.conf ``` Add a new 'VirtualHost' as below -``` +```xml ServerAdmin MyEMS-admin DocumentRoot /var/www/admin diff --git a/database/README.md b/database/README.md index ef44e6de..731454c0 100644 --- a/database/README.md +++ b/database/README.md @@ -33,7 +33,7 @@ mysql -u root -p < demo/myems_system_db.sql ```bash sudo nano /etc/mysql/my.cnf ``` -``` +```bash [client] default-character-set = utf8mb4 [mysql] diff --git a/myems-api/README.md b/myems-api/README.md index b483234a..185d9a76 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -27,28 +27,28 @@ In this step, you will install myems-api on Ubuntu for production or development For macOS developers, please refer to [Installation on macOS (Chinese)](./installation_macos_zh.md) * Install anytree -``` -$ cd ~/tools -$ git clone https://github.com/c0fec0de/anytree.git -$ cd anytree -$ sudo python3 setup.py install +```bash +cd ~/tools +git clone https://github.com/c0fec0de/anytree.git +cd anytree +sudo python3 setup.py install ``` * Install simplejson -``` -$ cd ~/tools -$ git clone https://github.com/simplejson/simplejson.git -$ cd simplejson -$ sudo python3 setup.py install +```bash +cd ~/tools +git clone https://github.com/simplejson/simplejson.git +cd simplejson +sudo python3 setup.py install ``` * Install MySQL Connector -``` - $ cd ~/tools - $ wget https://dev.mysql.com/get/Downloads/Connector-Python/mysql-connector-python-8.0.20.tar.gz - $ tar xzf mysql-connector-python-8.0.20.tar.gz - $ cd ~/tools/mysql-connector-python-8.0.20 - $ sudo python3 setup.py install +```bash + cd ~/tools + wget https://dev.mysql.com/get/Downloads/Connector-Python/mysql-connector-python-8.0.20.tar.gz + tar xzf mysql-connector-python-8.0.20.tar.gz + cd ~/tools/mysql-connector-python-8.0.20 + sudo python3 setup.py install ``` * Install Falcon, @@ -62,20 +62,20 @@ $ sudo python3 setup.py install https://github.com/lwcolton/falcon-cors https://github.com/yohanboniface/falcon-multipart -``` - $ mkdir ~/tools/falcon && cd ~/tools/falcon - $ pip3 download cython falcon falcon-cors falcon-multipart - $ export LC_ALL="en_US.UTF-8" - $ export LC_CTYPE="en_US.UTF-8" - $ sudo dpkg-reconfigure locales - $ sudo pip3 install --upgrade --no-index --find-links ~/tools/falcon cython falcon falcon-cors falcon-multipart +```bash + mkdir ~/tools/falcon && cd ~/tools/falcon + pip3 download cython falcon falcon-cors falcon-multipart + export LC_ALL="en_US.UTF-8" + export LC_CTYPE="en_US.UTF-8" + sudo dpkg-reconfigure locales + sudo pip3 install --upgrade --no-index --find-links ~/tools/falcon cython falcon falcon-cors falcon-multipart ``` * Install gunicorn, refer to http://gunicorn.org -``` - $ mkdir ~/tools/gunicorn && cd ~/tools/gunicorn - $ pip3 download gunicorn - $ sudo pip3 install --no-index --find-links ~/tools/gunicorn gunicorn +```bash + mkdir ~/tools/gunicorn && cd ~/tools/gunicorn + pip3 download gunicorn + sudo pip3 install --no-index --find-links ~/tools/gunicorn gunicorn ``` * Install openpyxl, refer to https://foss.heptapod.net/openpyxl/openpyxl @@ -86,68 +86,74 @@ Get the latest version of jdcal from https://github.com/phn/jdcal Get the latest version of openpyxl from https://foss.heptapod.net/openpyxl/openpyxl -``` - $ cd ~/tools - $ wget https://foss.heptapod.net/openpyxl/et_xmlfile/-/archive/branch/default/et_xmlfile-branch-default.tar.gz - $ tar xzf et_xmlfile-branch-default.tar.gz - $ cd ~/tools/et_xmlfile-branch-default - $ sudo python3 setup.py install - $ cd ~/tools - $ git clone https://github.com/phn/jdcal.git - $ cd ~/tools/jdcal - $ sudo python3 setup.py install - $ mkdir ~/tools/pillow && cd ~/tools/pillow - $ pip3 download Pillow - $ sudo pip3 install --no-index --find-links ~/tools/pillow Pillow - $ cd ~/tools - $ wget https://foss.heptapod.net/openpyxl/openpyxl/-/archive/branch/3.0/openpyxl-branch-3.0.tar.gz - $ tar xzf openpyxl-branch-3.0.tar.gz - $ cd openpyxl-branch-3.0 - $ sudo python3 setup.py install +```bash + cd ~/tools + wget https://foss.heptapod.net/openpyxl/et_xmlfile/-/archive/branch/default/et_xmlfile-branch-default.tar.gz + tar xzf et_xmlfile-branch-default.tar.gz + cd ~/tools/et_xmlfile-branch-default + sudo python3 setup.py install + cd ~/tools + git clone https://github.com/phn/jdcal.git + cd ~/tools/jdcal + sudo python3 setup.py install + mkdir ~/tools/pillow && cd ~/tools/pillow + pip3 download Pillow + sudo pip3 install --no-index --find-links ~/tools/pillow Pillow + cd ~/tools + wget https://foss.heptapod.net/openpyxl/openpyxl/-/archive/branch/3.0/openpyxl-branch-3.0.tar.gz + tar xzf openpyxl-branch-3.0.tar.gz + cd openpyxl-branch-3.0 + sudo python3 setup.py install ``` * Download myems: -``` - $ cd ~ - $ git clone https://github.com/MyEMS/myems.git +```bash +cd ~ +git clone https://github.com/MyEMS/myems.git ``` * Install gunicorn service for myems-api: +```bash +cd ~/myems/myems-api +sudo cp -R ~/myems/myems-api /myems-api ``` - $ cd ~/myems/myems-api - $ sudo cp -R ~/myems/myems-api /myems-api -``` - Check and change the config file if necessary: -``` - $ sudo nano /myems-api/config.py + Change the config file: + + Note: change cookie domain to the actual domain or IP address of Web UI and Admin UI +```bash +sudo nano /myems-api/config.py ``` Change the listening port (default is 8000) in gunicorn.socket: +```bash +sudo nano /myems-api/myems-api.socket ``` - $ sudo nano /myems-api/myems-api.socket +```bash ListenStream=0.0.0.0:8000 - $ sudo ufw allow 8000 +``` +```bash +sudo ufw allow 8000 ``` Setup systemd configure files: -``` - $ sudo cp /myems-api/myems-api.service /lib/systemd/system/ - $ sudo cp /myems-api/myems-api.socket /lib/systemd/system/ - $ sudo cp /myems-api/myems-api.conf /usr/lib/tmpfiles.d/ +```bash + sudo cp /myems-api/myems-api.service /lib/systemd/system/ + sudo cp /myems-api/myems-api.socket /lib/systemd/system/ + sudo cp /myems-api/myems-api.conf /usr/lib/tmpfiles.d/ ``` Next enable the services so that they autostart at boot: -``` - $ sudo systemctl enable myems-api.socket - $ sudo systemctl enable myems-api.service +```bash + sudo systemctl enable myems-api.socket + sudo systemctl enable myems-api.service ``` Start the services : -``` - $ sudo systemctl start myems-api.socket - $ sudo systemctl start myems-api.service +```bash + sudo systemctl start myems-api.socket + sudo systemctl start myems-api.service ``` ## Run for debugging and testing -``` -$ cd myems-api -$ sudo gunicorn -b 127.0.0.1:8000 app:api +```bash +cd myems-api +sudo gunicorn -b 127.0.0.1:8000 app:api ``` ## API List @@ -188,30 +194,30 @@ View in Postman: import the file MyEMS.postman_collection.json with Postman ### Contact * GET Contact by ID ```bash -$ curl -i -X GET {{base_url}}/contacts/{id} +curl -i -X GET {{base_url}}/contacts/{id} ``` * GET All Contacts ```bash -$ curl -i -X GET {{base_url}}/contacts +curl -i -X GET {{base_url}}/contacts ``` * DELETE Contact by ID ```bash -$ curl -i -X DELETE {{base_url}}/contacts/{id} +curl -i -X DELETE {{base_url}}/contacts/{id} ``` * POST Create a New Contact ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"albert", "email":"albert@myems.io", "phone":"+8613888888888", "description":"contact description"}}' {{base_url}}/contacts +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"albert", "email":"albert@myems.io", "phone":"+8613888888888", "description":"contact description"}}' {{base_url}}/contacts ``` * PUT Update a Contact ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"albert", "email":"albert@myems.io", "phone":"+8613888888899", "description":"contact description"}}' {{base_url}}/contacts/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"albert", "email":"albert@myems.io", "phone":"+8613888888899", "description":"contact description"}}' {{base_url}}/contacts/{id} ``` ### Cost Center * GET Cost Center by ID ```bash -$ curl -i -X GET {{base_url}}/costcenters/{id} +curl -i -X GET {{base_url}}/costcenters/{id} ``` Result in JSON @@ -224,38 +230,38 @@ Result in JSON * GET all Cost Centers ```bash -$ curl -i -X GET {{base_url}}/costcenters +curl -i -X GET {{base_url}}/costcenters ``` * DELETE Cost Center by ID ```bash -$ curl -i -X DELETE {{base_url}}/costcenters/{id} +curl -i -X DELETE {{base_url}}/costcenters/{id} ``` * POST Create New Cost Center ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"动力中心", "external_id":"21829198980001"}}' {{base_url}}/costcenters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"动力中心", "external_id":"21829198980001"}}' {{base_url}}/costcenters ``` * PUT Update a Cost Center ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"动力中心2", "external_id":"21829198980002"}}' {{base_url}}/costcenters/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"动力中心2", "external_id":"21829198980002"}}' {{base_url}}/costcenters/{id} ``` * GET All Tariffs associated with Cost Center ID ```bash -$ curl -i -X GET {{base_url}}/costcenters/{id}/tariffs +curl -i -X GET {{base_url}}/costcenters/{id}/tariffs ``` * POST Create a Cost Center and Tariff Relation ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"tariff_id":"3"}}' {{base_url}}/costcenters/{id}/tariffs +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"tariff_id":"3"}}' {{base_url}}/costcenters/{id}/tariffs ``` * DELETE a Cost Center and Tariff Relation by tid ```bash -$ curl -i -X DELETE {{base_url}}/costcenters/{id}/tariffs/{tid} +curl -i -X DELETE {{base_url}}/costcenters/{id}/tariffs/{tid} ``` ### Cost File * GET an Cost File by ID ```bash -$ curl -i -X GET {{base_url}}/costfiles/{id} +curl -i -X GET {{base_url}}/costfiles/{id} ``` Result @@ -270,27 +276,27 @@ Result * GET All Cost Files ```bash -$ curl -i -X GET {{base_url}}/costfiles +curl -i -X GET {{base_url}}/costfiles ``` * DELETE a Cost File by ID ```bash -$ curl -i -X DELETE {{base_url}}/costfiles/{id} +curl -i -X DELETE {{base_url}}/costfiles/{id} ``` * POST Upload a Cost File (user must login first to get cookie) ```bash -$ curl -i -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/costfiles +curl -i -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/costfiles ``` * GET Restore a Cost File by ID from database to disk ```bash -$ curl -i -X GET {{base_url}}/costfiles/{id}/restore +curl -i -X GET {{base_url}}/costfiles/{id}/restore ``` ### Data Source * GET Data Source by ID ```bash -$ curl -i -X GET {{base_url}}/datasources/{id} +curl -i -X GET {{base_url}}/datasources/{id} ``` Result in JSON @@ -307,30 +313,30 @@ Result in JSON * GET all Data Sources ```bash -$ curl -i -X GET {{base_url}}/datasources +curl -i -X GET {{base_url}}/datasources ``` * DELETE Data Source by ID ```bash -$ curl -i -X DELETE {{base_url}}/datasources/{id} +curl -i -X DELETE {{base_url}}/datasources/{id} ``` * POST Data Source ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Modbus1", "gateway_id":1, "protocol":"modbus-tcp", "connection":"{\"host\":\"10.1.2.88\", \"port\":502}"}}' {{base_url}}/datasources +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Modbus1", "gateway_id":1, "protocol":"modbus-tcp", "connection":"{\"host\":\"10.1.2.88\", \"port\":502}"}}' {{base_url}}/datasources ``` * PUT Data Source ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Modbus1", "gateway_id":1, "protocol":"modbus-tcp", "connection":"{\"host\":\"10.1.2.99\", \"port\":502}"}}' {{base_url}}/datasources/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Modbus1", "gateway_id":1, "protocol":"modbus-tcp", "connection":"{\"host\":\"10.1.2.99\", \"port\":502}"}}' {{base_url}}/datasources/{id} ``` * GET all points of the Data Source by ID ```bash -$ curl -i -X GET {{base_url}}/datasources/{id}/points +curl -i -X GET {{base_url}}/datasources/{id}/points ``` ### Distribution Circuit * GET Distribution Circuit by ID ```bash -$ curl -i -X GET {{base_url}}/distributioncircuits/{id} +curl -i -X GET {{base_url}}/distributioncircuits/{id} ``` Result in JSON @@ -349,38 +355,38 @@ Result in JSON * GET all Distribution Circuits ```bash -$ curl -i -X GET {{base_url}}/distributioncircuits +curl -i -X GET {{base_url}}/distributioncircuits ``` * DELETE a Distribution Circuit by ID ```bash -$ curl -i -X DELETE {{base_url}}/distributioncircuits/{id} +curl -i -X DELETE {{base_url}}/distributioncircuits/{id} ``` * POST Create new Distribution Circuit ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"51W91", "distribution_system_id":1, "distribution_room":"EW1", "switchgear":"51AL9", "peak_load": 30, "peak_current": 53.6, "customers": "地下室应急照明", "meters": "ALE-1102, ALE-1082"}}' {{base_url}}/distributioncircuits +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"51W91", "distribution_system_id":1, "distribution_room":"EW1", "switchgear":"51AL9", "peak_load": 30, "peak_current": 53.6, "customers": "地下室应急照明", "meters": "ALE-1102, ALE-1082"}}' {{base_url}}/distributioncircuits ``` * PUT Update a Distribution Circuit ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"51W92", "distribution_system_id":1, "distribution_room":"EW1", "switchgear":"51AL9", "peak_load": 30, "peak_current": 53.6, "customers": "地下室应急照明", "meters": "ALE-1102, ALE-1082"}}' {{base_url}}/distributioncircuits/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"51W92", "distribution_system_id":1, "distribution_room":"EW1", "switchgear":"51AL9", "peak_load": 30, "peak_current": 53.6, "customers": "地下室应急照明", "meters": "ALE-1102, ALE-1082"}}' {{base_url}}/distributioncircuits/{id} ``` * GET All Points associated with Distribution Circuit ID ```bash -$ curl -i -X GET {{base_url}}/distributioncircuits/{id}/points +curl -i -X GET {{base_url}}/distributioncircuits/{id}/points ``` * POST Bind Point to Distribution Circuit ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/distributioncircuits/{id}/points +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/distributioncircuits/{id}/points ``` * DELETE Unbind Point from Distribution Circuit ```bash -$ curl -i -X DELETE {{base_url}}/distributioncircuits/{id}/points/{pid} +curl -i -X DELETE {{base_url}}/distributioncircuits/{id}/points/{pid} ``` ### Distribution System * GET Distribution System by ID ```bash -$ curl -i -X GET {{base_url}}/distributionsystems/{id} +curl -i -X GET {{base_url}}/distributionsystems/{id} ``` Result in JSON @@ -394,23 +400,23 @@ Result in JSON * GET all Distribution Systems ```bash -$ curl -i -X GET {{base_url}}/distributionsystems +curl -i -X GET {{base_url}}/distributionsystems ``` * DELETE a Distribution System by ID ```bash -$ curl -i -X DELETE {{base_url}}/distributionsystems/{id} +curl -i -X DELETE {{base_url}}/distributionsystems/{id} ``` * POST Create new Distribution System ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"示例配电系统", "svg":"Four separate rectangles", "description":"demo description"}}' {{base_url}}/distributionsystems +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"示例配电系统", "svg":"Four separate rectangles", "description":"demo description"}}' {{base_url}}/distributionsystems ``` * PUT Update a Distribution System ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"示例配电系统", "svg":"Four separate rectangles", "description":"demo description"}}' {{base_url}}/distributionsystems/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"示例配电系统", "svg":"Four separate rectangles", "description":"demo description"}}' {{base_url}}/distributionsystems/{id} ``` * GET All Distribution Circuits associated with Distribution Circuit ```bash -$ curl -i -X GET {{base_url}}/distributionsystems/{id}/distributioncircuits +curl -i -X GET {{base_url}}/distributionsystems/{id}/distributioncircuits ``` ### Email Message @@ -431,22 +437,22 @@ Result in JSON | status | string | Status ('new', 'sent', 'timeout' | ```bash -$ curl -i -X GET {{base_url}}/emailmessages/{id} +curl -i -X GET {{base_url}}/emailmessages/{id} ``` * GET Email Messages from Startdate to Enddate ```bash -$ curl -i -X GET {{base_url}}/emailmessages/from/{startdate}/to/{enddate} +curl -i -X GET {{base_url}}/emailmessages/from/{startdate}/to/{enddate} ``` * DELETE an Email Message by ID ```bash -$ curl -i -X DELETE {{base_url}}/emailmessages/{id} +curl -i -X DELETE {{base_url}}/emailmessages/{id} ``` ### Email Server * GET an Email Server by ID ```bash -$ curl -i -X GET {{base_url}}/emailservers/{id} +curl -i -X GET {{base_url}}/emailservers/{id} ``` Result in JSON @@ -462,26 +468,26 @@ Result in JSON * GET All Email Servers ```bash -$ curl -i -X GET {{base_url}}/emailservers +curl -i -X GET {{base_url}}/emailservers ``` * DELETE an Email Server by ID ```bash -$ curl -i -X DELETE {{base_url}}/emailservers/{id} +curl -i -X DELETE {{base_url}}/emailservers/{id} ``` * POST Create New Email Server ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"host":"smtp.163.com","port":25, "requires_authentication":true, "user_name":"myems" , "password":"!MyEMS1" , "from_addr":"myems@163.com"}}' {{base_url}}/emailservers +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"host":"smtp.163.com","port":25, "requires_authentication":true, "user_name":"myems" , "password":"!MyEMS1" , "from_addr":"myems@163.com"}}' {{base_url}}/emailservers ``` * PUT Update an Email Server ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"host":"smtp.myems.io","port":25, "requires_authentication":true, "user_name":"myems" , "password":"!MyEMS1" , "from_addr":"myems@myems.io"}}' {{base_url}}/emailservers/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"host":"smtp.myems.io","port":25, "requires_authentication":true, "user_name":"myems" , "password":"!MyEMS1" , "from_addr":"myems@myems.io"}}' {{base_url}}/emailservers/{id} ``` ### Energy Category * GET an Energy Category by ID ```bash -$ curl -i -X GET {{base_url}}/energycategories/{id} +curl -i -X GET {{base_url}}/energycategories/{id} ``` Result in JSON @@ -497,25 +503,25 @@ Result in JSON * GET All Energy Categories ```bash -$ curl -i -X GET {{base_url}}/energycategories +curl -i -X GET {{base_url}}/energycategories ``` * DELETE an Energy Category by ID ```bash -$ curl -i -X DELETE {{base_url}}/energycategories/{id} +curl -i -X DELETE {{base_url}}/energycategories/{id} ``` * POST Create an Energy Category ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"电","unit_of_measure":"kWh", "kgce":0.1229 , "kgco2e":0.8825}}' {{base_url}}/energycategories +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"电","unit_of_measure":"kWh", "kgce":0.1229 , "kgco2e":0.8825}}' {{base_url}}/energycategories ``` * PUT Update an Energy Category ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"电","unit_of_measure":"kWh", "kgce":0.1329 , "kgco2e":0.9825}}' {{base_url}}/energycategories/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"电","unit_of_measure":"kWh", "kgce":0.1329 , "kgco2e":0.9825}}' {{base_url}}/energycategories/{id} ``` ### Energy Flow Diagram * GET an Energy Flow Diagram by ID ```bash -$ curl -i -X GET {{base_url}}/energyflowdiagrams/{id} +curl -i -X GET {{base_url}}/energyflowdiagrams/{id} ``` Result @@ -527,58 +533,58 @@ Result * GET All Energy Flow Diagrams ```bash -$ curl -i -X GET {{base_url}}/energyflowdiagrams +curl -i -X GET {{base_url}}/energyflowdiagrams ``` * DELETE an Energy Flow Diagram by ID ```bash -$ curl -i -X DELETE {{base_url}}/energyflowdiagrams/{id} +curl -i -X DELETE {{base_url}}/energyflowdiagrams/{id} ``` * POST Create an Energy Flow Diagram ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Energy Flow"}}' {{base_url}}/energyflowdiagrams +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Energy Flow"}}' {{base_url}}/energyflowdiagrams ``` * PUT Update an Energy Flow Diagram ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Energy Flow Diagram"}}' {{base_url}}/energyflowdiagrams/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Energy Flow Diagram"}}' {{base_url}}/energyflowdiagrams/{id} ``` * GET All Nodes of an Energy Flow Diagram by ID ```bash -$ curl -i -X GET {{base_url}}/energyflowdiagrams/{id}/nodes +curl -i -X GET {{base_url}}/energyflowdiagrams/{id}/nodes ``` * POST Create a Node of an Energy Flow Diagram ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"10KV#1"}}' {{base_url}}/energyflowdiagrams/{id}/nodes +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"10KV#1"}}' {{base_url}}/energyflowdiagrams/{id}/nodes ``` * PUT Update a Node of an Energy Flow Diagram ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"10KV#2"}}' {{base_url}}/energyflowdiagrams/{id}/nodes/{nid} +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"10KV#2"}}' {{base_url}}/energyflowdiagrams/{id}/nodes/{nid} ``` * DELETE a Node of an Energy Flow Diagram ```bash -$ curl -i -X DELETE {{base_url}}/energyflowdiagrams/{id}/nodes/{nid} +curl -i -X DELETE {{base_url}}/energyflowdiagrams/{id}/nodes/{nid} ``` * GET All Links of an Energy Flow Diagram by ID ```bash -$ curl -i -X GET {{base_url}}/energyflowdiagrams/{id}/links +curl -i -X GET {{base_url}}/energyflowdiagrams/{id}/links ``` * POST Create a Link of an Energy Flow Diagram ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"source_node_id":1, "target_node_id":3, "meter_uuid":"d806a78d-a31e-4833-b5c8-81261cfeb1f2"}}' {{base_url}}/energyflowdiagrams/{id}/links +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"source_node_id":1, "target_node_id":3, "meter_uuid":"d806a78d-a31e-4833-b5c8-81261cfeb1f2"}}' {{base_url}}/energyflowdiagrams/{id}/links ``` * PUT Update a Link of an Energy Flow Diagram ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"source_node_id":1, "target_node_id":4, "meter_uuid":"d806a78d-a31e-4833-b5c8-81261cfeb1f2"}}' {{base_url}}/energyflowdiagrams/{id}/links/{lid} +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"source_node_id":1, "target_node_id":4, "meter_uuid":"d806a78d-a31e-4833-b5c8-81261cfeb1f2"}}' {{base_url}}/energyflowdiagrams/{id}/links/{lid} ``` * DELETE a Link of an Energy Flow Diagram ```bash -$ curl -i -X DELETE {{base_url}}/energyflowdiagrams/{id}/links/{lid} +curl -i -X DELETE {{base_url}}/energyflowdiagrams/{id}/links/{lid} ``` ### Energy Item * GET an Energy Item by ID ```bash -$ curl -i -X GET {{base_url}}/energyitems/{id} +curl -i -X GET {{base_url}}/energyitems/{id} ``` Result in JSON @@ -592,25 +598,25 @@ Result in JSON * GET All Energy Items ```bash -$ curl -i -X GET {{base_url}}/energyitems +curl -i -X GET {{base_url}}/energyitems ``` * DELETE an Energy Item by ID ```bash -$ curl -i -X DELETE {{base_url}}/energyitems/{id} +curl -i -X DELETE {{base_url}}/energyitems/{id} ``` * POST Create an Energy Item ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"空调用电","energy_category_id":1}}' {{base_url}}/energyitems +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"空调用电","energy_category_id":1}}' {{base_url}}/energyitems ``` * PUT Update an Energy Item ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"动力用电","energy_category_id":1}}' {{base_url}}/energyitems/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"动力用电","energy_category_id":1}}' {{base_url}}/energyitems/{id} ``` ### Equipment * GET Equipment by ID ```bash -$ curl -i -X GET {{base_url}}/equipments/{id} +curl -i -X GET {{base_url}}/equipments/{id} ``` Result @@ -626,43 +632,43 @@ Result * GET All Equipments ```bash -$ curl -i -X GET {{base_url}}/equipments +curl -i -X GET {{base_url}}/equipments ``` * DELETE an Equipment by ID ```bash -$ curl -i -X DELETE {{base_url}}/equipments/{id} +curl -i -X DELETE {{base_url}}/equipments/{id} ``` * POST Create an Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Chiller", "is_input_counted":true, "is_output_counted":false, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/equipments +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Chiller", "is_input_counted":true, "is_output_counted":false, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/equipments ``` * PUT Update an Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Chiller", "is_input_counted":true, "is_output_counted":true, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/equipments/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Chiller", "is_input_counted":true, "is_output_counted":true, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/equipments/{id} ``` * POST Clone an Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{}}' {{base_url}}/equipments/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{}}' {{base_url}}/equipments/{id} ``` * GET All Meters of an Equipment by ID ```bash -$ curl -i -X GET {{base_url}}/equipments/{id}/meters +curl -i -X GET {{base_url}}/equipments/{id}/meters ``` * POST Bind a Meter to an Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/equipments/{id}/meters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/equipments/{id}/meters ``` * DELETE a Meter from an Equipment ```bash -$ curl -i -X DELETE {{base_url}}/equipments/{id}/meters/{mid} +curl -i -X DELETE {{base_url}}/equipments/{id}/meters/{mid} ``` * GET All Parameters of an Equipment by ID ```bash -$ curl -i -X GET {{base_url}}/equipments/{id}/parameters +curl -i -X GET {{base_url}}/equipments/{id}/parameters ``` * GET a Parameter of an Equipment by ID ```bash -$ curl -i -X GET {{base_url}}/equipments/{id}/parameters/{pid} +curl -i -X GET {{base_url}}/equipments/{id}/parameters/{pid} ``` Result @@ -680,49 +686,49 @@ Result * POST Create a constant Parameter for an Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"constant", "constant":"test constant", "point_id":null, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/equipments/{id}/parameters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"constant", "constant":"test constant", "point_id":null, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/equipments/{id}/parameters ``` * POST Create a point Parameter for an Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"point", "constant":null, "point_id":1, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/equipments/{id}/parameters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"point", "constant":null, "point_id":1, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/equipments/{id}/parameters ``` * POST Create a meter Parameter for an Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"fraction", "constant":null, "point_id":null, "numerator_meter_uuid":"89ff5118-d0c2-4dd8-8098-a8698189b2ea", "denominator_meter_uuid":"5ca62d2a-908e-40c5-a6b5-a8e436d60db4"}}' {{base_url}}/equipments/{id}/parameters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"fraction", "constant":null, "point_id":null, "numerator_meter_uuid":"89ff5118-d0c2-4dd8-8098-a8698189b2ea", "denominator_meter_uuid":"5ca62d2a-908e-40c5-a6b5-a8e436d60db4"}}' {{base_url}}/equipments/{id}/parameters ``` * DELETE a Parameter from an Equipment ```bash -$ curl -i -X DELETE {{base_url}}/equipments/{id}/parameters/{pid} +curl -i -X DELETE {{base_url}}/equipments/{id}/parameters/{pid} ``` * GET All Offline Meters of an Equipment by ID ```bash -$ curl -i -X GET {{base_url}}/equipments/{id}/offlinemeters +curl -i -X GET {{base_url}}/equipments/{id}/offlinemeters ``` * POST Bind an Offline Meter to an Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/equipments/{id}/offlinemeters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/equipments/{id}/offlinemeters ``` * DELETE an Offline Meter from an Equipment ```bash -$ curl -i -X DELETE {{base_url}}/equipments/{id}/offlinemeters/{mid} +curl -i -X DELETE {{base_url}}/equipments/{id}/offlinemeters/{mid} ``` * GET All Virtual Meters of an Equipment by ID ```bash -$ curl -i -X GET {{base_url}}/equipments/{id}/virtualmeters +curl -i -X GET {{base_url}}/equipments/{id}/virtualmeters ``` * POST Bind an Virtual Meter to an Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/equipments/{id}/virtualmeters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/equipments/{id}/virtualmeters ``` * DELETE an Virtual Meter from an Equipment ```bash -$ curl -i -X DELETE {{base_url}}/equipments/{id}/virtualmeters/{mid} +curl -i -X DELETE {{base_url}}/equipments/{id}/virtualmeters/{mid} ``` ### Combined Equipment * GET a Combined Equipment by ID ```bash -$ curl -i -X GET {{base_url}}/combinedequipments/{id} +curl -i -X GET {{base_url}}/combinedequipments/{id} ``` Result @@ -738,55 +744,55 @@ Result * GET All Equipments ```bash -$ curl -i -X GET {{base_url}}/combinedequipments +curl -i -X GET {{base_url}}/combinedequipments ``` * DELETE a Combined Equipment by ID ```bash -$ curl -i -X DELETE {{base_url}}/combinedequipments/{id} +curl -i -X DELETE {{base_url}}/combinedequipments/{id} ``` * POST Create a Combined Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Chiller Plant", "is_input_counted":true, "is_output_counted":false, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/combinedequipments +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Chiller Plant", "is_input_counted":true, "is_output_counted":false, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/combinedequipments ``` * PUT Update a Combined Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Chiller Plant", "is_input_counted":true, "is_output_counted":true, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/combinedequipments/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Chiller Plant", "is_input_counted":true, "is_output_counted":true, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/combinedequipments/{id} ``` * POST Clone a Combined Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{}}' {{base_url}}/combinedequipments/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{}}' {{base_url}}/combinedequipments/{id} ``` * GET All Equipments of a Combined Equipment by ID ```bash -$ curl -i -X GET {{base_url}}/combinedequipments/{id}/equipments +curl -i -X GET {{base_url}}/combinedequipments/{id}/equipments ``` * POST Bind an Equipment to a Combined Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"equipment_id":1}}' {{base_url}}/combinedequipments/{id}/equipments +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"equipment_id":1}}' {{base_url}}/combinedequipments/{id}/equipments ``` * DELETE an Equipment from a Combined Equipment ```bash -$ curl -i -X DELETE {{base_url}}/combinedequipments/{id}/equipments/{eid} +curl -i -X DELETE {{base_url}}/combinedequipments/{id}/equipments/{eid} ``` * GET All Meters of a Combined Equipment by ID ```bash -$ curl -i -X GET {{base_url}}/combinedequipments/{id}/meters +curl -i -X GET {{base_url}}/combinedequipments/{id}/meters ``` * POST Bind a Meter to a Combined Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/combinedequipments/{id}/meters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/combinedequipments/{id}/meters ``` * DELETE a Meter from a Combined Equipment ```bash -$ curl -i -X DELETE {{base_url}}/combinedequipments/{id}/meters/{mid} +curl -i -X DELETE {{base_url}}/combinedequipments/{id}/meters/{mid} ``` * GET All Parameters of a Combined Equipment by ID ```bash -$ curl -i -X GET {{base_url}}/combinedequipments/{id}/parameters +curl -i -X GET {{base_url}}/combinedequipments/{id}/parameters ``` * GET a Parameter of a Combined Equipment by ID ```bash -$ curl -i -X GET {{base_url}}/combinedequipments/{id}/parameters/{pid} +curl -i -X GET {{base_url}}/combinedequipments/{id}/parameters/{pid} ``` Result @@ -804,50 +810,50 @@ Result * POST Create a constant Parameter for a Combined Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"constant", "constant":"test constant", "point_id":null, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/combinedequipments/{id}/parameters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"constant", "constant":"test constant", "point_id":null, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/combinedequipments/{id}/parameters ``` * POST Create a point Parameter for a Combined Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"point", "constant":null, "point_id":1, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/combinedequipments/{id}/parameters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"point", "constant":null, "point_id":1, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/combinedequipments/{id}/parameters ``` * POST Create a meter Parameter for a Combined Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"fraction", "constant":null, "point_id":null, "numerator_meter_uuid":"89ff5118-d0c2-4dd8-8098-a8698189b2ea", "denominator_meter_uuid":"5ca62d2a-908e-40c5-a6b5-a8e436d60db4"}}' {{base_url}}/combinedequipments/{id}/parameters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"fraction", "constant":null, "point_id":null, "numerator_meter_uuid":"89ff5118-d0c2-4dd8-8098-a8698189b2ea", "denominator_meter_uuid":"5ca62d2a-908e-40c5-a6b5-a8e436d60db4"}}' {{base_url}}/combinedequipments/{id}/parameters ``` * DELETE a Parameter from a Combined Equipment ```bash -$ curl -i -X DELETE {{base_url}}/combinedequipments/{id}/parameters/{pid} +curl -i -X DELETE {{base_url}}/combinedequipments/{id}/parameters/{pid} ``` * GET All Offline Meters of a Combined Equipment by ID ```bash -$ curl -i -X GET {{base_url}}/combinedequipments/{id}/offlinemeters +curl -i -X GET {{base_url}}/combinedequipments/{id}/offlinemeters ``` * POST Bind an Offline Meter to a Combined Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/combinedequipments/{id}/offlinemeters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/combinedequipments/{id}/offlinemeters ``` * DELETE an Offline Meter from a Combined Equipment ```bash -$ curl -i -X DELETE {{base_url}}/combinedequipments/{id}/offlinemeters/{mid} +curl -i -X DELETE {{base_url}}/combinedequipments/{id}/offlinemeters/{mid} ``` * GET All Virtual Meters of a Combined Equipment by ID ```bash -$ curl -i -X GET {{base_url}}/combinedequipments/{id}/virtualmeters +curl -i -X GET {{base_url}}/combinedequipments/{id}/virtualmeters ``` * POST Bind an Virtual Meter to a Combined Equipment ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/combinedequipments/{id}/virtualmeters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/combinedequipments/{id}/virtualmeters ``` * DELETE an Virtual Meter from a Combined Equipment ```bash -$ curl -i -X DELETE {{base_url}}/combinedequipments/{id}/virtualmeters/{mid} +curl -i -X DELETE {{base_url}}/combinedequipments/{id}/virtualmeters/{mid} ``` ### Gateway * GET Gateway by ID ```bash -$ curl -i -X GET {{base_url}}/gateways/{id} +curl -i -X GET {{base_url}}/gateways/{id} ``` Result in JSON @@ -862,30 +868,30 @@ Result in JSON * GET all Gateways ```bash -$ curl -i -X GET {{base_url}}/gateways +curl -i -X GET {{base_url}}/gateways ``` * DELETE Gateway by ID ```bash -$ curl -i -X DELETE {{base_url}}/gateways/{id} +curl -i -X DELETE {{base_url}}/gateways/{id} ``` * POST Gateway ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Gateway 1"}}' {{base_url}}/gateways +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Gateway 1"}}' {{base_url}}/gateways ``` * PUT Gateway ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Gateway #1"}}' {{base_url}}/gateways/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Gateway #1"}}' {{base_url}}/gateways/{id} ``` * GET all data sources of the Gateway by ID ```bash -$ curl -i -X GET {{base_url}}/gateways/{id}/datasources +curl -i -X GET {{base_url}}/gateways/{id}/datasources ``` ### GSM Modem * GET a GSM Modem by ID ```bash -$ curl -i -X GET {{base_url}}/gsmmodems/{id} +curl -i -X GET {{base_url}}/gsmmodems/{id} ``` Result in JSON @@ -897,26 +903,26 @@ Result in JSON * GET All GSM Modems ```bash -$ curl -i -X GET {{base_url}}/gsmmodems +curl -i -X GET {{base_url}}/gsmmodems ``` * DELETE a GSM Modem by ID ```bash -$ curl -i -X DELETE {{base_url}}/gsmmodems/{id} +curl -i -X DELETE {{base_url}}/gsmmodems/{id} ``` * POST Create New GSM Modem ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"serial_port":"/dev/ttyS0","baud_rate":115200}}' {{base_url}}/gsmmodems +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"serial_port":"/dev/ttyS0","baud_rate":115200}}' {{base_url}}/gsmmodems ``` * PUT Update a GSM Modem ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"serial_port":"/dev/ttyS0","baud_rate":115200}}' {{base_url}}/gsmmodems/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"serial_port":"/dev/ttyS0","baud_rate":115200}}' {{base_url}}/gsmmodems/{id} ``` ### Knowledge File * GET Knowledge File by ID ```bash -$ curl -i -X GET {{base_url}}/knowledgefiles/{id} +curl -i -X GET {{base_url}}/knowledgefiles/{id} ``` Result @@ -931,26 +937,26 @@ Result * GET All Knowledge Files ```bash -$ curl -i -X GET {{base_url}}/knowledgefiles +curl -i -X GET {{base_url}}/knowledgefiles ``` * DELETE a Knowledge File by id ```bash -$ curl -i -X DELETE {{base_url}}/knowledgefiles/{id} +curl -i -X DELETE {{base_url}}/knowledgefiles/{id} ``` * POST Upload a Knowledge File (user must login first to get cookie) ```bash -$ curl -i -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/knowledgefiles +curl -i -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/knowledgefiles ``` * GET Restore a Knowledge File by id from database to disk ```bash -$ curl -i -X GET {{base_url}}/knowledgefiles/{id}/restore +curl -i -X GET {{base_url}}/knowledgefiles/{id}/restore ``` ### Menu * GET Menu by ID ```bash -$ curl -i -X GET {{base_url}}/menus/{id} +curl -i -X GET {{base_url}}/menus/{id} ``` Result @@ -964,26 +970,26 @@ Result * GET All Menus ```bash -$ curl -i -X GET {{base_url}}/menus +curl -i -X GET {{base_url}}/menus ``` * PUT Update a Menu ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"is_hidden": false}}' {{base_url}}/menus/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"is_hidden": false}}' {{base_url}}/menus/{id} ``` * Get All Menus for Web UI ```bash -$ curl -i -X GET {{base_url}}/menus/web +curl -i -X GET {{base_url}}/menus/web ``` * GET All Children of Menu by ID ```bash -$ curl -i -X GET {{base_url}}/menus/{id}/children +curl -i -X GET {{base_url}}/menus/{id}/children ``` ### Meter * GET Meter by ID ```bash -$ curl -i -X GET {{base_url}}/meters/{id} +curl -i -X GET {{base_url}}/meters/{id} ``` Result @@ -1003,35 +1009,35 @@ Result * GET All Meters ```bash -$ curl -i -X GET {{base_url}}/meters +curl -i -X GET {{base_url}}/meters ``` * DELETE Meter by ID ```bash -$ curl -i -X DELETE {{base_url}}/meters/{id} +curl -i -X DELETE {{base_url}}/meters/{id} ``` * POST Create a Meter ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters ``` * PUT Update a Meter ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters/{id} ``` * GET All Submeters of Meter by ID ```bash -$ curl -i -X GET {{base_url}}/meters/{id}/submeters +curl -i -X GET {{base_url}}/meters/{id}/submeters ``` * GET All Points associated with Meter ID ```bash -$ curl -i -X GET {{base_url}}/meters/{id}/points +curl -i -X GET {{base_url}}/meters/{id}/points ``` * POST Meter Point Relation ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/meters/{id}/points +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/meters/{id}/points ``` * DELETE Meter Point Relation ```bash -$ curl -i -X DELETE {{base_url}}/meters/{id}/points/{pid} +curl -i -X DELETE {{base_url}}/meters/{id}/points/{pid} ``` ### Notification @@ -1040,7 +1046,7 @@ NOTE: Login before call these APIs, and then update User-UUID and Token in Heade * GET a Notification by ID ```bash -$ curl -i -X GET {{base_url}}/notifications/{id} +curl -i -X GET {{base_url}}/notifications/{id} ``` Result @@ -1055,26 +1061,26 @@ Result * GET All Notifications ```bash -$ curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -X GET {{base_url}}/notifications?startdatetime={startdatetime}&enddatetime={enddatetime}&status={status} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -X GET {{base_url}}/notifications?startdatetime={startdatetime}&enddatetime={enddatetime}&status={status} ``` * DELETE Notification by ID ```bash -$ curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -X DELETE {{base_url}}/notifications/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -X DELETE {{base_url}}/notifications/{id} ``` * PUT Update a Notification ```bash -$ curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -H "Content-Type: application/json" -X PUT -d '{"data":{"status":"read"}}' {{base_url}}/notifications/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -H "Content-Type: application/json" -X PUT -d '{"data":{"status":"read"}}' {{base_url}}/notifications/{id} ``` * DELETE Notification ```bash -$ curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -X DELETE {{base_url}}/notifications/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -X DELETE {{base_url}}/notifications/{id} ``` ### Offline Meter * GET Offline Meter by ID ```bash -$ curl -i -X GET {{base_url}}/offlinemeters/{id} +curl -i -X GET {{base_url}}/offlinemeters/{id} ``` Result @@ -1093,26 +1099,26 @@ Result * GET All Offline Meters ```bash -$ curl -i -X GET {{base_url}}/offlinemeters +curl -i -X GET {{base_url}}/offlinemeters ``` * DELETE Offline Meter by ID ```bash -$ curl -i -X DELETE {{base_url}}/offlinemeters/{id} +curl -i -X DELETE {{base_url}}/offlinemeters/{id} ``` * POST Create a Offline Meter ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"OfflinePM20", "energy_category_id":1, "is_counted":true, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "cost_center_id":1, "energy_item_id":1, "description":"空调用电"}}' {{base_url}}/offlinemeters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"OfflinePM20", "energy_category_id":1, "is_counted":true, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "cost_center_id":1, "energy_item_id":1, "description":"空调用电"}}' {{base_url}}/offlinemeters ``` * PUT Update a Offline Meter ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"OfflinePM20", "energy_category_id":1, "is_counted":true, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "cost_center_id":1, "energy_item_id":1, "description":"空调用电"}}' {{base_url}}/offlinemeters/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"OfflinePM20", "energy_category_id":1, "is_counted":true, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "cost_center_id":1, "energy_item_id":1, "description":"空调用电"}}' {{base_url}}/offlinemeters/{id} ``` ### Offline Meter File * GET an Offline Meter File by ID ```bash -$ curl -i -X GET {{base_url}}/offlinemeterfiles/{id} +curl -i -X GET {{base_url}}/offlinemeterfiles/{id} ``` Result @@ -1127,20 +1133,20 @@ Result * GET All Offline Meter Files ```bash -$ curl -i -X GET {{base_url}}/offlinemeterfiles +curl -i -X GET {{base_url}}/offlinemeterfiles ``` * DELETE an Offline Meter File by ID ```bash -$ curl -i -X DELETE {{base_url}}/offlinemeterfiles/{id} +curl -i -X DELETE {{base_url}}/offlinemeterfiles/{id} ``` * POST Upload an Offline Meter File (user must log in first to get cookie) ```bash -$ curl -i -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/offlinemeterfiles +curl -i -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/offlinemeterfiles ``` * GET Restore an Offline Meter File by ID from database to disk ```bash -$ curl -i -X GET {{base_url}}/offlinemeterfiles/{id}/restore +curl -i -X GET {{base_url}}/offlinemeterfiles/{id}/restore ``` ### Point @@ -1148,7 +1154,7 @@ $ curl -i -X GET {{base_url}}/offlinemeterfiles/{id}/restore * GET Point by ID ```bash -$ curl -i -X GET {{base_url}}/points/{id} +curl -i -X GET {{base_url}}/points/{id} ``` Result in JSON @@ -1183,41 +1189,41 @@ Result in JSON * GET all Points ```bash -$ curl -i -X GET {{base_url}}/points +curl -i -X GET {{base_url}}/points ``` * DELETE Point by ID ```bash -$ curl -i -X DELETE {{base_url}}/points/{id} +curl -i -X DELETE {{base_url}}/points/{id} ``` * POST Point ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"ModbusPoint1", "data_source_id":1, "object_type": "ENERGY_VALUE", "units":"kWh", "low_limit":0, "high_limit":999999999, "is_trend":true, "is_virtual":false, "address":"{\"slave_id\":1, \"function_code\":3, \"offset\":1, \"number_of_registers\":2, \"data_format\":\"float\"}", "description":null}}' {{base_url}}/points +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"ModbusPoint1", "data_source_id":1, "object_type": "ENERGY_VALUE", "units":"kWh", "low_limit":0, "high_limit":999999999, "is_trend":true, "is_virtual":false, "address":"{\"slave_id\":1, \"function_code\":3, \"offset\":1, \"number_of_registers\":2, \"data_format\":\"float\"}", "description":null}}' {{base_url}}/points ``` * PUT Point ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"ModbusPoint1", "data_source_id":1, "object_type": "ENERGY_VALUE", "units":"kWh", "low_limit":0, "high_limit":999999999, "is_trend":true, "is_virtual":false, "address":"{\"slave_id\":1, \"function_code\":3, \"offset\":1, \"number_of_registers\":2, \"data_format\":\"float\"}", "description":null}}' {{base_url}}/points/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"ModbusPoint1", "data_source_id":1, "object_type": "ENERGY_VALUE", "units":"kWh", "low_limit":0, "high_limit":999999999, "is_trend":true, "is_virtual":false, "address":"{\"slave_id\":1, \"function_code\":3, \"offset\":1, \"number_of_registers\":2, \"data_format\":\"float\"}", "description":null}}' {{base_url}}/points/{id} ``` ### Privilege * GET Privilege by ID ```bash -$ curl -i -X GET {{base_url}}/privileges/{id} +curl -i -X GET {{base_url}}/privileges/{id} ``` * GET All Privileges ```bash -$ curl -i -X GET {{base_url}}/privileges +curl -i -X GET {{base_url}}/privileges ``` * DELETE Privilege by ID ```bash -$ curl -i -X DELETE {{base_url}}/privileges/{id} +curl -i -X DELETE {{base_url}}/privileges/{id} ``` * POST New Privilege ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"superusers","data":"{\"spaces\":[1,2,3,5]}"}}' {{base_url}}/privileges +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"superusers","data":"{\"spaces\":[1,2,3,5]}"}}' {{base_url}}/privileges ``` * PUT Privilege ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"superusers", "data":"{\"spaces\":[1, 3]}"}}' {{base_url}}/privileges/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"superusers", "data":"{\"spaces\":[1, 3]}"}}' {{base_url}}/privileges/{id} ``` ### Rule @@ -1241,30 +1247,30 @@ Result in JSON | next_run_datetime | float | null, or the number of milliseconds since January 1, 1970, 00:00:00, universal time | ```bash -$ curl -i -X GET {{base_url}}/rules/{id} +curl -i -X GET {{base_url}}/rules/{id} ``` * GET All Rules ```bash -$ curl -i -X GET {{base_url}}/rules +curl -i -X GET {{base_url}}/rules ``` * DELETE a Rule by ID ```bash -$ curl -i -X DELETE {{base_url}}/rules/{id} +curl -i -X DELETE {{base_url}}/rules/{id} ``` * POST Create New Rule ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Space Energy Consumption Over Limit", "fdd_code":"SPACE01", "category":"SPACE", "priority":"HIGH", "channel":"WEB", "expression":"{\"space_id\":1, \"high_limit\":1000.000}", "message_template":"%s截止到目前电耗%s,超标%s。", "is_enabled":true}}' {{base_url}}/rules +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Space Energy Consumption Over Limit", "fdd_code":"SPACE01", "category":"SPACE", "priority":"HIGH", "channel":"WEB", "expression":"{\"space_id\":1, \"high_limit\":1000.000}", "message_template":"%s截止到目前电耗%s,超标%s。", "is_enabled":true}}' {{base_url}}/rules ``` * PUT Update a Rule ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Space Energy Consumption Over Limit", "fdd_code":"SPACE01", "category":"SPACE", "priority":"HIGH", "channel":"WEB", "expression":"{\"space_id\":1, \"high_limit\":1000.000}", "message_template":"%s截止到目前电耗%s,超标%s。", "is_enabled":true}}' {{base_url}}/rules/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Space Energy Consumption Over Limit", "fdd_code":"SPACE01", "category":"SPACE", "priority":"HIGH", "channel":"WEB", "expression":"{\"space_id\":1, \"high_limit\":1000.000}", "message_template":"%s截止到目前电耗%s,超标%s。", "is_enabled":true}}' {{base_url}}/rules/{id} ``` ### Sensor * GET a Sensor by ID ```bash -$ curl -i -X GET {{base_url}}/sensors/{id} +curl -i -X GET {{base_url}}/sensors/{id} ``` Result @@ -1277,37 +1283,37 @@ Result * GET All Sensors ```bash -$ curl -i -X GET {{base_url}}/sensors +curl -i -X GET {{base_url}}/sensors ``` * DELETE a Sensor by ID ```bash -$ curl -i -X DELETE {{base_url}}/sensors/{id} +curl -i -X DELETE {{base_url}}/sensors/{id} ``` * POST Create New Sensor ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Sensor10", "description":"sensor description"}}' {{base_url}}/sensors +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Sensor10", "description":"sensor description"}}' {{base_url}}/sensors ``` * PUT Update a Sensor ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Sensor10", "description":"sensor description"}}' {{base_url}}/sensors/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Sensor10", "description":"sensor description"}}' {{base_url}}/sensors/{id} ``` * GET All Points associated with Sensor ID ```bash -$ curl -i -X GET {{base_url}}/sensors/{id}/points +curl -i -X GET {{base_url}}/sensors/{id}/points ``` * POST Sensor Point Relation ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/sensors/{id}/points +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/sensors/{id}/points ``` * DELETE Sensor Point Relation ```bash -$ curl -i -X DELETE {{base_url}}/sensors/{id}/points/{pid} +curl -i -X DELETE {{base_url}}/sensors/{id}/points/{pid} ``` ### Shopfloor * GET Shopfloor by ID ```bash -$ curl -i -X GET {{base_url}}/shopfloors/{id} +curl -i -X GET {{base_url}}/shopfloors/{id} ``` Result @@ -1324,97 +1330,97 @@ Result * GET All Shopfloors ```bash -$ curl -i -X GET {{base_url}}/shopfloors +curl -i -X GET {{base_url}}/shopfloors ``` * DELETE a Shopfloor by ID ```bash -$ curl -i -X DELETE {{base_url}}/shopfloors/{id} +curl -i -X DELETE {{base_url}}/shopfloors/{id} ``` * POST Create a Shopfloor ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Shopfloor", "area":999.99, "is_input_counted":true, "contact_id":1, "cost_center_id":1, "description":"Shopfloor description"}}' {{base_url}}/shopfloors +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Shopfloor", "area":999.99, "is_input_counted":true, "contact_id":1, "cost_center_id":1, "description":"Shopfloor description"}}' {{base_url}}/shopfloors ``` * PUT Update a Shopfloor ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Shopfloor", "area":999.99, "is_input_counted":true, "contact_id":1, "cost_center_id":1, "description":"Shopfloor description"}}' {{base_url}}/shopfloors/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Shopfloor", "area":999.99, "is_input_counted":true, "contact_id":1, "cost_center_id":1, "description":"Shopfloor description"}}' {{base_url}}/shopfloors/{id} ``` * GET All Equipments of Shopfloor by ID ```bash -$ curl -i -X GET {{base_url}}/shopfloors/{id}/equipments +curl -i -X GET {{base_url}}/shopfloors/{id}/equipments ``` * POST Bind an Equipment to a Shopfloor ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"equipment_id":1}}' {{base_url}}/shopfloors/{id}/equipments +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"equipment_id":1}}' {{base_url}}/shopfloors/{id}/equipments ``` * DELETE an Equipment from Shopfloor ```bash -$ curl -i -X DELETE {{base_url}}/shopfloors/{id}/equipments/{eid} +curl -i -X DELETE {{base_url}}/shopfloors/{id}/equipments/{eid} ``` * GET All Meters of Shopfloor by ID ```bash -$ curl -i -X GET {{base_url}}/shopfloors/{id}/meters +curl -i -X GET {{base_url}}/shopfloors/{id}/meters ``` * POST Bind a Meter to a Shopfloor ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/shopfloors/{id}/meters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/shopfloors/{id}/meters ``` * DELETE a Meter from Shopfloor ```bash -$ curl -i -X DELETE {{base_url}}/shopfloors/{id}/meters/{mid} +curl -i -X DELETE {{base_url}}/shopfloors/{id}/meters/{mid} ``` * GET All Offline Meters of Shopfloor by ID ```bash -$ curl -i -X GET {{base_url}}/shopfloors/{id}/offlinemeters +curl -i -X GET {{base_url}}/shopfloors/{id}/offlinemeters ``` * POST Bind an Offline Meter to a Shopfloor ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/shopfloors/{id}/offlinemeters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/shopfloors/{id}/offlinemeters ``` * DELETE an Offline Meter from Shopfloor ```bash -$ curl -i -X DELETE {{base_url}}/shopfloors/{id}/offlinemeters/{mid} +curl -i -X DELETE {{base_url}}/shopfloors/{id}/offlinemeters/{mid} ``` * GET All Points of Shopfloor by ID ```bash -$ curl -i -X GET {{base_url}}/shopfloors/{id}/points +curl -i -X GET {{base_url}}/shopfloors/{id}/points ``` * POST Bind a Point to a Shopfloor ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/shopfloors/{id}/points +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/shopfloors/{id}/points ``` * DELETE a Point from Shopfloor ```bash -$ curl -i -X DELETE {{base_url}}/shopfloors/{id}/points/{pid} +curl -i -X DELETE {{base_url}}/shopfloors/{id}/points/{pid} ``` * GET All Sensors of Shopfloor by ID ```bash -$ curl -i -X GET {{base_url}}/shopfloors/{id}/sensors +curl -i -X GET {{base_url}}/shopfloors/{id}/sensors ``` * POST Bind a Sensor to a Shopfloor ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/shopfloors/{id}/sensors +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/shopfloors/{id}/sensors ``` * DELETE a Sensor from Shopfloor ```bash -$ curl -i -X DELETE {{base_url}}/shopfloors/{id}/sensors/{sid} +curl -i -X DELETE {{base_url}}/shopfloors/{id}/sensors/{sid} ``` * GET All Virtual Meters of Shopfloor by ID ```bash -$ curl -i -X GET {{base_url}}/shopfloors/{id}/virtualmeters +curl -i -X GET {{base_url}}/shopfloors/{id}/virtualmeters ``` * POST Bind an Virtual Meter to a Shopfloor ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/shopfloors/{id}/virtualmeters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/shopfloors/{id}/virtualmeters ``` * DELETE an Virtual Meter from Shopfloor ```bash -$ curl -i -X DELETE {{base_url}}/shopfloors/{id}/virtualmeters/{mid} +curl -i -X DELETE {{base_url}}/shopfloors/{id}/virtualmeters/{mid} ``` ### Space * GET Space by ID ```bash -$ curl -i -X GET {{base_url}}/spaces/{id} +curl -i -X GET {{base_url}}/spaces/{id} ``` Result @@ -1434,141 +1440,141 @@ Result * GET All Spaces ```bash -$ curl -i -X GET {{base_url}}/spaces +curl -i -X GET {{base_url}}/spaces ``` * DELETE Space by ID ```bash -$ curl -i -X DELETE {{base_url}}/spaces/{id} +curl -i -X DELETE {{base_url}}/spaces/{id} ``` * POST Create a Space ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMSSpace", "parent_space_id":1, "area":999.99, "timezone_id":56, "is_input_counted":true, "is_output_counted":false, "contact_id":1, "cost_center_id":1, "description":"Space description"}}' {{base_url}}/spaces +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMSSpace", "parent_space_id":1, "area":999.99, "timezone_id":56, "is_input_counted":true, "is_output_counted":false, "contact_id":1, "cost_center_id":1, "description":"Space description"}}' {{base_url}}/spaces ``` * PUT Update a Space ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMSSpace", "parent_space_id":2, "area":999.99, "timezone_id":56, "is_input_counted":true, "is_output_counted":true, "contact_id":1, "cost_center_id":1, "description":"Space description"}}' {{base_url}}/spaces/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMSSpace", "parent_space_id":2, "area":999.99, "timezone_id":56, "is_input_counted":true, "is_output_counted":true, "contact_id":1, "cost_center_id":1, "description":"Space description"}}' {{base_url}}/spaces/{id} ``` * GET All Children of Space by ID ```bash -$ curl -i -X GET {{base_url}}/spaces/{id}/children +curl -i -X GET {{base_url}}/spaces/{id}/children ``` * GET All Combined Equipments of Space by ID ```bash -$ curl -i -X GET {{base_url}}/spaces/{id}/combinedequipments +curl -i -X GET {{base_url}}/spaces/{id}/combinedequipments ``` * POST Bind a Combined Equipment to a Space ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"combined_equipment_id":1}}' {{base_url}}/spaces/{id}/equipments +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"combined_equipment_id":1}}' {{base_url}}/spaces/{id}/equipments ``` * DELETE a Combined Equipment from Space ```bash -$ curl -i -X DELETE {{base_url}}/spaces/{id}/combinedequipments/{eid} +curl -i -X DELETE {{base_url}}/spaces/{id}/combinedequipments/{eid} ``` * GET All Equipments of Space by ID ```bash -$ curl -i -X GET {{base_url}}/spaces/{id}/equipments +curl -i -X GET {{base_url}}/spaces/{id}/equipments ``` * POST Bind an Equipment to a Space ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"equipment_id":1}}' {{base_url}}/spaces/{id}/equipments +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"equipment_id":1}}' {{base_url}}/spaces/{id}/equipments ``` * DELETE an Equipment from Space ```bash -$ curl -i -X DELETE {{base_url}}/spaces/{id}/equipments/{eid} +curl -i -X DELETE {{base_url}}/spaces/{id}/equipments/{eid} ``` * GET All Meters of Space by ID ```bash -$ curl -i -X GET {{base_url}}/spaces/{id}/meters +curl -i -X GET {{base_url}}/spaces/{id}/meters ``` * POST Bind a Meter to a Space ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/spaces/{id}/meters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/spaces/{id}/meters ``` * DELETE a Meter from Space ```bash -$ curl -i -X DELETE {{base_url}}/spaces/{id}/meters/{mid} +curl -i -X DELETE {{base_url}}/spaces/{id}/meters/{mid} ``` * GET All Offline Meters of Space by ID ```bash -$ curl -i -X GET {{base_url}}/spaces/{id}/offlinemeters +curl -i -X GET {{base_url}}/spaces/{id}/offlinemeters ``` * POST Bind an Offline Meter to a Space ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/spaces/{id}/offlinemeters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/spaces/{id}/offlinemeters ``` * DELETE an Offline Meter from Space ```bash -$ curl -i -X DELETE {{base_url}}/spaces/{id}/offlinemeters/{mid} +curl -i -X DELETE {{base_url}}/spaces/{id}/offlinemeters/{mid} ``` * GET All Points of Space by ID ```bash -$ curl -i -X GET {{base_url}}/spaces/{id}/points +curl -i -X GET {{base_url}}/spaces/{id}/points ``` * POST Bind a Point to a Space ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/spaces/{id}/points +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/spaces/{id}/points ``` * DELETE a Point from Space ```bash -$ curl -i -X DELETE {{base_url}}/spaces/{id}/points/{pid} +curl -i -X DELETE {{base_url}}/spaces/{id}/points/{pid} ``` * GET All Sensors of Space by ID ```bash -$ curl -i -X GET {{base_url}}/spaces/{id}/sensors +curl -i -X GET {{base_url}}/spaces/{id}/sensors ``` * POST Bind a Sensor to a Space ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/spaces/{id}/sensors +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/spaces/{id}/sensors ``` * DELETE a Sensor from Space ```bash -$ curl -i -X DELETE {{base_url}}/spaces/{id}/sensors/{sid} +curl -i -X DELETE {{base_url}}/spaces/{id}/sensors/{sid} ``` * GET All Stores of Space by ID ```bash -$ curl -i -X GET {{base_url}}/spaces/{id}/stores +curl -i -X GET {{base_url}}/spaces/{id}/stores ``` * POST Bind a Store to a Space ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"store_id":1}}' {{base_url}}/spaces/{id}/stores +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"store_id":1}}' {{base_url}}/spaces/{id}/stores ``` * DELETE a Store from Space ```bash -$ curl -i -X DELETE {{base_url}}/spaces/{id}/stores/{tid} +curl -i -X DELETE {{base_url}}/spaces/{id}/stores/{tid} ``` * GET All Tenants of Space by ID ```bash -$ curl -i -X GET {{base_url}}/spaces/{id}/tenants +curl -i -X GET {{base_url}}/spaces/{id}/tenants ``` * POST Bind a Tenant to a Space ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"tenant_id":1}}' {{base_url}}/spaces/{id}/tenants +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"tenant_id":1}}' {{base_url}}/spaces/{id}/tenants ``` * DELETE a Tenant from Space ```bash -$ curl -i -X DELETE {{base_url}}/spaces/{id}/tenants/{tid} +curl -i -X DELETE {{base_url}}/spaces/{id}/tenants/{tid} ``` * GET All Virtual Meters of Space by ID ```bash -$ curl -i -X GET {{base_url}}/spaces/{id}/virtualmeters +curl -i -X GET {{base_url}}/spaces/{id}/virtualmeters ``` * POST Bind an Virtual Meter to a Space ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/spaces/{id}/virtualmeters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/spaces/{id}/virtualmeters ``` * DELETE an Virtual Meter from Space ```bash -$ curl -i -X DELETE {{base_url}}/spaces/{id}/virtualmeters/{mid} +curl -i -X DELETE {{base_url}}/spaces/{id}/virtualmeters/{mid} ``` * GET Space Tree of User ```bash -$ curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X GET {{base_url}}/spaces/tree +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X GET {{base_url}}/spaces/tree ``` ### Store * GET Store by ID ```bash -$ curl -i -X GET {{base_url}}/stores/{id} +curl -i -X GET {{base_url}}/stores/{id} ``` Result @@ -1589,79 +1595,79 @@ Result * GET All Stores ```bash -$ curl -i -X GET {{base_url}}/stores +curl -i -X GET {{base_url}}/stores ``` * POST Create New Store ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"麦当劳(新王府井店)", "address":"北京市东城区王府井大街200号工美大厦1层010-65120499", "latitude":39.909429, "longitude":116.416993, "area":418.8, "store_type_id":9, "is_input_counted": true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/stores +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"麦当劳(新王府井店)", "address":"北京市东城区王府井大街200号工美大厦1层010-65120499", "latitude":39.909429, "longitude":116.416993, "area":418.8, "store_type_id":9, "is_input_counted": true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/stores ``` * PUT Update a Store ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"麦当劳(新王府井店)", "address":"北京市东城区王府井大街200号工美大厦1层010-65120499", "latitude":39.909429, "longitude":116.416993, "area":818.8, "store_type_id":9, "is_input_counted": true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/stores/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"麦当劳(新王府井店)", "address":"北京市东城区王府井大街200号工美大厦1层010-65120499", "latitude":39.909429, "longitude":116.416993, "area":818.8, "store_type_id":9, "is_input_counted": true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/stores/{id} ``` * DELETE Store by ID ```bash -$ curl -i -X DELETE {{base_url}}/stores/{id} +curl -i -X DELETE {{base_url}}/stores/{id} ``` * GET All Meters of Store by ID ```bash -$ curl -i -X GET {{base_url}}/stores/{id}/meters +curl -i -X GET {{base_url}}/stores/{id}/meters ``` * POST Bind a Meter to a Store ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/stores/{id}/meters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/stores/{id}/meters ``` * DELETE a Meter from Store ```bash -$ curl -i -X DELETE {{base_url}}/stores/{id}/meters/{mid} +curl -i -X DELETE {{base_url}}/stores/{id}/meters/{mid} ``` * GET All Offline Meters of Store by ID ```bash -$ curl -i -X GET {{base_url}}/stores/{id}/offlinemeters +curl -i -X GET {{base_url}}/stores/{id}/offlinemeters ``` * POST Bind an Offline Meter to a Store ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/stores/{id}/offlinemeters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/stores/{id}/offlinemeters ``` * DELETE an Offline Meter from Store ```bash -$ curl -i -X DELETE {{base_url}}/stores/{id}/offlinemeters/{mid} +curl -i -X DELETE {{base_url}}/stores/{id}/offlinemeters/{mid} ``` * GET All Points of Store by ID ```bash -$ curl -i -X GET {{base_url}}/stores/{id}/points +curl -i -X GET {{base_url}}/stores/{id}/points ``` * POST Bind a Point to a Store ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/stores/{id}/points +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/stores/{id}/points ``` * DELETE a Point from Store ```bash -$ curl -i -X DELETE {{base_url}}/stores/{id}/points/{pid} +curl -i -X DELETE {{base_url}}/stores/{id}/points/{pid} ``` * GET All Sensors of Store by ID ```bash -$ curl -i -X GET {{base_url}}/stores/{id}/sensors +curl -i -X GET {{base_url}}/stores/{id}/sensors ``` * POST Bind a Sensor to a Store ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/stores/{id}/sensors +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/stores/{id}/sensors ``` * DELETE a Sensor from Store ```bash -$ curl -i -X DELETE {{base_url}}/stores/{id}/sensors/{sid} +curl -i -X DELETE {{base_url}}/stores/{id}/sensors/{sid} ``` * GET All Virtual Meters of Store by ID ```bash -$ curl -i -X GET {{base_url}}/stores/{id}/virtualmeters +curl -i -X GET {{base_url}}/stores/{id}/virtualmeters ``` * POST Bind an Virtual Meter to a Store ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/stores/{id}/virtualmeters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/stores/{id}/virtualmeters ``` * DELETE an Virtual Meter from Store ```bash -$ curl -i -X DELETE {{base_url}}/stores/{id}/virtualmeters/{mid} +curl -i -X DELETE {{base_url}}/stores/{id}/virtualmeters/{mid} ``` @@ -1669,7 +1675,7 @@ $ curl -i -X DELETE {{base_url}}/stores/{id}/virtualmeters/{mid} * GET a Store Type by ID ```bash -$ curl -i -X GET {{base_url}}/storetypes/{id} +curl -i -X GET {{base_url}}/storetypes/{id} ``` Result @@ -1683,19 +1689,19 @@ Result * GET All Store Types ```bash -$ curl -i -X GET {{base_url}}/storetypes +curl -i -X GET {{base_url}}/storetypes ``` * POST Create New Store Types ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name": "Office", "description":"办公", "simplified_code":"OF"}}' {{base_url}}/storetypes +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name": "Office", "description":"办公", "simplified_code":"OF"}}' {{base_url}}/storetypes ``` * PUT Update a Store Types ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name": "Office1", "description":"办公", "simplified_code":"OF1"}}' {{base_url}}/storetypes/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name": "Office1", "description":"办公", "simplified_code":"OF1"}}' {{base_url}}/storetypes/{id} ``` * DELETE a Store Types by ID ```bash -$ curl -i -X DELETE {{base_url}}/storetypes/{id} +curl -i -X DELETE {{base_url}}/storetypes/{id} ``` @@ -1703,7 +1709,7 @@ $ curl -i -X DELETE {{base_url}}/storetypes/{id} * GET Tariff by id ```bash -$ curl -i -X GET {{base_url}}/tariffs/{id} +curl -i -X GET {{base_url}}/tariffs/{id} ``` Result in JSON @@ -1730,37 +1736,37 @@ Result in JSON * GET All Tariffs ```bash -$ curl -i -X GET {{base_url}}/tariffs +curl -i -X GET {{base_url}}/tariffs ``` * DELETE Tariff by ID ```bash -$ curl -i -X DELETE {{base_url}}/tariffs/{id} +curl -i -X DELETE {{base_url}}/tariffs/{id} ``` * POST Create a Tariff To POST a block tariff: ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"阶梯电价","energy_category_id":1, "tariff_type":"block", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2021-01-01T00:00:00", "block":[{"start_amount":"0", "end_amount":"10000", "price":"0.567"}, {"start_amount":"10000", "end_amount":"30000", "price":"0.678"}, {"start_amount":"30000", "end_amount":"100000", "price":"0.789"}]}}' {{base_url}}/tariffs +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"阶梯电价","energy_category_id":1, "tariff_type":"block", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2021-01-01T00:00:00", "block":[{"start_amount":"0", "end_amount":"10000", "price":"0.567"}, {"start_amount":"10000", "end_amount":"30000", "price":"0.678"}, {"start_amount":"30000", "end_amount":"100000", "price":"0.789"}]}}' {{base_url}}/tariffs ``` To POST a time of use tariff: ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"2020分时电价1-6","energy_category_id":1, "tariff_type":"timeofuse", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2020-07-01T00:00:00", "timeofuse":[{"start_time_of_day":"00:00:00", "end_time_of_day":"05:59:59", "peak_type":"offpeak", "price":0.345}, {"start_time_of_day":"06:00:00", "end_time_of_day":"07:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"08:00:00", "end_time_of_day":"10:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"11:00:00", "end_time_of_day":"17:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"18:00:00", "end_time_of_day":"20:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"21:00:00", "end_time_of_day":"21:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"22:00:00", "end_time_of_day":"23:59:59", "peak_type":"offpeak", "price":0.345}]}}' {{base_url}}/tariffs +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"2020分时电价1-6","energy_category_id":1, "tariff_type":"timeofuse", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2020-07-01T00:00:00", "timeofuse":[{"start_time_of_day":"00:00:00", "end_time_of_day":"05:59:59", "peak_type":"offpeak", "price":0.345}, {"start_time_of_day":"06:00:00", "end_time_of_day":"07:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"08:00:00", "end_time_of_day":"10:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"11:00:00", "end_time_of_day":"17:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"18:00:00", "end_time_of_day":"20:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"21:00:00", "end_time_of_day":"21:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"22:00:00", "end_time_of_day":"23:59:59", "peak_type":"offpeak", "price":0.345}]}}' {{base_url}}/tariffs ``` * PUT Update a Tariff To update a block tariff: ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"阶梯电价","energy_category_id":1, "tariff_type":"block", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2021-01-01T00:00:00", "block":[{"start_amount":"0", "end_amount":"20000", "price":"0.567"}, {"start_amount":"20000", "end_amount":"30000", "price":"0.678"}, {"start_amount":"30000", "end_amount":"100000", "price":"0.789"}]}}' {{base_url}}/tariffs/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"阶梯电价","energy_category_id":1, "tariff_type":"block", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2021-01-01T00:00:00", "block":[{"start_amount":"0", "end_amount":"20000", "price":"0.567"}, {"start_amount":"20000", "end_amount":"30000", "price":"0.678"}, {"start_amount":"30000", "end_amount":"100000", "price":"0.789"}]}}' {{base_url}}/tariffs/{id} ``` To update a time of use tariff: ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"2020分时电价1-6","energy_category_id":1, "tariff_type":"timeofuse", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2020-07-01T00:00:00", "timeofuse":[{"start_time_of_day":"00:00:00", "end_time_of_day":"05:59:59", "peak_type":"offpeak", "price":0.456}, {"start_time_of_day":"06:00:00", "end_time_of_day":"07:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"08:00:00", "end_time_of_day":"10:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"11:00:00", "end_time_of_day":"17:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"18:00:00", "end_time_of_day":"20:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"21:00:00", "end_time_of_day":"21:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"22:00:00", "end_time_of_day":"23:59:59", "peak_type":"offpeak", "price":0.345}]}}' {{base_url}}/tariffs/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"2020分时电价1-6","energy_category_id":1, "tariff_type":"timeofuse", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2020-07-01T00:00:00", "timeofuse":[{"start_time_of_day":"00:00:00", "end_time_of_day":"05:59:59", "peak_type":"offpeak", "price":0.456}, {"start_time_of_day":"06:00:00", "end_time_of_day":"07:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"08:00:00", "end_time_of_day":"10:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"11:00:00", "end_time_of_day":"17:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"18:00:00", "end_time_of_day":"20:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"21:00:00", "end_time_of_day":"21:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"22:00:00", "end_time_of_day":"23:59:59", "peak_type":"offpeak", "price":0.345}]}}' {{base_url}}/tariffs/{id} ``` ### Tenant * GET Tenant by ID ```bash -$ curl -i -X GET {{base_url}}/tenants/{id} +curl -i -X GET {{base_url}}/tenants/{id} ``` Result @@ -1786,86 +1792,86 @@ Result * GET All Tenants ```bash -$ curl -i -X GET {{base_url}}/tenants +curl -i -X GET {{base_url}}/tenants ``` * POST Create New Tenant ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Starbucks", "buildings":"Building #1", "floors":"L1 L2 L3", "rooms":"1201b+2247+3F", "area":418.8, "tenant_type_id":9, "is_input_counted": true, "is_key_tenant":true, "lease_number":"6b0da806", "lease_start_datetime_utc":"2019-12-31T16:00:00", "lease_end_datetime_utc":"2022-12-31T16:00:00", "is_in_lease":true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/tenants +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Starbucks", "buildings":"Building #1", "floors":"L1 L2 L3", "rooms":"1201b+2247+3F", "area":418.8, "tenant_type_id":9, "is_input_counted": true, "is_key_tenant":true, "lease_number":"6b0da806", "lease_start_datetime_utc":"2019-12-31T16:00:00", "lease_end_datetime_utc":"2022-12-31T16:00:00", "is_in_lease":true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/tenants ``` * PUT Update a Tenant ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Hermes 爱马仕", "buildings":"Building #1", "floors":"L1 L2 L3 L4 L5", "rooms":"1201b+2247+3F", "area":818.8, "tenant_type_id":9, "is_input_counted": true, "is_key_tenant":true, "lease_number":"6b0da806", "lease_start_datetime_utc":"2019-12-31T16:00:00", "lease_end_datetime_utc":"2022-12-31T16:00:00", "is_in_lease":true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/tenants/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Hermes 爱马仕", "buildings":"Building #1", "floors":"L1 L2 L3 L4 L5", "rooms":"1201b+2247+3F", "area":818.8, "tenant_type_id":9, "is_input_counted": true, "is_key_tenant":true, "lease_number":"6b0da806", "lease_start_datetime_utc":"2019-12-31T16:00:00", "lease_end_datetime_utc":"2022-12-31T16:00:00", "is_in_lease":true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/tenants/{id} ``` * DELETE Tenant by ID ```bash -$ curl -i -X DELETE {{base_url}}/tenants/{id} +curl -i -X DELETE {{base_url}}/tenants/{id} ``` * GET All Meters of Tenant by ID ```bash -$ curl -i -X GET {{base_url}}/tenants/{id}/meters +curl -i -X GET {{base_url}}/tenants/{id}/meters ``` * POST Bind a Meter to a Tenant ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/tenants/{id}/meters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/tenants/{id}/meters ``` * DELETE a Meter from Tenant ```bash -$ curl -i -X DELETE {{base_url}}/tenants/{id}/meters/{mid} +curl -i -X DELETE {{base_url}}/tenants/{id}/meters/{mid} ``` * GET All Offline Meters of Tenant by ID ```bash -$ curl -i -X GET {{base_url}}/tenants/{id}/offlinemeters +curl -i -X GET {{base_url}}/tenants/{id}/offlinemeters ``` * POST Bind an Offline Meter to a Tenant ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/tenants/{id}/offlinemeters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/tenants/{id}/offlinemeters ``` * DELETE an Offline Meter from Tenant ```bash -$ curl -i -X DELETE {{base_url}}/tenants/{id}/offlinemeters/{mid} +curl -i -X DELETE {{base_url}}/tenants/{id}/offlinemeters/{mid} ``` * GET All Points of Tenant by ID ```bash -$ curl -i -X GET {{base_url}}/tenants/{id}/points +curl -i -X GET {{base_url}}/tenants/{id}/points ``` * POST Bind a Point to a Tenant ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/tenants/{id}/points +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/tenants/{id}/points ``` * DELETE a Point from Tenant ```bash -$ curl -i -X DELETE {{base_url}}/tenants/{id}/points/{pid} +curl -i -X DELETE {{base_url}}/tenants/{id}/points/{pid} ``` * GET All Sensors of Tenant by ID ```bash -$ curl -i -X GET {{base_url}}/tenants/{id}/sensors +curl -i -X GET {{base_url}}/tenants/{id}/sensors ``` * POST Bind a Sensor to a Tenant ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/tenants/{id}/sensors +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/tenants/{id}/sensors ``` * DELETE a Sensor from Tenant ```bash -$ curl -i -X DELETE {{base_url}}/tenants/{id}/sensors/{sid} +curl -i -X DELETE {{base_url}}/tenants/{id}/sensors/{sid} ``` * GET All Virtual Meters of Tenant by ID ```bash -$ curl -i -X GET {{base_url}}/tenants/{id}/virtualmeters +curl -i -X GET {{base_url}}/tenants/{id}/virtualmeters ``` * POST Bind an Virtual Meter to a Tenant ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/tenants/{id}/virtualmeters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/tenants/{id}/virtualmeters ``` * DELETE an Virtual Meter from Tenant ```bash -$ curl -i -X DELETE {{base_url}}/tenants/{id}/virtualmeters/{mid} +curl -i -X DELETE {{base_url}}/tenants/{id}/virtualmeters/{mid} ``` ### Tenant Type * GET a Tenant Type by ID ```bash -$ curl -i -X GET {{base_url}}/tenanttypes/{id} +curl -i -X GET {{base_url}}/tenanttypes/{id} ``` Result @@ -1879,19 +1885,19 @@ Result * GET All Tenant Types ```bash -$ curl -i -X GET {{base_url}}/tenanttypes +curl -i -X GET {{base_url}}/tenanttypes ``` * POST Create New Tenant Types ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name": "Office", "description":"办公", "simplified_code":"OF"}}' {{base_url}}/tenanttypes +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name": "Office", "description":"办公", "simplified_code":"OF"}}' {{base_url}}/tenanttypes ``` * PUT Update a Tenant Types ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name": "Office1", "description":"办公", "simplified_code":"OF1"}}' {{base_url}}/tenanttypes/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name": "Office1", "description":"办公", "simplified_code":"OF1"}}' {{base_url}}/tenanttypes/{id} ``` * DELETE a Tenant Types by ID ```bash -$ curl -i -X DELETE {{base_url}}/tenanttypes/{id} +curl -i -X DELETE {{base_url}}/tenanttypes/{id} ``` ### Text Message @@ -1911,78 +1917,78 @@ Result in JSON | acknowledge_code| string | Recipient reply with Acknowledge code to acknowledge | | status | string | Status ('new', 'sent', 'acknowledged', 'timeout'| ```bash -$ curl -i -X GET {{base_url}}/textmessages/{id} +curl -i -X GET {{base_url}}/textmessages/{id} ``` * GET Text Messages from Startdate to Enddate ```bash -$ curl -i -X GET {{base_url}}/textmessages/from/{startdate}/to/{enddate} +curl -i -X GET {{base_url}}/textmessages/from/{startdate}/to/{enddate} ``` * DELETE an Text Message by ID ```bash -$ curl -i -X DELETE {{base_url}}/textmessages/{id} +curl -i -X DELETE {{base_url}}/textmessages/{id} ``` ### Timezone * GET a Timezone by ID ```bash -$ curl -i -X GET {{base_url}}/timezones/{id} +curl -i -X GET {{base_url}}/timezones/{id} ``` * GET all Timezones ```bash -$ curl -i -X GET {{base_url}}/timezones +curl -i -X GET {{base_url}}/timezones ``` * PUT Update a Timezone by ID ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Hawaiian Standard Time","description":"(GMT-10:00) Hawaii", "utc_offset":"-10:00"}}' {{base_url}}/timezones/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Hawaiian Standard Time","description":"(GMT-10:00) Hawaii", "utc_offset":"-10:00"}}' {{base_url}}/timezones/{id} ``` ### User * GET User by ID ```bash -$ curl -i -X GET {{base_url}}/users/{id} +curl -i -X GET {{base_url}}/users/{id} ``` * GET All Users ```bash -$ curl -i -X GET {{base_url}}/users +curl -i -X GET {{base_url}}/users ``` * DELETE User by id ```bash -$ curl -i -X DELETE {{base_url}}/users/{id} +curl -i -X DELETE {{base_url}}/users/{id} ``` * POST New User ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"albert", "display_name":"Mr. Albert", "email":"albert@myems.io", "is_admin":false, "password":"!MyEMS1"}}' {{base_url}}/users +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"albert", "display_name":"Mr. Albert", "email":"albert@myems.io", "is_admin":false, "password":"!MyEMS1"}}' {{base_url}}/users ``` * PUT User Profile ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"albert", "display_name":"Mr. Albert", "email":"albert@myems.io", "is_admin":false, "privilege_id":1, "password":"!MyEMS1"}}' {{base_url}}/users/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"albert", "display_name":"Mr. Albert", "email":"albert@myems.io", "is_admin":false, "privilege_id":1, "password":"!MyEMS1"}}' {{base_url}}/users/{id} ``` * PUT User Login by Username ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"johnson", "password":"!Password1"}}' {{base_url}}/users/login +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"johnson", "password":"!Password1"}}' {{base_url}}/users/login ``` * PUT User Login by Email ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"email":"johnson@myems.io", "password":"!Password1"}}' {{base_url}}/users/login +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"email":"johnson@myems.io", "password":"!Password1"}}' {{base_url}}/users/login ``` * PUT User Logout ```bash -$ curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X PUT {{base_url}}/users/logout +curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X PUT {{base_url}}/users/logout ``` * PUT User change password ```bash -$ curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X PUT -d '{"data":{"old_password":"Password1", "new_password":"Password2"}}' {{base_url}}/users/changepassword +curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X PUT -d '{"data":{"old_password":"Password1", "new_password":"Password2"}}' {{base_url}}/users/changepassword ``` * PUT User reset other user's password by administrator ```bash -$ curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X PUT -d '{"data":{"name":"johnson","password":"NewPassword1"}}' {{base_url}}/users/resetpassword +curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X PUT -d '{"data":{"name":"johnson","password":"NewPassword1"}}' {{base_url}}/users/resetpassword ``` ### Virtual Meter * GET a Virtual Meter by ID ```bash -$ curl -i -X GET {{base_url}}/virtualmeters/{id} +curl -i -X GET {{base_url}}/virtualmeters/{id} ``` Result @@ -2009,19 +2015,19 @@ Result * GET All Virtual Meters ```bash -$ curl -i -X GET {{base_url}}/virtualmeters +curl -i -X GET {{base_url}}/virtualmeters ``` * DELETE a Virtual Meter by ID ```bash -$ curl -i -X DELETE {{base_url}}/virtualmeters/{id} +curl -i -X DELETE {{base_url}}/virtualmeters/{id} ``` * POST Create New Virtual Meter ```bash -$ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"VM21", "energy_category_id":1, "is_counted": true, "cost_center_id":1, "energy_item_id":1, "description":"virtual description", "expression": {"equation":"x1-x2-x3", "variables":[{"name":"x1", "meter_type":"meter", "meter_id":3},{"name":"x2", "meter_type":"meter", "meter_id":4},{"name":"x3", "meter_type":"meter", "meter_id":5}] } }}' {{base_url}}/virtualmeters +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"VM21", "energy_category_id":1, "is_counted": true, "cost_center_id":1, "energy_item_id":1, "description":"virtual description", "expression": {"equation":"x1-x2-x3", "variables":[{"name":"x1", "meter_type":"meter", "meter_id":3},{"name":"x2", "meter_type":"meter", "meter_id":4},{"name":"x3", "meter_type":"meter", "meter_id":5}] } }}' {{base_url}}/virtualmeters ``` * PUT Update a Virtual Meter by ID ```bash -$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"VM21", "energy_category_id":1, "is_counted": true, "cost_center_id":1, "energy_item_id":1, "description":"virtual description", "expression": {"equation":"x1-x2-x3", "variables":[{"name":"x1", "meter_type":"meter", "meter_id":3},{"name":"x2", "meter_type":"meter", "meter_id":4},{"name":"x3", "meter_type":"meter", "meter_id":5}] } }}' {{base_url}}/virtualmeters/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"VM21", "energy_category_id":1, "is_counted": true, "cost_center_id":1, "energy_item_id":1, "description":"virtual description", "expression": {"equation":"x1-x2-x3", "variables":[{"name":"x1", "meter_type":"meter", "meter_id":3},{"name":"x2", "meter_type":"meter", "meter_id":4},{"name":"x3", "meter_type":"meter", "meter_id":5}] } }}' {{base_url}}/virtualmeters/{id} ``` ### Web Message @@ -2040,19 +2046,19 @@ Result in JSON | status | string | Status ('new', 'acknowledged', 'timeout') | | reply | string | User's Reply text, allow null | ```bash -$ curl -i -X GET {{base_url}}/webmessages/{id} +curl -i -X GET {{base_url}}/webmessages/{id} ``` * GET Web Messages from Startdate to Enddate ```bash -$ curl -i -X GET {{base_url}}/webmessages/from/{startdate}/to/{enddate} +curl -i -X GET {{base_url}}/webmessages/from/{startdate}/to/{enddate} ``` * GET New Web Messages ```bash -$ curl -i -X GET {{base_url}}/webmessagesnew +curl -i -X GET {{base_url}}/webmessagesnew ``` * DELETE a Web Message by ID ```bash -$ curl -i -X DELETE {{base_url}}/webmessages/{id} +curl -i -X DELETE {{base_url}}/webmessages/{id} ``` ### Wechat Message @@ -2072,15 +2078,15 @@ Result in JSON | acknowledge_code| string | Recipient reply with Acknowledge code to acknowledge | | status | string | Status ('new', 'sent', 'acknowledged', 'timeout'| ```bash -$ curl -i -X GET {{base_url}}/wechatmessages/{id} +curl -i -X GET {{base_url}}/wechatmessages/{id} ``` * GET a Wechat Messages from Startdate to Enddate ```bash -$ curl -i -X GET {{base_url}}/wechatmessages/from/{startdate}/to/{enddate} +curl -i -X GET {{base_url}}/wechatmessages/from/{startdate}/to/{enddate} ``` * DELETE a Wechat Message by ID ```bash -$ curl -i -X DELETE {{base_url}}/wechatmessages/{id} +curl -i -X DELETE {{base_url}}/wechatmessages/{id} ``` ### Reports diff --git a/myems-api/config.py b/myems-api/config.py index f597e100..5a365c99 100644 --- a/myems-api/config.py +++ b/myems-api/config.py @@ -62,6 +62,7 @@ myems_reporting_db = { } # address for Cookie domain +# use the actual domain or IP address of Web UI and Admin UI myems_api_domain = '127.0.0.1' # indicated in how many minutes to calculate meter energy consumption From f19a22813af2768eb614ff59a9a227c8758448c4 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sat, 28 Aug 2021 14:47:27 +0800 Subject: [PATCH 13/87] upgraded version number to v1.2.2 --- CHANGELOG.md | 29 +- admin/views/common/footer-login.html | 2 +- admin/views/common/footer.html | 2 +- web/package-lock.json | 3839 ++++++++++++++++++++------ web/package.json | 2 +- web/src/config.js | 2 +- 6 files changed, 3101 insertions(+), 775 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bab833a..6e13b5bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,32 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Removed - None. +## [v1.2.2] - 2021-08-28 +### Added +- added user log to UserLogin, ChangePassword and ResetPassword in API +- implemented user_logger decorators in API +- added default passwords to README. + +### Changed +- updated myems_user_db.tbl_logs in database +- updated i18n of WebUI +- changed user token hash algorithm from sha1 to sha256 in API +- upgraded dropzone js library in Admin UI +- moved css files for dropzone from js folder to css folder in Admin UI + +### Fixed +- fixed code style warnings in README +- fixed PEP8 warnings in API +- fixed code style warnings in API +- fixed translation errors in Admin UI +- fixed issues of markdown in README files +- fixed typeof issue of dropzone js in Admin UI +- fixed issue of 'typeof' expression compared to 'null' in Web UI +- fixed toaster issues for uploading file in Admin UI + +### Removed +- removed unnecessary dropzone-amd-module library from Admin UI + ## [v1.2.1] - 2021-08-19 ### Added - Added Missing Error Messages Words of API to Web UI i18n @@ -381,7 +407,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Removed - None. -[Unreleased]: https://github.com/MyEMS/myems/compare/v1.2.1...HEAD +[Unreleased]: https://github.com/MyEMS/myems/compare/v1.2.2...HEAD +[v1.2.2]: https://github.com/MyEMS/myems/compare/v1.2.1...v1.2.2 [v1.2.1]: https://github.com/MyEMS/myems/compare/v1.2.0...v1.2.1 [v1.2.0]: https://github.com/MyEMS/myems/compare/v1.1.6...v1.2.0 [v1.1.6]: https://github.com/MyEMS/myems/compare/v1.1.5...v1.1.6 diff --git a/admin/views/common/footer-login.html b/admin/views/common/footer-login.html index 26b194d9..f71b157c 100644 --- a/admin/views/common/footer-login.html +++ b/admin/views/common/footer-login.html @@ -1,5 +1,5 @@ diff --git a/admin/views/common/footer.html b/admin/views/common/footer.html index 02c4d66c..624aa98e 100644 --- a/admin/views/common/footer.html +++ b/admin/views/common/footer.html @@ -3,6 +3,6 @@ https://myems.io
- {{'MY_EMS_NAME' | translate}} v1.2.1 + {{'MY_EMS_NAME' | translate}} v1.2.2
diff --git a/web/package-lock.json b/web/package-lock.json index 81f061b2..c8cb36af 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "myems", - "version": "1.2.1", + "version": "1.2.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "myems", - "version": "1.2.1", + "version": "1.2.2", "dependencies": { "@fortawesome/fontawesome-free": "^5.15.1", "@fortawesome/fontawesome-svg-core": "^1.2.30", @@ -22295,15 +22295,18 @@ "dependencies": { "@babel/code-frame": { "version": "7.14.5", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", "requires": { "@babel/highlight": "^7.14.5" } }, "@babel/compat-data": { - "version": "7.14.7" + "version": "7.14.7", + "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==" }, "@babel/core": { "version": "7.9.0", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", "requires": { "@babel/code-frame": "^7.8.3", "@babel/generator": "^7.9.0", @@ -22324,12 +22327,14 @@ }, "dependencies": { "source-map": { - "version": "0.5.7" + "version": "0.5.7", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, "@babel/generator": { "version": "7.14.5", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", "requires": { "@babel/types": "^7.14.5", "jsesc": "^2.5.1", @@ -22337,21 +22342,25 @@ }, "dependencies": { "jsesc": { - "version": "2.5.2" + "version": "2.5.2", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, "source-map": { - "version": "0.5.7" + "version": "0.5.7", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, "@babel/helper-annotate-as-pure": { "version": "7.14.5", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", "requires": { "@babel/types": "^7.14.5" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.14.5", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", "requires": { "@babel/helper-explode-assignable-expression": "^7.14.5", "@babel/types": "^7.14.5" @@ -22359,6 +22368,7 @@ }, "@babel/helper-compilation-targets": { "version": "7.14.5", + "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", "requires": { "@babel/compat-data": "^7.14.5", "@babel/helper-validator-option": "^7.14.5", @@ -22367,12 +22377,14 @@ }, "dependencies": { "semver": { - "version": "6.3.0" + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/helper-create-class-features-plugin": { "version": "7.14.6", + "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", "requires": { "@babel/helper-annotate-as-pure": "^7.14.5", "@babel/helper-function-name": "^7.14.5", @@ -22384,6 +22396,7 @@ }, "@babel/helper-create-regexp-features-plugin": { "version": "7.14.5", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", "requires": { "@babel/helper-annotate-as-pure": "^7.14.5", "regexpu-core": "^4.7.1" @@ -22391,6 +22404,7 @@ }, "@babel/helper-define-polyfill-provider": { "version": "0.2.3", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", "requires": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -22403,18 +22417,21 @@ }, "dependencies": { "semver": { - "version": "6.3.0" + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/helper-explode-assignable-expression": { "version": "7.14.5", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", "requires": { "@babel/types": "^7.14.5" } }, "@babel/helper-function-name": { "version": "7.14.5", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", "requires": { "@babel/helper-get-function-arity": "^7.14.5", "@babel/template": "^7.14.5", @@ -22423,30 +22440,35 @@ }, "@babel/helper-get-function-arity": { "version": "7.14.5", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", "requires": { "@babel/types": "^7.14.5" } }, "@babel/helper-hoist-variables": { "version": "7.14.5", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", "requires": { "@babel/types": "^7.14.5" } }, "@babel/helper-member-expression-to-functions": { "version": "7.14.7", + "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", "requires": { "@babel/types": "^7.14.5" } }, "@babel/helper-module-imports": { "version": "7.14.5", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", "requires": { "@babel/types": "^7.14.5" } }, "@babel/helper-module-transforms": { "version": "7.14.5", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", "requires": { "@babel/helper-module-imports": "^7.14.5", "@babel/helper-replace-supers": "^7.14.5", @@ -22460,15 +22482,18 @@ }, "@babel/helper-optimise-call-expression": { "version": "7.14.5", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", "requires": { "@babel/types": "^7.14.5" } }, "@babel/helper-plugin-utils": { - "version": "7.14.5" + "version": "7.14.5", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" }, "@babel/helper-remap-async-to-generator": { "version": "7.14.5", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", "requires": { "@babel/helper-annotate-as-pure": "^7.14.5", "@babel/helper-wrap-function": "^7.14.5", @@ -22477,6 +22502,7 @@ }, "@babel/helper-replace-supers": { "version": "7.14.5", + "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", "requires": { "@babel/helper-member-expression-to-functions": "^7.14.5", "@babel/helper-optimise-call-expression": "^7.14.5", @@ -22486,30 +22512,36 @@ }, "@babel/helper-simple-access": { "version": "7.14.5", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", "requires": { "@babel/types": "^7.14.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { "version": "7.14.5", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", "requires": { "@babel/types": "^7.14.5" } }, "@babel/helper-split-export-declaration": { "version": "7.14.5", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", "requires": { "@babel/types": "^7.14.5" } }, "@babel/helper-validator-identifier": { - "version": "7.14.5" + "version": "7.14.5", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" }, "@babel/helper-validator-option": { - "version": "7.14.5" + "version": "7.14.5", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" }, "@babel/helper-wrap-function": { "version": "7.14.5", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", "requires": { "@babel/helper-function-name": "^7.14.5", "@babel/template": "^7.14.5", @@ -22519,6 +22551,7 @@ }, "@babel/helpers": { "version": "7.14.6", + "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", "requires": { "@babel/template": "^7.14.5", "@babel/traverse": "^7.14.5", @@ -22527,6 +22560,7 @@ }, "@babel/highlight": { "version": "7.14.5", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "requires": { "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", @@ -22535,12 +22569,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -22549,6 +22585,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -22556,10 +22593,12 @@ } }, "@babel/parser": { - "version": "7.14.7" + "version": "7.14.7", + "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==" }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.14.5", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", @@ -22568,6 +22607,7 @@ }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.14.7", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-remap-async-to-generator": "^7.14.5", @@ -22576,6 +22616,7 @@ }, "@babel/plugin-proposal-class-properties": { "version": "7.14.5", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", "requires": { "@babel/helper-create-class-features-plugin": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5" @@ -22583,6 +22624,7 @@ }, "@babel/plugin-proposal-class-static-block": { "version": "7.14.5", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", "requires": { "@babel/helper-create-class-features-plugin": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5", @@ -22591,6 +22633,7 @@ }, "@babel/plugin-proposal-decorators": { "version": "7.8.3", + "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", "requires": { "@babel/helper-create-class-features-plugin": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", @@ -22599,6 +22642,7 @@ }, "@babel/plugin-proposal-dynamic-import": { "version": "7.14.5", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -22606,6 +22650,7 @@ }, "@babel/plugin-proposal-export-namespace-from": { "version": "7.14.5", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -22613,6 +22658,7 @@ }, "@babel/plugin-proposal-json-strings": { "version": "7.14.5", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -22620,6 +22666,7 @@ }, "@babel/plugin-proposal-logical-assignment-operators": { "version": "7.14.5", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -22627,6 +22674,7 @@ }, "@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.14.5", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -22634,6 +22682,7 @@ }, "@babel/plugin-proposal-numeric-separator": { "version": "7.14.5", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -22641,6 +22690,7 @@ }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.14.7", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", "requires": { "@babel/compat-data": "^7.14.7", "@babel/helper-compilation-targets": "^7.14.5", @@ -22651,6 +22701,7 @@ }, "@babel/plugin-proposal-optional-catch-binding": { "version": "7.14.5", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -22658,6 +22709,7 @@ }, "@babel/plugin-proposal-optional-chaining": { "version": "7.14.5", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", @@ -22666,6 +22718,7 @@ }, "@babel/plugin-proposal-private-methods": { "version": "7.14.5", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", "requires": { "@babel/helper-create-class-features-plugin": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5" @@ -22673,6 +22726,7 @@ }, "@babel/plugin-proposal-private-property-in-object": { "version": "7.14.5", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", "requires": { "@babel/helper-annotate-as-pure": "^7.14.5", "@babel/helper-create-class-features-plugin": "^7.14.5", @@ -22682,6 +22736,7 @@ }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.14.5", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5" @@ -22689,120 +22744,140 @@ }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-class-properties": { "version": "7.12.13", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-class-static-block": { "version": "7.14.5", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-decorators": { "version": "7.14.5", + "integrity": "sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-flow": { "version": "7.14.5", + "integrity": "sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-jsx": { "version": "7.14.5", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-top-level-await": { "version": "7.14.5", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-typescript": { "version": "7.14.5", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-arrow-functions": { "version": "7.14.5", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-async-to-generator": { "version": "7.14.5", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", "requires": { "@babel/helper-module-imports": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5", @@ -22811,18 +22886,21 @@ }, "@babel/plugin-transform-block-scoped-functions": { "version": "7.14.5", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-block-scoping": { "version": "7.14.5", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-classes": { "version": "7.14.5", + "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", "requires": { "@babel/helper-annotate-as-pure": "^7.14.5", "@babel/helper-function-name": "^7.14.5", @@ -22835,18 +22913,21 @@ }, "@babel/plugin-transform-computed-properties": { "version": "7.14.5", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-destructuring": { "version": "7.14.7", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-dotall-regex": { "version": "7.14.5", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5" @@ -22854,12 +22935,14 @@ }, "@babel/plugin-transform-duplicate-keys": { "version": "7.14.5", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-exponentiation-operator": { "version": "7.14.5", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5" @@ -22867,6 +22950,7 @@ }, "@babel/plugin-transform-flow-strip-types": { "version": "7.9.0", + "integrity": "sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-flow": "^7.8.3" @@ -22874,12 +22958,14 @@ }, "@babel/plugin-transform-for-of": { "version": "7.14.5", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-function-name": { "version": "7.14.5", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", "requires": { "@babel/helper-function-name": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5" @@ -22887,18 +22973,21 @@ }, "@babel/plugin-transform-literals": { "version": "7.14.5", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-member-expression-literals": { "version": "7.14.5", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-modules-amd": { "version": "7.14.5", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", "requires": { "@babel/helper-module-transforms": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5", @@ -22907,6 +22996,7 @@ }, "@babel/plugin-transform-modules-commonjs": { "version": "7.14.5", + "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", "requires": { "@babel/helper-module-transforms": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5", @@ -22916,6 +23006,7 @@ }, "@babel/plugin-transform-modules-systemjs": { "version": "7.14.5", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", "requires": { "@babel/helper-hoist-variables": "^7.14.5", "@babel/helper-module-transforms": "^7.14.5", @@ -22926,6 +23017,7 @@ }, "@babel/plugin-transform-modules-umd": { "version": "7.14.5", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", "requires": { "@babel/helper-module-transforms": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5" @@ -22933,18 +23025,21 @@ }, "@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.14.7", + "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.14.5" } }, "@babel/plugin-transform-new-target": { "version": "7.14.5", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-object-super": { "version": "7.14.5", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-replace-supers": "^7.14.5" @@ -22952,30 +23047,35 @@ }, "@babel/plugin-transform-parameters": { "version": "7.14.5", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { "version": "7.14.5", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-constant-elements": { "version": "7.14.5", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-display-name": { "version": "7.14.5", + "integrity": "sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-jsx": { "version": "7.14.5", + "integrity": "sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q==", "requires": { "@babel/helper-annotate-as-pure": "^7.14.5", "@babel/helper-module-imports": "^7.14.5", @@ -22986,24 +23086,28 @@ }, "@babel/plugin-transform-react-jsx-development": { "version": "7.14.5", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", "requires": { "@babel/plugin-transform-react-jsx": "^7.14.5" } }, "@babel/plugin-transform-react-jsx-self": { "version": "7.14.5", + "integrity": "sha512-M/fmDX6n0cfHK/NLTcPmrfVAORKDhK8tyjDhyxlUjYyPYYO8FRWwuxBA3WBx8kWN/uBUuwGa3s/0+hQ9JIN3Tg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-jsx-source": { "version": "7.14.5", + "integrity": "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-pure-annotations": { "version": "7.14.5", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", "requires": { "@babel/helper-annotate-as-pure": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5" @@ -23011,18 +23115,21 @@ }, "@babel/plugin-transform-regenerator": { "version": "7.14.5", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { "version": "7.14.5", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-runtime": { "version": "7.9.0", + "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==", "requires": { "@babel/helper-module-imports": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", @@ -23032,12 +23139,14 @@ }, "@babel/plugin-transform-shorthand-properties": { "version": "7.14.5", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-spread": { "version": "7.14.6", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" @@ -23045,24 +23154,28 @@ }, "@babel/plugin-transform-sticky-regex": { "version": "7.14.5", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-template-literals": { "version": "7.14.5", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-typeof-symbol": { "version": "7.14.5", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-typescript": { "version": "7.14.6", + "integrity": "sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA==", "requires": { "@babel/helper-create-class-features-plugin": "^7.14.6", "@babel/helper-plugin-utils": "^7.14.5", @@ -23071,12 +23184,14 @@ }, "@babel/plugin-transform-unicode-escapes": { "version": "7.14.5", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-unicode-regex": { "version": "7.14.5", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5" @@ -23084,6 +23199,7 @@ }, "@babel/preset-env": { "version": "7.14.7", + "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", "requires": { "@babel/compat-data": "^7.14.7", "@babel/helper-compilation-targets": "^7.14.5", @@ -23161,12 +23277,14 @@ }, "dependencies": { "semver": { - "version": "6.3.0" + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/preset-modules": { "version": "0.1.4", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -23177,6 +23295,7 @@ }, "@babel/preset-react": { "version": "7.14.5", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-validator-option": "^7.14.5", @@ -23188,6 +23307,7 @@ }, "@babel/preset-typescript": { "version": "7.9.0", + "integrity": "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-transform-typescript": "^7.9.0" @@ -23195,12 +23315,14 @@ }, "@babel/runtime": { "version": "7.14.6", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { "version": "7.14.7", + "integrity": "sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA==", "requires": { "core-js-pure": "^3.15.0", "regenerator-runtime": "^0.13.4" @@ -23208,6 +23330,7 @@ }, "@babel/template": { "version": "7.14.5", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", "requires": { "@babel/code-frame": "^7.14.5", "@babel/parser": "^7.14.5", @@ -23216,6 +23339,7 @@ }, "@babel/traverse": { "version": "7.14.7", + "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", "requires": { "@babel/code-frame": "^7.14.5", "@babel/generator": "^7.14.5", @@ -23230,6 +23354,7 @@ }, "@babel/types": { "version": "7.14.5", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", "requires": { "@babel/helper-validator-identifier": "^7.14.5", "to-fast-properties": "^2.0.0" @@ -23237,6 +23362,7 @@ }, "@choojs/findup": { "version": "0.2.1", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", "dev": true, "requires": { "commander": "^2.15.1" @@ -23244,19 +23370,23 @@ }, "@cnakazawa/watch": { "version": "1.0.4", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "requires": { "exec-sh": "^0.3.2", "minimist": "^1.2.0" } }, "@csstools/convert-colors": { - "version": "1.4.0" + "version": "1.4.0", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" }, "@csstools/normalize.css": { - "version": "10.1.0" + "version": "10.1.0", + "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, "@emotion/cache": { "version": "10.0.29", + "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", "requires": { "@emotion/sheet": "0.9.4", "@emotion/stylis": "0.8.5", @@ -23266,6 +23396,7 @@ }, "@emotion/core": { "version": "10.1.1", + "integrity": "sha512-ZMLG6qpXR8x031NXD8HJqugy/AZSkAuMxxqB46pmAR7ze47MhNJ56cdoX243QPZdGctrdfo+s08yZTiwaUcRKA==", "requires": { "@babel/runtime": "^7.5.5", "@emotion/cache": "^10.0.27", @@ -23277,6 +23408,7 @@ }, "@emotion/css": { "version": "10.0.27", + "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", "requires": { "@emotion/serialize": "^0.11.15", "@emotion/utils": "0.11.3", @@ -23284,13 +23416,16 @@ } }, "@emotion/hash": { - "version": "0.8.0" + "version": "0.8.0", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "@emotion/memoize": { - "version": "0.7.4" + "version": "0.7.4", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" }, "@emotion/serialize": { "version": "0.11.16", + "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", "requires": { "@emotion/hash": "0.8.0", "@emotion/memoize": "0.7.4", @@ -23300,63 +23435,77 @@ }, "dependencies": { "csstype": { - "version": "2.6.17" + "version": "2.6.17", + "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" } } }, "@emotion/sheet": { - "version": "0.9.4" + "version": "0.9.4", + "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" }, "@emotion/stylis": { - "version": "0.8.5" + "version": "0.8.5", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" }, "@emotion/unitless": { - "version": "0.7.5" + "version": "0.7.5", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "@emotion/utils": { - "version": "0.11.3" + "version": "0.11.3", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" }, "@emotion/weak-memoize": { - "version": "0.2.5" + "version": "0.2.5", + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.35" + "version": "0.2.35", + "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==" }, "@fortawesome/fontawesome-free": { - "version": "5.15.3" + "version": "5.15.3", + "integrity": "sha512-rFnSUN/QOtnOAgqFRooTA3H57JLDm0QEG/jPdk+tLQNL/eWd+Aok8g3qCI+Q1xuDPWpGW/i9JySpJVsq8Q0s9w==" }, "@fortawesome/fontawesome-svg-core": { "version": "1.2.35", + "integrity": "sha512-uLEXifXIL7hnh2sNZQrIJWNol7cTVIzwI+4qcBIq9QWaZqUblm0IDrtSqbNg+3SQf8SMGHkiSigD++rHmCHjBg==", "requires": { "@fortawesome/fontawesome-common-types": "^0.2.35" } }, "@fortawesome/free-brands-svg-icons": { "version": "5.15.3", + "integrity": "sha512-1hirPcbjj72ZJtFvdnXGPbAbpn3Ox6mH3g5STbANFp3vGSiE5u5ingAKV06mK6ZVqNYxUPlh4DlTnaIvLtF2kw==", "requires": { "@fortawesome/fontawesome-common-types": "^0.2.35" } }, "@fortawesome/free-regular-svg-icons": { "version": "5.15.3", + "integrity": "sha512-q4/p8Xehy9qiVTdDWHL4Z+o5PCLRChePGZRTXkl+/Z7erDVL8VcZUuqzJjs6gUz6czss4VIPBRdCz6wP37/zMQ==", "requires": { "@fortawesome/fontawesome-common-types": "^0.2.35" } }, "@fortawesome/free-solid-svg-icons": { "version": "5.15.3", + "integrity": "sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q==", "requires": { "@fortawesome/fontawesome-common-types": "^0.2.35" } }, "@fortawesome/react-fontawesome": { "version": "0.1.14", + "integrity": "sha512-4wqNb0gRLVaBm/h+lGe8UfPPivcbuJ6ecI4hIgW0LjI7kzpYB9FkN0L9apbVzg+lsBdcTf0AlBtODjcSX5mmKA==", "requires": { "prop-types": "^15.7.2" } }, "@fullcalendar/bootstrap": { "version": "5.8.0", + "integrity": "sha512-KN1kZJj+A6sFwgGKK6d/Q+2z8W7ePiylCTR6YMmzp0TXH8pDCCnq+evuuDOserxv9MXVbYBKa1WYqEn9Pai1cQ==", "requires": { "@fullcalendar/common": "~5.8.0", "tslib": "^2.1.0" @@ -23364,12 +23513,14 @@ }, "@fullcalendar/common": { "version": "5.8.0", + "integrity": "sha512-cKmXNgo/9auw86MOwXxA+5FRrgvbE93C9YDwic+Alfm3bUruDTzJDnuvRndrFVurpSBLm6/ZitaR+yoWKLIsgA==", "requires": { "tslib": "^2.1.0" } }, "@fullcalendar/core": { "version": "5.8.0", + "integrity": "sha512-55Zwy4fwcxBqHjfjhV5eae4qOh9fMlpjGcyy4Zt39zA1NlgUW0JxCGOyIu2K2jm2JZn+27/P8b06JXy57DmtKg==", "requires": { "@fullcalendar/common": "~5.8.0", "preact": "^10.0.5", @@ -23378,6 +23529,7 @@ }, "@fullcalendar/daygrid": { "version": "5.8.0", + "integrity": "sha512-VrqwI97cewoUjFrKT67sS+f+JANI8xMx0g5bpM0XgV/KEEwvXpH5OmwkFSbXOnx1m4RXsvolQc6EBZpnJCf69Q==", "requires": { "@fullcalendar/common": "~5.8.0", "tslib": "^2.1.0" @@ -23385,6 +23537,7 @@ }, "@fullcalendar/interaction": { "version": "5.8.0", + "integrity": "sha512-ocOCS5g1AT06uR3OeKpN2WKJO4BLmnUZn/v2H/iPllbC7MwYBSy/obC4CoQqnK93FyJXUOFH1KfLwTK013C1+w==", "requires": { "@fullcalendar/common": "~5.8.0", "tslib": "^2.1.0" @@ -23392,6 +23545,7 @@ }, "@fullcalendar/list": { "version": "5.8.0", + "integrity": "sha512-JlqXbWq8Gl2BMx1mOAeEWakW43xDYypBBjwKztnax5tOB5Sfty8chVmeG7ffz2NFtvg2c1nj6MP/zGrVCYY0RA==", "requires": { "@fullcalendar/common": "~5.8.0", "tslib": "^2.1.0" @@ -23399,6 +23553,7 @@ }, "@fullcalendar/react": { "version": "5.8.0", + "integrity": "sha512-lGvExh2It8eEfH/Pu9Al6NExwAsq4zXFspcKeXjCARqETUqI0hL7PXuxwvedFlAGUuj2cdbpEnasFc89rGeENA==", "requires": { "@fullcalendar/common": "~5.8.0", "tslib": "^2.1.0" @@ -23406,6 +23561,7 @@ }, "@fullcalendar/timegrid": { "version": "5.8.0", + "integrity": "sha512-N24TkOuRkxMDn02E8LPj4fKKgAxQxF6k/PONIwMVHnOih2v3SeiKOOemmrk6uoTwOS7R2fVblOJQGFWXobYu3g==", "requires": { "@fullcalendar/common": "~5.8.0", "@fullcalendar/daygrid": "~5.8.0", @@ -23414,6 +23570,7 @@ }, "@gulp-sourcemaps/identity-map": { "version": "1.0.2", + "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", "dev": true, "requires": { "acorn": "^5.0.3", @@ -23425,16 +23582,19 @@ "dependencies": { "acorn": { "version": "5.7.4", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true }, "source-map": { "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "@gulp-sourcemaps/map-sources": { "version": "1.0.0", + "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", "dev": true, "requires": { "normalize-path": "^2.0.1", @@ -23442,16 +23602,20 @@ } }, "@hapi/address": { - "version": "2.1.4" + "version": "2.1.4", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" }, "@hapi/bourne": { - "version": "1.3.2" + "version": "1.3.2", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" }, "@hapi/hoek": { - "version": "8.5.1" + "version": "8.5.1", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" }, "@hapi/joi": { "version": "15.1.1", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", "requires": { "@hapi/address": "2.x.x", "@hapi/bourne": "1.x.x", @@ -23461,12 +23625,14 @@ }, "@hapi/topo": { "version": "3.1.6", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", "requires": { "@hapi/hoek": "^8.3.0" } }, "@hypnosphi/create-react-context": { "version": "0.3.1", + "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", "requires": { "gud": "^1.0.0", "warning": "^4.0.3" @@ -23474,6 +23640,7 @@ }, "@jest/console": { "version": "24.9.0", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", "requires": { "@jest/source-map": "^24.9.0", "chalk": "^2.0.1", @@ -23482,12 +23649,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -23496,6 +23665,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -23504,6 +23674,7 @@ }, "@jest/core": { "version": "24.9.0", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", "requires": { "@jest/console": "^24.7.1", "@jest/reporters": "^24.9.0", @@ -23536,19 +23707,23 @@ }, "dependencies": { "ansi-escapes": { - "version": "3.2.0" + "version": "3.2.0", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" }, "ansi-regex": { - "version": "4.1.0" + "version": "4.1.0", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -23557,12 +23732,14 @@ }, "strip-ansi": { "version": "5.2.0", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" } }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -23571,6 +23748,7 @@ }, "@jest/environment": { "version": "24.9.0", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", "requires": { "@jest/fake-timers": "^24.9.0", "@jest/transform": "^24.9.0", @@ -23580,6 +23758,7 @@ }, "@jest/fake-timers": { "version": "24.9.0", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", "requires": { "@jest/types": "^24.9.0", "jest-message-util": "^24.9.0", @@ -23588,6 +23767,7 @@ }, "@jest/reporters": { "version": "24.9.0", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", "requires": { "@jest/environment": "^24.9.0", "@jest/test-result": "^24.9.0", @@ -23614,12 +23794,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -23627,10 +23809,12 @@ } }, "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -23639,6 +23823,7 @@ }, "@jest/source-map": { "version": "24.9.0", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "requires": { "callsites": "^3.0.0", "graceful-fs": "^4.1.15", @@ -23646,15 +23831,18 @@ }, "dependencies": { "callsites": { - "version": "3.1.0" + "version": "3.1.0", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "@jest/test-result": { "version": "24.9.0", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", "requires": { "@jest/console": "^24.9.0", "@jest/types": "^24.9.0", @@ -23663,6 +23851,7 @@ }, "@jest/test-sequencer": { "version": "24.9.0", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", "requires": { "@jest/test-result": "^24.9.0", "jest-haste-map": "^24.9.0", @@ -23672,6 +23861,7 @@ }, "@jest/transform": { "version": "24.9.0", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", "requires": { "@babel/core": "^7.1.0", "@jest/types": "^24.9.0", @@ -23693,12 +23883,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -23706,10 +23898,12 @@ } }, "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -23718,6 +23912,7 @@ }, "@jest/types": { "version": "24.9.0", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", @@ -23726,6 +23921,7 @@ }, "@loadable/component": { "version": "5.15.0", + "integrity": "sha512-g63rQzypPOZi0BeGsK4ST2MYhsFR+i7bhL8k/McUoWDNMDuTTdUlQ2GACKxqh5sI/dNC/6nVoPrycMnSylnAgQ==", "requires": { "@babel/runtime": "^7.7.7", "hoist-non-react-statics": "^3.3.1", @@ -23734,6 +23930,7 @@ }, "@material-ui/core": { "version": "1.3.1", + "integrity": "sha512-h5pVkHgYrKExTdll4Y2Kmvkd5Hr4MxqEQLhRxzGTaXJ8RjOuRd+plfRk5r5ZauAdrIkKEsNcEt75VlEFX9aSGw==", "requires": { "@babel/runtime": "^7.0.0-beta.42", "@types/jss": "^9.5.3", @@ -23765,55 +23962,69 @@ }, "dependencies": { "csstype": { - "version": "2.6.17" + "version": "2.6.17", + "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" }, "hoist-non-react-statics": { - "version": "2.5.5" + "version": "2.5.5", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" } } }, "@material-ui/icons": { "version": "1.1.0", + "integrity": "sha512-Z4Xo/EYXuVqCIOjLw7AeBJPtJZsgy9dMAdqu6uYr7gxAefFA8L/QukLv/XE5ByxKYvRhzFG/AjA2OKXwKqfXBQ==", "requires": { "recompose": "^0.26.0 || ^0.27.0" } }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "requires": { "call-me-maybe": "^1.0.1", "glob-to-regexp": "^0.3.0" } }, "@nodelib/fs.stat": { - "version": "1.1.3" + "version": "1.1.3", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, "@svgr/babel-plugin-add-jsx-attribute": { - "version": "4.2.0" + "version": "4.2.0", + "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" }, "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0" + "version": "4.2.0", + "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" }, "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0" + "version": "4.2.0", + "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" }, "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0" + "version": "4.2.0", + "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" }, "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3" + "version": "4.3.3", + "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" }, "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0" + "version": "4.2.0", + "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" }, "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0" + "version": "4.2.0", + "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" }, "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0" + "version": "4.2.0", + "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" }, "@svgr/babel-preset": { "version": "4.3.3", + "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", "requires": { "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", @@ -23827,6 +24038,7 @@ }, "@svgr/core": { "version": "4.3.3", + "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", "requires": { "@svgr/plugin-jsx": "^4.3.3", "camelcase": "^5.3.1", @@ -23834,18 +24046,21 @@ }, "dependencies": { "camelcase": { - "version": "5.3.1" + "version": "5.3.1", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" } } }, "@svgr/hast-util-to-babel-ast": { "version": "4.3.2", + "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", "requires": { "@babel/types": "^7.4.4" } }, "@svgr/plugin-jsx": { "version": "4.3.3", + "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", "requires": { "@babel/core": "^7.4.5", "@svgr/babel-preset": "^4.3.3", @@ -23855,6 +24070,7 @@ }, "@svgr/plugin-svgo": { "version": "4.3.1", + "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", "requires": { "cosmiconfig": "^5.2.1", "merge-deep": "^3.0.2", @@ -23863,6 +24079,7 @@ }, "@svgr/webpack": { "version": "4.3.3", + "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", "requires": { "@babel/core": "^7.4.5", "@babel/plugin-transform-react-constant-elements": "^7.0.0", @@ -23876,6 +24093,7 @@ }, "@types/babel__core": { "version": "7.1.14", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -23886,12 +24104,14 @@ }, "@types/babel__generator": { "version": "7.6.2", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { "version": "7.4.0", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -23899,15 +24119,18 @@ }, "@types/babel__traverse": { "version": "7.11.1", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", "requires": { "@babel/types": "^7.3.0" } }, "@types/eslint-visitor-keys": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" }, "@types/glob": { "version": "7.1.3", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", "requires": { "@types/minimatch": "*", "@types/node": "*" @@ -23915,68 +24138,83 @@ }, "@types/hoist-non-react-statics": { "version": "3.3.1", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", "requires": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" } }, "@types/istanbul-lib-coverage": { - "version": "2.0.3" + "version": "2.0.3", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" }, "@types/istanbul-lib-report": { "version": "3.0.0", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "requires": { "@types/istanbul-lib-coverage": "*" } }, "@types/istanbul-reports": { "version": "1.1.2", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", "requires": { "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, "@types/json-schema": { - "version": "7.0.7" + "version": "7.0.7", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" }, "@types/jss": { "version": "9.5.8", + "integrity": "sha512-bBbHvjhm42UKki+wZpR89j73ykSXg99/bhuKuYYePtpma3ZAnmeGnl0WxXiZhPGsIfzKwCUkpPC0jlrVMBfRxA==", "requires": { "csstype": "^2.0.0", "indefinite-observable": "^1.0.1" }, "dependencies": { "csstype": { - "version": "2.6.17" + "version": "2.6.17", + "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" } } }, "@types/lodash": { - "version": "4.14.170" + "version": "4.14.170", + "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==" }, "@types/minimatch": { - "version": "3.0.4" + "version": "3.0.4", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" }, "@types/node": { - "version": "15.12.4" + "version": "15.12.4", + "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==" }, "@types/parse-json": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prop-types": { - "version": "15.7.3" + "version": "15.7.3", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "@types/q": { - "version": "1.5.4" + "version": "1.5.4", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" }, "@types/quill": { "version": "1.3.10", + "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", "requires": { "parchment": "^1.1.2" } }, "@types/react": { "version": "17.0.11", + "integrity": "sha512-yFRQbD+whVonItSk7ZzP/L+gPTJVBkL/7shLEF+i9GC/1cV3JmUxEQz6+9ylhUpWSDuqo1N9qEvqS6vTj4USUA==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -23985,6 +24223,7 @@ }, "@types/react-redux": { "version": "7.1.16", + "integrity": "sha512-f/FKzIrZwZk7YEO9E1yoxIuDNRiDducxkFlkw/GNMGEnK9n4K8wJzlJBghpSuOVDgEUHoDkDF7Gi9lHNQR4siw==", "requires": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -23994,27 +24233,33 @@ }, "@types/react-transition-group": { "version": "2.9.2", + "integrity": "sha512-5Fv2DQNO+GpdPZcxp2x/OQG/H19A01WlmpjVD9cKvVFmoVLOZ9LvBgSWG6pSXIU4og5fgbvGPaCV5+VGkWAEHA==", "requires": { "@types/react": "*" } }, "@types/scheduler": { - "version": "0.16.1" + "version": "0.16.1", + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" }, "@types/stack-utils": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" }, "@types/yargs": { "version": "13.0.11", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "20.2.0" + "version": "20.2.0", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" }, "@typescript-eslint/eslint-plugin": { "version": "2.34.0", + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", "requires": { "@typescript-eslint/experimental-utils": "2.34.0", "functional-red-black-tree": "^1.0.1", @@ -24024,6 +24269,7 @@ }, "@typescript-eslint/experimental-utils": { "version": "2.34.0", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", "requires": { "@types/json-schema": "^7.0.3", "@typescript-eslint/typescript-estree": "2.34.0", @@ -24033,6 +24279,7 @@ }, "@typescript-eslint/parser": { "version": "2.34.0", + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", "requires": { "@types/eslint-visitor-keys": "^1.0.0", "@typescript-eslint/experimental-utils": "2.34.0", @@ -24042,6 +24289,7 @@ }, "@typescript-eslint/typescript-estree": { "version": "2.34.0", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", "requires": { "debug": "^4.1.1", "eslint-visitor-keys": "^1.1.0", @@ -24054,23 +24302,27 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "semver": { "version": "7.3.5", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "@webassemblyjs/ast": { "version": "1.8.5", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", "requires": { "@webassemblyjs/helper-module-context": "1.8.5", "@webassemblyjs/helper-wasm-bytecode": "1.8.5", @@ -24078,35 +24330,43 @@ } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5" + "version": "1.8.5", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" }, "@webassemblyjs/helper-api-error": { - "version": "1.8.5" + "version": "1.8.5", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" }, "@webassemblyjs/helper-buffer": { - "version": "1.8.5" + "version": "1.8.5", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" }, "@webassemblyjs/helper-code-frame": { "version": "1.8.5", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", "requires": { "@webassemblyjs/wast-printer": "1.8.5" } }, "@webassemblyjs/helper-fsm": { - "version": "1.8.5" + "version": "1.8.5", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" }, "@webassemblyjs/helper-module-context": { "version": "1.8.5", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", "requires": { "@webassemblyjs/ast": "1.8.5", "mamacro": "^0.0.3" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5" + "version": "1.8.5", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" }, "@webassemblyjs/helper-wasm-section": { "version": "1.8.5", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-buffer": "1.8.5", @@ -24116,21 +24376,25 @@ }, "@webassemblyjs/ieee754": { "version": "1.8.5", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { "version": "1.8.5", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.8.5" + "version": "1.8.5", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" }, "@webassemblyjs/wasm-edit": { "version": "1.8.5", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-buffer": "1.8.5", @@ -24144,6 +24408,7 @@ }, "@webassemblyjs/wasm-gen": { "version": "1.8.5", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-wasm-bytecode": "1.8.5", @@ -24154,6 +24419,7 @@ }, "@webassemblyjs/wasm-opt": { "version": "1.8.5", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-buffer": "1.8.5", @@ -24163,6 +24429,7 @@ }, "@webassemblyjs/wasm-parser": { "version": "1.8.5", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-api-error": "1.8.5", @@ -24174,6 +24441,7 @@ }, "@webassemblyjs/wast-parser": { "version": "1.8.5", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/floating-point-hex-parser": "1.8.5", @@ -24185,6 +24453,7 @@ }, "@webassemblyjs/wast-printer": { "version": "1.8.5", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/wast-parser": "1.8.5", @@ -24192,51 +24461,63 @@ } }, "@xtuc/ieee754": { - "version": "1.2.0" + "version": "1.2.0", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "@xtuc/long": { - "version": "4.2.2" + "version": "4.2.2", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "abab": { - "version": "2.0.5" + "version": "2.0.5", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" }, "abbrev": { - "version": "1.1.1" + "version": "1.1.1", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accepts": { "version": "1.3.7", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { "mime-types": "~2.1.24", "negotiator": "0.6.2" } }, "acorn": { - "version": "7.4.1" + "version": "7.4.1", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" }, "acorn-globals": { "version": "4.3.4", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "requires": { "acorn": "^6.0.1", "acorn-walk": "^6.0.1" }, "dependencies": { "acorn": { - "version": "6.4.2" + "version": "6.4.2", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" } } }, "acorn-jsx": { "version": "5.3.1", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "requires": {} }, "acorn-walk": { - "version": "6.2.0" + "version": "6.2.0", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" }, "address": { - "version": "1.1.2" + "version": "1.1.2", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" }, "adjust-sourcemap-loader": { "version": "3.0.0", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", "requires": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -24244,6 +24525,7 @@ "dependencies": { "loader-utils": { "version": "2.0.0", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -24254,22 +24536,26 @@ }, "after": { "version": "0.8.2", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", "dev": true }, "aggregate-error": { "version": "3.1.0", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" }, "dependencies": { "indent-string": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" } } }, "ajv": { "version": "6.12.6", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -24278,29 +24564,36 @@ }, "dependencies": { "fast-deep-equal": { - "version": "3.1.3" + "version": "3.1.3", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" } } }, "ajv-errors": { "version": "1.0.1", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", "requires": {} }, "ajv-keywords": { "version": "3.5.2", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "requires": {} }, "alphanum-sort": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, "amdefine": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, "ansi-colors": { - "version": "3.2.4" + "version": "3.2.4", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" }, "ansi-cyan": { "version": "0.1.1", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", "dev": true, "requires": { "ansi-wrap": "0.1.0" @@ -24308,44 +24601,53 @@ }, "ansi-escapes": { "version": "4.3.2", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "requires": { "type-fest": "^0.21.3" }, "dependencies": { "type-fest": { - "version": "0.21.3" + "version": "0.21.3", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" } } }, "ansi-gray": { "version": "0.1.1", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", "dev": true, "requires": { "ansi-wrap": "0.1.0" } }, "ansi-html": { - "version": "0.0.7" + "version": "0.0.7", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, "ansi-red": { "version": "0.1.1", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", "dev": true, "requires": { "ansi-wrap": "0.1.0" } }, "ansi-regex": { - "version": "2.1.1" + "version": "2.1.1", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { - "version": "2.2.1" + "version": "2.2.1", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "ansi-wrap": { "version": "0.1.0", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true }, "anymatch": { "version": "2.0.0", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -24353,20 +24655,24 @@ }, "append-buffer": { "version": "1.0.2", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", "dev": true, "requires": { "buffer-equal": "^1.0.0" } }, "aproba": { - "version": "1.2.0" + "version": "1.2.0", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "archy": { "version": "1.0.0", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, "are-we-there-yet": { "version": "1.1.5", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -24374,58 +24680,71 @@ }, "argparse": { "version": "1.0.10", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { "sprintf-js": "~1.0.2" } }, "aria-query": { "version": "3.0.0", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", "requires": { "ast-types-flow": "0.0.7", "commander": "^2.11.0" } }, "arity-n": { - "version": "1.0.4" + "version": "1.0.4", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" }, "arr-diff": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, "arr-filter": { "version": "1.1.2", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", "dev": true, "requires": { "make-iterator": "^1.0.0" } }, "arr-flatten": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, "arr-map": { "version": "2.0.2", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", "dev": true, "requires": { "make-iterator": "^1.0.0" } }, "arr-union": { - "version": "3.1.0" + "version": "3.1.0", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, "array-each": { "version": "1.0.1", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", "dev": true }, "array-equal": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" }, "array-find-index": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "array-flatten": { - "version": "2.1.2" + "version": "2.1.2", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-includes": { "version": "3.1.3", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -24436,6 +24755,7 @@ }, "array-initial": { "version": "1.1.0", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", "dev": true, "requires": { "array-slice": "^1.0.0", @@ -24444,12 +24764,14 @@ "dependencies": { "is-number": { "version": "4.0.0", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true } } }, "array-last": { "version": "1.3.0", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", "dev": true, "requires": { "is-number": "^4.0.0" @@ -24457,16 +24779,19 @@ "dependencies": { "is-number": { "version": "4.0.0", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true } } }, "array-slice": { "version": "1.1.0", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", "dev": true }, "array-sort": { "version": "1.0.0", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", "dev": true, "requires": { "default-compare": "^1.0.0", @@ -24476,27 +24801,33 @@ "dependencies": { "kind-of": { "version": "5.1.0", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, "array-tree-filter": { - "version": "2.1.0" + "version": "2.1.0", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" }, "array-union": { "version": "1.0.2", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { "array-uniq": "^1.0.1" } }, "array-uniq": { - "version": "1.0.3" + "version": "1.0.3", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { - "version": "0.3.2" + "version": "0.3.2", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, "array.prototype.flat": { "version": "1.2.4", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -24505,6 +24836,7 @@ }, "array.prototype.flatmap": { "version": "1.2.4", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -24514,22 +24846,27 @@ }, "arraybuffer.slice": { "version": "0.0.7", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", "dev": true }, "arrify": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, "asap": { - "version": "2.0.6" + "version": "2.0.6", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asn1": { "version": "0.2.4", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { "safer-buffer": "~2.1.0" } }, "asn1.js": { "version": "5.4.1", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -24538,22 +24875,26 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0" + "version": "4.12.0", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "assert": { "version": "1.5.0", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "requires": { "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { "inherits": { - "version": "2.0.1" + "version": "2.0.1", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" }, "util": { "version": "0.10.3", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "requires": { "inherits": "2.0.1" } @@ -24561,25 +24902,31 @@ } }, "assert-plus": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assign-symbols": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "ast-types-flow": { - "version": "0.0.7" + "version": "0.0.7", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" }, "astral-regex": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" }, "async": { "version": "2.6.3", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "requires": { "lodash": "^4.17.14" } }, "async-done": { "version": "1.3.2", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -24589,36 +24936,45 @@ } }, "async-each": { - "version": "1.0.3" + "version": "1.0.3", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" }, "async-each-series": { "version": "0.1.1", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", "dev": true }, "async-foreach": { - "version": "0.1.3" + "version": "0.1.3", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" }, "async-limiter": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "async-settle": { "version": "1.0.0", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", "dev": true, "requires": { "async-done": "^1.2.2" } }, "asynckit": { - "version": "0.4.0" + "version": "0.4.0", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { - "version": "2.1.2" + "version": "2.1.2", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "attr-accept": { - "version": "2.2.2" + "version": "2.2.2", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==" }, "autoprefixer": { "version": "9.8.6", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", "requires": { "browserslist": "^4.12.0", "caniuse-lite": "^1.0.30001109", @@ -24630,23 +24986,28 @@ } }, "aws-sign2": { - "version": "0.7.0" + "version": "0.7.0", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.11.0" + "version": "1.11.0", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "axios": { "version": "0.21.1", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", "dev": true, "requires": { "follow-redirects": "^1.10.0" } }, "axobject-query": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" }, "babel-code-frame": { "version": "6.26.0", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "requires": { "chalk": "^1.1.3", "esutils": "^2.0.2", @@ -24654,12 +25015,14 @@ }, "dependencies": { "js-tokens": { - "version": "3.0.2" + "version": "3.0.2", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" } } }, "babel-eslint": { "version": "10.1.0", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.7.0", @@ -24671,12 +25034,14 @@ }, "babel-extract-comments": { "version": "1.0.0", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", "requires": { "babylon": "^6.18.0" } }, "babel-jest": { "version": "24.9.0", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "requires": { "@jest/transform": "^24.9.0", "@jest/types": "^24.9.0", @@ -24689,12 +25054,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -24703,6 +25070,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -24711,6 +25079,7 @@ }, "babel-loader": { "version": "8.1.0", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", "requires": { "find-cache-dir": "^2.1.0", "loader-utils": "^1.4.0", @@ -24720,18 +25089,21 @@ }, "dependencies": { "pify": { - "version": "4.0.1" + "version": "4.0.1", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" } } }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "requires": { "object.assign": "^4.1.0" } }, "babel-plugin-emotion": { "version": "10.2.2", + "integrity": "sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==", "requires": { "@babel/helper-module-imports": "^7.0.0", "@emotion/hash": "0.8.0", @@ -24746,12 +25118,14 @@ }, "dependencies": { "source-map": { - "version": "0.5.7" + "version": "0.5.7", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, "babel-plugin-istanbul": { "version": "5.2.0", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "find-up": "^3.0.0", @@ -24761,6 +25135,7 @@ "dependencies": { "find-up": { "version": "3.0.0", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { "locate-path": "^3.0.0" } @@ -24769,12 +25144,14 @@ }, "babel-plugin-jest-hoist": { "version": "24.9.0", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-plugin-macros": { "version": "2.8.0", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", "requires": { "@babel/runtime": "^7.7.2", "cosmiconfig": "^6.0.0", @@ -24783,6 +25160,7 @@ "dependencies": { "cosmiconfig": { "version": "6.0.0", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -24793,6 +25171,7 @@ }, "import-fresh": { "version": "3.3.0", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -24800,6 +25179,7 @@ }, "parse-json": { "version": "5.2.0", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -24808,19 +25188,23 @@ } }, "path-type": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "resolve-from": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" } } }, "babel-plugin-named-asset-import": { "version": "0.3.7", + "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==", "requires": {} }, "babel-plugin-polyfill-corejs2": { "version": "0.2.2", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", "requires": { "@babel/compat-data": "^7.13.11", "@babel/helper-define-polyfill-provider": "^0.2.2", @@ -24828,12 +25212,14 @@ }, "dependencies": { "semver": { - "version": "6.3.0" + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "babel-plugin-polyfill-corejs3": { "version": "0.2.3", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", "requires": { "@babel/helper-define-polyfill-provider": "^0.2.2", "core-js-compat": "^3.14.0" @@ -24841,28 +25227,34 @@ }, "babel-plugin-polyfill-regenerator": { "version": "0.2.2", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", "requires": { "@babel/helper-define-polyfill-provider": "^0.2.2" } }, "babel-plugin-syntax-jsx": { - "version": "6.18.0" + "version": "6.18.0", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" }, "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0" + "version": "6.13.0", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" }, "babel-plugin-transform-object-rest-spread": { "version": "6.26.0", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "requires": { "babel-plugin-syntax-object-rest-spread": "^6.8.0", "babel-runtime": "^6.26.0" } }, "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24" + "version": "0.4.24", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" }, "babel-preset-jest": { "version": "24.9.0", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "requires": { "@babel/plugin-syntax-object-rest-spread": "^7.0.0", "babel-plugin-jest-hoist": "^24.9.0" @@ -24870,6 +25262,7 @@ }, "babel-preset-react-app": { "version": "9.1.2", + "integrity": "sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA==", "requires": { "@babel/core": "7.9.0", "@babel/plugin-proposal-class-properties": "7.8.3", @@ -24890,6 +25283,7 @@ "dependencies": { "@babel/plugin-proposal-class-properties": { "version": "7.8.3", + "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", "requires": { "@babel/helper-create-class-features-plugin": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" @@ -24897,6 +25291,7 @@ }, "@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.8.3", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" @@ -24904,6 +25299,7 @@ }, "@babel/plugin-proposal-numeric-separator": { "version": "7.8.3", + "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.8.3" @@ -24911,6 +25307,7 @@ }, "@babel/plugin-proposal-optional-chaining": { "version": "7.9.0", + "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.0" @@ -24918,12 +25315,14 @@ }, "@babel/plugin-transform-react-display-name": { "version": "7.8.3", + "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", "requires": { "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/preset-env": { "version": "7.9.0", + "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", "requires": { "@babel/compat-data": "^7.9.0", "@babel/helper-compilation-targets": "^7.8.7", @@ -24989,6 +25388,7 @@ }, "@babel/preset-react": { "version": "7.9.1", + "integrity": "sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-transform-react-display-name": "^7.8.3", @@ -25000,6 +25400,7 @@ }, "@babel/runtime": { "version": "7.9.0", + "integrity": "sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -25008,24 +25409,29 @@ }, "babel-runtime": { "version": "6.26.0", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" }, "dependencies": { "core-js": { - "version": "2.6.12" + "version": "2.6.12", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "regenerator-runtime": { - "version": "0.11.1" + "version": "0.11.1", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" } } }, "babylon": { - "version": "6.18.0" + "version": "6.18.0", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "bach": { "version": "1.2.0", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", "dev": true, "requires": { "arr-filter": "^1.1.1", @@ -25041,13 +25447,16 @@ }, "backo2": { "version": "1.0.2", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", "dev": true }, "balanced-match": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base": { "version": "0.11.2", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -25060,24 +25469,28 @@ "dependencies": { "define-property": { "version": "1.0.0", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { "version": "1.0.0", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -25085,54 +25498,67 @@ } }, "kind-of": { - "version": "6.0.3" + "version": "6.0.3", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, "base64-arraybuffer": { "version": "0.1.4", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", "dev": true }, "base64-js": { - "version": "1.5.1" + "version": "1.5.1", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "base64id": { "version": "2.0.0", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, "batch": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, "bcrypt-pbkdf": { "version": "1.0.2", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { "tweetnacl": "^0.14.3" } }, "big.js": { - "version": "5.2.2" + "version": "5.2.2", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "binary-extensions": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "blob": { "version": "0.0.5", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", "dev": true }, "block-stream": { "version": "0.0.9", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { "inherits": "~2.0.0" } }, "bluebird": { - "version": "3.7.2" + "version": "3.7.2", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "bn.js": { - "version": "5.2.0" + "version": "5.2.0", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" }, "body-parser": { "version": "1.19.0", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { "bytes": "3.1.0", "content-type": "~1.0.4", @@ -25147,30 +25573,36 @@ }, "dependencies": { "bytes": { - "version": "3.1.0" + "version": "3.1.0", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "debug": { "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "iconv-lite": { "version": "0.4.24", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ms": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "qs": { - "version": "6.7.0" + "version": "6.7.0", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" } } }, "bonjour": { "version": "3.5.0", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "requires": { "array-flatten": "^2.1.0", "deep-equal": "^1.0.1", @@ -25181,14 +25613,17 @@ } }, "boolbase": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "bootstrap": { "version": "4.6.0", + "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==", "requires": {} }, "brace-expansion": { "version": "1.1.11", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -25196,6 +25631,7 @@ }, "braces": { "version": "2.3.2", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -25210,27 +25646,33 @@ } }, "brcast": { - "version": "3.0.2" + "version": "3.0.2", + "integrity": "sha512-f5XwwFCCuvgqP2nMH/hJ74FqnGmb4X3D+NC//HphxJzzhsZvSZa+Hk/syB7j3ZHpPDLMoYU8oBgviRWfNvEfKA==" }, "brorand": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-process-hrtime": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "browser-resolve": { "version": "1.11.3", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", "requires": { "resolve": "1.1.7" }, "dependencies": { "resolve": { - "version": "1.1.7" + "version": "1.1.7", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" } } }, "browser-sync": { "version": "2.27.1", + "integrity": "sha512-pw2hUeFPAfR75+fEMz0J4T+QtxC3x6hyc/W4FCiai8+b3BO5lqpwIOX3t6VDQyRDRcAFWsiIBZVZ0LCNZfEE+g==", "dev": true, "requires": { "browser-sync-client": "^2.27.1", @@ -25267,10 +25709,12 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { "version": "4.3.0", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" @@ -25278,6 +25722,7 @@ }, "braces": { "version": "3.0.2", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -25285,10 +25730,12 @@ }, "camelcase": { "version": "5.3.1", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "cliui": { "version": "6.0.0", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { "string-width": "^4.2.0", @@ -25298,6 +25745,7 @@ }, "color-convert": { "version": "2.0.1", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" @@ -25305,6 +25753,7 @@ }, "debug": { "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -25312,10 +25761,12 @@ }, "emoji-regex": { "version": "8.0.0", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "fill-range": { "version": "7.0.1", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -25323,6 +25774,7 @@ }, "find-up": { "version": "4.1.0", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", @@ -25331,6 +25783,7 @@ }, "fs-extra": { "version": "3.0.1", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -25340,6 +25793,7 @@ }, "http-errors": { "version": "1.6.3", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { "depd": "~1.1.2", @@ -25350,18 +25804,22 @@ }, "inherits": { "version": "2.0.3", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-number": { "version": "7.0.0", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jsonfile": { "version": "3.0.1", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", "dev": true, "requires": { "graceful-fs": "^4.1.6" @@ -25369,6 +25827,7 @@ }, "locate-path": { "version": "5.0.0", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" @@ -25376,6 +25835,7 @@ }, "micromatch": { "version": "4.0.4", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", @@ -25384,14 +25844,17 @@ }, "mime": { "version": "1.4.1", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "dev": true }, "ms": { "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "opn": { "version": "5.3.0", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { "is-wsl": "^1.1.0" @@ -25399,6 +25862,7 @@ }, "p-locate": { "version": "4.1.0", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" @@ -25406,14 +25870,17 @@ }, "path-exists": { "version": "4.0.0", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "qs": { "version": "6.2.3", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", "dev": true }, "send": { "version": "0.16.2", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "dev": true, "requires": { "debug": "2.6.9", @@ -25433,6 +25900,7 @@ }, "serve-static": { "version": "1.13.2", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "requires": { "encodeurl": "~1.0.2", @@ -25443,14 +25911,17 @@ }, "setprototypeof": { "version": "1.1.0", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, "statuses": { "version": "1.4.0", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "dev": true }, "string-width": { "version": "4.2.2", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -25460,6 +25931,7 @@ }, "strip-ansi": { "version": "6.0.0", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { "ansi-regex": "^5.0.0" @@ -25467,6 +25939,7 @@ }, "to-regex-range": { "version": "5.0.1", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -25474,6 +25947,7 @@ }, "wrap-ansi": { "version": "6.2.0", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -25483,6 +25957,7 @@ }, "yargs": { "version": "15.4.1", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { "cliui": "^6.0.0", @@ -25500,6 +25975,7 @@ }, "yargs-parser": { "version": "18.1.3", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -25510,6 +25986,7 @@ }, "browser-sync-client": { "version": "2.27.1", + "integrity": "sha512-/w4dGzleL2Td2pffYgAzIURYK0uTpDlSjxVc26kIPXDD8FwAgnt0SRqMrEKRnF9UzHMN5VxdqBwa8isGmFlJGA==", "dev": true, "requires": { "etag": "1.8.1", @@ -25520,6 +25997,7 @@ "dependencies": { "rxjs": { "version": "5.5.12", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", "dev": true, "requires": { "symbol-observable": "1.0.1" @@ -25527,12 +26005,14 @@ }, "symbol-observable": { "version": "1.0.1", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", "dev": true } } }, "browser-sync-ui": { "version": "2.27.1", + "integrity": "sha512-lmHVODr1k1IKILhhwrr2iQmoLj95eElqBj8cUC7voXqKvv18Wt/VBosZX6IpKU+WMML8YasgyDS1hqTM+Tu4kA==", "dev": true, "requires": { "async-each-series": "0.1.1", @@ -25545,6 +26025,7 @@ }, "browserify-aes": { "version": "1.2.0", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -25556,6 +26037,7 @@ }, "browserify-cipher": { "version": "1.0.1", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -25564,6 +26046,7 @@ }, "browserify-des": { "version": "1.0.2", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -25573,6 +26056,7 @@ }, "browserify-rsa": { "version": "4.1.0", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "requires": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -25580,6 +26064,7 @@ }, "browserify-sign": { "version": "4.2.1", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -25594,6 +26079,7 @@ "dependencies": { "readable-stream": { "version": "3.6.0", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -25601,18 +26087,21 @@ } }, "safe-buffer": { - "version": "5.2.1" + "version": "5.2.1", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, "browserify-zlib": { "version": "0.2.0", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { "pako": "~1.0.5" } }, "browserslist": { "version": "4.16.6", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "requires": { "caniuse-lite": "^1.0.30001219", "colorette": "^1.2.2", @@ -25623,20 +26112,24 @@ }, "bs-recipes": { "version": "1.3.4", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", "dev": true }, "bs-snippet-injector": { "version": "2.0.1", + "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", "dev": true }, "bser": { "version": "2.1.1", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "requires": { "node-int64": "^0.4.0" } }, "buble": { "version": "0.19.6", + "integrity": "sha512-9kViM6nJA1Q548Jrd06x0geh+BG2ru2+RMDkIHHgJY/8AcyCs34lTHwra9BX7YdPrZXd5aarkpr/SY8bmPgPdg==", "requires": { "chalk": "^2.4.1", "magic-string": "^0.25.1", @@ -25648,12 +26141,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -25662,6 +26157,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -25670,6 +26166,7 @@ }, "buffer": { "version": "4.9.2", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", @@ -25678,25 +26175,32 @@ }, "buffer-equal": { "version": "1.0.0", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true }, "buffer-from": { - "version": "1.1.1" + "version": "1.1.1", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-indexof": { - "version": "1.1.1" + "version": "1.1.1", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" }, "buffer-xor": { - "version": "1.0.3" + "version": "1.0.3", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-status-codes": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "bytes": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacache": { "version": "13.0.1", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", "requires": { "chownr": "^1.1.2", "figgy-pudding": "^3.5.1", @@ -25720,17 +26224,20 @@ "dependencies": { "lru-cache": { "version": "5.1.1", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { "yallist": "^3.0.2" } }, "yallist": { - "version": "3.1.1" + "version": "3.1.1", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, "cache-base": { "version": "1.0.1", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -25745,41 +26252,49 @@ }, "call-bind": { "version": "1.0.2", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, "call-me-maybe": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" }, "caller-callsite": { "version": "2.0.0", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "requires": { "callsites": "^2.0.0" } }, "caller-path": { "version": "2.0.0", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "requires": { "caller-callsite": "^2.0.0" } }, "callsites": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" }, "camel-case": { "version": "4.1.2", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "requires": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "camelcase": { - "version": "2.1.1" + "version": "2.1.1", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" }, "camelcase-keys": { "version": "2.1.0", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "requires": { "camelcase": "^2.0.0", "map-obj": "^1.0.0" @@ -25787,6 +26302,7 @@ }, "caniuse-api": { "version": "3.0.0", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "requires": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -25795,22 +26311,27 @@ } }, "caniuse-lite": { - "version": "1.0.30001239" + "version": "1.0.30001239", + "integrity": "sha512-cyBkXJDMeI4wthy8xJ2FvDU6+0dtcZSJW3voUF8+e9f1bBeuvyZfc3PNbkOETyhbR+dGCPzn9E7MA3iwzusOhQ==" }, "capture-exit": { "version": "2.0.0", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "requires": { "rsvp": "^4.8.4" } }, "case-sensitive-paths-webpack-plugin": { - "version": "2.3.0" + "version": "2.3.0", + "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==" }, "caseless": { - "version": "0.12.0" + "version": "0.12.0", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chalk": { "version": "1.1.3", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -25820,13 +26341,16 @@ } }, "change-emitter": { - "version": "0.1.6" + "version": "0.1.6", + "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=" }, "chardet": { - "version": "0.7.0" + "version": "0.7.0", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "chart.js": { "version": "2.9.4", + "integrity": "sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==", "requires": { "chartjs-color": "^2.1.0", "moment": "^2.10.2" @@ -25834,6 +26358,7 @@ }, "chartjs-color": { "version": "2.4.1", + "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", "requires": { "chartjs-color-string": "^0.6.0", "color-convert": "^1.9.3" @@ -25841,12 +26366,14 @@ }, "chartjs-color-string": { "version": "0.6.0", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", "requires": { "color-name": "^1.0.0" } }, "chokidar": { "version": "3.5.2", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -25860,6 +26387,7 @@ "dependencies": { "anymatch": { "version": "3.1.2", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -25867,24 +26395,29 @@ }, "braces": { "version": "3.0.2", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, "fill-range": { "version": "7.0.1", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" } }, "is-number": { - "version": "7.0.0" + "version": "7.0.0", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "normalize-path": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "to-regex-range": { "version": "5.0.1", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { "is-number": "^7.0.0" } @@ -25892,16 +26425,20 @@ } }, "chownr": { - "version": "1.1.4" + "version": "1.1.4", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "chrome-trace-event": { - "version": "1.0.3" + "version": "1.0.3", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "cipher-base": { "version": "1.0.4", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -25909,6 +26446,7 @@ }, "class-utils": { "version": "0.3.6", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -25918,6 +26456,7 @@ "dependencies": { "define-property": { "version": "0.2.5", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" } @@ -25925,33 +26464,40 @@ } }, "classnames": { - "version": "2.3.1" + "version": "2.3.1", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" }, "clean-css": { "version": "4.2.3", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", "requires": { "source-map": "~0.6.0" }, "dependencies": { "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "clean-stack": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, "cli-cursor": { "version": "3.1.0", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "requires": { "restore-cursor": "^3.1.0" } }, "cli-width": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" }, "cliui": { "version": "5.0.0", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", @@ -25959,13 +26505,16 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0" + "version": "4.1.0", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "is-fullwidth-code-point": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "3.1.0", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -25974,6 +26523,7 @@ }, "strip-ansi": { "version": "5.2.0", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" } @@ -25981,14 +26531,17 @@ } }, "clone": { - "version": "2.1.2" + "version": "2.1.2", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" }, "clone-buffer": { "version": "1.0.0", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", "dev": true }, "clone-deep": { "version": "0.2.4", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", "requires": { "for-own": "^0.1.3", "is-plain-object": "^2.0.1", @@ -25999,10 +26552,12 @@ }, "clone-stats": { "version": "1.0.0", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", "dev": true }, "cloneable-readable": { "version": "1.1.3", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -26011,13 +26566,16 @@ } }, "cnbuilder": { - "version": "2.6.0" + "version": "2.6.0", + "integrity": "sha512-SA2gBDcU6B9T1uMhA3m13dVffdaA8RC9TIz7zQygYwbdwOf6l8IGem5UbDc661W2YcQ0aiwt6FqDhDpAE7YUqA==" }, "co": { - "version": "4.6.0" + "version": "4.6.0", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "coa": { "version": "2.0.2", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "requires": { "@types/q": "^1.5.1", "chalk": "^2.4.1", @@ -26026,12 +26584,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -26040,6 +26600,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -26047,10 +26608,12 @@ } }, "code-point-at": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "collection-map": { "version": "1.0.0", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", "dev": true, "requires": { "arr-map": "^2.0.2", @@ -26060,6 +26623,7 @@ "dependencies": { "for-own": { "version": "1.0.0", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { "for-in": "^1.0.1" @@ -26069,6 +26633,7 @@ }, "collection-visit": { "version": "1.0.0", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -26076,6 +26641,7 @@ }, "color": { "version": "3.1.3", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "requires": { "color-convert": "^1.9.1", "color-string": "^1.5.4" @@ -26083,20 +26649,24 @@ }, "color-convert": { "version": "1.9.3", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { "color-name": "1.1.3" }, "dependencies": { "color-name": { - "version": "1.1.3" + "version": "1.1.3", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" } } }, "color-name": { - "version": "1.1.4" + "version": "1.1.4", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { "version": "1.5.5", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -26104,57 +26674,71 @@ }, "color-support": { "version": "1.1.3", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, "colorette": { - "version": "1.2.2" + "version": "1.2.2", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" }, "combined-stream": { "version": "1.0.8", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.20.3" + "version": "2.20.3", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "common-tags": { - "version": "1.8.0" + "version": "1.8.0", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" }, "commondir": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "component-bind": { "version": "1.0.0", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", "dev": true }, "component-emitter": { - "version": "1.3.0" + "version": "1.3.0", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "component-inherit": { "version": "0.0.3", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", "dev": true }, "component-props": { - "version": "1.1.1" + "version": "1.1.1", + "integrity": "sha1-+bffm5kntubZfJvScqqGdnDzSUQ=" }, "component-xor": { - "version": "0.0.4" + "version": "0.0.4", + "integrity": "sha1-xV2DzMG5TNUImk6T+niRxyY+Wao=" }, "compose-function": { "version": "3.0.3", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", "requires": { "arity-n": "^1.0.4" } }, "compressible": { "version": "2.0.18", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { "mime-db": ">= 1.43.0 < 2" } }, "compression": { "version": "1.7.4", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "requires": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -26167,20 +26751,24 @@ "dependencies": { "debug": { "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "ms": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "concat-map": { - "version": "0.0.1" + "version": "0.0.1", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -26189,10 +26777,12 @@ } }, "confusing-browser-globals": { - "version": "1.0.10" + "version": "1.0.10", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" }, "connect": { "version": "3.6.6", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", "dev": true, "requires": { "debug": "2.6.9", @@ -26203,6 +26793,7 @@ "dependencies": { "debug": { "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -26210,6 +26801,7 @@ }, "finalhandler": { "version": "1.1.0", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", "dev": true, "requires": { "debug": "2.6.9", @@ -26223,52 +26815,65 @@ }, "ms": { "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "statuses": { "version": "1.3.1", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", "dev": true } } }, "connect-history-api-fallback": { - "version": "1.6.0" + "version": "1.6.0", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" }, "console-browserify": { - "version": "1.2.0" + "version": "1.2.0", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, "console-control-strings": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "constants-browserify": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, "contains-path": { - "version": "0.1.0" + "version": "0.1.0", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" }, "content-disposition": { "version": "0.5.3", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "requires": { "safe-buffer": "5.1.2" } }, "content-type": { - "version": "1.0.4" + "version": "1.0.4", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { "version": "1.8.0", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "requires": { "safe-buffer": "~5.1.1" } }, "cookie": { - "version": "0.4.0" + "version": "0.4.0", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-signature": { - "version": "1.0.6" + "version": "1.0.6", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "copy-concurrently": { "version": "1.0.5", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "requires": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -26279,10 +26884,12 @@ } }, "copy-descriptor": { - "version": "0.1.1" + "version": "0.1.1", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "copy-props": { "version": "2.0.5", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", "dev": true, "requires": { "each-props": "^1.3.2", @@ -26291,33 +26898,40 @@ "dependencies": { "is-plain-object": { "version": "5.0.0", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true } } }, "core-js": { - "version": "3.15.1" + "version": "3.15.1", + "integrity": "sha512-h8VbZYnc9pDzueiS2610IULDkpFFPunHwIpl8yRwFahAEEdSpHlTy3h3z3rKq5h11CaUdBEeRViu9AYvbxiMeg==" }, "core-js-compat": { "version": "3.15.1", + "integrity": "sha512-xGhzYMX6y7oEGQGAJmP2TmtBLvR4nZmRGEcFa3ubHOq5YEp51gGN9AovVa0AoujGZIq+Wm6dISiYyGNfdflYww==", "requires": { "browserslist": "^4.16.6", "semver": "7.0.0" }, "dependencies": { "semver": { - "version": "7.0.0" + "version": "7.0.0", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" } } }, "core-js-pure": { - "version": "3.15.1" + "version": "3.15.1", + "integrity": "sha512-OZuWHDlYcIda8sJLY4Ec6nWq2hRjlyCqCZ+jCflyleMkVt3tPedDVErvHslyS2nbO+SlBFMSBJYvtLMwxnrzjA==" }, "core-util-is": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { "version": "5.2.1", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -26327,6 +26941,7 @@ "dependencies": { "parse-json": { "version": "4.0.0", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -26335,22 +26950,26 @@ } }, "countup.js": { - "version": "1.9.3" + "version": "1.9.3", + "integrity": "sha1-zj5QzXFgRB5HjwfaMYle3MDxyd0=" }, "create-ecdh": { "version": "4.0.4", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "requires": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" }, "dependencies": { "bn.js": { - "version": "4.12.0" + "version": "4.12.0", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "create-hash": { "version": "1.2.0", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -26361,6 +26980,7 @@ }, "create-hmac": { "version": "1.1.7", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -26372,6 +26992,7 @@ }, "create-react-class": { "version": "15.7.0", + "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", "requires": { "loose-envify": "^1.3.1", "object-assign": "^4.1.1" @@ -26379,6 +27000,7 @@ }, "cross-spawn": { "version": "3.0.1", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", "requires": { "lru-cache": "^4.0.1", "which": "^1.2.9" @@ -26386,6 +27008,7 @@ }, "crypto-browserify": { "version": "3.12.0", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -26402,6 +27025,7 @@ }, "css": { "version": "2.2.4", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", "requires": { "inherits": "^2.0.3", "source-map": "^0.6.1", @@ -26410,27 +27034,32 @@ }, "dependencies": { "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "css-blank-pseudo": { "version": "0.1.4", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", "requires": { "postcss": "^7.0.5" } }, "css-box-model": { "version": "1.2.1", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", "requires": { "tiny-invariant": "^1.0.6" } }, "css-color-names": { - "version": "0.0.4" + "version": "0.0.4", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" }, "css-declaration-sorter": { "version": "4.0.1", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "requires": { "postcss": "^7.0.1", "timsort": "^0.3.0" @@ -26438,16 +27067,19 @@ }, "css-has-pseudo": { "version": "0.10.0", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", "requires": { "postcss": "^7.0.6", "postcss-selector-parser": "^5.0.0-rc.4" }, "dependencies": { "cssesc": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, "postcss-selector-parser": { "version": "5.0.0", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "requires": { "cssesc": "^2.0.0", "indexes-of": "^1.0.1", @@ -26458,6 +27090,7 @@ }, "css-loader": { "version": "3.4.2", + "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", "requires": { "camelcase": "^5.3.1", "cssesc": "^3.0.0", @@ -26474,21 +27107,25 @@ }, "dependencies": { "camelcase": { - "version": "5.3.1" + "version": "5.3.1", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "normalize-path": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" } } }, "css-prefers-color-scheme": { "version": "3.1.1", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", "requires": { "postcss": "^7.0.5" } }, "css-select": { "version": "2.1.0", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "requires": { "boolbase": "^1.0.0", "css-what": "^3.2.1", @@ -26497,37 +27134,45 @@ } }, "css-select-base-adapter": { - "version": "0.1.1" + "version": "0.1.1", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, "css-tree": { "version": "1.0.0-alpha.37", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "requires": { "mdn-data": "2.0.4", "source-map": "^0.6.1" }, "dependencies": { "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "css-vendor": { "version": "0.3.8", + "integrity": "sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo=", "requires": { "is-in-browser": "^1.0.2" } }, "css-what": { - "version": "3.4.2" + "version": "3.4.2", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" }, "cssdb": { - "version": "4.4.0" + "version": "4.4.0", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" }, "cssesc": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssnano": { "version": "4.1.11", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", "requires": { "cosmiconfig": "^5.0.0", "cssnano-preset-default": "^4.0.8", @@ -26537,6 +27182,7 @@ }, "cssnano-preset-default": { "version": "4.0.8", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", "requires": { "css-declaration-sorter": "^4.0.1", "cssnano-util-raw-cache": "^4.0.1", @@ -26571,83 +27217,101 @@ } }, "cssnano-util-get-arguments": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" }, "cssnano-util-get-match": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" }, "cssnano-util-raw-cache": { "version": "4.0.1", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", "requires": { "postcss": "^7.0.0" } }, "cssnano-util-same-parent": { - "version": "4.0.1" + "version": "4.0.1", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" }, "csso": { "version": "4.2.0", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "requires": { "css-tree": "^1.1.2" }, "dependencies": { "css-tree": { "version": "1.1.3", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "requires": { "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "mdn-data": { - "version": "2.0.14" + "version": "2.0.14", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "cssom": { - "version": "0.3.8" + "version": "0.3.8", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "cssstyle": { "version": "1.4.0", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "requires": { "cssom": "0.3.x" } }, "csstype": { - "version": "3.0.8" + "version": "3.0.8", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" }, "currently-unhandled": { "version": "0.4.1", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "requires": { "array-find-index": "^1.0.1" } }, "custom-event-polyfill": { - "version": "1.0.7" + "version": "1.0.7", + "integrity": "sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==" }, "cyclist": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "d": { "version": "1.0.1", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "requires": { "es5-ext": "^0.10.50", "type": "^1.0.1" } }, "damerau-levenshtein": { - "version": "1.0.7" + "version": "1.0.7", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" }, "dashdash": { "version": "1.14.1", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { "assert-plus": "^1.0.0" } }, "data-urls": { "version": "1.1.0", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "requires": { "abab": "^2.0.0", "whatwg-mimetype": "^2.2.0", @@ -26656,6 +27320,7 @@ "dependencies": { "whatwg-url": { "version": "7.1.0", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -26665,16 +27330,19 @@ } }, "debounce": { - "version": "1.2.1" + "version": "1.2.1", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" }, "debug": { "version": "4.3.1", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { "ms": "2.1.2" } }, "debug-fabulous": { "version": "1.1.0", + "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", "dev": true, "requires": { "debug": "3.X", @@ -26684,6 +27352,7 @@ "dependencies": { "debug": { "version": "3.2.7", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -26692,13 +27361,16 @@ } }, "decamelize": { - "version": "1.2.0" + "version": "1.2.0", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { - "version": "0.2.0" + "version": "0.2.0", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "deep-equal": { "version": "1.1.1", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", "requires": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -26709,13 +27381,16 @@ } }, "deep-is": { - "version": "0.1.3" + "version": "0.1.3", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "deepmerge": { - "version": "2.2.1" + "version": "2.2.1", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" }, "default-compare": { "version": "1.0.0", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", "dev": true, "requires": { "kind-of": "^5.0.2" @@ -26723,12 +27398,14 @@ "dependencies": { "kind-of": { "version": "5.1.0", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, "default-gateway": { "version": "4.2.0", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "requires": { "execa": "^1.0.0", "ip-regex": "^2.1.0" @@ -26736,16 +27413,19 @@ }, "default-resolution": { "version": "2.0.0", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", "dev": true }, "define-properties": { "version": "1.1.3", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "requires": { "object-keys": "^1.0.12" } }, "define-property": { "version": "2.0.2", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -26753,18 +27433,21 @@ "dependencies": { "is-accessor-descriptor": { "version": "1.0.0", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -26772,12 +27455,14 @@ } }, "kind-of": { - "version": "6.0.3" + "version": "6.0.3", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, "del": { "version": "4.1.1", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "requires": { "@types/glob": "^7.1.1", "globby": "^6.1.0", @@ -26790,6 +27475,7 @@ "dependencies": { "globby": { "version": "6.1.0", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "requires": { "array-union": "^1.0.1", "glob": "^7.0.3", @@ -26799,49 +27485,61 @@ }, "dependencies": { "pify": { - "version": "2.3.0" + "version": "2.3.0", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, "p-map": { - "version": "2.1.0" + "version": "2.1.0", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" }, "pify": { - "version": "4.0.1" + "version": "4.0.1", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" } } }, "delayed-stream": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegates": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "depd": { - "version": "1.1.2" + "version": "1.1.2", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "des.js": { "version": "1.0.1", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "destroy": { - "version": "1.0.4" + "version": "1.0.4", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-file": { "version": "1.0.0", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, "detect-newline": { - "version": "2.1.0" + "version": "2.1.0", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" }, "detect-node": { - "version": "2.1.0" + "version": "2.1.0", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "detect-port-alt": { "version": "1.1.6", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", "requires": { "address": "^1.0.1", "debug": "^2.6.0" @@ -26849,24 +27547,29 @@ "dependencies": { "debug": { "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "ms": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "dev-ip": { "version": "1.0.1", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", "dev": true }, "diff-sequences": { - "version": "24.9.0" + "version": "24.9.0", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" }, "diffie-hellman": { "version": "5.0.3", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -26874,12 +27577,14 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0" + "version": "4.12.0", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "dir-glob": { "version": "2.0.0", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "requires": { "arrify": "^1.0.1", "path-type": "^3.0.0" @@ -26887,24 +27592,29 @@ "dependencies": { "path-type": { "version": "3.0.0", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { "pify": "^3.0.0" } }, "pify": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } }, "dlv": { "version": "1.1.3", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true }, "dns-equal": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "dns-packet": { "version": "1.3.4", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "requires": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -26912,33 +27622,39 @@ }, "dns-txt": { "version": "2.0.2", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "requires": { "buffer-indexof": "^1.0.0" } }, "doctrine": { "version": "3.0.0", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "requires": { "esutils": "^2.0.2" } }, "dom-align": { - "version": "1.12.2" + "version": "1.12.2", + "integrity": "sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg==" }, "dom-converter": { "version": "0.2.0", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "requires": { "utila": "~0.4" } }, "dom-helpers": { "version": "3.4.0", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", "requires": { "@babel/runtime": "^7.1.2" } }, "dom-iterator": { "version": "1.0.0", + "integrity": "sha512-7dsMOQI07EMU98gQM8NSB3GsAiIeBYIPKpnxR3c9xOvdvBjChAcOM0iJ222I3p5xyiZO9e5oggkNaCusuTdYig==", "requires": { "component-props": "1.1.1", "component-xor": "0.0.4" @@ -26946,44 +27662,53 @@ }, "dom-serializer": { "version": "0.2.2", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "requires": { "domelementtype": "^2.0.1", "entities": "^2.0.0" }, "dependencies": { "domelementtype": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" } } }, "dom-walk": { - "version": "0.1.2" + "version": "0.1.2", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, "domain-browser": { - "version": "1.2.0" + "version": "1.2.0", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, "domelementtype": { - "version": "1.3.1" + "version": "1.3.1", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" }, "domexception": { "version": "1.0.1", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "requires": { "webidl-conversions": "^4.0.2" } }, "domhandler": { "version": "4.2.0", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", "requires": { "domelementtype": "^2.2.0" }, "dependencies": { "domelementtype": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" } } }, "domutils": { "version": "1.7.0", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "requires": { "dom-serializer": "0", "domelementtype": "1" @@ -26991,6 +27716,7 @@ }, "dot-case": { "version": "3.0.4", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -26998,21 +27724,26 @@ }, "dot-prop": { "version": "5.3.0", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "requires": { "is-obj": "^2.0.0" } }, "dotenv": { - "version": "8.2.0" + "version": "8.2.0", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, "dotenv-expand": { - "version": "5.1.0" + "version": "5.1.0", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, "duplexer": { - "version": "0.1.2" + "version": "0.1.2", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "duplexify": { "version": "3.7.1", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -27022,6 +27753,7 @@ }, "each-props": { "version": "1.3.2", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", "dev": true, "requires": { "is-plain-object": "^2.0.1", @@ -27030,6 +27762,7 @@ }, "easy-extender": { "version": "2.3.4", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", "dev": true, "requires": { "lodash": "^4.17.10" @@ -27037,6 +27770,7 @@ }, "eazy-logger": { "version": "3.1.0", + "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", "dev": true, "requires": { "tfunk": "^4.0.0" @@ -27044,6 +27778,7 @@ }, "ecc-jsbn": { "version": "0.1.2", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -27051,28 +27786,34 @@ }, "echarts": { "version": "4.9.0", + "integrity": "sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==", "requires": { "zrender": "4.3.2" } }, "echarts-for-react": { "version": "2.0.16", + "integrity": "sha512-VmHCktay2qKt/+wpL/C7thbvIa7dYBEey0/U4Zaqo+qeA4wx+uiCd5NeCsPIhD/0Pv+2qqNswqiNiUCtcgccOw==", "requires": { "fast-deep-equal": "^2.0.1", "size-sensor": "^1.0.0" } }, "ee-first": { - "version": "1.1.1" + "version": "1.1.1", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.756" + "version": "1.3.756", + "integrity": "sha512-WsmJym1TMeHVndjPjczTFbnRR/c4sbzg8fBFtuhlb2Sru3i/S1VGpzDSrv/It8ctMU2bj8G7g7/O3FzYMGw6eA==" }, "element-resize-event": { - "version": "3.0.6" + "version": "3.0.6", + "integrity": "sha512-sSeXY9rNDp86bJODW68pxLcy3A5FrPZfIgOrJHzqgYzX513Zq6/ytdBigp7KeJEpZZopBBSiO1cVuiRkZpNxLw==" }, "elliptic": { "version": "6.5.4", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -27084,40 +27825,48 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0" + "version": "4.12.0", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "emoji-mart": { "version": "3.0.1", + "integrity": "sha512-sxpmMKxqLvcscu6mFn9ITHeZNkGzIvD0BSNFE/LJESPbCA8s1jM6bCDPjWbV31xHq7JXaxgpHxLB54RCbBZSlg==", "requires": { "@babel/runtime": "^7.0.0", "prop-types": "^15.6.0" } }, "emoji-regex": { - "version": "7.0.3" + "version": "7.0.3", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "emojis-list": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "encodeurl": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "encoding": { "version": "0.1.13", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "requires": { "iconv-lite": "^0.6.2" } }, "end-of-stream": { "version": "1.4.4", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { "once": "^1.4.0" } }, "engine.io": { "version": "3.5.0", + "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", "dev": true, "requires": { "accepts": "~1.3.4", @@ -27130,10 +27879,12 @@ "dependencies": { "cookie": { "version": "0.4.1", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "dev": true }, "debug": { "version": "4.1.1", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -27141,6 +27892,7 @@ }, "ws": { "version": "7.4.6", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "dev": true, "requires": {} } @@ -27148,6 +27900,7 @@ }, "engine.io-client": { "version": "3.5.2", + "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", "dev": true, "requires": { "component-emitter": "~1.3.0", @@ -27165,6 +27918,7 @@ "dependencies": { "debug": { "version": "3.1.0", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -27172,10 +27926,12 @@ }, "ms": { "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "ws": { "version": "7.4.6", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "dev": true, "requires": {} } @@ -27183,6 +27939,7 @@ }, "engine.io-parser": { "version": "2.2.1", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", "dev": true, "requires": { "after": "0.8.2", @@ -27194,6 +27951,7 @@ }, "enhanced-resolve": { "version": "4.5.0", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", @@ -27202,6 +27960,7 @@ "dependencies": { "memory-fs": { "version": "0.5.0", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -27210,25 +27969,30 @@ } }, "enquire.js": { - "version": "2.1.6" + "version": "2.1.6", + "integrity": "sha1-PoeAybi4NQhMP2DhZtvDwqPImBQ=" }, "entities": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, "errno": { "version": "0.1.8", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "requires": { "prr": "~1.0.1" } }, "error-ex": { "version": "1.3.2", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "requires": { "is-arrayish": "^0.2.1" } }, "es-abstract": { "version": "1.18.3", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -27250,6 +28014,7 @@ }, "es-to-primitive": { "version": "1.2.1", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -27258,6 +28023,7 @@ }, "es5-ext": { "version": "0.10.53", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", "requires": { "es6-iterator": "~2.0.3", "es6-symbol": "~3.1.3", @@ -27266,6 +28032,7 @@ }, "es6-iterator": { "version": "2.0.3", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { "d": "1", "es5-ext": "^0.10.35", @@ -27274,6 +28041,7 @@ }, "es6-symbol": { "version": "3.1.3", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "requires": { "d": "^1.0.1", "ext": "^1.1.2" @@ -27281,6 +28049,7 @@ }, "es6-weak-map": { "version": "2.0.3", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "dev": true, "requires": { "d": "1", @@ -27290,16 +28059,20 @@ } }, "escalade": { - "version": "3.1.1" + "version": "3.1.1", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { - "version": "1.0.3" + "version": "1.0.3", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { - "version": "1.0.5" + "version": "1.0.5", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { "version": "1.14.3", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "requires": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -27310,12 +28083,14 @@ "dependencies": { "source-map": { "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "optional": true } } }, "eslint": { "version": "6.8.0", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", "requires": { "@babel/code-frame": "^7.0.0", "ajv": "^6.10.0", @@ -27357,16 +28132,19 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0" + "version": "4.1.0", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -27375,6 +28153,7 @@ }, "cross-spawn": { "version": "6.0.5", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -27384,46 +28163,55 @@ }, "dependencies": { "semver": { - "version": "5.7.1" + "version": "5.7.1", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, "eslint-utils": { "version": "1.4.3", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "requires": { "eslint-visitor-keys": "^1.1.0" } }, "globals": { "version": "12.4.0", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "requires": { "type-fest": "^0.8.1" } }, "import-fresh": { "version": "3.3.0", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "regexpp": { - "version": "2.0.1" + "version": "2.0.1", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" }, "resolve-from": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, "semver": { - "version": "6.3.0" + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "strip-ansi": { "version": "5.2.0", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" } }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -27432,6 +28220,7 @@ }, "eslint-config-prettier": { "version": "4.3.0", + "integrity": "sha512-sZwhSTHVVz78+kYD3t5pCWSYEdVSBR0PXnwjDRsUs8ytIrK8PLXw+6FKp8r3Z7rx4ZszdetWlXYKOHoUrrwPlA==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -27439,18 +28228,21 @@ "dependencies": { "get-stdin": { "version": "6.0.0", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true } } }, "eslint-config-react-app": { "version": "5.2.1", + "integrity": "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==", "requires": { "confusing-browser-globals": "^1.0.9" } }, "eslint-import-resolver-node": { "version": "0.3.4", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", "requires": { "debug": "^2.6.9", "resolve": "^1.13.1" @@ -27458,17 +28250,20 @@ "dependencies": { "debug": { "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "ms": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "eslint-loader": { "version": "3.0.3", + "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==", "requires": { "fs-extra": "^8.1.0", "loader-fs-cache": "^1.0.2", @@ -27479,6 +28274,7 @@ }, "eslint-module-utils": { "version": "2.6.1", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", "requires": { "debug": "^3.2.7", "pkg-dir": "^2.0.0" @@ -27486,18 +28282,21 @@ "dependencies": { "debug": { "version": "3.2.7", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } }, "find-up": { "version": "2.1.0", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { "locate-path": "^2.0.0" } }, "locate-path": { "version": "2.0.0", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -27505,24 +28304,29 @@ }, "p-limit": { "version": "1.3.0", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { "p-try": "^1.0.0" } }, "p-locate": { "version": "2.0.0", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { "p-limit": "^1.1.0" } }, "p-try": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "path-exists": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "pkg-dir": { "version": "2.0.0", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "requires": { "find-up": "^2.1.0" } @@ -27531,12 +28335,14 @@ }, "eslint-plugin-flowtype": { "version": "4.6.0", + "integrity": "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==", "requires": { "lodash": "^4.17.15" } }, "eslint-plugin-import": { "version": "2.20.1", + "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==", "requires": { "array-includes": "^3.0.3", "array.prototype.flat": "^1.2.1", @@ -27554,12 +28360,14 @@ "dependencies": { "debug": { "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "doctrine": { "version": "1.5.0", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "requires": { "esutils": "^2.0.2", "isarray": "^1.0.0" @@ -27567,12 +28375,14 @@ }, "find-up": { "version": "2.1.0", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { "locate-path": "^2.0.0" } }, "load-json-file": { "version": "2.0.0", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -27582,40 +28392,48 @@ }, "locate-path": { "version": "2.0.0", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, "ms": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "p-limit": { "version": "1.3.0", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { "p-try": "^1.0.0" } }, "p-locate": { "version": "2.0.0", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { "p-limit": "^1.1.0" } }, "p-try": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "path-exists": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-type": { "version": "2.0.0", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "requires": { "pify": "^2.0.0" } }, "read-pkg": { "version": "2.0.0", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "requires": { "load-json-file": "^2.0.0", "normalize-package-data": "^2.3.2", @@ -27624,18 +28442,21 @@ }, "read-pkg-up": { "version": "2.0.0", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "requires": { "find-up": "^2.0.0", "read-pkg": "^2.0.0" } }, "strip-bom": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, "eslint-plugin-jsx-a11y": { "version": "6.2.3", + "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", "requires": { "@babel/runtime": "^7.4.5", "aria-query": "^3.0.0", @@ -27650,6 +28471,7 @@ }, "eslint-plugin-prettier": { "version": "3.4.0", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" @@ -27657,6 +28479,7 @@ }, "eslint-plugin-react": { "version": "7.24.0", + "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", "requires": { "array-includes": "^3.1.3", "array.prototype.flatmap": "^1.2.4", @@ -27674,12 +28497,14 @@ "dependencies": { "doctrine": { "version": "2.1.0", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "requires": { "esutils": "^2.0.2" } }, "resolve": { "version": "2.0.0-next.3", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -27689,10 +28514,12 @@ }, "eslint-plugin-react-hooks": { "version": "1.7.0", + "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==", "requires": {} }, "eslint-scope": { "version": "5.1.1", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -27700,15 +28527,18 @@ }, "eslint-utils": { "version": "2.1.0", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "requires": { "eslint-visitor-keys": "^1.1.0" } }, "eslint-visitor-keys": { - "version": "1.3.0" + "version": "1.3.0", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" }, "espree": { "version": "6.2.1", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "requires": { "acorn": "^7.1.1", "acorn-jsx": "^5.2.0", @@ -27716,41 +28546,50 @@ } }, "esprima": { - "version": "4.0.1" + "version": "4.0.1", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { "version": "1.4.0", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "requires": { "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { - "version": "5.2.0" + "version": "5.2.0", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" } } }, "esrecurse": { "version": "4.3.0", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "requires": { "estraverse": "^5.2.0" }, "dependencies": { "estraverse": { - "version": "5.2.0" + "version": "5.2.0", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" } } }, "estraverse": { - "version": "4.3.0" + "version": "4.3.0", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { - "version": "2.0.3" + "version": "2.0.3", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { - "version": "1.8.1" + "version": "1.8.1", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "event-emitter": { "version": "0.3.5", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { "d": "1", @@ -27758,29 +28597,35 @@ } }, "eventemitter3": { - "version": "2.0.3" + "version": "2.0.3", + "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=" }, "events": { - "version": "3.3.0" + "version": "3.3.0", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "eventsource": { "version": "1.1.0", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", "requires": { "original": "^1.0.0" } }, "evp_bytestokey": { "version": "1.0.3", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "exec-sh": { - "version": "0.3.6" + "version": "0.3.6", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" }, "execa": { "version": "1.0.0", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -27793,6 +28638,7 @@ "dependencies": { "cross-spawn": { "version": "6.0.5", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -27804,13 +28650,16 @@ } }, "exenv": { - "version": "1.2.2" + "version": "1.2.2", + "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" }, "exit": { - "version": "0.1.2" + "version": "0.1.2", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" }, "expand-brackets": { "version": "2.1.4", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -27823,23 +28672,27 @@ "dependencies": { "debug": { "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "define-property": { "version": "0.2.5", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" } }, "ms": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "expand-tilde": { "version": "2.0.2", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { "homedir-polyfill": "^1.0.1" @@ -27847,6 +28700,7 @@ }, "expect": { "version": "24.9.0", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", "requires": { "@jest/types": "^24.9.0", "ansi-styles": "^3.2.0", @@ -27858,6 +28712,7 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } @@ -27866,6 +28721,7 @@ }, "express": { "version": "4.17.1", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { "accepts": "~1.3.7", "array-flatten": "1.1.1", @@ -27900,47 +28756,57 @@ }, "dependencies": { "array-flatten": { - "version": "1.1.1" + "version": "1.1.1", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "debug": { "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "ms": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "path-to-regexp": { - "version": "0.1.7" + "version": "0.1.7", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "qs": { - "version": "6.7.0" + "version": "6.7.0", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" } } }, "ext": { "version": "1.4.0", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", "requires": { "type": "^2.0.0" }, "dependencies": { "type": { - "version": "2.5.0" + "version": "2.5.0", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" } } }, "extend": { - "version": "3.0.2" + "version": "3.0.2", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "2.0.1", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } }, "external-editor": { "version": "3.1.0", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -27949,6 +28815,7 @@ "dependencies": { "iconv-lite": { "version": "0.4.24", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -27957,6 +28824,7 @@ }, "extglob": { "version": "2.0.4", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -27970,24 +28838,28 @@ "dependencies": { "define-property": { "version": "1.0.0", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { "version": "1.0.0", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -27995,15 +28867,18 @@ } }, "kind-of": { - "version": "6.0.3" + "version": "6.0.3", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, "extsprintf": { - "version": "1.3.0" + "version": "1.3.0", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fancy-log": { "version": "1.3.3", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", "dev": true, "requires": { "ansi-gray": "^0.1.1", @@ -28013,13 +28888,16 @@ } }, "fast-deep-equal": { - "version": "2.0.1" + "version": "2.0.1", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-diff": { - "version": "1.1.2" + "version": "1.1.2", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" }, "fast-glob": { "version": "2.2.7", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", "requires": { "@mrmlnc/readdir-enhanced": "^2.2.1", "@nodelib/fs.stat": "^1.1.2", @@ -28031,6 +28909,7 @@ "dependencies": { "glob-parent": { "version": "3.1.0", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -28038,6 +28917,7 @@ "dependencies": { "is-glob": { "version": "3.1.0", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { "is-extglob": "^2.1.0" } @@ -28047,25 +28927,30 @@ } }, "fast-json-stable-stringify": { - "version": "2.1.0" + "version": "2.1.0", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { - "version": "2.0.6" + "version": "2.0.6", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "faye-websocket": { "version": "0.10.0", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "requires": { "websocket-driver": ">=0.5.1" } }, "fb-watchman": { "version": "2.0.1", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "requires": { "bser": "2.1.1" } }, "fbjs": { "version": "0.8.17", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", "requires": { "core-js": "^1.0.0", "isomorphic-fetch": "^2.1.1", @@ -28077,10 +28962,12 @@ }, "dependencies": { "core-js": { - "version": "1.2.7" + "version": "1.2.7", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" }, "promise": { "version": "7.3.1", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "~2.0.3" } @@ -28088,22 +28975,26 @@ } }, "figgy-pudding": { - "version": "3.5.2" + "version": "3.5.2", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" }, "figures": { "version": "3.2.0", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "requires": { "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { "version": "5.0.1", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "requires": { "flat-cache": "^2.0.1" } }, "file-loader": { "version": "4.3.0", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", "requires": { "loader-utils": "^1.2.3", "schema-utils": "^2.5.0" @@ -28111,15 +29002,18 @@ }, "file-selector": { "version": "0.1.19", + "integrity": "sha512-kCWw3+Aai8Uox+5tHCNgMFaUdgidxvMnLWO6fM5sZ0hA2wlHP5/DHGF0ECe84BiB95qdJbKNEJhWKVDvMN+JDQ==", "requires": { "tslib": "^2.0.1" } }, "filesize": { - "version": "6.0.1" + "version": "6.0.1", + "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==" }, "fill-range": { "version": "4.0.0", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -28129,6 +29023,7 @@ }, "finalhandler": { "version": "1.1.2", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -28141,17 +29036,20 @@ "dependencies": { "debug": { "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "ms": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "find-cache-dir": { "version": "2.1.0", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "requires": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -28159,10 +29057,12 @@ } }, "find-root": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, "find-up": { "version": "1.1.2", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -28170,6 +29070,7 @@ }, "findup-sync": { "version": "3.0.0", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "dev": true, "requires": { "detect-file": "^1.0.0", @@ -28180,6 +29081,7 @@ }, "fined": { "version": "1.2.0", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", "dev": true, "requires": { "expand-tilde": "^2.0.2", @@ -28191,10 +29093,12 @@ }, "flagged-respawn": { "version": "1.0.1", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", "dev": true }, "flat-cache": { "version": "2.0.1", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "requires": { "flatted": "^2.0.0", "rimraf": "2.6.3", @@ -28203,6 +29107,7 @@ "dependencies": { "rimraf": { "version": "2.6.3", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "requires": { "glob": "^7.1.3" } @@ -28210,38 +29115,47 @@ } }, "flatpickr": { - "version": "4.6.9" + "version": "4.6.9", + "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==" }, "flatted": { - "version": "2.0.2" + "version": "2.0.2", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" }, "flatten": { - "version": "1.0.3" + "version": "1.0.3", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" }, "flush-write-stream": { "version": "1.1.1", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "requires": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" } }, "follow-redirects": { - "version": "1.14.1" + "version": "1.14.1", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" }, "for-in": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "for-own": { "version": "0.1.5", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "requires": { "for-in": "^1.0.1" } }, "forever-agent": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "fork-ts-checker-webpack-plugin": { "version": "3.1.1", + "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==", "requires": { "babel-code-frame": "^6.22.0", "chalk": "^2.4.1", @@ -28255,12 +29169,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -28269,6 +29185,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -28277,6 +29194,7 @@ }, "form-data": { "version": "2.3.3", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -28284,19 +29202,23 @@ } }, "forwarded": { - "version": "0.2.0" + "version": "0.2.0", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fragment-cache": { "version": "0.2.1", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { "map-cache": "^0.2.2" } }, "fresh": { - "version": "0.5.2" + "version": "0.5.2", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "from2": { "version": "2.3.0", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -28304,6 +29226,7 @@ }, "fs-extra": { "version": "8.1.0", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -28312,12 +29235,14 @@ }, "fs-minipass": { "version": "2.1.0", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "requires": { "minipass": "^3.0.0" } }, "fs-mkdirp-stream": { "version": "1.0.0", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -28326,6 +29251,7 @@ }, "fs-write-stream-atomic": { "version": "1.0.10", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "requires": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -28334,10 +29260,12 @@ } }, "fs.realpath": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fstream": { "version": "1.0.12", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -28346,16 +29274,20 @@ } }, "function-bind": { - "version": "1.1.1" + "version": "1.1.1", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "fuse.js": { - "version": "6.4.6" + "version": "6.4.6", + "integrity": "sha512-/gYxR/0VpXmWSfZOIPS3rWwU8SHgsRTwWuXhyb2O6s7aRuVtHtxCkR33bNYu3wyLyNx/Wpv0vU7FZy8Vj53VNw==" }, "gauge": { "version": "2.7.4", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -28369,18 +29301,22 @@ }, "gaze": { "version": "1.1.3", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "requires": { "globule": "^1.0.0" } }, "gensync": { - "version": "1.0.0-beta.2" + "version": "1.0.0-beta.2", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { - "version": "2.0.5" + "version": "2.0.5", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { "version": "1.1.1", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -28388,28 +29324,34 @@ } }, "get-own-enumerable-property-symbols": { - "version": "3.0.2" + "version": "3.0.2", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, "get-stdin": { - "version": "4.0.1" + "version": "4.0.1", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" }, "get-stream": { "version": "4.1.0", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "requires": { "pump": "^3.0.0" } }, "get-value": { - "version": "2.0.6" + "version": "2.0.6", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, "getpass": { "version": "0.1.7", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { "assert-plus": "^1.0.0" } }, "glob": { "version": "7.1.7", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -28421,12 +29363,14 @@ }, "glob-parent": { "version": "5.1.2", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } }, "glob-stream": { "version": "6.1.0", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", "dev": true, "requires": { "extend": "^3.0.0", @@ -28443,6 +29387,7 @@ "dependencies": { "glob-parent": { "version": "3.1.0", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { "is-glob": "^3.1.0", @@ -28451,6 +29396,7 @@ }, "is-glob": { "version": "3.1.0", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { "is-extglob": "^2.1.0" @@ -28459,10 +29405,12 @@ } }, "glob-to-regexp": { - "version": "0.3.0" + "version": "0.3.0", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" }, "glob-watcher": { "version": "5.0.5", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -28476,10 +29424,12 @@ "dependencies": { "binary-extensions": { "version": "1.13.1", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, "chokidar": { "version": "2.1.8", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -28498,6 +29448,7 @@ }, "glob-parent": { "version": "3.1.0", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { "is-glob": "^3.1.0", @@ -28506,6 +29457,7 @@ "dependencies": { "is-glob": { "version": "3.1.0", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { "is-extglob": "^2.1.0" @@ -28515,6 +29467,7 @@ }, "is-binary-path": { "version": "1.0.1", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { "binary-extensions": "^1.0.0" @@ -28522,10 +29475,12 @@ }, "normalize-path": { "version": "3.0.0", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, "readdirp": { "version": "2.2.1", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -28537,6 +29492,7 @@ }, "global": { "version": "4.3.2", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", "requires": { "min-document": "^2.19.0", "process": "~0.5.1" @@ -28544,12 +29500,14 @@ }, "global-modules": { "version": "2.0.0", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "requires": { "global-prefix": "^3.0.0" } }, "global-prefix": { "version": "3.0.0", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "requires": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -28557,15 +29515,18 @@ }, "dependencies": { "kind-of": { - "version": "6.0.3" + "version": "6.0.3", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, "globals": { - "version": "11.12.0" + "version": "11.12.0", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { "version": "8.0.2", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", "requires": { "array-union": "^1.0.1", "dir-glob": "2.0.0", @@ -28577,18 +29538,22 @@ }, "dependencies": { "ignore": { - "version": "3.3.10" + "version": "3.3.10", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" }, "pify": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "slash": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" } } }, "globule": { "version": "1.3.2", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", "requires": { "glob": "~7.1.1", "lodash": "~4.17.10", @@ -28597,6 +29562,7 @@ }, "glogg": { "version": "1.0.2", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", "dev": true, "requires": { "sparkles": "^1.0.0" @@ -28604,19 +29570,24 @@ }, "google-maps-react": { "version": "2.0.6", + "integrity": "sha512-M8Eo9WndfQEfxcmm6yRq03qdJgw1x6rQmJ9DN+a+xPQ3K7yNDGkVDbinrf4/8vcox7nELbeopbm4bpefKewWfQ==", "requires": {} }, "graceful-fs": { - "version": "4.2.6" + "version": "4.2.6", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" }, "growly": { - "version": "1.3.0" + "version": "1.3.0", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, "gud": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" }, "gulp": { "version": "4.0.2", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", "dev": true, "requires": { "glob-watcher": "^5.0.3", @@ -28627,6 +29598,7 @@ "dependencies": { "ansi-colors": { "version": "1.1.0", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { "ansi-wrap": "^0.1.0" @@ -28634,10 +29606,12 @@ }, "camelcase": { "version": "3.0.0", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true }, "cliui": { "version": "3.2.0", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { "string-width": "^1.0.1", @@ -28647,10 +29621,12 @@ }, "get-caller-file": { "version": "1.0.3", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, "gulp-cli": { "version": "2.3.0", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", "dev": true, "requires": { "ansi-colors": "^1.0.1", @@ -28675,14 +29651,17 @@ }, "require-main-filename": { "version": "1.0.1", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, "which-module": { "version": "1.0.0", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, "wrap-ansi": { "version": "2.1.0", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { "string-width": "^1.0.1", @@ -28691,10 +29670,12 @@ }, "y18n": { "version": "3.2.2", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", "dev": true }, "yargs": { "version": "7.1.2", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", "dev": true, "requires": { "camelcase": "^3.0.0", @@ -28714,6 +29695,7 @@ }, "yargs-parser": { "version": "5.0.1", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", "dev": true, "requires": { "camelcase": "^3.0.0", @@ -28724,6 +29706,7 @@ }, "gulp-autoprefixer": { "version": "6.1.0", + "integrity": "sha512-Ti/BUFe+ekhbDJfspZIMiOsOvw51KhI9EncsDfK7NaxjqRm+v4xS9v99kPxEoiDavpWqQWvG8Y6xT1mMlB3aXA==", "dev": true, "requires": { "autoprefixer": "^9.5.1", @@ -28736,6 +29719,7 @@ "dependencies": { "through2": { "version": "3.0.2", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", "dev": true, "requires": { "inherits": "^2.0.4", @@ -28746,6 +29730,7 @@ }, "gulp-clean-css": { "version": "4.3.0", + "integrity": "sha512-mGyeT3qqFXTy61j0zOIciS4MkYziF2U594t2Vs9rUnpkEHqfu6aDITMp8xOvZcvdX61Uz3y1mVERRYmjzQF5fg==", "dev": true, "requires": { "clean-css": "4.2.3", @@ -28756,6 +29741,7 @@ "dependencies": { "through2": { "version": "3.0.1", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", "dev": true, "requires": { "readable-stream": "2 || 3" @@ -28765,6 +29751,7 @@ }, "gulp-plumber": { "version": "1.2.1", + "integrity": "sha512-mctAi9msEAG7XzW5ytDVZ9PxWMzzi1pS2rBH7lA095DhMa6KEXjm+St0GOCc567pJKJ/oCvosVAZEpAey0q2eQ==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -28775,6 +29762,7 @@ "dependencies": { "arr-diff": { "version": "1.1.0", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", "dev": true, "requires": { "arr-flatten": "^1.0.1", @@ -28783,14 +29771,17 @@ }, "arr-union": { "version": "2.1.0", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", "dev": true }, "array-slice": { "version": "0.2.3", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", "dev": true }, "extend-shallow": { "version": "1.1.4", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", "dev": true, "requires": { "kind-of": "^1.1.0" @@ -28798,10 +29789,12 @@ }, "kind-of": { "version": "1.1.0", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", "dev": true }, "plugin-error": { "version": "0.1.2", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", "dev": true, "requires": { "ansi-cyan": "^0.1.1", @@ -28815,10 +29808,12 @@ }, "gulp-rename": { "version": "1.4.0", + "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", "dev": true }, "gulp-rtlcss": { "version": "1.4.2", + "integrity": "sha512-wd807z/xq4XKtSwgrEetbx/aPoI5gV0yWV2rNqEBRwe2cJvNKLDsYR9A968c3gZtaKRMGAue5g3pHn40R+GWSA==", "dev": true, "requires": { "plugin-error": "^1.0.1", @@ -28829,6 +29824,7 @@ }, "gulp-sass": { "version": "4.1.1", + "integrity": "sha512-bg7mfgsgho0Ej0WXE9Cd2sq/YxeKxOjagrMmM40zvOYXHtZvi5ED84wIpqCUvJLz66kFNkv+jS/rQXolmgXrUQ==", "dev": true, "requires": { "chalk": "^2.3.0", @@ -28843,10 +29839,12 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -28854,6 +29852,7 @@ }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -28863,6 +29862,7 @@ }, "strip-ansi": { "version": "4.0.0", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -28870,6 +29870,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -28879,6 +29880,7 @@ }, "gulp-sourcemaps": { "version": "2.6.5", + "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==", "dev": true, "requires": { "@gulp-sourcemaps/identity-map": "1.X", @@ -28896,16 +29898,19 @@ "dependencies": { "acorn": { "version": "5.7.4", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true }, "source-map": { "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "gulplog": { "version": "1.0.0", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", "dev": true, "requires": { "glogg": "^1.0.0" @@ -28913,49 +29918,59 @@ }, "gzip-size": { "version": "5.1.1", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", "requires": { "duplexer": "^0.1.1", "pify": "^4.0.1" }, "dependencies": { "pify": { - "version": "4.0.1" + "version": "4.0.1", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" } } }, "handle-thing": { - "version": "2.0.1" + "version": "2.0.1", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, "har-schema": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.1.5", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, "harmony-reflect": { - "version": "1.6.2" + "version": "1.6.2", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" }, "has": { "version": "1.0.3", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { "function-bind": "^1.1.1" } }, "has-ansi": { "version": "2.0.0", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { "ansi-regex": "^2.0.0" } }, "has-bigints": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" }, "has-binary2": { "version": "1.0.3", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", "dev": true, "requires": { "isarray": "2.0.1" @@ -28963,25 +29978,31 @@ "dependencies": { "isarray": { "version": "2.0.1", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true } } }, "has-cors": { "version": "1.1.0", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", "dev": true }, "has-flag": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, "has-unicode": { - "version": "2.0.1" + "version": "2.0.1", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "has-value": { "version": "1.0.0", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -28990,6 +30011,7 @@ }, "has-values": { "version": "1.0.0", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -28997,6 +30019,7 @@ "dependencies": { "kind-of": { "version": "4.0.0", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { "is-buffer": "^1.1.5" } @@ -29005,6 +30028,7 @@ }, "hash-base": { "version": "3.1.0", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -29013,6 +30037,7 @@ "dependencies": { "readable-stream": { "version": "3.6.0", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -29020,25 +30045,30 @@ } }, "safe-buffer": { - "version": "5.2.1" + "version": "5.2.1", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, "hash.js": { "version": "1.1.7", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "he": { - "version": "1.2.0" + "version": "1.2.0", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "hex-color-regex": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, "history": { "version": "4.10.1", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", "requires": { "@babel/runtime": "^7.1.2", "loose-envify": "^1.2.0", @@ -29050,6 +30080,7 @@ }, "hmac-drbg": { "version": "1.0.1", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -29058,22 +30089,26 @@ }, "hoist-non-react-statics": { "version": "3.3.2", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "requires": { "react-is": "^16.7.0" } }, "homedir-polyfill": { "version": "1.0.3", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { "parse-passwd": "^1.0.0" } }, "hosted-git-info": { - "version": "2.8.9" + "version": "2.8.9", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "hpack.js": { "version": "2.1.6", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "requires": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -29082,25 +30117,31 @@ } }, "hsl-regex": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" }, "hsla-regex": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" }, "html-encoding-sniffer": { "version": "1.0.2", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "requires": { "whatwg-encoding": "^1.0.1" } }, "html-entities": { - "version": "1.4.0" + "version": "1.4.0", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" }, "html-escaper": { - "version": "2.0.2" + "version": "2.0.2", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, "html-minifier-terser": { "version": "5.1.1", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", "requires": { "camel-case": "^4.1.1", "clean-css": "^4.2.3", @@ -29112,18 +30153,21 @@ }, "dependencies": { "commander": { - "version": "4.1.1" + "version": "4.1.1", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" } } }, "html-parse-stringify": { "version": "3.0.1", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", "requires": { "void-elements": "3.1.0" } }, "html-webpack-plugin": { "version": "4.0.0-beta.11", + "integrity": "sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==", "requires": { "html-minifier-terser": "^5.0.1", "loader-utils": "^1.2.3", @@ -29135,6 +30179,7 @@ "dependencies": { "util.promisify": { "version": "1.0.0", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "requires": { "define-properties": "^1.1.2", "object.getownpropertydescriptors": "^2.0.3" @@ -29144,6 +30189,7 @@ }, "htmlparser2": { "version": "6.1.0", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -29153,6 +30199,7 @@ "dependencies": { "dom-serializer": { "version": "1.3.2", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -29160,10 +30207,12 @@ } }, "domelementtype": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" }, "domutils": { "version": "2.7.0", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -29173,10 +30222,12 @@ } }, "http-deceiver": { - "version": "1.2.7" + "version": "1.2.7", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { "version": "1.7.2", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -29186,12 +30237,14 @@ }, "dependencies": { "inherits": { - "version": "2.0.3" + "version": "2.0.3", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" } } }, "http-proxy": { "version": "1.18.1", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "requires": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -29199,12 +30252,14 @@ }, "dependencies": { "eventemitter3": { - "version": "4.0.7" + "version": "4.0.7", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" } } }, "http-proxy-middleware": { "version": "0.19.1", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "requires": { "http-proxy": "^1.17.0", "is-glob": "^4.0.0", @@ -29214,6 +30269,7 @@ }, "http-signature": { "version": "1.2.0", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -29221,59 +30277,72 @@ } }, "https-browserify": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, "hyphenate-style-name": { - "version": "1.0.4" + "version": "1.0.4", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" }, "i18next": { "version": "19.9.2", + "integrity": "sha512-0i6cuo6ER6usEOtKajUUDj92zlG+KArFia0857xxiEHAQcUwh/RtOQocui1LPJwunSYT574Pk64aNva1kwtxZg==", "requires": { "@babel/runtime": "^7.12.0" } }, "iconv-lite": { "version": "0.6.3", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "icss-utils": { "version": "4.1.1", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "requires": { "postcss": "^7.0.14" } }, "identity-obj-proxy": { "version": "3.0.0", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", "requires": { "harmony-reflect": "^1.4.6" } }, "ieee754": { - "version": "1.2.1" + "version": "1.2.1", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "iferr": { - "version": "0.1.5" + "version": "0.1.5", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "ignore": { - "version": "4.0.6" + "version": "4.0.6", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, "immer": { - "version": "1.10.0" + "version": "1.10.0", + "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" }, "immutable": { "version": "3.8.2", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", "dev": true }, "import-cwd": { "version": "2.1.0", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", "requires": { "import-from": "^2.1.0" } }, "import-fresh": { "version": "2.0.0", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "requires": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -29281,60 +30350,73 @@ }, "import-from": { "version": "2.1.0", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "requires": { "resolve-from": "^3.0.0" } }, "import-local": { "version": "2.0.0", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "requires": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" } }, "imurmurhash": { - "version": "0.1.4" + "version": "0.1.4", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "in-publish": { - "version": "2.0.1" + "version": "2.0.1", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" }, "indefinite-observable": { "version": "1.0.2", + "integrity": "sha512-Mps0898zEduHyPhb7UCgNmfzlqNZknVmaFz5qzr0mm04YQ5FGLhAyK/dJ+NaRxGyR6juQXIxh5Ev0xx+qq0nYA==", "requires": { "symbol-observable": "1.2.0" } }, "indent-string": { "version": "2.1.0", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "requires": { "repeating": "^2.0.0" } }, "indexes-of": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" }, "indexof": { "version": "0.0.1", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, "infer-owner": { - "version": "1.0.4" + "version": "1.0.4", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "inflight": { "version": "1.0.6", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { - "version": "2.0.4" + "version": "2.0.4", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.8" + "version": "1.3.8", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "inquirer": { "version": "7.3.3", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "requires": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.0", @@ -29352,16 +30434,19 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0" + "version": "5.0.0", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { "version": "4.3.0", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.1", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -29369,21 +30454,26 @@ }, "color-convert": { "version": "2.0.1", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "emoji-regex": { - "version": "8.0.0" + "version": "8.0.0", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "has-flag": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "is-fullwidth-code-point": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { "version": "4.2.2", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -29392,12 +30482,14 @@ }, "strip-ansi": { "version": "6.0.0", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { "ansi-regex": "^5.0.0" } }, "supports-color": { "version": "7.2.0", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -29406,6 +30498,7 @@ }, "internal-ip": { "version": "4.3.0", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", "requires": { "default-gateway": "^4.2.0", "ipaddr.js": "^1.9.0" @@ -29413,6 +30506,7 @@ }, "internal-slot": { "version": "1.0.3", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", "requires": { "get-intrinsic": "^1.1.0", "has": "^1.0.3", @@ -29421,32 +30515,40 @@ }, "interpret": { "version": "1.4.0", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "invariant": { "version": "2.2.4", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { "loose-envify": "^1.0.0" } }, "invert-kv": { "version": "1.0.0", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, "ip": { - "version": "1.1.5" + "version": "1.1.5", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "ip-regex": { - "version": "2.1.0" + "version": "2.1.0", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" }, "ipaddr.js": { - "version": "1.9.1" + "version": "1.9.1", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, "is_js": { - "version": "0.9.0" + "version": "0.9.0", + "integrity": "sha1-CrlFQFArp6+iTIVqqYVWFmnpxS0=" }, "is-absolute": { "version": "1.0.0", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, "requires": { "is-relative": "^1.0.0", @@ -29454,52 +30556,63 @@ } }, "is-absolute-url": { - "version": "2.1.0" + "version": "2.1.0", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" }, "is-accessor-descriptor": { "version": "0.1.6", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { "kind-of": "^3.0.2" } }, "is-arguments": { "version": "1.1.0", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", "requires": { "call-bind": "^1.0.0" } }, "is-arrayish": { - "version": "0.2.1" + "version": "0.2.1", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-bigint": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" }, "is-binary-path": { "version": "2.1.0", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "requires": { "binary-extensions": "^2.0.0" } }, "is-boolean-object": { "version": "1.1.1", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", "requires": { "call-bind": "^1.0.2" } }, "is-buffer": { - "version": "1.1.6" + "version": "1.1.6", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.2.3" + "version": "1.2.3", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" }, "is-ci": { "version": "2.0.0", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "requires": { "ci-info": "^2.0.0" } }, "is-color-stop": { "version": "1.1.0", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", "requires": { "css-color-names": "^0.0.4", "hex-color-regex": "^1.1.0", @@ -29511,21 +30624,25 @@ }, "is-core-module": { "version": "2.4.0", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", "requires": { "has": "^1.0.3" } }, "is-data-descriptor": { "version": "0.1.4", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { "kind-of": "^3.0.2" } }, "is-date-object": { - "version": "1.0.4" + "version": "1.0.4", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" }, "is-descriptor": { "version": "0.1.6", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -29533,182 +30650,226 @@ }, "dependencies": { "kind-of": { - "version": "5.1.0" + "version": "5.1.0", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, "is-directory": { - "version": "0.3.1" + "version": "0.3.1", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, "is-docker": { - "version": "2.2.1" + "version": "2.2.1", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, "is-extendable": { - "version": "0.1.1" + "version": "0.1.1", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { - "version": "2.1.1" + "version": "2.1.1", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" }, "is-fullwidth-code-point": { "version": "1.0.0", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" } }, "is-function": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, "is-generator-fn": { - "version": "2.1.0" + "version": "2.1.0", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" }, "is-glob": { "version": "4.0.1", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "requires": { "is-extglob": "^2.1.1" } }, "is-in-browser": { - "version": "1.1.3" + "version": "1.1.3", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" }, "is-negated-glob": { "version": "1.0.0", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true }, "is-negative-zero": { - "version": "2.0.1" + "version": "2.0.1", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" }, "is-number": { "version": "3.0.0", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { "kind-of": "^3.0.2" } }, "is-number-like": { "version": "1.0.8", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", "dev": true, "requires": { "lodash.isfinite": "^3.3.2" } }, "is-number-object": { - "version": "1.0.5" + "version": "1.0.5", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" }, "is-obj": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" }, "is-path-cwd": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" }, "is-path-in-cwd": { "version": "2.1.0", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "requires": { "is-path-inside": "^2.1.0" } }, "is-path-inside": { "version": "2.1.0", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", "requires": { "path-is-inside": "^1.0.2" } }, "is-plain-obj": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-plain-object": { "version": "2.0.4", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { "isobject": "^3.0.1" } }, "is-promise": { "version": "2.2.2", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true }, "is-regex": { "version": "1.1.3", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "requires": { "call-bind": "^1.0.2", "has-symbols": "^1.0.2" } }, "is-regexp": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" }, "is-relative": { "version": "1.0.0", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, "requires": { "is-unc-path": "^1.0.0" } }, "is-resolvable": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" }, "is-root": { - "version": "2.1.0" + "version": "2.1.0", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" }, "is-stream": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-string": { - "version": "1.0.6" + "version": "1.0.6", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" }, "is-symbol": { "version": "1.0.4", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "requires": { "has-symbols": "^1.0.2" } }, "is-typedarray": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-unc-path": { "version": "1.0.0", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, "requires": { "unc-path-regex": "^0.1.2" } }, "is-utf8": { - "version": "0.2.1" + "version": "0.2.1", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, "is-valid-glob": { "version": "1.0.0", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", "dev": true }, "is-windows": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, "is-wsl": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "isarray": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { - "version": "3.0.1" + "version": "3.0.1", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "isomorphic-fetch": { "version": "2.2.1", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { "node-fetch": "^1.0.1", "whatwg-fetch": ">=0.10.0" } }, "isstream": { - "version": "0.1.2" + "version": "0.1.2", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-lib-coverage": { - "version": "2.0.5" + "version": "2.0.5", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==" }, "istanbul-lib-instrument": { "version": "3.3.0", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "requires": { "@babel/generator": "^7.4.0", "@babel/parser": "^7.4.3", @@ -29720,12 +30881,14 @@ }, "dependencies": { "semver": { - "version": "6.3.0" + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "istanbul-lib-report": { "version": "2.0.8", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "requires": { "istanbul-lib-coverage": "^2.0.5", "make-dir": "^2.1.0", @@ -29734,6 +30897,7 @@ "dependencies": { "supports-color": { "version": "6.1.0", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { "has-flag": "^3.0.0" } @@ -29742,6 +30906,7 @@ }, "istanbul-lib-source-maps": { "version": "3.0.6", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "requires": { "debug": "^4.1.1", "istanbul-lib-coverage": "^2.0.5", @@ -29751,18 +30916,21 @@ }, "dependencies": { "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "istanbul-reports": { "version": "2.2.7", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", "requires": { "html-escaper": "^2.0.0" } }, "jest": { "version": "24.9.0", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "requires": { "import-local": "^2.0.0", "jest-cli": "^24.9.0" @@ -29770,12 +30938,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -29784,6 +30954,7 @@ }, "jest-cli": { "version": "24.9.0", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", "requires": { "@jest/core": "^24.9.0", "@jest/test-result": "^24.9.0", @@ -29802,6 +30973,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -29810,6 +30982,7 @@ }, "jest-changed-files": { "version": "24.9.0", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "requires": { "@jest/types": "^24.9.0", "execa": "^1.0.0", @@ -29818,6 +30991,7 @@ }, "jest-config": { "version": "24.9.0", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "requires": { "@babel/core": "^7.1.0", "@jest/test-sequencer": "^24.9.0", @@ -29840,12 +31014,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -29854,6 +31030,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -29862,6 +31039,7 @@ }, "jest-diff": { "version": "24.9.0", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "requires": { "chalk": "^2.0.1", "diff-sequences": "^24.9.0", @@ -29871,12 +31049,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -29885,6 +31065,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -29893,12 +31074,14 @@ }, "jest-docblock": { "version": "24.9.0", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", "requires": { "detect-newline": "^2.1.0" } }, "jest-each": { "version": "24.9.0", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", "requires": { "@jest/types": "^24.9.0", "chalk": "^2.0.1", @@ -29909,12 +31092,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -29923,6 +31108,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -29931,6 +31117,7 @@ }, "jest-environment-jsdom": { "version": "24.9.0", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", "requires": { "@jest/environment": "^24.9.0", "@jest/fake-timers": "^24.9.0", @@ -29942,6 +31129,7 @@ }, "jest-environment-jsdom-fourteen": { "version": "1.0.1", + "integrity": "sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==", "requires": { "@jest/environment": "^24.3.0", "@jest/fake-timers": "^24.3.0", @@ -29952,10 +31140,12 @@ }, "dependencies": { "acorn": { - "version": "6.4.2" + "version": "6.4.2", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" }, "jsdom": { "version": "14.1.0", + "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", "requires": { "abab": "^2.0.0", "acorn": "^6.0.4", @@ -29986,10 +31176,12 @@ } }, "parse5": { - "version": "5.1.0" + "version": "5.1.0", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" }, "whatwg-url": { "version": "7.1.0", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -29998,6 +31190,7 @@ }, "ws": { "version": "6.2.2", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "requires": { "async-limiter": "~1.0.0" } @@ -30006,6 +31199,7 @@ }, "jest-environment-node": { "version": "24.9.0", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", "requires": { "@jest/environment": "^24.9.0", "@jest/fake-timers": "^24.9.0", @@ -30015,10 +31209,12 @@ } }, "jest-get-type": { - "version": "24.9.0" + "version": "24.9.0", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" }, "jest-haste-map": { "version": "24.9.0", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "requires": { "@jest/types": "^24.9.0", "anymatch": "^2.0.0", @@ -30036,6 +31232,7 @@ }, "jest-jasmine2": { "version": "24.9.0", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", "requires": { "@babel/traverse": "^7.1.0", "@jest/environment": "^24.9.0", @@ -30057,12 +31254,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -30071,6 +31270,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -30079,6 +31279,7 @@ }, "jest-leak-detector": { "version": "24.9.0", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", "requires": { "jest-get-type": "^24.9.0", "pretty-format": "^24.9.0" @@ -30086,6 +31287,7 @@ }, "jest-matcher-utils": { "version": "24.9.0", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", "requires": { "chalk": "^2.0.1", "jest-diff": "^24.9.0", @@ -30095,12 +31297,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -30109,6 +31313,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -30117,6 +31322,7 @@ }, "jest-message-util": { "version": "24.9.0", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "requires": { "@babel/code-frame": "^7.0.0", "@jest/test-result": "^24.9.0", @@ -30130,12 +31336,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -30144,6 +31352,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -30152,19 +31361,23 @@ }, "jest-mock": { "version": "24.9.0", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "requires": { "@jest/types": "^24.9.0" } }, "jest-pnp-resolver": { "version": "1.2.2", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", "requires": {} }, "jest-regex-util": { - "version": "24.9.0" + "version": "24.9.0", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==" }, "jest-resolve": { "version": "24.9.0", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "requires": { "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", @@ -30175,12 +31388,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -30189,6 +31404,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -30197,6 +31413,7 @@ }, "jest-resolve-dependencies": { "version": "24.9.0", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", "requires": { "@jest/types": "^24.9.0", "jest-regex-util": "^24.3.0", @@ -30205,6 +31422,7 @@ }, "jest-runner": { "version": "24.9.0", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", "requires": { "@jest/console": "^24.7.1", "@jest/environment": "^24.9.0", @@ -30229,12 +31447,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -30243,6 +31463,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -30251,6 +31472,7 @@ }, "jest-runtime": { "version": "24.9.0", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", "requires": { "@jest/console": "^24.7.1", "@jest/environment": "^24.9.0", @@ -30279,12 +31501,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -30292,10 +31516,12 @@ } }, "strip-bom": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -30303,10 +31529,12 @@ } }, "jest-serializer": { - "version": "24.9.0" + "version": "24.9.0", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" }, "jest-snapshot": { "version": "24.9.0", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", "requires": { "@babel/types": "^7.0.0", "@jest/types": "^24.9.0", @@ -30325,12 +31553,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -30338,10 +31568,12 @@ } }, "semver": { - "version": "6.3.0" + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -30350,6 +31582,7 @@ }, "jest-util": { "version": "24.9.0", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "requires": { "@jest/console": "^24.9.0", "@jest/fake-timers": "^24.9.0", @@ -30367,15 +31600,18 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "callsites": { - "version": "3.1.0" + "version": "3.1.0", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -30383,10 +31619,12 @@ } }, "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -30395,6 +31633,7 @@ }, "jest-validate": { "version": "24.9.0", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "requires": { "@jest/types": "^24.9.0", "camelcase": "^5.3.1", @@ -30406,15 +31645,18 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "camelcase": { - "version": "5.3.1" + "version": "5.3.1", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -30423,6 +31665,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -30431,6 +31674,7 @@ }, "jest-watch-typeahead": { "version": "0.4.2", + "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==", "requires": { "ansi-escapes": "^4.2.1", "chalk": "^2.4.1", @@ -30442,16 +31686,19 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0" + "version": "4.1.0", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -30459,10 +31706,12 @@ } }, "slash": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "string-length": { "version": "3.1.0", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", "requires": { "astral-regex": "^1.0.0", "strip-ansi": "^5.2.0" @@ -30470,12 +31719,14 @@ }, "strip-ansi": { "version": "5.2.0", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" } }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -30484,6 +31735,7 @@ }, "jest-watcher": { "version": "24.9.0", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "requires": { "@jest/test-result": "^24.9.0", "@jest/types": "^24.9.0", @@ -30495,16 +31747,19 @@ }, "dependencies": { "ansi-escapes": { - "version": "3.2.0" + "version": "3.2.0", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" }, "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -30513,6 +31768,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -30521,6 +31777,7 @@ }, "jest-worker": { "version": "24.9.0", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", "requires": { "merge-stream": "^2.0.0", "supports-color": "^6.1.0" @@ -30528,6 +31785,7 @@ "dependencies": { "supports-color": { "version": "6.1.0", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { "has-flag": "^3.0.0" } @@ -30535,23 +31793,28 @@ } }, "js-base64": { - "version": "2.6.4" + "version": "2.6.4", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" }, "js-tokens": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.14.1", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "jsbn": { - "version": "0.1.1" + "version": "0.1.1", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdom": { "version": "11.12.0", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", "requires": { "abab": "^2.0.0", "acorn": "^5.5.3", @@ -30582,63 +31845,78 @@ }, "dependencies": { "acorn": { - "version": "5.7.4" + "version": "5.7.4", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" } } }, "jsesc": { - "version": "0.5.0" + "version": "0.5.0", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" }, "json-parse-better-errors": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "json-parse-even-better-errors": { - "version": "2.3.1" + "version": "2.3.1", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema": { - "version": "0.2.3" + "version": "0.2.3", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { - "version": "0.4.1" + "version": "0.4.1", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify": { "version": "1.0.1", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "requires": { "jsonify": "~0.0.0" } }, "json-stable-stringify-without-jsonify": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, "json-stringify-safe": { - "version": "5.0.1" + "version": "5.0.1", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json2mq": { "version": "0.2.0", + "integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=", "requires": { "string-convert": "^0.2.0" } }, "json3": { - "version": "3.3.3" + "version": "3.3.3", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" }, "json5": { "version": "2.2.0", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "requires": { "minimist": "^1.2.5" } }, "jsonfile": { "version": "4.0.0", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { "graceful-fs": "^4.1.6" } }, "jsonify": { - "version": "0.0.0" + "version": "0.0.0", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, "jsprim": { "version": "1.4.1", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -30648,6 +31926,7 @@ }, "jss": { "version": "9.8.7", + "integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==", "requires": { "is-in-browser": "^1.1.3", "symbol-observable": "^1.1.0", @@ -30656,6 +31935,7 @@ "dependencies": { "warning": { "version": "3.0.0", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { "loose-envify": "^1.0.0" } @@ -30664,18 +31944,21 @@ }, "jss-camel-case": { "version": "6.1.0", + "integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==", "requires": { "hyphenate-style-name": "^1.0.2" } }, "jss-compose": { "version": "5.0.0", + "integrity": "sha512-YofRYuiA0+VbeOw0VjgkyO380sA4+TWDrW52nSluD9n+1FWOlDzNbgpZ/Sb3Y46+DcAbOS21W5jo6SAqUEiuwA==", "requires": { "warning": "^3.0.0" }, "dependencies": { "warning": { "version": "3.0.0", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { "loose-envify": "^1.0.0" } @@ -30684,20 +31967,24 @@ }, "jss-default-unit": { "version": "8.0.2", + "integrity": "sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg==", "requires": {} }, "jss-expand": { "version": "5.3.0", + "integrity": "sha512-NiM4TbDVE0ykXSAw6dfFmB1LIqXP/jdd0ZMnlvlGgEMkMt+weJIl8Ynq1DsuBY9WwkNyzWktdqcEW2VN0RAtQg==", "requires": {} }, "jss-extend": { "version": "6.2.0", + "integrity": "sha512-YszrmcB6o9HOsKPszK7NeDBNNjVyiW864jfoiHoMlgMIg2qlxKw70axZHqgczXHDcoyi/0/ikP1XaHDPRvYtEA==", "requires": { "warning": "^3.0.0" }, "dependencies": { "warning": { "version": "3.0.0", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { "loose-envify": "^1.0.0" } @@ -30706,16 +31993,19 @@ }, "jss-global": { "version": "3.0.0", + "integrity": "sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q==", "requires": {} }, "jss-nested": { "version": "6.0.1", + "integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==", "requires": { "warning": "^3.0.0" }, "dependencies": { "warning": { "version": "3.0.0", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { "loose-envify": "^1.0.0" } @@ -30724,6 +32014,7 @@ }, "jss-preset-default": { "version": "4.5.0", + "integrity": "sha512-qZbpRVtHT7hBPpZEBPFfafZKWmq3tA/An5RNqywDsZQGrlinIF/mGD9lmj6jGqu8GrED2SMHZ3pPKLmjCZoiaQ==", "requires": { "jss-camel-case": "^6.1.0", "jss-compose": "^5.0.0", @@ -30739,16 +32030,19 @@ }, "jss-props-sort": { "version": "6.0.0", + "integrity": "sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g==", "requires": {} }, "jss-template": { "version": "1.0.1", + "integrity": "sha512-m5BqEWha17fmIVXm1z8xbJhY6GFJxNB9H68GVnCWPyGYfxiAgY9WTQyvDAVj+pYRgrXSOfN5V1T4+SzN1sJTeg==", "requires": { "warning": "^3.0.0" }, "dependencies": { "warning": { "version": "3.0.0", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { "loose-envify": "^1.0.0" } @@ -30757,12 +32051,14 @@ }, "jss-vendor-prefixer": { "version": "7.0.0", + "integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==", "requires": { "css-vendor": "^0.3.8" } }, "jsx-ast-utils": { "version": "2.4.1", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", "requires": { "array-includes": "^3.1.1", "object.assign": "^4.1.0" @@ -30770,25 +32066,31 @@ }, "just-debounce": { "version": "1.1.0", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", "dev": true }, "keycode": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" }, "killable": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" }, "kind-of": { "version": "3.2.2", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } }, "kleur": { - "version": "3.0.3" + "version": "3.0.3", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, "last-call-webpack-plugin": { "version": "3.0.0", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", "requires": { "lodash": "^4.17.5", "webpack-sources": "^1.1.0" @@ -30796,6 +32098,7 @@ }, "last-run": { "version": "1.1.1", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", "dev": true, "requires": { "default-resolution": "^2.0.0", @@ -30803,10 +32106,12 @@ } }, "lazy-cache": { - "version": "1.0.4" + "version": "1.0.4", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "lazystream": { "version": "1.0.0", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "dev": true, "requires": { "readable-stream": "^2.0.5" @@ -30814,6 +32119,7 @@ }, "lcid": { "version": "1.0.0", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { "invert-kv": "^1.0.0" @@ -30821,35 +32127,43 @@ }, "lead": { "version": "1.0.0", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", "dev": true, "requires": { "flush-write-stream": "^1.0.2" } }, "leaflet": { - "version": "1.7.1" + "version": "1.7.1", + "integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw==" }, "leaflet.markercluster": { "version": "1.5.0", + "integrity": "sha512-Fvf/cq4o806mJL50n+fZW9+QALDDLPvt7vuAjlD2vfnxx3srMDs2vWINJze4nKYJYRY45OC6tM/669C3pLwMCA==", "requires": {} }, "leaflet.tilelayer.colorfilter": { - "version": "1.2.5" + "version": "1.2.5", + "integrity": "sha512-wUvqVlpEofDEDi0ocXApXAcz1l06RsNBEw3L/2ColaygDPERswgas2Jgv/DVrWrVd0HQAxDerwFqOtBI+zbw3w==" }, "left-pad": { - "version": "1.3.0" + "version": "1.3.0", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" }, "leven": { - "version": "3.1.0" + "version": "3.1.0", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, "levenary": { "version": "1.1.1", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", "requires": { "leven": "^3.1.0" } }, "levn": { "version": "0.3.0", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -30857,6 +32171,7 @@ }, "liftoff": { "version": "3.1.0", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", "dev": true, "requires": { "extend": "^3.0.0", @@ -30871,13 +32186,16 @@ }, "limiter": { "version": "1.1.5", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", "dev": true }, "lines-and-columns": { - "version": "1.1.6" + "version": "1.1.6", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "load-json-file": { "version": "1.1.0", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -30888,6 +32206,7 @@ }, "loader-fs-cache": { "version": "1.0.3", + "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", "requires": { "find-cache-dir": "^0.1.1", "mkdirp": "^0.5.1" @@ -30895,6 +32214,7 @@ "dependencies": { "find-cache-dir": { "version": "0.1.1", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "requires": { "commondir": "^1.0.1", "mkdirp": "^0.5.1", @@ -30903,6 +32223,7 @@ }, "pkg-dir": { "version": "1.0.0", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "requires": { "find-up": "^1.0.0" } @@ -30910,10 +32231,12 @@ } }, "loader-runner": { - "version": "2.4.0" + "version": "2.4.0", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" }, "loader-utils": { "version": "1.4.0", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -30922,6 +32245,7 @@ "dependencies": { "json5": { "version": "1.0.1", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "requires": { "minimist": "^1.2.0" } @@ -30929,10 +32253,12 @@ } }, "loadjs": { - "version": "4.2.0" + "version": "4.2.0", + "integrity": "sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA==" }, "localtunnel": { "version": "2.0.1", + "integrity": "sha512-LiaI5wZdz0xFkIQpXbNI62ZnNn8IMsVhwxHmhA+h4vj8R9JG/07bQHWwQlyy7b95/5fVOCHJfIHv+a5XnkvaJA==", "dev": true, "requires": { "axios": "0.21.1", @@ -30943,10 +32269,12 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { "version": "4.3.0", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" @@ -30954,6 +32282,7 @@ }, "cliui": { "version": "7.0.4", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", @@ -30963,6 +32292,7 @@ }, "color-convert": { "version": "2.0.1", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" @@ -30970,14 +32300,17 @@ }, "emoji-regex": { "version": "8.0.0", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { "version": "4.2.2", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -30987,6 +32320,7 @@ }, "strip-ansi": { "version": "6.0.0", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { "ansi-regex": "^5.0.0" @@ -30994,6 +32328,7 @@ }, "wrap-ansi": { "version": "7.0.0", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -31003,10 +32338,12 @@ }, "y18n": { "version": "5.0.8", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yargs": { "version": "16.2.0", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -31020,43 +32357,53 @@ }, "yargs-parser": { "version": "20.2.9", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true } } }, "locate-path": { "version": "3.0.0", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" } } }, "lodash": { - "version": "4.17.21" + "version": "4.17.21", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash._reinterpolate": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, "lodash.debounce": { - "version": "4.0.8" + "version": "4.0.8", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, "lodash.isfinite": { "version": "3.3.2", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", "dev": true }, "lodash.memoize": { - "version": "4.1.2" + "version": "4.1.2", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, "lodash.sortby": { - "version": "4.7.0" + "version": "4.7.0", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, "lodash.template": { "version": "4.5.0", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "requires": { "lodash._reinterpolate": "^3.0.0", "lodash.templatesettings": "^4.0.0" @@ -31064,30 +32411,37 @@ }, "lodash.templatesettings": { "version": "4.2.0", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "requires": { "lodash._reinterpolate": "^3.0.0" } }, "lodash.throttle": { - "version": "4.1.1" + "version": "4.1.1", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" }, "lodash.uniq": { - "version": "4.5.0" + "version": "4.5.0", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "loglevel": { - "version": "1.7.1" + "version": "1.7.1", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" }, "loose-envify": { "version": "1.4.0", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } }, "lottie-web": { - "version": "5.7.11" + "version": "5.7.11", + "integrity": "sha512-Jvz3PQqwrDj1rXGqfeQtipH/WNtM/Y4l8t8NIQXe1xUI0nVooH2bTYJGef0UkdBcWUx1s3miKsRhyP196g9tvQ==" }, "loud-rejection": { "version": "1.6.0", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "requires": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.0" @@ -31095,12 +32449,14 @@ }, "lower-case": { "version": "2.0.2", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "requires": { "tslib": "^2.0.3" } }, "lru-cache": { "version": "4.1.5", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -31108,6 +32464,7 @@ }, "lru-queue": { "version": "0.1.0", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", "dev": true, "requires": { "es5-ext": "~0.10.2" @@ -31115,24 +32472,28 @@ }, "magic-string": { "version": "0.25.7", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", "requires": { "sourcemap-codec": "^1.4.4" } }, "make-dir": { "version": "2.1.0", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "requires": { "pify": "^4.0.1", "semver": "^5.6.0" }, "dependencies": { "pify": { - "version": "4.0.1" + "version": "4.0.1", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" } } }, "make-iterator": { "version": "1.0.1", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", "dev": true, "requires": { "kind-of": "^6.0.2" @@ -31140,33 +32501,40 @@ "dependencies": { "kind-of": { "version": "6.0.3", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true } } }, "makeerror": { "version": "1.0.11", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "requires": { "tmpl": "1.0.x" } }, "mamacro": { - "version": "0.0.3" + "version": "0.0.3", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" }, "map-cache": { - "version": "0.2.2" + "version": "0.2.2", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, "map-obj": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" }, "map-visit": { "version": "1.0.0", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "requires": { "object-visit": "^1.0.0" } }, "matchdep": { "version": "2.0.0", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", "dev": true, "requires": { "findup-sync": "^2.0.0", @@ -31177,6 +32545,7 @@ "dependencies": { "findup-sync": { "version": "2.0.0", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", "dev": true, "requires": { "detect-file": "^1.0.0", @@ -31187,6 +32556,7 @@ }, "is-glob": { "version": "3.1.0", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { "is-extglob": "^2.1.0" @@ -31196,6 +32566,7 @@ }, "md5.js": { "version": "1.3.5", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -31203,16 +32574,20 @@ } }, "mdn-data": { - "version": "2.0.4" + "version": "2.0.4", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" }, "media-typer": { - "version": "0.3.0" + "version": "0.3.0", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "memoize-one": { - "version": "5.2.1" + "version": "5.2.1", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" }, "memoizee": { "version": "0.4.15", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", "dev": true, "requires": { "d": "^1.0.1", @@ -31227,12 +32602,14 @@ "dependencies": { "next-tick": { "version": "1.1.0", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true } } }, "memory-fs": { "version": "0.4.1", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -31240,6 +32617,7 @@ }, "meow": { "version": "3.7.0", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "requires": { "camelcase-keys": "^2.0.0", "decamelize": "^1.1.2", @@ -31255,6 +32633,7 @@ }, "merge-deep": { "version": "3.0.3", + "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==", "requires": { "arr-union": "^3.1.0", "clone-deep": "^0.2.4", @@ -31262,22 +32641,28 @@ } }, "merge-descriptors": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "merge-stream": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { - "version": "1.4.1" + "version": "1.4.1", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "methods": { - "version": "1.1.2" + "version": "1.1.2", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "microevent.ts": { - "version": "0.1.1" + "version": "0.1.1", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" }, "micromatch": { "version": "3.1.10", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -31296,6 +32681,7 @@ "dependencies": { "extend-shallow": { "version": "3.0.2", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -31303,50 +32689,60 @@ }, "is-extendable": { "version": "1.0.1", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { "is-plain-object": "^2.0.4" } }, "kind-of": { - "version": "6.0.3" + "version": "6.0.3", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, "miller-rabin": { "version": "4.0.1", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" }, "dependencies": { "bn.js": { - "version": "4.12.0" + "version": "4.12.0", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "mime": { - "version": "2.5.2" + "version": "2.5.2", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" }, "mime-db": { - "version": "1.48.0" + "version": "1.48.0", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" }, "mime-types": { "version": "2.1.31", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", "requires": { "mime-db": "1.48.0" } }, "mimic-fn": { - "version": "2.1.0" + "version": "2.1.0", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "min-document": { "version": "2.19.0", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", "requires": { "dom-walk": "^0.1.0" } }, "mini-create-react-context": { "version": "0.4.1", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", "requires": { "@babel/runtime": "^7.12.1", "tiny-warning": "^1.0.3" @@ -31354,6 +32750,7 @@ }, "mini-css-extract-plugin": { "version": "0.9.0", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", "requires": { "loader-utils": "^1.1.0", "normalize-url": "1.9.1", @@ -31363,6 +32760,7 @@ "dependencies": { "schema-utils": { "version": "1.0.0", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -31372,51 +32770,61 @@ } }, "minimalistic-assert": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { "version": "3.0.4", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5" + "version": "1.2.5", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { "version": "3.1.3", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "requires": { "yallist": "^4.0.0" }, "dependencies": { "yallist": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "minipass-collect": { "version": "1.0.2", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "requires": { "minipass": "^3.0.0" } }, "minipass-flush": { "version": "1.0.5", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "requires": { "minipass": "^3.0.0" } }, "minipass-pipeline": { "version": "1.2.4", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "requires": { "minipass": "^3.0.0" } }, "mississippi": { "version": "3.0.0", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "requires": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -31432,10 +32840,12 @@ }, "mitt": { "version": "1.2.0", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", "dev": true }, "mixin-deep": { "version": "1.3.2", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -31443,6 +32853,7 @@ "dependencies": { "is-extendable": { "version": "1.0.1", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { "is-plain-object": "^2.0.4" } @@ -31451,27 +32862,32 @@ }, "mixin-object": { "version": "2.0.1", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", "requires": { "for-in": "^0.1.3", "is-extendable": "^0.1.1" }, "dependencies": { "for-in": { - "version": "0.1.8" + "version": "0.1.8", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" } } }, "mkdirp": { "version": "0.5.5", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { "minimist": "^1.2.5" } }, "moment": { - "version": "2.29.1" + "version": "2.29.1", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "move-concurrently": { "version": "1.0.1", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "requires": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -31482,30 +32898,37 @@ } }, "ms": { - "version": "2.1.2" + "version": "2.1.2", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { "version": "6.2.3", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "requires": { "dns-packet": "^1.3.1", "thunky": "^1.0.2" } }, "multicast-dns-service-types": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "mute-stdout": { "version": "1.0.1", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", "dev": true }, "mute-stream": { - "version": "0.0.8" + "version": "0.0.8", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "nan": { - "version": "2.14.2" + "version": "2.14.2", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" }, "nanomatch": { "version": "1.2.13", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -31522,6 +32945,7 @@ "dependencies": { "extend-shallow": { "version": "3.0.2", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -31529,32 +32953,40 @@ }, "is-extendable": { "version": "1.0.1", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { "is-plain-object": "^2.0.4" } }, "kind-of": { - "version": "6.0.3" + "version": "6.0.3", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, "natural-compare": { - "version": "1.4.0" + "version": "1.4.0", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, "negotiator": { - "version": "0.6.2" + "version": "0.6.2", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "neo-async": { - "version": "2.6.2" + "version": "2.6.2", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "next-tick": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, "nice-try": { - "version": "1.0.5" + "version": "1.0.5", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "no-case": { "version": "3.0.4", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "requires": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -31562,16 +32994,19 @@ }, "node-fetch": { "version": "1.7.3", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { "encoding": "^0.1.11", "is-stream": "^1.0.1" } }, "node-forge": { - "version": "0.10.0" + "version": "0.10.0", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" }, "node-gyp": { "version": "3.8.0", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", "requires": { "fstream": "^1.0.0", "glob": "^7.0.3", @@ -31588,15 +33023,18 @@ }, "dependencies": { "semver": { - "version": "5.3.0" + "version": "5.3.0", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" } } }, "node-int64": { - "version": "0.4.0" + "version": "0.4.0", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-libs-browser": { "version": "2.2.1", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "requires": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -31624,18 +33062,22 @@ }, "dependencies": { "process": { - "version": "0.11.10" + "version": "0.11.10", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "punycode": { - "version": "1.4.1" + "version": "1.4.1", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" } } }, "node-modules-regexp": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" }, "node-notifier": { "version": "5.4.5", + "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==", "requires": { "growly": "^1.3.0", "is-wsl": "^1.1.0", @@ -31645,10 +33087,12 @@ } }, "node-releases": { - "version": "1.1.73" + "version": "1.1.73", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" }, "node-sass": { "version": "4.14.1", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", "requires": { "async-foreach": "^0.1.3", "chalk": "^1.1.1", @@ -31671,12 +33115,14 @@ }, "nopt": { "version": "3.0.6", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { "abbrev": "1" } }, "normalize-package-data": { "version": "2.5.0", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -31686,18 +33132,22 @@ }, "normalize-path": { "version": "2.1.1", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { "remove-trailing-separator": "^1.0.1" } }, "normalize-range": { - "version": "0.1.2" + "version": "0.1.2", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, "normalize-scroll-left": { - "version": "0.1.2" + "version": "0.1.2", + "integrity": "sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg==" }, "normalize-url": { "version": "1.9.1", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "requires": { "object-assign": "^4.0.1", "prepend-http": "^1.0.0", @@ -31707,6 +33157,7 @@ }, "now-and-later": { "version": "2.0.1", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", "dev": true, "requires": { "once": "^1.3.2" @@ -31714,12 +33165,14 @@ }, "npm-run-path": { "version": "2.0.2", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { "path-key": "^2.0.0" } }, "npmlog": { "version": "4.1.2", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -31729,27 +33182,34 @@ }, "nth-check": { "version": "1.0.2", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "requires": { "boolbase": "~1.0.0" } }, "num2fraction": { - "version": "1.2.2" + "version": "1.2.2", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" }, "number-is-nan": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nwsapi": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" }, "oauth-sign": { - "version": "0.9.0" + "version": "0.9.0", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { - "version": "4.1.1" + "version": "4.1.1", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -31758,6 +33218,7 @@ "dependencies": { "define-property": { "version": "0.2.5", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" } @@ -31765,29 +33226,35 @@ } }, "object-hash": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" }, "object-inspect": { - "version": "1.10.3" + "version": "1.10.3", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" }, "object-is": { "version": "1.1.5", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, "object-keys": { - "version": "1.1.1" + "version": "1.1.1", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-visit": { "version": "1.0.1", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { "isobject": "^3.0.0" } }, "object.assign": { "version": "4.1.2", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -31797,6 +33264,7 @@ }, "object.defaults": { "version": "1.1.0", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "dev": true, "requires": { "array-each": "^1.0.1", @@ -31807,6 +33275,7 @@ "dependencies": { "for-own": { "version": "1.0.0", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { "for-in": "^1.0.1" @@ -31816,6 +33285,7 @@ }, "object.entries": { "version": "1.1.4", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -31824,6 +33294,7 @@ }, "object.fromentries": { "version": "2.0.4", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -31833,6 +33304,7 @@ }, "object.getownpropertydescriptors": { "version": "2.1.2", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -31841,6 +33313,7 @@ }, "object.map": { "version": "1.0.1", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", "dev": true, "requires": { "for-own": "^1.0.0", @@ -31849,6 +33322,7 @@ "dependencies": { "for-own": { "version": "1.0.0", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { "for-in": "^1.0.1" @@ -31858,12 +33332,14 @@ }, "object.pick": { "version": "1.3.0", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { "isobject": "^3.0.1" } }, "object.reduce": { "version": "1.0.1", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", "dev": true, "requires": { "for-own": "^1.0.0", @@ -31872,6 +33348,7 @@ "dependencies": { "for-own": { "version": "1.0.0", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { "for-in": "^1.0.1" @@ -31881,6 +33358,7 @@ }, "object.values": { "version": "1.1.4", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -31888,31 +33366,37 @@ } }, "obuf": { - "version": "1.1.2" + "version": "1.1.2", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "on-finished": { "version": "2.3.0", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "requires": { "ee-first": "1.1.1" } }, "on-headers": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" }, "once": { "version": "1.4.0", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" } }, "onetime": { "version": "5.1.2", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "requires": { "mimic-fn": "^2.1.0" } }, "open": { "version": "7.4.2", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -31920,6 +33404,7 @@ "dependencies": { "is-wsl": { "version": "2.2.0", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "requires": { "is-docker": "^2.0.0" } @@ -31928,16 +33413,19 @@ }, "openurl": { "version": "1.1.1", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", "dev": true }, "opn": { "version": "5.5.0", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "requires": { "is-wsl": "^1.1.0" } }, "optimize-css-assets-webpack-plugin": { "version": "5.0.3", + "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", "requires": { "cssnano": "^4.1.10", "last-call-webpack-plugin": "^3.0.0" @@ -31945,6 +33433,7 @@ }, "optionator": { "version": "0.8.3", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -31956,6 +33445,7 @@ }, "ordered-read-streams": { "version": "1.0.1", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", "dev": true, "requires": { "readable-stream": "^2.0.1" @@ -31963,28 +33453,34 @@ }, "original": { "version": "1.0.2", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", "requires": { "url-parse": "^1.4.3" } }, "os-browserify": { - "version": "0.3.0" + "version": "0.3.0", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, "os-homedir": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { "version": "1.4.0", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { "lcid": "^1.0.0" } }, "os-tmpdir": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { "version": "0.1.5", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" @@ -31992,48 +33488,58 @@ }, "p-each-series": { "version": "1.0.0", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", "requires": { "p-reduce": "^1.0.0" } }, "p-finally": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { "version": "2.3.0", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { "p-limit": "^2.0.0" } }, "p-map": { "version": "3.0.0", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "requires": { "aggregate-error": "^3.0.0" } }, "p-reduce": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" }, "p-retry": { "version": "3.0.1", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", "requires": { "retry": "^0.12.0" } }, "p-try": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pako": { - "version": "1.0.11" + "version": "1.0.11", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "parallel-transform": { "version": "1.2.0", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "requires": { "cyclist": "^1.0.1", "inherits": "^2.0.3", @@ -32042,27 +33548,32 @@ }, "param-case": { "version": "3.0.4", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "requires": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "parchment": { - "version": "1.1.4" + "version": "1.1.4", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" }, "parent-module": { "version": "1.0.1", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "requires": { "callsites": "^3.0.0" }, "dependencies": { "callsites": { - "version": "3.1.0" + "version": "3.1.0", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" } } }, "parse-asn1": { "version": "5.1.6", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "requires": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -32073,6 +33584,7 @@ }, "parse-filepath": { "version": "1.0.2", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", "dev": true, "requires": { "is-absolute": "^1.0.0", @@ -32082,68 +33594,85 @@ }, "parse-json": { "version": "2.2.0", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { "error-ex": "^1.2.0" } }, "parse-node-version": { "version": "1.0.1", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true }, "parse-passwd": { "version": "1.0.0", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, "parse5": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" }, "parseqs": { "version": "0.0.6", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", "dev": true }, "parseuri": { "version": "0.0.6", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", "dev": true }, "parseurl": { - "version": "1.3.3" + "version": "1.3.3", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "pascal-case": { "version": "3.1.2", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "pascalcase": { - "version": "0.1.1" + "version": "0.1.1", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, "path-browserify": { - "version": "0.0.1" + "version": "0.0.1", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" }, "path-dirname": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" }, "path-exists": { "version": "2.1.0", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { - "version": "2.0.1" + "version": "2.0.1", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { - "version": "1.0.7" + "version": "1.0.7", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-root": { "version": "0.1.1", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", "dev": true, "requires": { "path-root-regex": "^0.1.0" @@ -32151,21 +33680,25 @@ }, "path-root-regex": { "version": "0.1.2", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", "dev": true }, "path-to-regexp": { "version": "1.8.0", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "requires": { "isarray": "0.0.1" }, "dependencies": { "isarray": { - "version": "0.0.1" + "version": "0.0.1", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" } } }, "path-type": { "version": "1.1.0", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -32174,6 +33707,7 @@ }, "pbkdf2": { "version": "3.1.2", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -32183,37 +33717,45 @@ } }, "performance-now": { - "version": "2.1.0" + "version": "2.1.0", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "picomatch": { - "version": "2.3.0" + "version": "2.3.0", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, "pify": { - "version": "2.3.0" + "version": "2.3.0", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { - "version": "2.0.4" + "version": "2.0.4", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { "pinkie": "^2.0.0" } }, "pirates": { "version": "4.0.1", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "requires": { "node-modules-regexp": "^1.0.0" } }, "pkg-dir": { "version": "3.0.0", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "requires": { "find-up": "^3.0.0" }, "dependencies": { "find-up": { "version": "3.0.0", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { "locate-path": "^3.0.0" } @@ -32222,12 +33764,14 @@ }, "pkg-up": { "version": "3.1.0", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "requires": { "find-up": "^3.0.0" }, "dependencies": { "find-up": { "version": "3.0.0", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { "locate-path": "^3.0.0" } @@ -32236,6 +33780,7 @@ }, "plugin-error": { "version": "1.0.1", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, "requires": { "ansi-colors": "^1.0.1", @@ -32246,6 +33791,7 @@ "dependencies": { "ansi-colors": { "version": "1.1.0", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { "ansi-wrap": "^0.1.0" @@ -32253,6 +33799,7 @@ }, "extend-shallow": { "version": "3.0.2", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { "assign-symbols": "^1.0.0", @@ -32261,6 +33808,7 @@ }, "is-extendable": { "version": "1.0.1", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -32270,6 +33818,7 @@ }, "plyr": { "version": "3.6.8", + "integrity": "sha512-Iu9KKsH+/HH6PBGAag57KswjXRXyJ9TeMlcMiwLCGC9foqSIb+crPi6wTmyFr9AFmTr8QZuFrYEL+SlnXT+vBw==", "requires": { "core-js": "^3.10.1", "custom-event-polyfill": "^1.0.7", @@ -32279,19 +33828,23 @@ } }, "pn": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, "pnp-webpack-plugin": { "version": "1.6.4", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", "requires": { "ts-pnp": "^1.1.6" } }, "popper.js": { - "version": "1.16.1" + "version": "1.16.1", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" }, "portfinder": { "version": "1.0.28", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "requires": { "async": "^2.6.2", "debug": "^3.1.1", @@ -32300,6 +33853,7 @@ "dependencies": { "debug": { "version": "3.2.7", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } @@ -32308,6 +33862,7 @@ }, "portscanner": { "version": "2.1.1", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", "dev": true, "requires": { "async": "1.5.2", @@ -32316,15 +33871,18 @@ "dependencies": { "async": { "version": "1.5.2", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true } } }, "posix-character-classes": { - "version": "0.1.1" + "version": "0.1.1", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { "version": "7.0.36", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -32333,12 +33891,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -32347,6 +33907,7 @@ "dependencies": { "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -32354,10 +33915,12 @@ } }, "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "supports-color": { "version": "6.1.0", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { "has-flag": "^3.0.0" } @@ -32366,6 +33929,7 @@ }, "postcss-attribute-case-insensitive": { "version": "4.0.2", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", "requires": { "postcss": "^7.0.2", "postcss-selector-parser": "^6.0.2" @@ -32373,12 +33937,14 @@ }, "postcss-browser-comments": { "version": "3.0.0", + "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", "requires": { "postcss": "^7" } }, "postcss-calc": { "version": "7.0.5", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", "requires": { "postcss": "^7.0.27", "postcss-selector-parser": "^6.0.2", @@ -32387,6 +33953,7 @@ }, "postcss-color-functional-notation": { "version": "2.0.1", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" @@ -32394,6 +33961,7 @@ }, "postcss-color-gray": { "version": "5.0.0", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", "requires": { "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.5", @@ -32402,6 +33970,7 @@ }, "postcss-color-hex-alpha": { "version": "5.0.3", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", "requires": { "postcss": "^7.0.14", "postcss-values-parser": "^2.0.1" @@ -32409,6 +33978,7 @@ }, "postcss-color-mod-function": { "version": "3.0.3", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", "requires": { "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.2", @@ -32417,6 +33987,7 @@ }, "postcss-color-rebeccapurple": { "version": "4.0.1", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" @@ -32424,6 +33995,7 @@ }, "postcss-colormin": { "version": "4.0.3", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "requires": { "browserslist": "^4.0.0", "color": "^3.0.0", @@ -32433,30 +34005,35 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-convert-values": { "version": "4.0.1", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-custom-media": { "version": "7.0.8", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", "requires": { "postcss": "^7.0.14" } }, "postcss-custom-properties": { "version": "8.0.11", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", "requires": { "postcss": "^7.0.17", "postcss-values-parser": "^2.0.1" @@ -32464,16 +34041,19 @@ }, "postcss-custom-selectors": { "version": "5.1.2", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", "requires": { "postcss": "^7.0.2", "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { "cssesc": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, "postcss-selector-parser": { "version": "5.0.0", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "requires": { "cssesc": "^2.0.0", "indexes-of": "^1.0.1", @@ -32484,16 +34064,19 @@ }, "postcss-dir-pseudo-class": { "version": "5.0.0", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", "requires": { "postcss": "^7.0.2", "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { "cssesc": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, "postcss-selector-parser": { "version": "5.0.0", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "requires": { "cssesc": "^2.0.0", "indexes-of": "^1.0.1", @@ -32504,30 +34087,35 @@ }, "postcss-discard-comments": { "version": "4.0.2", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "requires": { "postcss": "^7.0.0" } }, "postcss-discard-duplicates": { "version": "4.0.2", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "requires": { "postcss": "^7.0.0" } }, "postcss-discard-empty": { "version": "4.0.1", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "requires": { "postcss": "^7.0.0" } }, "postcss-discard-overridden": { "version": "4.0.1", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "requires": { "postcss": "^7.0.0" } }, "postcss-double-position-gradients": { "version": "1.0.0", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", "requires": { "postcss": "^7.0.5", "postcss-values-parser": "^2.0.0" @@ -32535,6 +34123,7 @@ }, "postcss-env-function": { "version": "2.0.2", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" @@ -32542,36 +34131,42 @@ }, "postcss-flexbugs-fixes": { "version": "4.1.0", + "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", "requires": { "postcss": "^7.0.0" } }, "postcss-focus-visible": { "version": "4.0.0", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", "requires": { "postcss": "^7.0.2" } }, "postcss-focus-within": { "version": "3.0.0", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", "requires": { "postcss": "^7.0.2" } }, "postcss-font-variant": { "version": "4.0.1", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", "requires": { "postcss": "^7.0.2" } }, "postcss-gap-properties": { "version": "2.0.0", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", "requires": { "postcss": "^7.0.2" } }, "postcss-image-set-function": { "version": "3.0.1", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" @@ -32579,12 +34174,14 @@ }, "postcss-initial": { "version": "3.0.4", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", "requires": { "postcss": "^7.0.2" } }, "postcss-lab-function": { "version": "2.0.1", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", "requires": { "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.2", @@ -32593,6 +34190,7 @@ }, "postcss-load-config": { "version": "2.1.2", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", "requires": { "cosmiconfig": "^5.0.0", "import-cwd": "^2.0.0" @@ -32600,6 +34198,7 @@ }, "postcss-loader": { "version": "3.0.0", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", "requires": { "loader-utils": "^1.1.0", "postcss": "^7.0.0", @@ -32609,6 +34208,7 @@ "dependencies": { "schema-utils": { "version": "1.0.0", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -32619,18 +34219,21 @@ }, "postcss-logical": { "version": "3.0.0", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", "requires": { "postcss": "^7.0.2" } }, "postcss-media-minmax": { "version": "4.0.0", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", "requires": { "postcss": "^7.0.2" } }, "postcss-merge-longhand": { "version": "4.0.11", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", "requires": { "css-color-names": "0.0.4", "postcss": "^7.0.0", @@ -32639,12 +34242,14 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-merge-rules": { "version": "4.0.3", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "requires": { "browserslist": "^4.0.0", "caniuse-api": "^3.0.0", @@ -32656,6 +34261,7 @@ "dependencies": { "postcss-selector-parser": { "version": "3.1.2", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "requires": { "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", @@ -32666,18 +34272,21 @@ }, "postcss-minify-font-values": { "version": "4.0.2", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-minify-gradients": { "version": "4.0.2", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "requires": { "cssnano-util-get-arguments": "^4.0.0", "is-color-stop": "^1.0.0", @@ -32686,12 +34295,14 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-minify-params": { "version": "4.0.2", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "requires": { "alphanum-sort": "^1.0.0", "browserslist": "^4.0.0", @@ -32702,12 +34313,14 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-minify-selectors": { "version": "4.0.2", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "requires": { "alphanum-sort": "^1.0.0", "has": "^1.0.0", @@ -32717,6 +34330,7 @@ "dependencies": { "postcss-selector-parser": { "version": "3.1.2", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "requires": { "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", @@ -32727,12 +34341,14 @@ }, "postcss-modules-extract-imports": { "version": "2.0.0", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", "requires": { "postcss": "^7.0.5" } }, "postcss-modules-local-by-default": { "version": "3.0.3", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", "requires": { "icss-utils": "^4.1.1", "postcss": "^7.0.32", @@ -32742,6 +34358,7 @@ }, "postcss-modules-scope": { "version": "2.2.0", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "requires": { "postcss": "^7.0.6", "postcss-selector-parser": "^6.0.0" @@ -32749,6 +34366,7 @@ }, "postcss-modules-values": { "version": "3.0.0", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", "requires": { "icss-utils": "^4.0.0", "postcss": "^7.0.6" @@ -32756,12 +34374,14 @@ }, "postcss-nesting": { "version": "7.0.1", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", "requires": { "postcss": "^7.0.2" } }, "postcss-normalize": { "version": "8.0.1", + "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", "requires": { "@csstools/normalize.css": "^10.1.0", "browserslist": "^4.6.2", @@ -32772,12 +34392,14 @@ }, "postcss-normalize-charset": { "version": "4.0.1", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "requires": { "postcss": "^7.0.0" } }, "postcss-normalize-display-values": { "version": "4.0.2", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", "requires": { "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", @@ -32785,12 +34407,14 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-normalize-positions": { "version": "4.0.2", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "requires": { "cssnano-util-get-arguments": "^4.0.0", "has": "^1.0.0", @@ -32799,12 +34423,14 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-normalize-repeat-style": { "version": "4.0.2", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", "requires": { "cssnano-util-get-arguments": "^4.0.0", "cssnano-util-get-match": "^4.0.0", @@ -32813,12 +34439,14 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-normalize-string": { "version": "4.0.2", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "requires": { "has": "^1.0.0", "postcss": "^7.0.0", @@ -32826,12 +34454,14 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-normalize-timing-functions": { "version": "4.0.2", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", "requires": { "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", @@ -32839,12 +34469,14 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-normalize-unicode": { "version": "4.0.1", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", "requires": { "browserslist": "^4.0.0", "postcss": "^7.0.0", @@ -32852,12 +34484,14 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-normalize-url": { "version": "4.0.1", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", "requires": { "is-absolute-url": "^2.0.0", "normalize-url": "^3.0.0", @@ -32866,27 +34500,32 @@ }, "dependencies": { "normalize-url": { - "version": "3.3.0" + "version": "3.3.0", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" }, "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-normalize-whitespace": { "version": "4.0.2", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-ordered-values": { "version": "4.1.2", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "requires": { "cssnano-util-get-arguments": "^4.0.0", "postcss": "^7.0.0", @@ -32894,24 +34533,28 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-overflow-shorthand": { "version": "2.0.0", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", "requires": { "postcss": "^7.0.2" } }, "postcss-page-break": { "version": "2.0.0", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", "requires": { "postcss": "^7.0.2" } }, "postcss-place": { "version": "4.0.1", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" @@ -32919,6 +34562,7 @@ }, "postcss-preset-env": { "version": "6.7.0", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", "requires": { "autoprefixer": "^9.6.1", "browserslist": "^4.6.4", @@ -32961,16 +34605,19 @@ }, "postcss-pseudo-class-any-link": { "version": "6.0.0", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", "requires": { "postcss": "^7.0.2", "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { "cssesc": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, "postcss-selector-parser": { "version": "5.0.0", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "requires": { "cssesc": "^2.0.0", "indexes-of": "^1.0.1", @@ -32981,6 +34628,7 @@ }, "postcss-reduce-initial": { "version": "4.0.3", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "requires": { "browserslist": "^4.0.0", "caniuse-api": "^3.0.0", @@ -32990,6 +34638,7 @@ }, "postcss-reduce-transforms": { "version": "4.0.2", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", "requires": { "cssnano-util-get-match": "^4.0.0", "has": "^1.0.0", @@ -32998,24 +34647,28 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-replace-overflow-wrap": { "version": "3.0.0", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", "requires": { "postcss": "^7.0.2" } }, "postcss-safe-parser": { "version": "4.0.1", + "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", "requires": { "postcss": "^7.0.0" } }, "postcss-selector-matches": { "version": "4.0.0", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", "requires": { "balanced-match": "^1.0.0", "postcss": "^7.0.2" @@ -33023,6 +34676,7 @@ }, "postcss-selector-not": { "version": "4.0.1", + "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", "requires": { "balanced-match": "^1.0.0", "postcss": "^7.0.2" @@ -33030,6 +34684,7 @@ }, "postcss-selector-parser": { "version": "6.0.6", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -33037,6 +34692,7 @@ }, "postcss-svgo": { "version": "4.0.3", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", @@ -33044,12 +34700,14 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1" + "version": "3.3.1", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, "postcss-unique-selectors": { "version": "4.0.1", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", "requires": { "alphanum-sort": "^1.0.0", "postcss": "^7.0.0", @@ -33057,10 +34715,12 @@ } }, "postcss-value-parser": { - "version": "4.1.0" + "version": "4.1.0", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" }, "postcss-values-parser": { "version": "2.0.1", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", "requires": { "flatten": "^1.0.2", "indexes-of": "^1.0.1", @@ -33068,30 +34728,37 @@ } }, "preact": { - "version": "10.5.13" + "version": "10.5.13", + "integrity": "sha512-q/vlKIGNwzTLu+jCcvywgGrt+H/1P/oIRSD6mV4ln3hmlC+Aa34C7yfPI4+5bzW8pONyVXYS7SvXosy2dKKtWQ==" }, "prelude-ls": { - "version": "1.1.2" + "version": "1.1.2", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "prepend-http": { - "version": "1.0.4" + "version": "1.0.4", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "prettier": { "version": "1.17.1", + "integrity": "sha512-TzGRNvuUSmPgwivDqkZ9tM/qTGW9hqDKWOE9YHiyQdixlKbv7kvEqsmDPrcHJTKwthU774TQwZXVtaQ/mMsvjg==", "dev": true }, "prettier-linter-helpers": { "version": "1.0.0", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "requires": { "fast-diff": "^1.1.2" } }, "pretty-bytes": { - "version": "5.6.0" + "version": "5.6.0", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" }, "pretty-error": { "version": "2.1.2", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "requires": { "lodash": "^4.17.20", "renderkid": "^2.0.4" @@ -33099,6 +34766,7 @@ }, "pretty-format": { "version": "24.9.0", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "requires": { "@jest/types": "^24.9.0", "ansi-regex": "^4.0.0", @@ -33107,10 +34775,12 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0" + "version": "4.1.0", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } @@ -33119,41 +34789,51 @@ }, "pretty-hrtime": { "version": "1.0.3", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, "prism-react-renderer": { "version": "0.1.7", + "integrity": "sha512-EhnM0sYfLK103ASK0ViSv0rta//ZGB0dBA9TiFyOvA+zOj5peLmGEG01sLEDwl9sMe+gSqncInafBe1VFTCMvA==", "requires": {} }, "prism-themes": { - "version": "1.7.0" + "version": "1.7.0", + "integrity": "sha512-D5EsUQXOY4W9pcGwrOXFJiT22RRUuxWaaxyVNMGHRGr96h86K1XLLWMhzc3tXL0Qri7BhRE8mJtEN/ZZSNau6w==" }, "process": { - "version": "0.5.2" + "version": "0.5.2", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" }, "process-nextick-args": { - "version": "2.0.1" + "version": "2.0.1", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { - "version": "2.0.3" + "version": "2.0.3", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "progressbar.js": { "version": "1.1.0", + "integrity": "sha512-K68/xcyXKo2I6T3PfIkXrRaycxROmWeU4bugb49iulWR25cU94PM0cfZ47S0jDhG5K3vPhZwCOy1fgb5Pgh6UQ==", "requires": { "shifty": "^2.1.2" } }, "promise": { "version": "8.1.0", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", "requires": { "asap": "~2.0.6" } }, "promise-inflight": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "prompts": { "version": "2.4.1", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -33161,6 +34841,7 @@ }, "prop-types": { "version": "15.7.2", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -33169,22 +34850,27 @@ }, "proxy-addr": { "version": "2.0.7", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "requires": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "prr": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, "pseudomap": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { - "version": "1.8.0" + "version": "1.8.0", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, "public-encrypt": { "version": "4.0.3", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -33195,12 +34881,14 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0" + "version": "4.12.0", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "pump": { "version": "3.0.0", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -33208,6 +34896,7 @@ }, "pumpify": { "version": "1.5.1", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "requires": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -33216,6 +34905,7 @@ "dependencies": { "pump": { "version": "2.0.1", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -33224,32 +34914,40 @@ } }, "punycode": { - "version": "2.1.1" + "version": "2.1.1", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "q": { - "version": "1.5.1" + "version": "1.5.1", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, "qs": { - "version": "6.5.2" + "version": "6.5.2", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "query-string": { "version": "4.3.4", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "requires": { "object-assign": "^4.1.0", "strict-uri-encode": "^1.0.0" } }, "querystring": { - "version": "0.2.0" + "version": "0.2.0", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, "querystring-es3": { - "version": "0.2.1" + "version": "0.2.1", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "querystringify": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "quill": { "version": "1.3.7", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", "requires": { "clone": "^2.1.1", "deep-equal": "^1.0.1", @@ -33261,6 +34959,7 @@ }, "quill-delta": { "version": "3.6.3", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", "requires": { "deep-equal": "^1.0.1", "extend": "^3.0.2", @@ -33269,40 +34968,48 @@ }, "raf": { "version": "3.4.1", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", "requires": { "performance-now": "^2.1.0" } }, "raf-schd": { - "version": "4.0.3" + "version": "4.0.3", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" }, "rafl": { "version": "1.2.2", + "integrity": "sha1-/pMPdYIRAg1H44gV9Rlqi+QVB0A=", "requires": { "global": "~4.3.0" } }, "randombytes": { "version": "2.1.0", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "requires": { "safe-buffer": "^5.1.0" } }, "randomfill": { "version": "1.0.4", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" } }, "range-parser": { - "version": "1.2.1" + "version": "1.2.1", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "rangetouch": { - "version": "2.0.1" + "version": "2.0.1", + "integrity": "sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==" }, "raw-body": { "version": "2.4.0", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "requires": { "bytes": "3.1.0", "http-errors": "1.7.2", @@ -33311,10 +35018,12 @@ }, "dependencies": { "bytes": { - "version": "3.1.0" + "version": "3.1.0", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "iconv-lite": { "version": "0.4.24", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -33323,6 +35032,7 @@ }, "rc-align": { "version": "4.0.9", + "integrity": "sha512-myAM2R4qoB6LqBul0leaqY8gFaiECDJ3MtQDmzDo9xM9NRT/04TvWOYd2YHU9zvGzqk9QXF6S9/MifzSKDZeMw==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -33333,6 +35043,7 @@ }, "rc-cascader": { "version": "1.4.3", + "integrity": "sha512-Q4l9Mv8aaISJ+giVnM9IaXxDeMqHUGLvi4F+LksS6pHlaKlN4awop/L+IMjIXpL+ug/ojaCyv/ixcVopJYYCVA==", "requires": { "@babel/runtime": "^7.12.5", "array-tree-filter": "^2.1.0", @@ -33343,6 +35054,7 @@ }, "rc-motion": { "version": "2.4.4", + "integrity": "sha512-ms7n1+/TZQBS0Ydd2Q5P4+wJTSOrhIrwNxLXCZpR7Fa3/oac7Yi803HDALc2hLAKaCTQtw9LmQeB58zcwOsqlQ==", "requires": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -33351,6 +35063,7 @@ }, "rc-trigger": { "version": "5.2.9", + "integrity": "sha512-0Bxsh2Xe+etejMn73am+jZBcOpsueAZiEKLiGoDfA0fvm/JHLNOiiww3zJ0qgyPOTmbYxhsxFcGOZu+VcbaZhQ==", "requires": { "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", @@ -33361,6 +35074,7 @@ }, "rc-util": { "version": "5.13.1", + "integrity": "sha512-Dws2tjXBBihfjVQFlG5JzZ/5O3Wutctm0W94Wb1+M7GD2roWJPrQdSa4AkWm2pn0Ms32zoVPPkWodFeAYZPLfA==", "requires": { "@babel/runtime": "^7.12.5", "react-is": "^16.12.0", @@ -33369,6 +35083,7 @@ }, "react": { "version": "16.14.0", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -33377,6 +35092,7 @@ }, "react-app-polyfill": { "version": "1.0.6", + "integrity": "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==", "requires": { "core-js": "^3.5.0", "object-assign": "^4.1.1", @@ -33388,6 +35104,7 @@ }, "react-beautiful-dnd": { "version": "13.1.0", + "integrity": "sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA==", "requires": { "@babel/runtime": "^7.9.2", "css-box-model": "^1.2.0", @@ -33400,6 +35117,7 @@ }, "react-bootstrap-table-next": { "version": "3.3.5", + "integrity": "sha512-vBO+y2Y483Y1QnpxvgY8jTz6gwIPYpfc26AKZhwgESL6cpjhxSsoFGXNp3KKnT5krW5SF9zpcf/98jIJefv+RQ==", "requires": { "classnames": "^2.2.5", "react-transition-group": "2.5.3", @@ -33408,10 +35126,12 @@ }, "react-bootstrap-table2-paginator": { "version": "2.1.2", + "integrity": "sha512-LC5znEphhgKJvaSY1q8d+Gj0Nc/1X+VS3tKJjkmWmfv9P61YC/BnwJ+aoqEmQzsLiVGowrzss+i/u+Tip5H+Iw==", "requires": {} }, "react-chartjs-2": { "version": "2.11.2", + "integrity": "sha512-hcPS9vmRJeAALPPf0uo02BiD8BDm0HNmneJYTZVR74UKprXOpql+Jy1rVuj93rKw0Jfx77mkcRfXPxTe5K83uw==", "requires": { "lodash": "^4.17.19", "prop-types": "^15.7.2" @@ -33419,6 +35139,7 @@ }, "react-countup": { "version": "4.3.3", + "integrity": "sha512-pWnxpwdPNRyJFha/YKKbyc4RLAw8PzmULdgCziGIgw6vxhT1VdccrvQgj38HBSoM2qF/MoLmn4M2klvDWVIdaw==", "requires": { "countup.js": "^1.9.3", "prop-types": "^15.7.2", @@ -33427,6 +35148,7 @@ }, "react-datetime": { "version": "2.16.3", + "integrity": "sha512-amWfb5iGEiyqjLmqCLlPpu2oN415jK8wX1qoTq7qn6EYiU7qQgbNHglww014PT4O/3G5eo/3kbJu/M/IxxTyGw==", "requires": { "create-react-class": "^15.5.2", "object-assign": "^3.0.0", @@ -33435,12 +35157,14 @@ }, "dependencies": { "object-assign": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" } } }, "react-dev-utils": { "version": "10.2.1", + "integrity": "sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ==", "requires": { "@babel/code-frame": "7.8.3", "address": "1.1.2", @@ -33470,21 +35194,25 @@ "dependencies": { "@babel/code-frame": { "version": "7.8.3", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "requires": { "@babel/highlight": "^7.8.3" } }, "ansi-regex": { - "version": "5.0.0" + "version": "5.0.0", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "browserslist": { "version": "4.10.0", + "integrity": "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==", "requires": { "caniuse-lite": "^1.0.30001035", "electron-to-chromium": "^1.3.378", @@ -33494,6 +35222,7 @@ }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -33501,15 +35230,18 @@ }, "dependencies": { "escape-string-regexp": { - "version": "1.0.5" + "version": "1.0.5", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" } } }, "cli-width": { - "version": "2.2.1" + "version": "2.2.1", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" }, "cross-spawn": { "version": "7.0.1", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -33517,16 +35249,20 @@ } }, "emoji-regex": { - "version": "8.0.0" + "version": "8.0.0", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "emojis-list": { - "version": "2.1.0" + "version": "2.1.0", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, "escape-string-regexp": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" }, "find-up": { "version": "4.1.0", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -33534,6 +35270,7 @@ }, "inquirer": { "version": "7.0.4", + "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", "requires": { "ansi-escapes": "^4.2.1", "chalk": "^2.4.2", @@ -33551,10 +35288,12 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0" + "version": "4.1.0", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "strip-ansi": { "version": "5.2.0", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" } @@ -33562,16 +35301,19 @@ } }, "is-fullwidth-code-point": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "json5": { "version": "1.0.1", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "requires": { "minimist": "^1.2.0" } }, "loader-utils": { "version": "1.2.3", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "requires": { "big.js": "^5.2.2", "emojis-list": "^2.0.0", @@ -33580,33 +35322,40 @@ }, "locate-path": { "version": "5.0.0", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { "p-locate": "^4.1.0" } }, "p-locate": { "version": "4.1.0", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "^2.2.0" } }, "path-exists": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-key": { - "version": "3.1.1" + "version": "3.1.1", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "shebang-command": { "version": "2.0.0", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "requires": { "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "string-width": { "version": "4.2.2", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -33615,18 +35364,21 @@ }, "strip-ansi": { "version": "6.0.0", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { "ansi-regex": "^5.0.0" } }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } }, "which": { "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { "isexe": "^2.0.0" } @@ -33635,6 +35387,7 @@ }, "react-dom": { "version": "16.14.0", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -33643,10 +35396,12 @@ } }, "react-dom-factories": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha1-63cFxNs2+1AbOqOP91lhaqD/luA=" }, "react-draggable": { "version": "4.4.3", + "integrity": "sha512-jV4TE59MBuWm7gb6Ns3Q1mxX8Azffb7oTtDtBgFkxRvhDp38YAARmRplrj0+XGkhOJB5XziArX+4HUUABtyZ0w==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.6.0" @@ -33654,6 +35409,7 @@ }, "react-dropzone": { "version": "10.2.2", + "integrity": "sha512-U5EKckXVt6IrEyhMMsgmHQiWTGLudhajPPG77KFSvgsMqNEHSyGpqWvOMc5+DhEah/vH4E1n+J5weBNLd5VtyA==", "requires": { "attr-accept": "^2.0.0", "file-selector": "^0.1.12", @@ -33661,10 +35417,12 @@ } }, "react-error-overlay": { - "version": "6.0.9" + "version": "6.0.9", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" }, "react-es6-progressbar.js": { "version": "1.1.0", + "integrity": "sha512-uFOevq5TNCtYQcmDsdyBPmN3L8sFOeYgunH5Ro0HycIAnmvHJvrXkAveAvFhAC/oK0+HPOV6Mliz+TF/HlApRA==", "requires": { "progressbar.js": "^1.0.1", "react": "^16.3.2" @@ -33672,6 +35430,7 @@ }, "react-event-listener": { "version": "0.6.6", + "integrity": "sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw==", "requires": { "@babel/runtime": "^7.2.0", "prop-types": "^15.6.0", @@ -33680,6 +35439,7 @@ }, "react-flatpickr": { "version": "3.10.7", + "integrity": "sha512-dJ7cZAayefqWJnX4Xe8Piy13oK2h4aeGCH9tz+D2iSNh+kbezUAWVMVCKdTqjsNBqTMS4v0DkfMy2CP2atNCTQ==", "requires": { "flatpickr": "^4.6.2", "prop-types": "^15.5.10" @@ -33687,10 +35447,12 @@ }, "react-hook-form": { "version": "4.10.2", + "integrity": "sha512-Ule/KqHBwUvuubqGC4WDvOARS6VjlULSS+WHspgQ5FhFKR4ytHDc4AMpjVfnv+Wbz2TEbMp9/ZHmuZsUksPCiA==", "requires": {} }, "react-i18next": { "version": "11.11.0", + "integrity": "sha512-p1jHmoyJgDFQmyubUEjrx6kCsr1izW/C8i9pOiJy+9lJqLYwNA8sElVplm0VAnop3kH68edT0/g3wB3UvAcRCQ==", "requires": { "@babel/runtime": "^7.14.5", "html-parse-stringify": "^3.0.1" @@ -33698,6 +35460,7 @@ }, "react-image-lightbox": { "version": "5.1.1", + "integrity": "sha512-GprldD8AqpRb2hsOdns3sI7Xeo9hJlcybDxuli4RB+ml1J/GaFaUuRkT/7IrTLv2+4vkR74ahz2LD0HOUHI7wA==", "requires": { "prop-types": "^15.6.2", "react-modal": "^3.8.1" @@ -33705,6 +35468,7 @@ }, "react-image-video-lightbox": { "version": "2.0.4", + "integrity": "sha512-ByP5UIezzSRJshKhcCRCWo33xURCIPVfG2ZpxARUve2QyRWBGmPC4qJ0Kq1rIigorB+1/BaGXO8RHtYaX/KzHw==", "requires": { "@material-ui/core": "1.3.1", "@material-ui/icons": "1.1.0", @@ -33714,6 +35478,7 @@ "dependencies": { "react": { "version": "16.4.1", + "integrity": "sha512-3GEs0giKp6E0Oh/Y9ZC60CmYgUPnp7voH9fbjWsvXtYFb4EWtgQub0ADSq0sJR0BbHc4FThLLtzlcFaFXIorwg==", "requires": { "fbjs": "^0.8.16", "loose-envify": "^1.1.0", @@ -33723,6 +35488,7 @@ }, "react-dom": { "version": "16.4.1", + "integrity": "sha512-1Gin+wghF/7gl4Cqcvr1DxFX2Osz7ugxSwl6gBqCMpdrxHjIFUS7GYxrFftZ9Ln44FHw0JxCFD9YtZsrbR5/4A==", "requires": { "fbjs": "^0.8.16", "loose-envify": "^1.1.0", @@ -33734,15 +35500,18 @@ }, "react-input-autosize": { "version": "3.0.0", + "integrity": "sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg==", "requires": { "prop-types": "^15.5.8" } }, "react-is": { - "version": "16.13.1" + "version": "16.13.1", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-jss": { "version": "8.6.1", + "integrity": "sha512-SH6XrJDJkAphp602J14JTy3puB2Zxz1FkM3bKVE8wON+va99jnUTKWnzGECb3NfIn9JPR5vHykge7K3/A747xQ==", "requires": { "hoist-non-react-statics": "^2.5.0", "jss": "^9.7.0", @@ -33752,12 +35521,14 @@ }, "dependencies": { "hoist-non-react-statics": { - "version": "2.5.5" + "version": "2.5.5", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" } } }, "react-leaflet": { "version": "2.8.0", + "integrity": "sha512-Y7oHtNrrlRH8muDttXf+jZ2Ga/X7jneSGi1GN8uEdeCfLProTqgG2Zoa5TfloS3ZnY20v7w+DIenMG59beFsQw==", "requires": { "@babel/runtime": "^7.12.1", "fast-deep-equal": "^3.1.3", @@ -33766,15 +35537,18 @@ }, "dependencies": { "fast-deep-equal": { - "version": "3.1.3" + "version": "3.1.3", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" } } }, "react-lifecycles-compat": { - "version": "3.0.4" + "version": "3.0.4", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-live": { "version": "2.2.3", + "integrity": "sha512-tpKruvfytNETuzO3o1mrQUj180GVrq35IE8F5gH1NJVPt4szYCx83/dOSCOyjgRhhc3gQvl0pQ3k/CjOjwJkKQ==", "requires": { "buble": "0.19.6", "core-js": "^2.4.1", @@ -33786,20 +35560,24 @@ }, "dependencies": { "core-js": { - "version": "2.6.12" + "version": "2.6.12", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "prism-react-renderer": { "version": "1.2.1", + "integrity": "sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg==", "requires": {} }, "react-simple-code-editor": { "version": "0.10.0", + "integrity": "sha512-bL5W5mAxSW6+cLwqqVWY47Silqgy2DKDTR4hDBrLrUqC5BXc29YVx17l2IZk5v36VcDEq1Bszu2oHm1qBwKqBA==", "requires": {} } } }, "react-lottie": { "version": "1.2.3", + "integrity": "sha512-qLCERxUr8M+4mm1LU0Ruxw5Y5Fn/OmYkGfnA+JDM/dZb3oKwVAJCjwnjkj9TMHtzR2U6sMEUD3ZZ1RaHagM7kA==", "requires": { "babel-runtime": "^6.26.0", "lottie-web": "^5.1.3" @@ -33807,6 +35585,7 @@ }, "react-modal": { "version": "3.14.3", + "integrity": "sha512-+C2KODVKyu20zHXPJxfOOcf571L1u/EpFlH+oS/3YDn8rgVE51QZuxuuIwabJ8ZFnOEHaD+r6XNjqwtxZnXO0g==", "requires": { "exenv": "^1.2.0", "prop-types": "^15.7.2", @@ -33816,10 +35595,12 @@ }, "react-onclickoutside": { "version": "6.11.2", + "integrity": "sha512-640486eSwU/t5iD6yeTlefma8dI3bxPXD93hM9JGKyYITAd0P1JFkkcDeyHZRqNpY/fv1YW0Fad9BXr44OY8wQ==", "requires": {} }, "react-popper": { "version": "0.10.4", + "integrity": "sha1-rypBXqIike3VBGeNev2opu4ylao=", "requires": { "popper.js": "^1.14.1", "prop-types": "^15.6.1" @@ -33827,6 +35608,7 @@ }, "react-quill": { "version": "1.3.5", + "integrity": "sha512-/W/rNCW+6QpGz8yQ9tFK5Ka/h/No1RqrcOOvCIOR092OiKzRFlU2xbPEwiP3Wgy/Dx13pi1YhjReDMX/5uotJg==", "requires": { "@types/quill": "1.3.10", "create-react-class": "^15.6.0", @@ -33838,6 +35620,7 @@ }, "react-rating": { "version": "2.0.5", + "integrity": "sha512-uldxgLCe5bzqGX7V+7/bPgQQj2Kok6eiMgTMxjKOhfhnQkFLDlc4TjMlp7gaJFAHWdbiOnqpiShI7z8as6oWtg==", "requires": { "@types/lodash": "^4.14.105", "@types/react": "^16.0.40" @@ -33845,6 +35628,7 @@ "dependencies": { "@types/react": { "version": "16.14.8", + "integrity": "sha512-QN0/Qhmx+l4moe7WJuTxNiTsjBwlBGHqKGvInSQCBdo7Qio0VtOqwsC0Wq7q3PbJlB0cR4Y4CVo1OOe6BOsOmA==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -33855,6 +35639,7 @@ }, "react-redux": { "version": "7.2.4", + "integrity": "sha512-hOQ5eOSkEJEXdpIKbnRyl04LhaWabkDPV+Ix97wqQX3T3d2NQ8DUblNXXtNMavc7DpswyQM6xfaN4HQDKNY2JA==", "requires": { "@babel/runtime": "^7.12.1", "@types/react-redux": "^7.1.16", @@ -33866,6 +35651,7 @@ }, "react-router": { "version": "5.2.0", + "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", "requires": { "@babel/runtime": "^7.1.2", "history": "^4.9.0", @@ -33881,12 +35667,14 @@ }, "react-router-bootstrap": { "version": "0.25.0", + "integrity": "sha512-/22eqxjn6Zv5fvY2rZHn57SKmjmJfK7xzJ6/G1OgxAjLtKVfWgV5sn41W2yiqzbtV5eE4/i4LeDLBGYTqx7jbA==", "requires": { "prop-types": "^15.5.10" } }, "react-router-dom": { "version": "5.2.0", + "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", "requires": { "@babel/runtime": "^7.1.2", "history": "^4.9.0", @@ -33899,6 +35687,7 @@ }, "react-scripts": { "version": "3.4.4", + "integrity": "sha512-7J7GZyF/QvZkKAZLneiOIhHozvOMHey7hO9cdO9u68jjhGZlI8hDdOm6UyuHofn6Ajc9Uji5I6Psm/nKNuWdyw==", "requires": { "@babel/core": "7.9.0", "@svgr/webpack": "4.3.3", @@ -33956,16 +35745,19 @@ }, "dependencies": { "camelcase": { - "version": "5.3.1" + "version": "5.3.1", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "doctrine": { "version": "2.1.0", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "requires": { "esutils": "^2.0.2" } }, "eslint-plugin-react": { "version": "7.19.0", + "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", "requires": { "array-includes": "^3.1.1", "doctrine": "^2.1.0", @@ -33983,6 +35775,7 @@ "dependencies": { "resolve": { "version": "1.20.0", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -33992,17 +35785,20 @@ }, "resolve": { "version": "1.15.0", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", "requires": { "path-parse": "^1.0.6" } }, "semver": { - "version": "6.3.0" + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "react-scroll": { "version": "1.8.2", + "integrity": "sha512-f2ZEG5fsPbPTySI9ekcFpETCcNlqbmwbQj9hhzYK8tkgv+PA8APatSt66o/q0KSkDZxyT98ONTtXp9x0lyowEw==", "requires": { "lodash.throttle": "^4.1.1", "prop-types": "^15.7.2" @@ -34010,6 +35806,7 @@ }, "react-scrollbars-custom": { "version": "4.0.25", + "integrity": "sha512-kipJK49fwvHsDgumIGiTmrJkxw5QD9urN7f4o2VvSrsHNOWMrDppNf+IjgobT5w+ZjbaaHfLk5NmZ/n1zgKtcw==", "requires": { "cnbuilder": "^2.5.0", "react-draggable": "^4.4.2", @@ -34018,6 +35815,7 @@ }, "react-select": { "version": "3.2.0", + "integrity": "sha512-B/q3TnCZXEKItO0fFN/I0tWOX3WJvi/X2wtdffmwSQVRwg5BpValScTO1vdic9AxlUgmeSzib2hAZAwIUQUZGQ==", "requires": { "@babel/runtime": "^7.4.4", "@emotion/cache": "^10.0.9", @@ -34031,6 +35829,7 @@ "dependencies": { "dom-helpers": { "version": "5.2.1", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", "requires": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -34038,6 +35837,7 @@ }, "react-transition-group": { "version": "4.4.2", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", "requires": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -34049,10 +35849,12 @@ }, "react-simple-code-editor": { "version": "0.9.15", + "integrity": "sha512-M8iKgjBTBZK92tZYgOEfMuR7c3zZ0q0v3QYllSxIPx3SU+w003VofH50txXQSBTu92pSOm2tidON1HbQ1l8BDA==", "requires": {} }, "react-slick": { "version": "0.25.2", + "integrity": "sha512-8MNH/NFX/R7zF6W/w+FS5VXNyDusF+XDW1OU0SzODEU7wqYB+ZTGAiNJ++zVNAVqCAHdyCybScaUB+FCZOmBBw==", "requires": { "classnames": "^2.2.5", "enquire.js": "^2.1.6", @@ -34063,6 +35865,7 @@ }, "react-toastify": { "version": "5.5.0", + "integrity": "sha512-jsVme7jALIFGRyQsri/g4YTsRuaaGI70T6/ikjwZMB4mwTZaCWqj5NqxhGrRStKlJc5npXKKvKeqTiRGQl78LQ==", "requires": { "@babel/runtime": "^7.4.2", "classnames": "^2.2.6", @@ -34072,6 +35875,7 @@ "dependencies": { "dom-helpers": { "version": "5.2.1", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", "requires": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -34079,6 +35883,7 @@ }, "react-transition-group": { "version": "4.4.2", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", "requires": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -34090,6 +35895,7 @@ }, "react-transition-group": { "version": "2.5.3", + "integrity": "sha512-2DGFck6h99kLNr8pOFk+z4Soq3iISydwOFeeEVPjTN6+Y01CmvbWmnN02VuTWyFdnRtIDPe+wy2q6Ui8snBPZg==", "requires": { "dom-helpers": "^3.3.1", "loose-envify": "^1.4.0", @@ -34099,6 +35905,7 @@ }, "react-typed": { "version": "1.2.0", + "integrity": "sha512-aDsaA6zkjAFJs8285APOqE85l/kwJ0/ZJmBhARwUrza4TTttrMM5FcMCGEDdThdfUdHo/0l9WXmxp1m2ik4qdw==", "requires": { "prop-types": "^15.6.0", "typed.js": "^2.0.6" @@ -34106,6 +35913,7 @@ }, "reactstrap": { "version": "8.9.0", + "integrity": "sha512-pmf33YjpNZk1IfrjqpWCUMq9hk6GzSnMWBAofTBNIRJQB1zQ0Au2kzv3lPUAFsBYgWEuI9iYa/xKXHaboSiMkQ==", "requires": { "@babel/runtime": "^7.12.5", "classnames": "^2.2.3", @@ -34116,6 +35924,7 @@ "dependencies": { "react-popper": { "version": "1.3.11", + "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", "requires": { "@babel/runtime": "^7.1.2", "@hypnosphi/create-react-context": "^0.3.1", @@ -34130,6 +35939,7 @@ }, "read-pkg": { "version": "1.1.0", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -34138,6 +35948,7 @@ }, "read-pkg-up": { "version": "1.0.1", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -34145,6 +35956,7 @@ }, "readable-stream": { "version": "2.3.7", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -34157,18 +35969,21 @@ }, "readdirp": { "version": "3.6.0", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" } }, "realpath-native": { "version": "1.1.0", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", "requires": { "util.promisify": "^1.0.0" } }, "rechoir": { "version": "0.6.2", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { "resolve": "^1.1.6" @@ -34176,6 +35991,7 @@ }, "recompose": { "version": "0.27.1", + "integrity": "sha512-p7xsyi/rfNjHfdP7vPU02uSFa+Q1eHhjKrvO+3+kRP4Ortj+MxEmpmd+UQtBGM2D2iNAjzNI5rCyBKp9Ob5McA==", "requires": { "babel-runtime": "^6.26.0", "change-emitter": "^0.1.2", @@ -34186,18 +36002,21 @@ }, "dependencies": { "hoist-non-react-statics": { - "version": "2.5.5" + "version": "2.5.5", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" } } }, "recursive-readdir": { "version": "2.2.2", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", "requires": { "minimatch": "3.0.4" } }, "redent": { "version": "1.0.0", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "requires": { "indent-string": "^2.1.0", "strip-indent": "^1.0.1" @@ -34205,30 +36024,36 @@ }, "redux": { "version": "4.1.0", + "integrity": "sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g==", "requires": { "@babel/runtime": "^7.9.2" } }, "regenerate": { - "version": "1.4.2" + "version": "1.4.2", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { "version": "8.2.0", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "requires": { "regenerate": "^1.4.0" } }, "regenerator-runtime": { - "version": "0.13.7" + "version": "0.13.7", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, "regenerator-transform": { "version": "0.14.5", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "requires": { "@babel/runtime": "^7.8.4" } }, "regex-not": { "version": "1.0.2", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -34236,6 +36061,7 @@ "dependencies": { "extend-shallow": { "version": "3.0.2", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -34243,6 +36069,7 @@ }, "is-extendable": { "version": "1.0.1", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { "is-plain-object": "^2.0.4" } @@ -34250,20 +36077,24 @@ } }, "regex-parser": { - "version": "2.2.11" + "version": "2.2.11", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" }, "regexp.prototype.flags": { "version": "1.3.1", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, "regexpp": { - "version": "3.2.0" + "version": "3.2.0", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" }, "regexpu-core": { "version": "4.7.1", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "requires": { "regenerate": "^1.4.0", "regenerate-unicode-properties": "^8.2.0", @@ -34274,19 +36105,23 @@ } }, "regjsgen": { - "version": "0.5.2" + "version": "0.5.2", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "regjsparser": { "version": "0.6.9", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", "requires": { "jsesc": "~0.5.0" } }, "relateurl": { - "version": "0.2.7" + "version": "0.2.7", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" }, "remove-bom-buffer": { "version": "3.0.0", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", "dev": true, "requires": { "is-buffer": "^1.1.5", @@ -34295,6 +36130,7 @@ }, "remove-bom-stream": { "version": "1.2.0", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", "dev": true, "requires": { "remove-bom-buffer": "^3.0.0", @@ -34303,10 +36139,12 @@ } }, "remove-trailing-separator": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "renderkid": { "version": "2.0.7", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "requires": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -34317,6 +36155,7 @@ "dependencies": { "css-select": { "version": "4.1.3", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "requires": { "boolbase": "^1.0.0", "css-what": "^5.0.0", @@ -34326,10 +36165,12 @@ } }, "css-what": { - "version": "5.0.1" + "version": "5.0.1", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" }, "dom-serializer": { "version": "1.3.2", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -34337,10 +36178,12 @@ } }, "domelementtype": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" }, "domutils": { "version": "2.7.0", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -34349,6 +36192,7 @@ }, "nth-check": { "version": "2.0.0", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", "requires": { "boolbase": "^1.0.0" } @@ -34356,23 +36200,28 @@ } }, "repeat-element": { - "version": "1.1.4" + "version": "1.1.4", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" }, "repeat-string": { - "version": "1.6.1" + "version": "1.6.1", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { "version": "2.0.1", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "requires": { "is-finite": "^1.0.0" } }, "replace-ext": { "version": "1.0.1", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", "dev": true }, "replace-homedir": { "version": "1.0.0", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", "dev": true, "requires": { "homedir-polyfill": "^1.0.1", @@ -34382,6 +36231,7 @@ }, "request": { "version": "2.88.2", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -34407,12 +36257,14 @@ }, "request-promise-core": { "version": "1.1.4", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "requires": { "lodash": "^4.17.19" } }, "request-promise-native": { "version": "1.0.9", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "requires": { "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", @@ -34420,19 +36272,24 @@ } }, "require-directory": { - "version": "2.1.1" + "version": "2.1.1", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "requires-port": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resize-observer-polyfill": { - "version": "1.5.1" + "version": "1.5.1", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, "resolve": { "version": "1.20.0", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -34440,12 +36297,14 @@ }, "resolve-cwd": { "version": "2.0.0", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "requires": { "resolve-from": "^3.0.0" } }, "resolve-dir": { "version": "1.0.1", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { "expand-tilde": "^2.0.0", @@ -34454,6 +36313,7 @@ "dependencies": { "global-modules": { "version": "1.0.0", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { "global-prefix": "^1.0.1", @@ -34463,6 +36323,7 @@ }, "global-prefix": { "version": "1.0.2", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { "expand-tilde": "^2.0.2", @@ -34475,23 +36336,28 @@ } }, "resolve-from": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" }, "resolve-options": { "version": "1.1.0", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", "dev": true, "requires": { "value-or-function": "^3.0.0" } }, "resolve-pathname": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" }, "resolve-url": { - "version": "0.2.1" + "version": "0.2.1", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, "resolve-url-loader": { "version": "3.1.2", + "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", "requires": { "adjust-sourcemap-loader": "3.0.0", "camelcase": "5.3.1", @@ -34507,15 +36373,18 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "camelcase": { - "version": "5.3.1" + "version": "5.3.1", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -34524,6 +36393,7 @@ "dependencies": { "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -34532,21 +36402,25 @@ }, "convert-source-map": { "version": "1.7.0", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "requires": { "safe-buffer": "~5.1.1" } }, "emojis-list": { - "version": "2.1.0" + "version": "2.1.0", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, "json5": { "version": "1.0.1", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "requires": { "minimist": "^1.2.0" } }, "loader-utils": { "version": "1.2.3", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "requires": { "big.js": "^5.2.2", "emojis-list": "^2.0.0", @@ -34555,6 +36429,7 @@ }, "postcss": { "version": "7.0.21", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -34562,10 +36437,12 @@ } }, "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "supports-color": { "version": "6.1.0", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { "has-flag": "^3.0.0" } @@ -34574,6 +36451,7 @@ }, "resp-modifier": { "version": "6.0.2", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", "dev": true, "requires": { "debug": "^2.2.0", @@ -34582,6 +36460,7 @@ "dependencies": { "debug": { "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -34589,62 +36468,75 @@ }, "ms": { "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "restore-cursor": { "version": "3.1.0", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "requires": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "ret": { - "version": "0.1.15" + "version": "0.1.15", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "retry": { - "version": "0.12.0" + "version": "0.12.0", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" }, "rework": { "version": "1.0.1", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", "requires": { "convert-source-map": "^0.3.3", "css": "^2.0.0" }, "dependencies": { "convert-source-map": { - "version": "0.3.5" + "version": "0.3.5", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" } } }, "rework-visit": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" }, "rgb-regex": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" }, "rgba-regex": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" }, "rimraf": { "version": "2.7.1", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } }, "ripemd160": { "version": "2.0.2", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, "rsvp": { - "version": "4.8.5" + "version": "4.8.5", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" }, "rtlcss": { "version": "2.6.2", + "integrity": "sha512-06LFAr+GAPo+BvaynsXRfoYTJvSaWRyOhURCQ7aeI1MKph9meM222F+Zkt3bDamyHHJuGi3VPtiRkpyswmQbGA==", "dev": true, "requires": { "@choojs/findup": "^0.2.1", @@ -34656,6 +36548,7 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -34663,6 +36556,7 @@ }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -34672,6 +36566,7 @@ }, "postcss": { "version": "6.0.23", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { "chalk": "^2.4.1", @@ -34681,14 +36576,17 @@ }, "source-map": { "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "strip-json-comments": { "version": "2.0.1", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -34697,43 +36595,52 @@ } }, "run-async": { - "version": "2.4.1" + "version": "2.4.1", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, "run-queue": { "version": "1.0.3", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "requires": { "aproba": "^1.1.1" } }, "rx": { "version": "4.1.0", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", "dev": true }, "rxjs": { "version": "6.6.7", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "requires": { "tslib": "^1.9.0" }, "dependencies": { "tslib": { - "version": "1.14.1" + "version": "1.14.1", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" } } }, "safe-buffer": { - "version": "5.1.2" + "version": "5.1.2", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { "ret": "~0.1.10" } }, "safer-buffer": { - "version": "2.1.2" + "version": "2.1.2", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { "version": "4.1.0", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "requires": { "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", @@ -34747,10 +36654,12 @@ } }, "sanitize.css": { - "version": "10.0.0" + "version": "10.0.0", + "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" }, "sass-graph": { "version": "2.2.5", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", "requires": { "glob": "^7.0.0", "lodash": "^4.0.0", @@ -34760,6 +36669,7 @@ }, "sass-loader": { "version": "8.0.2", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", "requires": { "clone-deep": "^4.0.1", "loader-utils": "^1.2.3", @@ -34770,6 +36680,7 @@ "dependencies": { "clone-deep": { "version": "4.0.1", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "requires": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -34777,13 +36688,16 @@ } }, "kind-of": { - "version": "6.0.3" + "version": "6.0.3", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "semver": { - "version": "6.3.0" + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "shallow-clone": { "version": "3.0.1", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "requires": { "kind-of": "^6.0.2" } @@ -34791,16 +36705,19 @@ } }, "sax": { - "version": "1.2.4" + "version": "1.2.4", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "saxes": { "version": "3.1.11", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", "requires": { "xmlchars": "^2.1.1" } }, "scheduler": { "version": "0.19.1", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -34808,6 +36725,7 @@ }, "schema-utils": { "version": "2.7.1", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "requires": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", @@ -34816,31 +36734,37 @@ }, "scroll": { "version": "2.0.3", + "integrity": "sha512-3ncZzf8gUW739h3LeS68nSssO60O+GGjT3SxzgofQmT8PIoyHzebql9HHPJopZX8iT6TKOdwaWFMqL6LzUN3DQ==", "requires": { "rafl": "~1.2.1" } }, "scss-tokenizer": { "version": "0.2.3", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", "requires": { "js-base64": "^2.1.8", "source-map": "^0.4.2" } }, "select-hose": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { "version": "1.10.11", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", "requires": { "node-forge": "^0.10.0" } }, "semver": { - "version": "5.7.1" + "version": "5.7.1", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "semver-greatest-satisfied-range": { "version": "1.1.0", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", "dev": true, "requires": { "sver-compat": "^1.5.0" @@ -34848,6 +36772,7 @@ }, "send": { "version": "0.17.1", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -34866,31 +36791,37 @@ "dependencies": { "debug": { "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" }, "dependencies": { "ms": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "mime": { - "version": "1.6.0" + "version": "1.6.0", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "ms": { - "version": "2.1.1" + "version": "2.1.1", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, "serialize-javascript": { "version": "4.0.0", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "requires": { "randombytes": "^2.1.0" } }, "serve-index": { "version": "1.9.1", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "requires": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -34903,12 +36834,14 @@ "dependencies": { "debug": { "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "http-errors": { "version": "1.6.3", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -34917,18 +36850,22 @@ } }, "inherits": { - "version": "2.0.3" + "version": "2.0.3", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ms": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "setprototypeof": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" } } }, "serve-static": { "version": "1.14.1", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -34938,13 +36875,16 @@ }, "server-destroy": { "version": "1.0.1", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", "dev": true }, "set-blocking": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { "version": "2.0.1", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -34953,13 +36893,16 @@ } }, "setimmediate": { - "version": "1.0.5" + "version": "1.0.5", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { - "version": "1.1.1" + "version": "1.1.1", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "sha.js": { "version": "2.4.11", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -34967,6 +36910,7 @@ }, "shallow-clone": { "version": "0.1.2", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", "requires": { "is-extendable": "^0.1.1", "kind-of": "^2.0.1", @@ -34976,38 +36920,47 @@ "dependencies": { "kind-of": { "version": "2.0.1", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", "requires": { "is-buffer": "^1.0.2" } }, "lazy-cache": { - "version": "0.2.7" + "version": "0.2.7", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" } } }, "shallowequal": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" }, "shebang-command": { "version": "1.2.0", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shell-quote": { - "version": "1.7.2" + "version": "1.7.2", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" }, "shellwords": { - "version": "0.1.1" + "version": "0.1.1", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, "shifty": { - "version": "2.15.2" + "version": "2.15.2", + "integrity": "sha512-uaDIdYXrOGncvPula4Pi2jl7kv46IwvZ10AYBSGsl/vrvclOXqzMWOAQCgDjNR7LVPgQki0CTtOMJOH9gnJgsg==" }, "side-channel": { "version": "1.0.4", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -35015,30 +36968,37 @@ } }, "signal-exit": { - "version": "3.0.3" + "version": "3.0.3", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "simple-swizzle": { "version": "0.2.2", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "requires": { "is-arrayish": "^0.3.1" }, "dependencies": { "is-arrayish": { - "version": "0.3.2" + "version": "0.3.2", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" } } }, "sisteransi": { - "version": "1.0.5" + "version": "1.0.5", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "size-sensor": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha512-QTy7MnuugCFXIedXRpUSk9gUnyNiaxIdxGfUjr8xxXOqIB3QvBUYP9+b51oCg2C4dnhaeNk/h57TxjbvoJrJUA==" }, "slash": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" }, "slice-ansi": { "version": "2.1.0", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "requires": { "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", @@ -35047,21 +37007,25 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "is-fullwidth-code-point": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" } } }, "slick-carousel": { "version": "1.8.1", + "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==", "requires": {} }, "snapdragon": { "version": "0.8.2", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -35075,26 +37039,31 @@ "dependencies": { "debug": { "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "define-property": { "version": "0.2.5", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" } }, "ms": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "source-map": { - "version": "0.5.7" + "version": "0.5.7", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, "snapdragon-node": { "version": "2.1.1", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -35103,24 +37072,28 @@ "dependencies": { "define-property": { "version": "1.0.0", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { "version": "1.0.0", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -35128,18 +37101,21 @@ } }, "kind-of": { - "version": "6.0.3" + "version": "6.0.3", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, "snapdragon-util": { "version": "3.0.1", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { "kind-of": "^3.2.0" } }, "socket.io": { "version": "2.4.0", + "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", "dev": true, "requires": { "debug": "~4.1.0", @@ -35152,10 +37128,12 @@ "dependencies": { "component-emitter": { "version": "1.2.1", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", "dev": true }, "debug": { "version": "4.1.1", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -35163,10 +37141,12 @@ }, "isarray": { "version": "2.0.1", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true }, "socket.io-parser": { "version": "3.4.1", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", "dev": true, "requires": { "component-emitter": "1.2.1", @@ -35178,10 +37158,12 @@ }, "socket.io-adapter": { "version": "1.1.2", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", "dev": true }, "socket.io-client": { "version": "2.4.0", + "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", "dev": true, "requires": { "backo2": "1.0.2", @@ -35199,6 +37181,7 @@ "dependencies": { "debug": { "version": "3.1.0", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -35206,12 +37189,14 @@ }, "ms": { "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "socket.io-parser": { "version": "3.3.2", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", "dev": true, "requires": { "component-emitter": "~1.3.0", @@ -35221,6 +37206,7 @@ "dependencies": { "debug": { "version": "3.1.0", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -35228,16 +37214,19 @@ }, "isarray": { "version": "2.0.1", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true }, "ms": { "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "sockjs": { "version": "0.3.20", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", "requires": { "faye-websocket": "^0.10.0", "uuid": "^3.4.0", @@ -35246,6 +37235,7 @@ }, "sockjs-client": { "version": "1.4.0", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", "requires": { "debug": "^3.2.5", "eventsource": "^1.0.7", @@ -35257,12 +37247,14 @@ "dependencies": { "debug": { "version": "3.2.7", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } }, "faye-websocket": { "version": "0.11.4", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "requires": { "websocket-driver": ">=0.5.1" } @@ -35271,21 +37263,25 @@ }, "sort-keys": { "version": "1.1.2", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "requires": { "is-plain-obj": "^1.0.0" } }, "source-list-map": { - "version": "2.0.1" + "version": "2.0.1", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "source-map": { "version": "0.4.4", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "requires": { "amdefine": ">=0.0.4" } }, "source-map-resolve": { "version": "0.5.3", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "requires": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", @@ -35296,48 +37292,58 @@ }, "source-map-support": { "version": "0.5.19", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" }, "dependencies": { "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "source-map-url": { - "version": "0.4.1" + "version": "0.4.1", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" }, "sourcemap-codec": { - "version": "1.4.8" + "version": "1.4.8", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "sparkles": { "version": "1.0.1", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", "dev": true }, "spdx-correct": { "version": "3.1.1", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.3.0" + "version": "2.3.0", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "spdx-expression-parse": { "version": "3.0.1", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { - "version": "3.0.9" + "version": "3.0.9", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" }, "spdy": { "version": "4.0.2", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "requires": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -35348,6 +37354,7 @@ }, "spdy-transport": { "version": "3.0.0", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "requires": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -35359,6 +37366,7 @@ "dependencies": { "readable-stream": { "version": "3.6.0", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -35369,12 +37377,14 @@ }, "split-string": { "version": "3.1.0", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "requires": { "extend-shallow": "^3.0.0" }, "dependencies": { "extend-shallow": { "version": "3.0.2", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -35382,6 +37392,7 @@ }, "is-extendable": { "version": "1.0.1", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { "is-plain-object": "^2.0.4" } @@ -35389,10 +37400,12 @@ } }, "sprintf-js": { - "version": "1.0.3" + "version": "1.0.3", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { "version": "1.16.1", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -35407,31 +37420,37 @@ }, "ssri": { "version": "7.1.1", + "integrity": "sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw==", "requires": { "figgy-pudding": "^3.5.1", "minipass": "^3.1.1" } }, "stable": { - "version": "0.1.8" + "version": "0.1.8", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "stack-trace": { "version": "0.0.10", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", "dev": true }, "stack-utils": { "version": "1.0.5", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", "requires": { "escape-string-regexp": "^2.0.0" }, "dependencies": { "escape-string-regexp": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" } } }, "static-extend": { "version": "0.1.2", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -35439,6 +37458,7 @@ "dependencies": { "define-property": { "version": "0.2.5", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" } @@ -35446,19 +37466,23 @@ } }, "statuses": { - "version": "1.5.0" + "version": "1.5.0", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "stdout-stream": { "version": "1.4.1", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "requires": { "readable-stream": "^2.0.1" } }, "stealthy-require": { - "version": "1.1.1" + "version": "1.1.1", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" }, "stream-browserify": { "version": "2.0.2", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" @@ -35466,6 +37490,7 @@ }, "stream-each": { "version": "1.2.3", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "requires": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -35473,10 +37498,12 @@ }, "stream-exhaust": { "version": "1.0.2", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", "dev": true }, "stream-http": { "version": "2.8.3", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", @@ -35486,10 +37513,12 @@ } }, "stream-shift": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, "stream-throttle": { "version": "0.1.3", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", "dev": true, "requires": { "commander": "^2.2.0", @@ -35497,29 +37526,35 @@ } }, "strict-uri-encode": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string_decoder": { "version": "1.1.1", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { "safe-buffer": "~5.1.0" } }, "string-convert": { - "version": "0.2.1" + "version": "0.2.1", + "integrity": "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c=" }, "string-length": { "version": "2.0.0", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", "requires": { "astral-regex": "^1.0.0", "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "strip-ansi": { "version": "4.0.0", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { "ansi-regex": "^3.0.0" } @@ -35528,6 +37563,7 @@ }, "string-width": { "version": "1.0.2", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -35536,6 +37572,7 @@ }, "string.prototype.matchall": { "version": "4.0.5", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -35549,6 +37586,7 @@ }, "string.prototype.trimend": { "version": "1.0.4", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -35556,6 +37594,7 @@ }, "string.prototype.trimstart": { "version": "1.0.4", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -35563,6 +37602,7 @@ }, "stringify-object": { "version": "3.3.0", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "requires": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", @@ -35570,47 +37610,56 @@ }, "dependencies": { "is-obj": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" } } }, "strip-ansi": { "version": "3.0.1", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" } }, "strip-bom": { "version": "2.0.0", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "requires": { "is-utf8": "^0.2.0" } }, "strip-bom-string": { "version": "1.0.0", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", "dev": true }, "strip-comments": { "version": "1.0.2", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", "requires": { "babel-extract-comments": "^1.0.0", "babel-plugin-transform-object-rest-spread": "^6.26.0" } }, "strip-eof": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { "version": "1.0.1", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "requires": { "get-stdin": "^4.0.1" } }, "strip-json-comments": { - "version": "3.1.1" + "version": "3.1.1", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "style-loader": { "version": "0.23.1", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", "requires": { "loader-utils": "^1.1.0", "schema-utils": "^1.0.0" @@ -35618,6 +37667,7 @@ "dependencies": { "schema-utils": { "version": "1.0.0", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -35628,6 +37678,7 @@ }, "stylehacks": { "version": "4.0.3", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "requires": { "browserslist": "^4.0.0", "postcss": "^7.0.0", @@ -35636,6 +37687,7 @@ "dependencies": { "postcss-selector-parser": { "version": "3.1.2", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "requires": { "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", @@ -35645,10 +37697,12 @@ } }, "supports-color": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, "sver-compat": { "version": "1.5.0", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", "dev": true, "requires": { "es6-iterator": "^2.0.1", @@ -35656,10 +37710,12 @@ } }, "svg-parser": { - "version": "2.0.4" + "version": "2.0.4", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "svgo": { "version": "1.3.2", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "requires": { "chalk": "^2.4.1", "coa": "^2.0.2", @@ -35678,12 +37734,14 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -35692,6 +37750,7 @@ }, "supports-color": { "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -35699,13 +37758,16 @@ } }, "symbol-observable": { - "version": "1.2.0" + "version": "1.2.0", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" }, "symbol-tree": { - "version": "3.2.4" + "version": "3.2.4", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "table": { "version": "5.4.6", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "requires": { "ajv": "^6.10.2", "lodash": "^4.17.14", @@ -35714,13 +37776,16 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0" + "version": "4.1.0", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "is-fullwidth-code-point": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "3.1.0", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -35729,6 +37794,7 @@ }, "strip-ansi": { "version": "5.2.0", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" } @@ -35736,10 +37802,12 @@ } }, "tapable": { - "version": "1.1.3" + "version": "1.1.3", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "tar": { "version": "2.2.2", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", "requires": { "block-stream": "*", "fstream": "^1.0.12", @@ -35748,6 +37816,7 @@ }, "terser": { "version": "4.8.0", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -35755,12 +37824,14 @@ }, "dependencies": { "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "terser-webpack-plugin": { "version": "2.3.8", + "integrity": "sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w==", "requires": { "cacache": "^13.0.1", "find-cache-dir": "^3.3.1", @@ -35775,6 +37846,7 @@ "dependencies": { "find-cache-dir": { "version": "3.3.1", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -35783,16 +37855,19 @@ }, "find-up": { "version": "4.1.0", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "has-flag": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "jest-worker": { "version": "25.5.0", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", "requires": { "merge-stream": "^2.0.0", "supports-color": "^7.0.0" @@ -35800,39 +37875,47 @@ }, "locate-path": { "version": "5.0.0", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { "p-locate": "^4.1.0" } }, "make-dir": { "version": "3.1.0", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { "semver": "^6.0.0" } }, "p-locate": { "version": "4.1.0", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "^2.2.0" } }, "path-exists": { - "version": "4.0.0" + "version": "4.0.0", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "pkg-dir": { "version": "4.2.0", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { "find-up": "^4.0.0" } }, "semver": { - "version": "6.3.0" + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "supports-color": { "version": "7.2.0", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -35841,6 +37924,7 @@ }, "test-exclude": { "version": "5.2.3", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", "requires": { "glob": "^7.1.3", "minimatch": "^3.0.4", @@ -35850,12 +37934,14 @@ "dependencies": { "find-up": { "version": "3.0.0", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { "locate-path": "^3.0.0" } }, "load-json-file": { "version": "4.0.0", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "requires": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -35865,6 +37951,7 @@ }, "parse-json": { "version": "4.0.0", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -35872,15 +37959,18 @@ }, "path-type": { "version": "3.0.0", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { "pify": "^3.0.0" } }, "pify": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "read-pkg": { "version": "3.0.0", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "requires": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", @@ -35889,21 +37979,25 @@ }, "read-pkg-up": { "version": "4.0.0", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "requires": { "find-up": "^3.0.0", "read-pkg": "^3.0.0" } }, "strip-bom": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, "text-table": { - "version": "0.2.0" + "version": "0.2.0", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "tfunk": { "version": "4.0.0", + "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -35912,6 +38006,7 @@ }, "theming": { "version": "1.3.0", + "integrity": "sha512-ya5Ef7XDGbTPBv5ENTwrwkPUexrlPeiAg/EI9kdlUAZhNlRbCdhMKRgjNX1IcmsmiPcqDQZE6BpSaH+cr31FKw==", "requires": { "brcast": "^3.0.1", "is-function": "^1.0.1", @@ -35920,13 +38015,16 @@ } }, "throat": { - "version": "4.1.0" + "version": "4.1.0", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" }, "through": { - "version": "2.3.8" + "version": "2.3.8", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.5", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -35934,6 +38032,7 @@ }, "through2-filter": { "version": "3.0.0", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", "dev": true, "requires": { "through2": "~2.0.0", @@ -35941,20 +38040,24 @@ } }, "thunky": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, "time-stamp": { "version": "1.1.0", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", "dev": true }, "timers-browserify": { "version": "2.0.12", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "requires": { "setimmediate": "^1.0.4" } }, "timers-ext": { "version": "0.1.7", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", "dev": true, "requires": { "es5-ext": "~0.10.46", @@ -35962,25 +38065,31 @@ } }, "timsort": { - "version": "0.3.0" + "version": "0.3.0", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" }, "tiny-invariant": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" }, "tiny-warning": { - "version": "1.0.3" + "version": "1.0.3", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, "tmp": { "version": "0.0.33", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "requires": { "os-tmpdir": "~1.0.2" } }, "tmpl": { - "version": "1.0.4" + "version": "1.0.4", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" }, "to-absolute-glob": { "version": "2.0.2", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", "dev": true, "requires": { "is-absolute": "^1.0.0", @@ -35989,22 +38098,27 @@ }, "to-array": { "version": "0.1.4", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", "dev": true }, "to-arraybuffer": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, "to-fast-properties": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "to-object-path": { "version": "0.3.0", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { "kind-of": "^3.0.2" } }, "to-regex": { "version": "3.0.2", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -36014,6 +38128,7 @@ "dependencies": { "extend-shallow": { "version": "3.0.2", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -36021,6 +38136,7 @@ }, "is-extendable": { "version": "1.0.1", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { "is-plain-object": "^2.0.4" } @@ -36029,6 +38145,7 @@ }, "to-regex-range": { "version": "2.1.1", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -36036,16 +38153,19 @@ }, "to-through": { "version": "2.0.0", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", "dev": true, "requires": { "through2": "^2.0.3" } }, "toidentifier": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, "tough-cookie": { "version": "2.5.0", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -36053,81 +38173,100 @@ }, "tr46": { "version": "1.0.1", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "requires": { "punycode": "^2.1.0" } }, "trim-newlines": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" }, "true-case-path": { "version": "1.0.3", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "requires": { "glob": "^7.1.2" } }, "ts-pnp": { - "version": "1.1.6" + "version": "1.1.6", + "integrity": "sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ==" }, "tslib": { - "version": "2.3.0" + "version": "2.3.0", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, "tsutils": { "version": "3.21.0", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "requires": { "tslib": "^1.8.1" }, "dependencies": { "tslib": { - "version": "1.14.1" + "version": "1.14.1", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" } } }, "tty-browserify": { - "version": "0.0.0" + "version": "0.0.0", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, "tunnel-agent": { "version": "0.6.0", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { "safe-buffer": "^5.0.1" } }, "tweetnacl": { - "version": "0.14.5" + "version": "0.14.5", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type": { - "version": "1.2.0" + "version": "1.2.0", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "type-check": { "version": "0.3.2", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "requires": { "prelude-ls": "~1.1.2" } }, "type-fest": { - "version": "0.8.1" + "version": "0.8.1", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" }, "type-is": { "version": "1.6.18", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "typed-styles": { - "version": "0.0.7" + "version": "0.0.7", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" }, "typed.js": { - "version": "2.0.12" + "version": "2.0.12", + "integrity": "sha512-lyACZh1cu+vpfYY3DG/bvsGLXXbdoDDpWxmqta10IQUdMXisMXOEyl+jos+YT9uBbzK4QaKYBjT3R0kTJO0Slw==" }, "typedarray": { - "version": "0.0.6" + "version": "0.0.6", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "ua-parser-js": { - "version": "0.7.28" + "version": "0.7.28", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" }, "unbox-primitive": { "version": "1.0.1", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "requires": { "function-bind": "^1.1.1", "has-bigints": "^1.0.1", @@ -36137,13 +38276,16 @@ }, "unc-path-regex": { "version": "0.1.2", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", "dev": true }, "underscore": { - "version": "1.9.1" + "version": "1.9.1", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" }, "undertaker": { "version": "1.3.0", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", "dev": true, "requires": { "arr-flatten": "^1.0.1", @@ -36160,38 +38302,46 @@ "dependencies": { "fast-levenshtein": { "version": "1.1.4", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", "dev": true } } }, "undertaker-registry": { "version": "1.0.1", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", "dev": true }, "unescape": { "version": "1.0.1", + "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==", "requires": { "extend-shallow": "^2.0.1" } }, "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4" + "version": "1.0.4", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" }, "unicode-match-property-ecmascript": { "version": "1.0.4", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "requires": { "unicode-canonical-property-names-ecmascript": "^1.0.4", "unicode-property-aliases-ecmascript": "^1.0.4" } }, "unicode-match-property-value-ecmascript": { - "version": "1.2.0" + "version": "1.2.0", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" }, "unicode-property-aliases-ecmascript": { - "version": "1.1.0" + "version": "1.1.0", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" }, "union-value": { "version": "1.0.1", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -36200,25 +38350,30 @@ } }, "uniq": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" }, "uniqs": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" }, "unique-filename": { "version": "1.1.1", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "requires": { "unique-slug": "^2.0.0" } }, "unique-slug": { "version": "2.0.2", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "requires": { "imurmurhash": "^0.1.4" } }, "unique-stream": { "version": "2.3.1", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", "dev": true, "requires": { "json-stable-stringify-without-jsonify": "^1.0.1", @@ -36226,16 +38381,20 @@ } }, "universalify": { - "version": "0.1.2" + "version": "0.1.2", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unpipe": { - "version": "1.0.0" + "version": "1.0.0", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unquote": { - "version": "1.1.1" + "version": "1.1.1", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" }, "unset-value": { "version": "1.0.0", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -36243,6 +38402,7 @@ "dependencies": { "has-value": { "version": "0.3.1", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -36251,6 +38411,7 @@ "dependencies": { "isobject": { "version": "2.1.0", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "requires": { "isarray": "1.0.0" } @@ -36258,36 +38419,43 @@ } }, "has-values": { - "version": "0.1.4" + "version": "0.1.4", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" } } }, "upath": { - "version": "1.2.0" + "version": "1.2.0", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, "uri-js": { "version": "4.4.1", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { "punycode": "^2.1.0" } }, "urix": { - "version": "0.1.0" + "version": "0.1.0", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, "url": { "version": "0.11.0", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "requires": { "punycode": "1.3.2", "querystring": "0.2.0" }, "dependencies": { "punycode": { - "version": "1.3.2" + "version": "1.3.2", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" } } }, "url-loader": { "version": "2.3.0", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", "requires": { "loader-utils": "^1.2.3", "mime": "^2.4.4", @@ -36296,37 +38464,45 @@ }, "url-parse": { "version": "1.5.1", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "url-polyfill": { - "version": "1.1.12" + "version": "1.1.12", + "integrity": "sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A==" }, "use": { - "version": "3.1.1" + "version": "3.1.1", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "use-memo-one": { "version": "1.1.2", + "integrity": "sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==", "requires": {} }, "util": { "version": "0.11.1", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "requires": { "inherits": "2.0.3" }, "dependencies": { "inherits": { - "version": "2.0.3" + "version": "2.0.3", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" } } }, "util-deprecate": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { "version": "1.0.1", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.2", @@ -36335,19 +38511,24 @@ } }, "utila": { - "version": "0.4.0" + "version": "0.4.0", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" }, "utils-merge": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.4.0" + "version": "3.4.0", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "v8-compile-cache": { - "version": "2.3.0" + "version": "2.3.0", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, "v8flags": { "version": "3.2.0", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "dev": true, "requires": { "homedir-polyfill": "^1.0.1" @@ -36355,26 +38536,32 @@ }, "validate-npm-package-license": { "version": "3.0.4", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "value-equal": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" }, "value-or-function": { "version": "3.0.0", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", "dev": true }, "vary": { - "version": "1.1.2" + "version": "1.1.2", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "vendors": { - "version": "1.0.4" + "version": "1.0.4", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" }, "verror": { "version": "1.10.0", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -36383,6 +38570,7 @@ }, "vinyl": { "version": "2.2.1", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", "dev": true, "requires": { "clone": "^2.1.1", @@ -36395,6 +38583,7 @@ }, "vinyl-fs": { "version": "3.0.3", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", "dev": true, "requires": { "fs-mkdirp-stream": "^1.0.0", @@ -36418,6 +38607,7 @@ }, "vinyl-sourcemap": { "version": "1.1.0", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", "dev": true, "requires": { "append-buffer": "^1.0.2", @@ -36431,6 +38621,7 @@ }, "vinyl-sourcemaps-apply": { "version": "0.2.1", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", "dev": true, "requires": { "source-map": "^0.5.1" @@ -36438,27 +38629,33 @@ "dependencies": { "source-map": { "version": "0.5.7", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true } } }, "vlq": { - "version": "1.0.1" + "version": "1.0.1", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==" }, "vm-browserify": { - "version": "1.1.2" + "version": "1.1.2", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "void-elements": { - "version": "3.1.0" + "version": "3.1.0", + "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=" }, "w3c-hr-time": { "version": "1.0.2", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "requires": { "browser-process-hrtime": "^1.0.0" } }, "w3c-xmlserializer": { "version": "1.1.2", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", "requires": { "domexception": "^1.0.1", "webidl-conversions": "^4.0.2", @@ -36467,18 +38664,21 @@ }, "walker": { "version": "1.0.7", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "requires": { "makeerror": "1.0.x" } }, "warning": { "version": "4.0.3", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", "requires": { "loose-envify": "^1.0.0" } }, "watchpack": { "version": "1.7.5", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "requires": { "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", @@ -36488,6 +38688,7 @@ }, "watchpack-chokidar2": { "version": "2.0.1", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", "optional": true, "requires": { "chokidar": "^2.1.8" @@ -36495,10 +38696,12 @@ "dependencies": { "binary-extensions": { "version": "1.13.1", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "optional": true }, "chokidar": { "version": "2.1.8", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "optional": true, "requires": { "anymatch": "^2.0.0", @@ -36517,6 +38720,7 @@ }, "glob-parent": { "version": "3.1.0", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "optional": true, "requires": { "is-glob": "^3.1.0", @@ -36525,6 +38729,7 @@ "dependencies": { "is-glob": { "version": "3.1.0", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "optional": true, "requires": { "is-extglob": "^2.1.0" @@ -36534,6 +38739,7 @@ }, "is-binary-path": { "version": "1.0.1", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "optional": true, "requires": { "binary-extensions": "^1.0.0" @@ -36541,10 +38747,12 @@ }, "normalize-path": { "version": "3.0.0", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "optional": true }, "readdirp": { "version": "2.2.1", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "optional": true, "requires": { "graceful-fs": "^4.1.11", @@ -36556,15 +38764,18 @@ }, "wbuf": { "version": "1.7.3", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "requires": { "minimalistic-assert": "^1.0.0" } }, "webidl-conversions": { - "version": "4.0.2" + "version": "4.0.2", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "webpack": { "version": "4.42.0", + "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-module-context": "1.8.5", @@ -36592,10 +38803,12 @@ }, "dependencies": { "acorn": { - "version": "6.4.2" + "version": "6.4.2", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" }, "cacache": { "version": "12.0.4", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "requires": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -36616,6 +38829,7 @@ }, "eslint-scope": { "version": "4.0.3", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -36623,12 +38837,14 @@ }, "lru-cache": { "version": "5.1.1", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { "yallist": "^3.0.2" } }, "schema-utils": { "version": "1.0.0", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -36636,16 +38852,19 @@ } }, "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "ssri": { "version": "6.0.2", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "requires": { "figgy-pudding": "^3.5.1" } }, "terser-webpack-plugin": { "version": "1.4.5", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", @@ -36659,12 +38878,14 @@ } }, "yallist": { - "version": "3.1.1" + "version": "3.1.1", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, "webpack-dev-middleware": { "version": "3.7.3", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", "requires": { "memory-fs": "^0.4.1", "mime": "^2.4.4", @@ -36675,6 +38896,7 @@ }, "webpack-dev-server": { "version": "3.11.0", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", @@ -36712,10 +38934,12 @@ }, "dependencies": { "binary-extensions": { - "version": "1.13.1" + "version": "1.13.1", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" }, "chokidar": { "version": "2.1.8", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -36733,6 +38957,7 @@ }, "glob-parent": { "version": "3.1.0", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -36740,6 +38965,7 @@ "dependencies": { "is-glob": { "version": "3.1.0", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { "is-extglob": "^2.1.0" } @@ -36747,19 +38973,23 @@ } }, "is-absolute-url": { - "version": "3.0.3" + "version": "3.0.3", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" }, "is-binary-path": { "version": "1.0.1", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "requires": { "binary-extensions": "^1.0.0" } }, "normalize-path": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "readdirp": { "version": "2.2.1", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -36768,6 +38998,7 @@ }, "schema-utils": { "version": "1.0.0", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -36775,16 +39006,19 @@ } }, "semver": { - "version": "6.3.0" + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "supports-color": { "version": "6.1.0", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { "has-flag": "^3.0.0" } }, "ws": { "version": "6.2.2", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "requires": { "async-limiter": "~1.0.0" } @@ -36793,6 +39027,7 @@ }, "webpack-log": { "version": "2.0.0", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", "requires": { "ansi-colors": "^3.0.0", "uuid": "^3.3.2" @@ -36800,6 +39035,7 @@ }, "webpack-manifest-plugin": { "version": "2.2.0", + "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", "requires": { "fs-extra": "^7.0.0", "lodash": ">=3.5 <5", @@ -36809,6 +39045,7 @@ "dependencies": { "fs-extra": { "version": "7.0.1", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -36819,33 +39056,39 @@ }, "webpack-sources": { "version": "1.4.3", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" }, "dependencies": { "source-map": { - "version": "0.6.1" + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "websocket-driver": { "version": "0.6.5", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", "requires": { "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "0.1.4" + "version": "0.1.4", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, "whatwg-encoding": { "version": "1.0.5", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "requires": { "iconv-lite": "0.4.24" }, "dependencies": { "iconv-lite": { "version": "0.4.24", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -36853,13 +39096,16 @@ } }, "whatwg-fetch": { - "version": "3.6.2" + "version": "3.6.2", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" }, "whatwg-mimetype": { - "version": "2.3.0" + "version": "2.3.0", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, "whatwg-url": { "version": "6.5.0", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -36868,12 +39114,14 @@ }, "which": { "version": "1.3.1", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { "isexe": "^2.0.0" } }, "which-boxed-primitive": { "version": "1.0.2", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -36883,31 +39131,37 @@ } }, "which-module": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "wide-align": { "version": "1.1.3", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "requires": { "string-width": "^1.0.2 || 2" } }, "word-wrap": { - "version": "1.2.3" + "version": "1.2.3", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "workbox-background-sync": { "version": "4.3.1", + "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-broadcast-update": { "version": "4.3.1", + "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-build": { "version": "4.3.1", + "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", "requires": { "@babel/runtime": "^7.3.4", "@hapi/joi": "^15.0.0", @@ -36936,6 +39190,7 @@ "dependencies": { "fs-extra": { "version": "4.0.3", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -36946,21 +39201,25 @@ }, "workbox-cacheable-response": { "version": "4.3.1", + "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-core": { - "version": "4.3.1" + "version": "4.3.1", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" }, "workbox-expiration": { "version": "4.3.1", + "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-google-analytics": { "version": "4.3.1", + "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", "requires": { "workbox-background-sync": "^4.3.1", "workbox-core": "^4.3.1", @@ -36970,45 +39229,53 @@ }, "workbox-navigation-preload": { "version": "4.3.1", + "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-precaching": { "version": "4.3.1", + "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-range-requests": { "version": "4.3.1", + "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-routing": { "version": "4.3.1", + "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-strategies": { "version": "4.3.1", + "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-streams": { "version": "4.3.1", + "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", "requires": { "workbox-core": "^4.3.1" } }, "workbox-sw": { - "version": "4.3.1" + "version": "4.3.1", + "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==" }, "workbox-webpack-plugin": { "version": "4.3.1", + "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", "requires": { "@babel/runtime": "^7.0.0", "json-stable-stringify": "^1.0.1", @@ -37017,24 +39284,28 @@ }, "workbox-window": { "version": "4.3.1", + "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", "requires": { "workbox-core": "^4.3.1" } }, "worker-farm": { "version": "1.7.0", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "requires": { "errno": "~0.1.7" } }, "worker-rpc": { "version": "0.1.1", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", "requires": { "microevent.ts": "~0.1.1" } }, "wrap-ansi": { "version": "5.1.0", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "requires": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", @@ -37042,19 +39313,23 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0" + "version": "4.1.0", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "ansi-styles": { "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "is-fullwidth-code-point": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "3.1.0", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -37063,6 +39338,7 @@ }, "strip-ansi": { "version": "5.2.0", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" } @@ -37070,16 +39346,19 @@ } }, "wrappy": { - "version": "1.0.2" + "version": "1.0.2", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "1.0.3", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "requires": { "mkdirp": "^0.5.1" } }, "write-file-atomic": { "version": "2.4.1", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -37088,40 +39367,50 @@ }, "ws": { "version": "5.2.3", + "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", "requires": { "async-limiter": "~1.0.0" } }, "xml-name-validator": { - "version": "3.0.0" + "version": "3.0.0", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, "xmlchars": { - "version": "2.2.0" + "version": "2.2.0", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "xmlhttprequest-ssl": { "version": "1.6.3", + "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", "dev": true }, "xregexp": { "version": "4.4.1", + "integrity": "sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag==", "requires": { "@babel/runtime-corejs3": "^7.12.1" } }, "xtend": { - "version": "4.0.2" + "version": "4.0.2", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.3" + "version": "4.0.3", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "yallist": { - "version": "2.1.2" + "version": "2.1.2", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yaml": { - "version": "1.10.2" + "version": "1.10.2", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { "version": "13.3.2", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", @@ -37136,19 +39425,23 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0" + "version": "4.1.0", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "find-up": { "version": "3.0.0", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { "locate-path": "^3.0.0" } }, "is-fullwidth-code-point": { - "version": "2.0.0" + "version": "2.0.0", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "3.1.0", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -37157,6 +39450,7 @@ }, "strip-ansi": { "version": "5.2.0", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" } @@ -37165,25 +39459,30 @@ }, "yargs-parser": { "version": "13.1.2", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" }, "dependencies": { "camelcase": { - "version": "5.3.1" + "version": "5.3.1", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" } } }, "yeast": { "version": "0.1.2", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", "dev": true }, "zoom-level": { - "version": "2.5.0" + "version": "2.5.0", + "integrity": "sha512-7UlRWU4Q3uCMCeDVMOm7eBrIu145OqsIJ3p6zq58l8UsSYwKWxc6zEapC5YA9tIeh0oheb4cT9Kk2Wq353loFg==" }, "zrender": { - "version": "4.3.2" + "version": "4.3.2", + "integrity": "sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g==" } } } diff --git a/web/package.json b/web/package.json index e703d6bc..9bb7c048 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "myems", - "version": "1.2.1", + "version": "1.2.2", "private": true, "dependencies": { "@fortawesome/fontawesome-free": "^5.15.1", diff --git a/web/src/config.js b/web/src/config.js index b41075d9..12ac70f6 100644 --- a/web/src/config.js +++ b/web/src/config.js @@ -1,4 +1,4 @@ -export const version = '1.2.1'; +export const version = '1.2.2'; export const navbarBreakPoint = 'xl'; // Vertical navbar breakpoint export const topNavbarBreakpoint = 'lg'; //export const APIBaseURL = 'http://127.0.0.1:8000'; From c71ba3e394b3c1897b831313cc64bf3cda987dd5 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 29 Aug 2021 17:39:42 +0800 Subject: [PATCH 14/87] updated README --- README.md | 20 ++++++++++---------- README_DE.md | 23 +++++++++-------------- README_EN.md | 22 +++++++++------------- 3 files changed, 28 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 90a70e16..d7816c79 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,16 @@ MyEMS是行业领先的开源能源管理系统,利用云计算、物联网、 ![MyEMS Architecture Site View](/docs/images/architecture-site-view.png) +## MyEMS镜像 + +[1]. [Gitee](https://gitee.com/myems/myems) https://gitee.com/myems/myems + +[2]. [Github](https://github.com/MyEMS/myems) https://github.com/MyEMS/myems + +[3]. [Bitbucket](https://bitbucket.org/myems/myems) https://bitbucket.org/myems/myems + +[4]. [Gitlab](https://gitlab.com/myems/myems) https://gitlab.com/myems/myems + ## MyEMS组件(社区版) MyEMS项目由下列组件构成: @@ -270,13 +280,3 @@ docker-compose up -d [社区版路线图](https://github.com/orgs/MyEMS/projects) -## MyEMS镜像 - -[1]. [Github](https://github.com/MyEMS/myems) https://github.com/MyEMS/myems - -[2]. [Gitee](https://gitee.com/myems/myems) https://gitee.com/myems/myems - -[3]. [Bitbucket](https://bitbucket.org/myems/myems) https://bitbucket.org/myems/myems - -[4]. [Gitlab](https://gitlab.com/myems/myems) https://gitlab.com/myems/myems - diff --git a/README_DE.md b/README_DE.md index e550796e..52843b3a 100644 --- a/README_DE.md +++ b/README_DE.md @@ -23,6 +23,15 @@ MyEMS wird von einem erfahrenen Entwicklungsteam entwickelt und gewartet, und de ![MyEMS Architecture Site View](/docs/images/architecture-site-view.png) +## MyEMS Spiegel + +[1]. [Github](https://github.com/MyEMS/myems) https://github.com/MyEMS/myems + +[2]. [Gitee](https://gitee.com/myems/myems) https://gitee.com/myems/myems + +[3]. [Bitbucket](https://bitbucket.org/myems/myems) https://bitbucket.org/myems/myems + +[4]. [Gitlab](https://gitlab.com/myems/myems) https://gitlab.com/myems/myems ## MyEMS Komponenten (GCommunity Edition) @@ -259,26 +268,12 @@ docker-compose up -d | Bidding Support Service | ❌ | ✔️ | | | Customize Support Service | ❌ | ✔️ | | - ## MyEMS Bildschirmfoto ![MyEMS Space EnergyCategory1](/docs/images/myems-space-energycategory1.gif) ![MyEMS Space EnergyCategory2](/docs/images/myems-space-energycategory2.gif) ![MyEMS Space EnergyCategory3](/docs/images/myems-space-energycategory3.gif) ![MyEMS Großbild-Dashboard](/docs/images/myems-large-screen-dashboard.gif) - ## MyEMS Straßenkarte [Community Edition Straßenkarte](https://github.com/orgs/MyEMS/projects) - - -## MyEMS Spiegel - -[1]. [Github](https://github.com/MyEMS/myems) https://github.com/MyEMS/myems - -[2]. [Gitee](https://gitee.com/myems/myems) https://gitee.com/myems/myems - -[3]. [Bitbucket](https://bitbucket.org/myems/myems) https://bitbucket.org/myems/myems - -[4]. [Gitlab](https://gitlab.com/myems/myems) https://gitlab.com/myems/myems - diff --git a/README_EN.md b/README_EN.md index a7684be4..a6204ed6 100644 --- a/README_EN.md +++ b/README_EN.md @@ -23,6 +23,15 @@ MyEMS is being developed and maintained by an experienced development team, and ![MyEMS Architecture Site View](/docs/images/architecture-site-view.png) +## MyEMS Mirrors + +[1]. [Github](https://github.com/MyEMS/myems) https://github.com/MyEMS/myems + +[2]. [Gitee](https://gitee.com/myems/myems) https://gitee.com/myems/myems + +[3]. [Bitbucket](https://bitbucket.org/myems/myems) https://bitbucket.org/myems/myems + +[4]. [Gitlab](https://gitlab.com/myems/myems) https://gitlab.com/myems/myems ## MyEMS Components (Community Edition) @@ -266,19 +275,6 @@ docker-compose up -d ![MyEMS Space EnergyCategory3](/docs/images/myems-space-energycategory3.gif) ![MyEMS Large Screen Dashboard](/docs/images/myems-large-screen-dashboard.gif) - ## MyEMS Roadmap [Community Edition Roadmap](https://github.com/orgs/MyEMS/projects) - - -## MyEMS Mirrors - -[1]. [Github](https://github.com/MyEMS/myems) https://github.com/MyEMS/myems - -[2]. [Gitee](https://gitee.com/myems/myems) https://gitee.com/myems/myems - -[3]. [Bitbucket](https://bitbucket.org/myems/myems) https://bitbucket.org/myems/myems - -[4]. [Gitlab](https://gitlab.com/myems/myems) https://gitlab.com/myems/myems - From 4b5c90031a511285213d59835e018f8904ce8d16 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Mon, 30 Aug 2021 10:19:05 +0800 Subject: [PATCH 15/87] updated README --- README.md | 4 +++- README_DE.md | 3 ++- README_EN.md | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d7816c79..da29e29e 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,9 @@ ## MyEMS 介绍 -MyEMS是行业领先的开源能源管理系统,利用云计算、物联网、大数据、人工智能等信息化技术构建而成。MyEMS可用于构建统一规范、功能强大的综合能源管理服务平台。MyEMS由资深专业团队开发维护,系统代码基于MIT开源软件许可协议发布。用开源助力实现碳达峰碳中和。 +MyEMS是行业领先的开源能源管理系统。 +MyEMS可用于能源管理项目的设备管理、数据采集、处理、分析、可视化和报表。 +MyEMS由资深专业团队开发维护,系统代码基于MIT开源软件许可协议发布。用开源助力实现碳达峰碳中和。 ## MyEMS架构 diff --git a/README_DE.md b/README_DE.md index 52843b3a..b93a8009 100644 --- a/README_DE.md +++ b/README_DE.md @@ -14,7 +14,8 @@ ## MyEMS-Einführung -MyEMS ist ein industrie führend Open Source Energiemanagementsystem, das auf Cloud-Computing-, IOT-, Big Data- und AI-Technologien basiert. MyEMS kann für eine standardmäßige und leistungsstarke integrierte Energiemanagement-Serviceplattform verwendet werden. +MyEMS ist ein industrie führend Open Source Energiemanagementsystem. +MyEMS kann für Gerätemanagement, Datenerfassung, Verarbeitung, Analyse, Visualisierung und Berichterstellung für Ihre EMS-Projekte verwendet werden. MyEMS wird von einem erfahrenen Entwicklungsteam entwickelt und gewartet, und der Quellcode des Systems wird unter MIT-Lizenz veröffentlicht. ## MyEMS Architektur diff --git a/README_EN.md b/README_EN.md index a6204ed6..4894e009 100644 --- a/README_EN.md +++ b/README_EN.md @@ -14,7 +14,8 @@ ## MyEMS Introduction -MyEMS is an industry-leading open source Energy Management System that is built on cloud computing, IOT, Big Data and AI technologies. MyEMS can be used for a standard and powerful integrated energy management service platform. +MyEMS is an industry-leading open source Energy Management System. +MyEMS can be used for device management, data collection, processing, analysis, visualization and reporting for your EMS projects. MyEMS is being developed and maintained by an experienced development team, and the system's source code is published under MIT license. ## MyEMS Architecture From b86573020b4686090f36fcfb6fddf4650693f735 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Tue, 31 Aug 2021 18:41:07 +0800 Subject: [PATCH 16/87] added tbl_reports to myems_reporting_db in database --- database/myems_reporting_db.sql | 19 +++++++++++++++++++ database/upgrade/upgrade1.2.3.sql | 21 +++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 database/upgrade/upgrade1.2.3.sql diff --git a/database/myems_reporting_db.sql b/database/myems_reporting_db.sql index 6b328774..a46697cf 100644 --- a/database/myems_reporting_db.sql +++ b/database/myems_reporting_db.sql @@ -26,6 +26,25 @@ CREATE TABLE IF NOT EXISTS `myems_reporting_db`.`tbl_email_messages` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_email_messages_index_1` ON `myems_reporting_db`.`tbl_email_messages` (`status`, `scheduled_datetime_utc`); +-- --------------------------------------------------------------------------------------------------------------------- +-- Table `myems_reporting_db`.`tbl_reports` +-- --------------------------------------------------------------------------------------------------------------------- +DROP TABLE IF EXISTS `myems_reporting_db`.`tbl_reports` ; + +CREATE TABLE IF NOT EXISTS `myems_reporting_db`.`tbl_reports` ( + `id` BIGINT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(128) NOT NULL, + `uuid` CHAR(36) NOT NULL, + `category` VARCHAR(128) NOT NULL COMMENT 'SPACE, METER, VIRTUALMETER, TENANT, STORE, SHOPFLOOR, EQUIPMENT, COMBINEDEQUIPMENT', + `report_code` VARCHAR(128) NOT NULL COMMENT 'SPACE01, SPACE02, ... METER01, METER02, ... TENANT01, TENANT02, ...', + `expression` JSON NOT NULL COMMENT 'JSON string of reporting objects, peroids, date ranges, and recipients', + `is_enabled` BOOL NOT NULL, + `last_run_datetime_utc` DATETIME, + `next_run_datetime_utc` DATETIME, + PRIMARY KEY (`id`)); +CREATE INDEX `tbl_reports_index_1` ON `myems_reporting_db`.`tbl_reports` (`name`); + + -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_reporting_db`.`tbl_reports_files` -- --------------------------------------------------------------------------------------------------------------------- diff --git a/database/upgrade/upgrade1.2.3.sql b/database/upgrade/upgrade1.2.3.sql new file mode 100644 index 00000000..e5b2cbe5 --- /dev/null +++ b/database/upgrade/upgrade1.2.3.sql @@ -0,0 +1,21 @@ + +-- --------------------------------------------------------------------------------------------------------------------- +-- Table `myems_reporting_db`.`tbl_reports` +-- --------------------------------------------------------------------------------------------------------------------- +DROP TABLE IF EXISTS `myems_reporting_db`.`tbl_reports` ; + +CREATE TABLE IF NOT EXISTS `myems_reporting_db`.`tbl_reports` ( + `id` BIGINT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(128) NOT NULL, + `uuid` CHAR(36) NOT NULL, + `category` VARCHAR(128) NOT NULL COMMENT 'SPACE, METER, VIRTUALMETER, TENANT, STORE, SHOPFLOOR, EQUIPMENT, COMBINEDEQUIPMENT', + `report_code` VARCHAR(128) NOT NULL COMMENT 'SPACE01, SPACE02, ... METER01, METER02, ... TENANT01, TENANT02, ...', + `expression` JSON NOT NULL COMMENT 'JSON string of reporting objects, peroids, date ranges, and recipients', + `is_enabled` BOOL NOT NULL, + `last_run_datetime_utc` DATETIME, + `next_run_datetime_utc` DATETIME, + PRIMARY KEY (`id`)); +CREATE INDEX `tbl_reports_index_1` ON `myems_reporting_db`.`tbl_reports` (`name`); + +-- UPDATE VERSION NUMBER +UPDATE myems_system_db.tbl_versions SET version='1.2.3', release_date='2021-09-04' WHERE id=1; From fc379e4e3b352b366222f1c6ab2d37fb2feb0b2d Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Wed, 1 Sep 2021 15:35:13 +0800 Subject: [PATCH 17/87] added trusted-host to Dockerfiles --- myems-aggregation/Dockerfile | 2 +- myems-api/Dockerfile | 2 +- myems-cleaning/Dockerfile | 2 +- myems-modbus-tcp/Dockerfile | 2 +- myems-normalization/Dockerfile | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/myems-aggregation/Dockerfile b/myems-aggregation/Dockerfile index 7c5b08ce..daff43a1 100644 --- a/myems-aggregation/Dockerfile +++ b/myems-aggregation/Dockerfile @@ -2,5 +2,5 @@ FROM python:3.9.6 WORKDIR /code COPY . /code -RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ +RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com CMD ['python', 'main.py'] \ No newline at end of file diff --git a/myems-api/Dockerfile b/myems-api/Dockerfile index 3df75ea4..da58a6a5 100644 --- a/myems-api/Dockerfile +++ b/myems-api/Dockerfile @@ -2,6 +2,6 @@ FROM python:3.9.6 WORKDIR /code COPY . /code -RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ +RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com EXPOSE 8000 CMD ['gunicorn', 'app:api', '-b 0.0.0.0:8000'] \ No newline at end of file diff --git a/myems-cleaning/Dockerfile b/myems-cleaning/Dockerfile index 7c5b08ce..daff43a1 100644 --- a/myems-cleaning/Dockerfile +++ b/myems-cleaning/Dockerfile @@ -2,5 +2,5 @@ FROM python:3.9.6 WORKDIR /code COPY . /code -RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ +RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com CMD ['python', 'main.py'] \ No newline at end of file diff --git a/myems-modbus-tcp/Dockerfile b/myems-modbus-tcp/Dockerfile index 7c5b08ce..daff43a1 100644 --- a/myems-modbus-tcp/Dockerfile +++ b/myems-modbus-tcp/Dockerfile @@ -2,5 +2,5 @@ FROM python:3.9.6 WORKDIR /code COPY . /code -RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ +RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com CMD ['python', 'main.py'] \ No newline at end of file diff --git a/myems-normalization/Dockerfile b/myems-normalization/Dockerfile index 7c5b08ce..daff43a1 100644 --- a/myems-normalization/Dockerfile +++ b/myems-normalization/Dockerfile @@ -2,5 +2,5 @@ FROM python:3.9.6 WORKDIR /code COPY . /code -RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ +RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com CMD ['python', 'main.py'] \ No newline at end of file From 548f3b68f0225b5c1ee1b32355bf72a8ddbabd3f Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 2 Sep 2021 18:43:02 +0800 Subject: [PATCH 18/87] updated README --- README.md | 7 ++++++- README_DE.md | 9 +++++++-- README_EN.md | 9 +++++++-- docs/images/architecture-function-view.png | Bin 42326 -> 42071 bytes 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index da29e29e..835fe47d 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ MyEMS由资深专业团队开发维护,系统代码基于MIT开源软件许可 [1]. [Gitee](https://gitee.com/myems/myems) https://gitee.com/myems/myems -[2]. [Github](https://github.com/MyEMS/myems) https://github.com/MyEMS/myems +[2]. [Github](https://github.com/myems/myems) https://github.com/myems/myems [3]. [Bitbucket](https://bitbucket.org/myems/myems) https://bitbucket.org/myems/myems @@ -243,6 +243,11 @@ docker-compose up -d | Honeywell EBI | ❌ | ✔️ | 采集数据 https://www.honeywell.com/ | | SIEMENS Desigo CC | ❌ | ✔️ | 采集数据 https://siemens.com/ | | QWeather API | ❌ | ✔️ | 采集数据 https://www.qweather.com/ | +| Ingest from MySQL | ❌ | ✔️ | 采集数据 https://www.mysql.com/ | +| Ingest from Microsoft SQL Server | ❌ | ✔️ | 采集数据 https://www.microsoft.com/en-us/sql-server/ | +| Ingest from PostgreSQL | ❌ | ✔️ | 采集数据 https://www.postgresql.org/ | +| Ingest from Oracle | ❌ | ✔️ | 采集数据 https://www.oracle.com/database/ | +| Ingest from MongoDB | ❌ | ✔️ | 采集数据 https://www.mongodb.com/ | | FDD 能效故障诊断系统 | ❌ | ✔️ | 需要企业版组件许可或定制开发 | | 高级报表系统 | ❌ | ✔️ | 需要企业版组件许可或定制开发 | | 能耗预测 | ❌ | ✔️ | 需要企业版组件许可或定制开发 | diff --git a/README_DE.md b/README_DE.md index b93a8009..0b860f96 100644 --- a/README_DE.md +++ b/README_DE.md @@ -26,7 +26,7 @@ MyEMS wird von einem erfahrenen Entwicklungsteam entwickelt und gewartet, und de ## MyEMS Spiegel -[1]. [Github](https://github.com/MyEMS/myems) https://github.com/MyEMS/myems +[1]. [Github](https://github.com/MyEMS/myems) https://github.com/myems/myems [2]. [Gitee](https://gitee.com/myems/myems) https://gitee.com/myems/myems @@ -240,7 +240,12 @@ docker-compose up -d | Johnson Controls Metasys API | ❌ | ✔️ | https://www.johnsoncontrols.com/ | | Honeywell EBI | ❌️ | ✔️ | https://www.honeywell.com/ | | SIEMENS Desigo CC | ❌ | ✔️ | https://siemens.com/ | -| QWeather API | ❌ | ✔️ | Erfordert eine Standardkomponentenlizenz | +| QWeather API | ❌ | ✔️ | https://www.qweather.com/ | +| Ingest from MySQL | ❌ | ✔️ | https://www.mysql.com/ | +| Ingest from Microsoft SQL Server | ❌ | ✔️ | https://www.microsoft.com/en-us/sql-server/ | +| Ingest from PostgreSQL | ❌ | ✔️ | https://www.postgresql.org/ | +| Ingest from Oracle | ❌ | ✔️ | https://www.oracle.com/database/ | +| Ingest from MongoDB | ❌ | ✔️ | https://www.mongodb.com/ | | FDD Rule Engine | ❌ | ✔️ | Erfordert eine Standardkomponentenlizenz | | Advanced Reporting Engine | ❌ | ✔️ | Erfordert eine Standardkomponentenlizenz oder eine benutzerdefinierte Entwicklung | | Prognose des Energieverbrauchs | ❌ | ✔️ | Erfordert eine Standardkomponentenlizenz oder eine benutzerdefinierte Entwicklung | diff --git a/README_EN.md b/README_EN.md index 4894e009..df6ff2c7 100644 --- a/README_EN.md +++ b/README_EN.md @@ -26,7 +26,7 @@ MyEMS is being developed and maintained by an experienced development team, and ## MyEMS Mirrors -[1]. [Github](https://github.com/MyEMS/myems) https://github.com/MyEMS/myems +[1]. [Github](https://github.com/myems/myems) https://github.com/myems/myems [2]. [Gitee](https://gitee.com/myems/myems) https://gitee.com/myems/myems @@ -241,7 +241,12 @@ docker-compose up -d | Johnson Controls Metasys API | ❌ | ✔️ | https://www.johnsoncontrols.com/ | | Honeywell EBI | ❌ | ✔️ | https://www.honeywell.com/ | | SIEMENS Desigo CC | ❌ | ✔️ | https://siemens.com/ | -| QWeather API | ❌ | ✔️ | Requires standard component license | +| QWeather API | ❌ | ✔️ | https://www.qweather.com/ | +| Ingest from MySQL | ❌ | ✔️ | https://www.mysql.com/ | +| Ingest from Microsoft SQL Server | ❌ | ✔️ | https://www.microsoft.com/en-us/sql-server/ | +| Ingest from PostgreSQL | ❌ | ✔️ | https://www.postgresql.org/ | +| Ingest from Oracle | ❌ | ✔️ | https://www.oracle.com/database/ | +| Ingest from MongoDB | ❌ | ✔️ | https://www.mongodb.com/ | | FDD Rule Engine | ❌ | ✔️ | Requires standard component license or custom development | | Advanced Reporting Engine | ❌ | ✔️ | Requires standard component license or custom development | | Prognose des Energieverbrauchs | ❌ | ✔️ | Requires standard component license or custom development | diff --git a/docs/images/architecture-function-view.png b/docs/images/architecture-function-view.png index a2e1ecca25fa4a6e3add281cc7f867f4fd07f490..59a082058960519861baba40a42ad647a4afd715 100644 GIT binary patch delta 33501 zcmc$`cT|&I(>{ui1ylqP=>iG@N)3cwMHHlWkZvdeLKEpA+zJSy6zPO6Adt|cgkBVs zW&kOnS3yc>QbH%38=mKV-|zeV&Ue;2Yn}2BD~sIsp4qeao;`ETH5u&uYpDIN5Bh&) zuap`}U*vHMW*|&UNLOA}9P?1uOY3bP#L4LICgk0F6_31w_3pQ}`E$NrK!lPq85`Sp zkr5z+68f{duWy8EmCMU8j^#6&jalKoj&mh9n%roPM6ru3515aekr+IhmpMe4*)q$d zgy`BXTaSqDUXtW8#wmJ#;XerLtyO4RxD1tpROyExi30gy63RVM@G@nMLVBw{P58=e z>(Pv~Uux8A_R~dP*%cwwlR$8Y7PajI24!5IZlYBG;^pUVCd1Ekl1c|K z&jlX;nz1g6oc;6pw>cS;!@|&j*AoTN{MGpcdxT<9A|qf7?&#C*e}p5A8bb^Td&JNp0rA447M*tgs>kH|G5{{nDXtp$6G4 z;WgZ)EmrFXC`300f|l^zL3{lJT5k#>-;crXA?i@$1LV8f9ww~zc&lH;3$L=;zuC)S z913PN7Q1Yb%*!>sMS|K>xjE+2fUA@gzGKWNa#UUPiz6l0iISLtWQh$;kCx;?NxZvn zSKlFrta;(??VaxyQFG-h$5j>vM1fDv9%Ulje@oe2_H})-2u8I(c3wBjqv7VH49*;G zGA>JUQ*mAhTrWdrD6=!9#Sse)Lk5W#B^LL6AV*~9IMO2!p`-ChDYEResH)07YdY{ScJ@)zCDoOTt>@vg)Z)A7OjYtB8=gAS4fyDkm<9^gsE0gQSx~H~Dy=xI8kMU(D6kN-D}zxvLZp z2_tlwnxixne=F~Gd;UuzQ_OogC2V}jm>`HYlRGa8nz4@%ihf8m=*W^Tigbd#Pe8-;Z)VL3mN)vlbBmXEr6ALlaFEUtmBz(hdr%P_Iw`*g5 z11iFH6de0Clhc)qtIz!4iE-T;BwzYEOdaJg%eqRvy4FW7p*mZx0AhU*a#Ou?t#muR z`?c;C#+a^R!fKurG9eqxAoG3Tpo_itX0USZk##FX^UnJIN5c-AcdU1I?&!&g-7wT$ zrIvlyrz4Vm$-^)wq3+{qxxuQIZs=vH%K*vm50^(lljcPxUn6YOtEc+vHX)_5xF&Xt zM3Vzot?u6Mjj+=&%%WaI-2C!%`Q#$WJE@dmk2QB4{pHt2cB#s+R_UM>8$CKz|DSY4 zwV!hp-CPG07uL^Jm`+E&H)7V=VpV)6Oh2JZh;}TWRNxtw_f~>P9-Jppxga6=?JO~d7;1j%!pzRx@h$e{#soUHvK z>Wu_PN-wO{^vATyQbD3GKl0>UL~eQbM2T;vxZdi<(3HKF$Xvym%zpCuyS^kO1#GeD z;0Y;;OjmAE_VJ>&l}sUdn%l7Fzy=?#QIdQ9D;R=)-{ z?U%P17qR(38sBSitJO!#XjD9Et%oJ)CVbDFoV(-jgWxSadY~nYV}XP->i1K#q-fWA z|HGr!i1PmBs^YXKN-k;An)ZA`vO^lyh1TD!$4A#Oi=4xjlJ<3q8iYu{%LYG=?1(ySK-H7htAuSe6x+>;afk;DqLBHGGqiLv40xqjenhL zYfOKpY-`(b>A&RhPWBZvbRV&scFxnd9)U46Zf|zthZz2no^u!CWRF*DX<>D-{~v?I4kr`*Y^wwWbSx$Mbc)@=2ddL7@4{bAczv#j~@aZGCJ zQGvyNXVs*?7>Cj1=DgU+A4=k@@R;!U@TBmR@X3VquGr>qH+7r9078K|O)A+Ze!0C6 zv0Freliq0uMt|3U-wPBLz(Sh*Y+Nnyvd6*VaIEP_HK<9vSNzBK7*$$f4b=OWBfoj% z{8LYeCcu#ruooKGs&sQHs$Pj=4b++yRC2IZ1%=#!*0CJm}!O(v}~yxfa^}GP6pO@M&b}lyzI4^xYY;U4J>ToV>o(vDIN>O$+F@sClS!Wd2BV z61&4@G4IuQ>=aaDzx~~3U9)Mq@o=r&glZq@)pSU-@a~xw&=Br^QL2b-I#g&}*^JMS z?e;nuPOq-<6*B7-tqhv%|m)s&Ku*W7+R3Puv{ zVCUqMI)Wg&w9RUlf{{yP(0(d7yd_nf3I_KlgZf;DZ{Ehny@AA@gTW=6vF^dh5eS#Y zqa-8NW;K>zq%;}S<_^~SK@u_&0%eB5MX_Pjry_y>A7uVlk-+~)^Zc(e|Eoygf3|J; zfW*e$pGYZ+sMUwYQQS287}w|S-z~JGuX%(M$4K=0e+8U|h{T*prdo>< zykStJ!iZt${O@l82!nwe1qZ_!kbYV0s({_(SVm(`dW4JTK~fQB)NhV4K>s}%^k9x! z%(bG-kDO269=j^nq0thaS}HMfz!D)BoP5n!%cLR_Gm7%aUPKJ^;vU_A+2x#M!Z98I}^K2(3iyt!W5_>K$;uQ;NrIKNmlU{M$WSY__qay!&4o6W!uANC&2 zjHhB^2)XKOWPd8EIT%bVRU)fg6AS%9!Tr4Uc)B=aiYwo(qw<_uUhyg}9)~ z%TFg(%1TkJ6}btdQ%mQ0g|IoHDpBEb#m-&N+WrVRYD>U!88V)GkA})nHe(%cY)weJ zWz{Ox3&a%yf7Tg14EJ}RF3^2O6*pn|*Y$ILiCQq55QQ;WoWf1O@pbr0pk_p)688a} zvRUACj7LS{O%W=Q>B$Sn@l^2bCBKD|w%MPoH~sI3QobJb*n6N}F$=NUud?|ys6We4 zNUl^vD>@&xHuS*#uvJtf`ccyT_v6oYbn70a`LK+i2Ohb-mwUhXsikF(ys(K&32}mV z-r1dKe9@xzB6Wf}d%28{BLo?doyY*5S(6lMoXjs751ThYPku_FQMPSWabAVR#AG&s zMSFRYace~4k*N#@P1zi7_9TX}OJq}^w5sFn=vC({Cox>fPedU{Xxba_?R_a*TSXr6 z-Q6CyqD|9mQZ~XqYQ{VT9M`hmVwTe1zH)L&qY!TeG>0>6M2yQ1h{^vD z+2sEK<9}WEwID}odMztu%5G1ej|01S4yCEdhkAq8RHuxV3&e@K=!(SQ%8Hk+?a=a0 zb3qLwDR50vwD6}`pSl)9fEH1}KrLe4wJ5xtqA57xIrKqN>FP3mdDhd0tXT~(n$!8u zu5#%+$lXp1uC>LLotSB_M66BB`F=b+6f6jAQG@jLM#7GZ?nAH_tcFBZK!*zlkFa3! z*Od!{T2=bxihLdcC%^CsBdP|$Rd)TUGM?o+{_pmWmqWpw{U#V5N60@+tgfLK8A~t! zUbooGf}#lsJpxj4OLUsU_h}y~(1csaJo5d@d`-WXzaWbE#HY@=&ACNQu_sTHMBL=EHe$itir1k zvL>f$N(gj!5pY#n2DmfiZwnQ*vImA(rf*cXonUJsyaG1H5<(q)BF8fQ%Y*$H|0$m}}7rNQP^mv}+1 z3;#Q*9Rpl?IjYeT#hfLge_q6P_uRY7(1W9u>*7J$fV=3}MHfh5L(pp#pfGuaq9xod zFJJp-&}}eDOqqFqN$ptuBq*C5)z2^C=qvsB@B>~0C5^M+6FJ?3{AK^%gEQe-YtL1F?k- zdl9u)^`xR1NSWD|!Abbn;5!&6dE8} zth(`kV3U$kRcV-L2=KsE2fRG8do!j3{07q%Zr`WlGupOhC54(6B@xK9`een4?ZK5D zE~tu(PCA13x2Bic_N!sorWgt?8WCq-QJy=LZvphLIMIc$f%9@cP3^O~r773WZCACW zh-@3?)N0}$VlXv8nv}%xs;;|KZ@6$lUvoG!myA#VW{0_|s2yU}2JuK-`wKi`FZ5UQ zMtR+`8iPa~*4S$D4kmTbPBk<*v&Ej^+=y>CM}(c_a6FDC1U}%U&9qYk7fkV*CjfZ7 zLxm1i&X`)_vVi#HPJC>Uv440$ifSd&4V!-D3e?whj{JD0G-#eY+l+w%)+K6{Sn&;w zTm|QK8MlP*)oXG<$pX+u1X&kZXBkwq>p+z7=}$>mo6GlGz5Ewc&r`uW*}SsO)+~W^ z_c}g=-~xAvsI^@#!UZ0F2YNAMYxwF79~wsZjr0ADvz6e7dXYLN8Su_Yaq0@g({AM5 z_oD3|;L|VBzUt39*cMs~e@W(-(ps==WfZ|DD~e#Clhm7i{rE3E|4CGQ?`>l=4Uhx4*9C<-f0!UzbJA0+ zPxg-e`l?evkld1|H0EWoT-Wko|Clg;$E4EialMJn2Ojr?v5On3Q=j(17_I!1grI9^J2w!KKC!~M>t=zcC#vPU zm{4JIB3FUqKDH95tHOEknt2#g%Lcd0<}r=(#i{5HnJX_O=kP}x)7_HAYq<}YzXKQJ zR#wVnG5IC+5-0A?MZK#qc3+8G8#Sw-G?PNf**~(SOfBcM3UHDpW|ul9l(lCoHx#c$ zj_$L@1A?#wQLxPu>Z)-4QHr;5>>5FIa=+jW1n{wFW@7Kd?HP-tTK?qURZgklE1pk39;Ki72}L%%l-7-xNd6bjTb zIvE-y^|Dh%ykRUGkZ~Gh>VAsCl`T3l%Q^;~?y?YOnO%1Rw-kNHnDX&Q(I*!Hzn6Ii zP9xuwS?sE^fX{PqFQ4nDt227$$8+VXN&D!AXD70Ve0q3otL5Mz*?O!6pRVx`bIS|9d22SswV|`?dsWWLk(4qd>(S&r5yWK zKFMA*>}g8JmGXG7CS!`kzFaz_gJbQOQZ8Y~ui!IWyKr9C~@B zQs}6an-?4B&<4w`Ro&*xUQ;B;?W@qyt1hAGT2&M4*(hGTt7mzp`#EQDke#K@MR&O*G1 zOnCeEUN!K`zQq?w3TcBPbVk9|7CXaKSk~TbI|^O zHz5N4w~XljeVPANByg66{eLM_X5o=f$epFHq^#TX-wFV((=7N!bxkuiiui|eX^nlx zf88%bOlh}17yh9neZb-tGRPY7If89-Hvpg48p>ds`rERDqdbC*&0=Q**2-Xe8M-?K zGkuKTP`abn$*1hKEhLCW9Ig?%f{3iFBp z-|egdPWAx)C_xpI{e7>7t^J;WgSo32QvRD8CPNzh-IWB#gfUm0Bvdh~UU~dDw~0FS z;&(pQqwl-d8gqr(ZEbaoJfoRyynJXcb?MY^<~D70Se%GRRqdQqk@Sk6?4JB;x@?jw z{+sJ$%_Mzqf>M)p!D3Hfin&6%_-M|ASe_>b>_mS(9$|_FRb89p*qGj#V*hQzK9%-N z;GK!}+A2$n+)>fgoK1F}@JTL8BZ&CzaBTOu;8|iXhqQt4MlnBDPr-)}9crVI<4#Ag z3D|>99b^kM?rjfsYm``|W{gFrj^#jFM3{A2&2&+m@iufL+MbDuf$;mT(M)AN*LMIv zlufEq+^2}Gx5SmO4OobBz!PP)&G4Bo&Gg+mfgR67sn=_p)sD&i=23JketO-eF}FSy zyqs}+(UV3TF?5mL?b>1z<1bhis{>zlkgN!=&DBxo{=r|CogC8mr{=TKJBvAkI3^uu z)x+B>p{^{(38LMz2jyIfAq<@RA2|S#4roZr6)W+YZ?Q8JT$7kL3=ExPVlI=CJ{sLd zLgNIk#)nJygdW9w#3k;3O5}Gb0HCloS7+U3@*#IE1|M|+flp;CY*L+T;aja)t^3Hl zxyrbderYm4SSo1(IIVW#N@(xtw6wIvV8WoVAW&FCz92bg%Y=Hp18^1Ud(TBxIBwf> zc{I#@d$40G&OQ2TjVIgrPejZ&(b(`aZ0>w#oC6~FPHTh1J90^u{;F>d5zk@`kfNrE{% zap^XPn!i!7)(-(Xz6tjObMGT5$*vUk7A1~UiU^W&DOgRZE6>EpP{ z&2Q@g-m@o$9<(woSf;5x#eFW4OmUf(@S+RM0uTPiMqAYtT|!~=`wJO~W7_C*B=5E&z3N-K=T~zg!Qr;{ z`w|h82R5BH%Q zJO{f3KK_^;yCQI=^E<_)5esl_NJwr*K>CN`vxB78#HA}$F|#e;2k}}Wq&!58la_YHVHa(0Wa7=i9Cu)OR7y-tpe>RIt`5T zqa;_3lmW#CAe)Qk27GRy%WmK@2k|;WH2D1TJ5T-ilz3uH$y%J*p9^$7V}+G(2t@#i?dbcV!S-Ec_X+ghoy9u5f z+H8AT?bW&@>Ty3N;yX?D@(pIaooE#^!<-REIh10M!hS(=P>!E)|LNLlNrJ}opYnVY zFcn^4+);#r_Z;?;-t(0j1$n?6|A&J&~*KO)D4;%JR6EyK?!=>6!B|SYw{|Wq57j*Kys6k z=X3W$qL0>ZDzop*eQ={|=H(oPbk6IUo|xM(b12cV0=OJzpemkmUi@P| zBMHfuNjB_C30t#T?1kjJY^UW{Qp|V1wjuqfNDBAq#b;hBc_ASg0BcTVr*>H%%g|Ex zpTtMy%>jMK36m1{RlKSt^WIH`|0ZDUL4BXGQo(l&m4Pm`re>v*HA$NGPELM1(d&!) z#9T>e#S_PpNbOjf1G(Yeu1*Tc1o5^%QTLK*c4Ck2s8_e?WE`gKR`e*3%4Ja>y+}$z;MnC7h2E^X=71PEwOF`> z&#=ls@&^yt(7#8x0e3VPEZLrU-!zf*jspRt6{SD9;E|cXl$-V8I?K-&#^fgNCDArhX_U<>#HU8hCN&~^d=-&a0DKF0wxFS z%#YPgAtx2@FL#TIiCn9`BCfTiyAp!tLrG%0Tz?Z*KwnZ`8YCq=PhuY!*ED> z)0KmZB=Y7z*LP-k8agiFfd|=3y!{t~^;R=+chugaS+&`TUvu6Wqx;{YizChaiJc~@Cs56+$*Jxos=O1kX_)09zTV+`Hk8_H)^AEP%T!6BOfVJj4g5` zn$;{Hj21V4D2=V<(~qT_eBz|D3~#V};aNUm4UXhcF$7a=;H|VbSDDx~z=V#(yo^{w z{QTXpVP5m1a56AxXga>3T?6E$JSn*Pk@Wtlr*SvCp{syXr^Jl*)!umyc&AFn$Ocx) zV}|gOpuCj;HsaRnfU zbhThInWAq<9O%LU1>8C_)0y_NFBt}%m?heVN*Ys&rn@{q0!lL-@!KM@a8_K}y*Pu% zj@Qvdm#3xFYn{~ga08|*=%_kDqtAET;ncEeh@y2oX^~w@cBnq}x$w_kuvWi*M{{Tz z&iUGwfqg=~Oqv-p+ypXK@F)3Sxs=+Jo8*C{Cb8hFqQYpal2ANW@Q+3-p>S94U;Zgkf$VSEUZ=> zz4?VqPg=E4GBX%+huM!7u@_nG`> zGDUwNR#Nz24Jy735_)*ce7=d)<75-ydw`C=%3F$fS(REP&~}G*l)$-HzV;Y_k}ikb zEm0GH;S+}7@~{0X_&;NAJN==e@704U0@b*MxljkYW1IOlMcSf#5GgfQXoanvs#>^;5CWIijw6wRrZfs4zTj8 zW{IIgKV6GyK7V(BI^7BvPVPi59U-UVkO=yn&n_oj;XV)Gd_{={llvIMqf*uc+k?UTP>PNA#zon$5F*~h3 zCCWGGYAvg?rYRoHgAQ`Z85FaEl%a&;t~$gETN3@?Er10EtJ0q{nwx+FDxDc2q%ICW zcfPG96l#CIFNf4VKTG~rY|}TT4wp|l@=}XE1Ngb3KeU^V*?4TQ0+SLy6k)E+(DT~v z#lAR%Jt}uo82p}g@icDpqla^M9cG%3ZTcn!bg4I4E390P?Sez5ldhpDaWmcsxfK)YWYZ`jwNGL|PyA778kDuPe7W zh7INUfs^^1vBQfU*slBK)vh`N3<;dfm)$p9liQ=f5F^*ckMzoO4_0XHr`HafCT&06 zFYBm$*~WabqDwf?JTBK0bKE~T_WCgxbXam>*-IxEc@vH%`DihNi!Zn#f2`wz5H2Ai zvbUOW10GfZ{#4e%>ZKo@n?8DO7}mtkx#2vFJ`sO*`860iq;M24p35!(G*36ZwM7f| z_wP^cYk%h~zbE2KPDa0a9T%-1Eo6`nk$%@ZEN%hl3VRH#-*)%dROdcQ1_>keV}~U> z^AoZ!KZ%VzI3ChWK1{her;GNSKv(^=y9(8>up9Yq!pEaWjpO&tmNX^Q3b3Q7y?bD`G(XV4>YU}-FC41BkI!@#F4`opxS>)HR zovxHBjdZ^aWS&OG%OfzA_~?FbuAVSwFQU{vKebpNkSu+{C`u1k@j9K9ZM;Q8) zlgZus-Mp#C_B^b|Uk>%tL4kLP%4Bi(#DBRY|0Br%8kDOCytqbdDEV~O8g?ha%texc zgMo)Zu;!1D?^)E(dk&`fhN13qv~7m};8pN>>Qf~@Uk_$zR--%15NO{+6q1(CBK9wq zRB$q=*;$J7ls8sOi2=}U#-8R3U=cac^`&>)*It^s=_h*3N)%dG8TH!oDP;RM{&~C^ z`xc^0njk6ojrC#IC9#O$m16XZ6zk=8qa9t^c<~NXkqc)=eg8O#fe_2Uq>g1(*KlQ1 z%^%5nsEF1$Y(ym5{n+@Jp;s%UWYS4^LNc!?=2K zGH1HeFl24HF%%1ypPwCXf^^%^6dM}ZY!iN2{uX#y)5)z`XRdpodj}hS8Op7hzxZr3 zRGF>~pF!%uB6vn_biN9u0=#0Y{K^^;p63Ntw#(l_*e%k>s(M_;#ibeoK)_-AW#6^` zzS&n)P_DAJseUvrsV>lNRRPnIvd+cj?=5V=2LIsOP>LZQ7lz~CH^!34^S0aMlNfHn zQ(0dRP-UyoduVB!)UTWp95aeRHq@rXl9*XR&78u&$Y>7VJpn|u8>r5l?t3vDX+uO$ZIDMTBvG2hB z$716q4J9()E-B1*-Dt*s->=E>tQoTKUg<4}lIE59=pHZda?J$T{@yQli1w`*ukLk2 zd_epItl8gnO!!4tL-RW%ZcN8nqvr9dxO21kI{JA-C--bI9p(FpIBiPiuY^%$qfu+| zV!3n8*re0we*ck^zT9j3zup7pvq!{vbr@&vj`&X?tZSsyBm;gp?4K09?BRI|`B;0^ z%zomETiZOcmGj^HV{2XPv$0e{$Y5Mi_`OtuQpV5pJYknFkE?FKcE9S=cfBC)7=Q<^S>+l*dsg#xlkre0EMZXiE!37-kdiU`!y|@Hl3oKN^*aQUqO4d_$&SX!Rq_$z*>A(wK<9Shz!c!9NxvlNk3cx zt0b!{<--o+&543~oEy7+>PUUu8VVuX(Es{C#^In!gi>AL^`~GY-nS!X|3GTJo|12J z14L%FR$Z8mSgto*Xg^{bY8HLh9z|@A0>)3St}`5+>6&0FGCf}2i#}ydyAvnYbBPXD1unB6QiCV% z*ahzBcwM6cqWsV{{ZD0ijjI%H+Bjx!uEYk(~nsSV40MgYA&qL4c0XEv z{13k>+@Yi;JnSOMn(ER;{r)3LJK;2&m4MCr`cih7Xfh~>%YkqGL&Y+hbCsC?IBOwr zR>vs24mUj#DfgF8x_|X=CRdCGXY8^$bF8Pj6~HZrHI+dLgjKL-hvoRKHw;~c8fvyq zAkNrX|LAfRmV5h@F%+8y(dCiGrlw8QdcHWAn>A$hdCDJFAJ?v>Gur8LvMJDUuj6UQ z+m7mv#fWO$f8l?f^26lM$X?Yd6wtnctu2sFdFpYl0#P#D>x)8f8tyE4^xI%98??jKO93#}uGR--I&U@lllYI=dIFlt#3yKmktv~az04-b72V1y8NF_;0j-%S-yjrW(0 z`1ZET6{Ncpa=I<|kgL4d{4I?sbc$nrqoUN;9eOufE|Deq%=?3Z>Rv}U z{<-hxYknz9jLbpS#`&S;EW3LO`6E9)uBk=f(}zfVWn5^?FPsQ{|KUGJ0quGP_^ZQrp`7g!7f*`XX zym+X`dGb_oMHo8(jo5ENMxC~FsE)Z)t(o+^irAU&64h-QDJ=+)Gip|w(B2B|U*4g% zt8`@4B;>9CsbD*B*Ah_(fu{1Id;givntwVCd==E4dW8)N9TF zvqd=veW!7CNl~7G*EaXB^haYKYkyNfL%a?)lu5I*X~hu6pZ&mRa{~>SyAr-z2uSpQ zjZOMfGW4ej&Y9-4THvR1Ptws>3IuY_*_!^$2q8n z1O=sEw|YXdg)s+b(IZxb!n`=UZc=HbMEazq%xf`dja1(IXRc6OV^wI=LyOiOS}!WN zZ>j~<4t;{s-nnR199%H);@PIxqoT=|qG9ZzzT{!rDoM)MEcu+}gZ)sy9{{h1RPhw) z--3aLgHU9`){ghomjH{BC*G;wKG1lVmW3jXdwzVeUc7^??xcVw9*LIUd3?-W{-5w* zQM$YZ(l2^#5ty37@_*Iq=LI=h?$=O1g`zGvF%mnAWy3$*!RBk^Vnx$KssNd9T~Ea_ z;&==rJ*u|R?v%i>LyqrEiMHQ}NbNbm;aL?-(W8-(DQ^t^k-^5~u|N5Uy1u`E^JO=) z{%?_KEd@?!4$_J7x0o_Ww(O_Ed0%C@zt4kDi<$!yLZK7EKUmxx4p4-t>bQ!2y43HC zZq+_UmL-FJ)HR+N&cAnpCFi!-8?PcRzRv@8^nrL==W#7y%CVX`1lbv%-O{2UqmFcG zNM=bj9DFAFXCW89WvJtl3wSIsU*w0ATWn7WCVELhe7{0u(jpy_eNcnh&>Qn7RT4T(=|#-19Ox1hkj0|M zB8ZNPWpfgYLE5V!y%gqP1}Xj`f9P0&n~rKF0tyd-(tlOb?0L z>G2nmU%%DlqR)FKIFHF>0unjO6Gtl2mpQyPrlR=TK{Ss>B zTC9-aH33NsuS>*|_2(wktY@a~JS4kzJkR#v))5cPi(*(ER}J#TDB}yaOms}@Wf##_ zP3$Q>in!6twh#1mWKi`J53$+U!C71W;J(?H1yJ*2LQHKCm*9*=$(ti+k&>W8Wy)jTX zKtTHssF;kov{F|s8OX{OCcoGjvV~6je2#4b;Bcvt?xldXClW2x;c>FB&&dHw!o$Qt)tUp1e1eLT@Y$%);`|sb4eULwv1tOyt&=`ns2o z`)(?*w0O3R4n`m>?-a$OckN)Q)Z&aW(iy{ZO7OZ^3d@dYwFpxXad+Qs& z_j}?@NauC9o`n@ODsQr2|6}8XQjy+(N)yB5WFbs}XqqaO9!(cfzkscH(9#w}yc7sh zBJRoMg17G5wiiToUl#|^4elmeFO{&q1k|pUN!O&6H6^sqY)ecRO+9#?-mUvyy#})Z z&@ktC7L8#hAlY==MwO*}=&w=wPD`q~JKv3slC&{aJhfo|9vuvBQFt5scDio8OVrmy z8k&zIm|6uyDL=#{qODU3y~w?nyN+z>jviOJ$zxcAf*F91-QSmz#%#*@);#?W=7S{5 zgM9@|%#M47i#&DCaUo0v+dL>>26gp>-2Plvf_YczO@C<@btfBGYk+(5mS^ACuOOUX z3MKx-Wt@5Uxq-HX*G2lciCR1vAz(gpeoL{YC475er(w6$WL+altO# zzICNeQ2HsRs)!{bf9UE&$d*JQ-T~o-!`agAaNl=JDh1-T2@PxJFWHzxy>xJfFB@_u z|CtvY-&16}jLBEBZJ^_EOX{6iSItO+f;aVF-CvMVJ7jR{X2CM1mS_OAQ;AD_*-&{4 z?(XFzFed9q1`S5u8r+CwPymoe0xt>2I@GUEM08DZvJMoS7SmHwqi~T_whbm`{yWK@ zkpqKzp}eqGor$qgZ%Gqe%EyDNQt)!!B9;uaKF`y_0URcu6j5G2aqE6>xB-ZA-y(h> zlOY?c&eiAWGI{bd6ez6yfDh<*-a>(H#%kmog7%2oRm_DkhSoR7z`J2C?(c1ff%Lz0 zWJc<}_f0bJE)@zz(lV!chiejer`p2skHX z>!FO)Vr?m$0@aj*{x}eDk5fM#V=Y74GfvdE}=j9 zR2kIkdgxFzF-4BUID4x^b9)dMjQuR!9GnQrXtR`=$>*Z-O|h$&hMZ$3LXg)McouXh zEdl*(-@5}ud=N_k!ci?E*U0U|fmW@vnu~6os6ze66Zy8-RnZ6nn_sxk;@*(MAOz?S ze=8-L#y(r|6xV-074Sym-*b zyMPzU_4ky}KP#NrXS_c5qE4q<03?0A`GX9)_#QGldI(|v`0d98z=`#{5zT>IGs&-o zQKLKz2m*ge_5r`9XdD&)ov(qJQ#9$~+0H&os=!19Jc`AOCtVKAOo5pn)R@D*%x-u+ zAx*3lALy$@WUev7;FSMrzR{)i@s2o^|NfNGmCFmdDbP3PKZEtZ-qHr%$G+9LV|?qL z`;E(nV(P+moQvEVYT8cwN}Sjg>VM^roorE+XLg|ar=e$-4J)oT{O86a&@PMtFM3tw zTOrGcgA>u^1!`4&J*K%HUq4Lo9S1U~U(i2N!Td4E1*_23Wd5(lpXwb+uq(Gd6J?j_ zrjkmPoRRya?5)nDiH8V7o_2+YgGr;r++K@ptgdtzq zzB+mVFZyn9j?<#K3C^UUp_})kP4pu2<#9L9I->sWXabG;=YKIOto8jR*TA$Sj@m;+>( z@xq1lwZ~K?+IA@bXP}`8=e|8)#CgQft!~OejMJ2J`1*zvLdxV0K&HtIOkMaLzYlt#?8kOS}S9X=_ z(zhl|yg-;51Q|fk0E9a_*)+TV*X_D;6@(CCOU-Bi|I#>!8wjuoAlJ>ohQAlP>`Tn+ z-l25x;`HrWbK>n3AC=-aPB)`jkE2=bo7H;cY5#5kgfo2~Y|rTpMqVCLV-R+JDk#LN#qN@%Jd@{WUvrOzYP^^eg#+= z#KfL*v7^bm<$0UNgK(Iy#v26I&WL#n6kpQjY3Ey5aZWe)&DEOBrN_%@ ze3X-jzhgjlpHiYAWj`4VI8|g9rnr{%9~1@zVZ7?MgZs>^|J}>EBJOGV0c;cv;-z0O zJH@!)EbAN0_|oVlc$T&jxE>_k!MYng1baiPtN(6foik5d;h)HKr~A8B!63#UBNdrO zKljn*+wH5ZK8An4AFt0`ZGJKSlUbqb@#X8MbqNrJo_n5H<&rT~eFt?M+ZwcwnCvp zOY!O`vOujo5f)%LN6y<14EhgfntM`w z`Rp-x6H z7qI*8^jXNwSov(p*vt!L04)`Kt?7h#s1+Fn9L?@@VyZos2TO?flF?D{!3UH*vWJEK zDJxFkzKoPw`)vE_d)-31U%)S}fM)X=+KiKD2PAc>tXHYgtE2Q{gtxCollqst_eqsXx3iDW%|7!P;IM}2aTA!Xdl-60LMAJ z6bT8s#d#7tYb6aN8r*_6?{+Efu`v})+0=0`BBb#1R-z#TeBa_A*&zzo&# zZhGt4a8b-;yTCC^<8z5|T$Rxw(WKO2RYwB+g#$(H1?DJYk+`q7N0=UzY>Hj9;&lgF z8gPfB3XadvVrHK+2D&Gm`aO(h`N2K%1%&MyEa<3l&H4xl$mXsC?x@^OF7FNaQxM2t z#C3OGExFlzrN>e3Ls+LGqaS8%`G9{k^OH?|V zKVodcrm9+H==W7*faobzug+oWIWl(wOigz~6o#~T{hrue*>z^@OX5hLYVxEnft{CyySf*waEo>yqt zvG{HM$Wspo!g;?8{uBoq+cn+ub*OGyjWjYFs&Yt6YhWJ<5O%=6K0XK;xltn4M&<`v z_jAUc16<_f8Zh|WLgP0tLGn-$Jy6$vh8g(I4(KZ#1@QS*JX*k8#e+XkgDMVWVe%No z2OX5N@abkVT!V@d$d+maF(7XxhTh37cpmRl_lQt%UZtp(8t(B=>EFAds_r0EOoSWe zb;?bnkwciZa%92Ro_X>RJFr?Ffls#F-l(v^JB&(3B4Dce z%ayf>067;g&ScpGw?>#j%UzW}C9r;38DxR$F+QK%$61RlMN(?d5`=dr5^#GeE(GbKK@yS1mqWyrDHd=ZnnSEhM~r zxZCbZ zL*U4c0W>d8+_{X3F(Q`uF5~nlstM6$4=|Ox&`s?GG_S)~$b%atCM_+sN6X-885b9q zBDR;}J^i*H*92Yl^fqvAvs3FHa7m1Df4#Jxp+8g<5di(#!18&~_pW~WuQf(>>IFQY z$$Lk!DN5T2Unyz>N;}XW{1qksi00tnUmX6WZ|2EjKurOR8_XzPSshPx87{8e;4H%THny{udLJ> z0Y7LS9``8Su2W_<3#%QfZtu-T5NRRrj_{$sT_YyJDY%;wB|?!1Pu5;@9Z~Uj zc{0i@LlUK=cXw0Vrbi&p_dT{s@7hSEgZ6QMIa7yjT6cy=h^@V@JWeOIJ(^VLX+Te- zl5AJ2jG5+xW?qnFC#B-tx5~-SfJbn3AwwVcfeqI>g?}BlOq8mqJCMGsOdfp)K%{#f z=y4gzwWk4jJd(Im_ZN+X(u9*8NT;9v8mQ;|qEuco9wkw~$-j%b@sc0<>;FhkSr>3L zWMH{T6bP~Jr*3ORhmnICa!k`{0HT?{? zzgt4KJWT&baWTj)UW{uVBJmjFrloghqXMNlG*$pXD4*!qs*(qYLMRjIJ!XrGPh(Fq zeLg=4#3>rK9mz&i_3n3>B}fg!LvEO17v?SgMabVupwek%#q$h_-QCF9GgdT|ewMv{ z{;bP#7q6U019L69J*we zxnoblkgGeuTZWh>y(ja4USZjD1lk?m*(^Ke(<;kHzl@)CZR#>+k)2q^cc~8jhemK= z%`C2PuhHIx?a&%`C5U@%(t6LhhlII5OlKP`mA%X6wNev7XU3K(6XFHmoG_wxk8c$G z#&-IIJB#~r1yNz^m?~UgugnMKm^Gx+Ao~hXWA6 zW~OY&@0Awdo(sX9g>P zU*mS*b-Ewt<)oB7*9!e5?oS{d1B(|s4nKsCi5#Ci^DX=d!q+?U0j7mjNJfkj{2Cey zEddXn*&il<{^19ZA)vK~%DqNUQ|3!*Q4gI03rHX*O4B#`-ph%Ndo z4CjQ-9YN;Ty^K*7#r2q&sJBoZvGSkkGurZP+%`etN6B%zJ zwJfSG#3R8q);G@6V1Sy>5ca0uw&3VMK?@s9*g20U1H1U2LRsASPtz>%kK2zdjnkxR z-(4n(wNjO!x+AGekHdsr(DQL7F3Xtz^zDx)|LNQ2czSb6!M>>5_N-BA&ln*v<2A`h z2LPjfK}wu}JOakWDrl?jylz;oxHwmsl?+!O$U5M(gPq*(5$k*!WUf9)5?0%$sL zOh~utyD;e!u~PWv5`VY5HUXoGnX6IpeHn*~lB0 zV?IB$%3=-Y=Uh|YEZm$jDaxiO6FG&^dQ~saB63fIM+DugZn=A*S5LhEEKPw3a`pui zg}nS?0_-#B9&!btOkH)j=*?%u<#)V&Na51fnglmHW}KS1dp(yDrQlS=WZ3OW&a<2v zb*O!_-Y4Vk>4fy;9=w}-KTS|S^^!kg>d8;_F0rji<Uoh-%r_n zsC&YA!#tGD|5@X}A&!R%AJtjUOKloc9}~x=^<_B`x{rcw#UA)32b`=;$}8`JIpx@fB2rY2Mx(ZXDjJeGS>1KdoQwWKdt-1n6SJN*yz<3w+yOdf! z7+@ju1xv2vw4sCZ1_}7Exg~7bJb#)>jkt86NWHqOd9Da8i+hXkPq}y*TJc-oFMx&d ziF4w{lu5f#qN2xV(U-2bs!N_21?U;W)!!AfNUGt^y|c*88Nl4rNwDAIu8tKg{qejk z&^9e+AnKzu7@*Mvmk)KS^X%HoGVr*H)6 zJv2f%;lu9JABV;I0){Zc(#E7d#SHTjaUe~hJ4N2tLacW#-;!2qJ$%W|nJzDD!otx( z-K2h!Mp5Ekl5SWIU3(s_6_nFLFXs^f7W~Vsv}OaKwA04N{dG+@gIrz1yML8dxAmM@ zMaMyg#(D}h^XhdetcG)3v=;gq*X7?&iFDHBSxuY^_77m*GNfl|^;o~@nQze|HCvzCZ{H^O z=sqAD^snBoEuGICI+kQpKSb}5)FZRpYcDMqAr<2OkbA8rpF-+v%vXMx&K>dx_K_b9@$YWtH~8#wH50~ ze8g1J*<4Vk?DbNJs7zm{Isf$H+l*4zeOj0EIx)VXj4ZH0p@i0Qvx&3FQpi%x)IAA@QhQe!^MsrlC|rDoU3{tGio+YyLLl`i?S*oPwU3z}!h^K$ zxo_Dt7<+7RV+@-mNB%i71<*5y>)VGTS1-=1hPGNW-%l*}7>XTUXlY-nsY`09A{3oM z4O?ZT7z84|t~^}2^2%5sm1Wiw7u3w~F(t3)E%lJ%c9U{=F*JOmRmCc{*t6XG+EU*Y zkmX4_$iRM4$f11a;8vLx-Pyf~&!4VEF$6@}g4m0Dvxb#MX|8`l=N_;+!E7W7ZD_dK zJ9z7vb^Nn%*U@k;OalHvly$MMv`#!KS9U<#K(EKyg?8#u;iRQe@y_>-x2|`y>QIZ2 z6k5}Ka#PB%c=ga?`;CK_pRn6~o;rr)7w>W2nEIM*O7V#M2Kv*%j^(_H22tC(0X@6T zeoMxm1`Q9N!h>3QrS$CVP@q%L(epKbl#M(zzJj4~Sn|`5z%luBn{$HKIMHy1rRN#)?JSOIlP)&Q zzgB^FZQ?QjT30TK8AHqU2wrSJw3f*8$RQRg`ou6Z2-}~!A-n(<^QL0`*b2k_U zAjsz_lBQ#hgRa?N8yqMgnW~~@E@)e?nhO zg>o0@CjWjph>>K$iqb&vXBPdrvjeE0OeyYj;8+;5Whc6m!7v+xz3*`aA3e<2KmGO( zgZ1AbR&N6buo$(s-<@jFyWG~4umu=b%?Q5ydxgIdhthT_I@zfAUJO?nqym^l>ze;b z?sw8`^|~#Kb6mWO7Q4BoI(**cLo9)$~z>su`IQ}Q#3-hKSllyp1`6N8z`crRG6uJLbaK2y)|2#?* zEcUM@nrEK+cbIGmJ_Zxr&$A}}?{~|BmoWB{l|67?t2HAB~(fISOZwG_dPV1?V z>^6#jji9^rjkD{;)x@AO;&wQN=VIwaoW$O)GN~1GNUZ>=M4R{Ck=P#f4H9i6jW#1f z`@xa*{%RZ7htHi-0-=-)F0v=({}9iEX!?hv+9{YJ5kF!Me!jY%8UCv&Peom@m-s8f zRsz%B&U1GHsGV|+Hm)LGay6~_+PT%W?bSi;`i05W-mUCU`tVH9W^&JnyLtP~3|>%z z9-kE^Vugt>_dEO8;7f7bPZJ+7?R;p~@xk3BPKS(AX-|{kI9za>#73=Y_;)h4 z@qftlJvB*e2C5Jeu%l5Q>d3AieA{f?AI$kbSd5|m;4jUI1G^G$l(F%dD0PtZ%XjAG zh2P&KYfnLG&WO)K_^ZT0xx9i2G{X( z;sN^yAQT(XL6!s@Fr$`6bjUACJe^BF(#Q;}!e;QHri2P3EI}clTkIpdsFB@KU%LLX zrs3`ru$MO@-$8p0&qmGJIQsP{f(teQ9WOnB{)2KiKgY$kd-uUpsh4-zM85*|d;P`K zafMU*cPn|dnoE57IR-N1ad-8cokd+qVCBA28&(s!%P$JJ+tcY;DfV8gJN0dAMDq9p z57!Ic3p7>0B1v6Z$W0QIuPvB2J$O;eGv?`y?K01T87 z#3JE|#~n@v_nY+6Nx?v1&WB)S3nSP-W|j~+^}5+iRTt8}^KFVgiT-8w&xW|6KxWLr z7}+qoz>PFHGW1G#WDd7q3u+bW@T`h60#SD2xRRaxH-uP`f*#MYUqZC&^OS;XRLfHg ztj1_@6ctrY%A-&F>+yqaAtszudW-hy!D18^8MHzI1F}!g(}&1rz@kJ#{+>CKF5^BzfQj84_e7*AT`g zO?@WfY5ydRV4E~?Z(w*+IER!L!D72KRQo{RQVN=)SE3LL4gt(L>-8d4>I9H;y|@p% zT3Uu$d_lqX-YyCSG+5_I;Ij7|c=C6mHtJ~97fU{HC4&{m*3k@e1*$oPbSeUvN?V^H}tfJI}szV3VLTspkb- zPo7`p-ViX}wjW=>;=mNX{;1JLMuCYr5&Tu{x;{wq57@ zFwbwh$Yv<(qEeOPVZLeCV7FP*4dFqq&-*@0YNrH-wXeP%5V0^Z zJ_xP#+xv_MTtons*&K-xe%WX{aZofm%mGM3ff!BQ-A)`x^6Y(hO|KB6+djy3H+QE> znR)tK6(ycD0%e!^U3MCL6FT5#+8tk|>hyVUeUm&jPa&J~j&q|zg>!xl#V?1P^9}c# zC==@lNa2^Xr*m54!EFK7L}M3vwTo$@QJaRYq(_8E`I-0u+5XR1Ww%+K~zVz9=wr^*IBi!an}kr!uyMb&<=clX?h0(q7rIFm_|A1hVoG7ZwQ9a$HD_Ux^pSUJV@X?|_P%tT;L@@mOX!JbTkS>Y5w1b3lv_BBQ^j zICK~lpye!|IpBV++TeH2^a`H~fQfe(XnW&HX_wg9vR&QACm=MS>t}s0bbV17n%URO z{s*ErXLaW*G(yrd*YHBfHVmU{xJONXD$}5dGp2wzwba!fXkRMaGN5W{H}tWOXxw@5%1s9v8|(m98*te zF45bi@N)pg*nT|@K@2vK_BsB~SjT3k8TPeMLpwluGgs`rUu5ST?V;qU!v-Ss+QK&5 zg)3V6`~#Je$~xRy^7&5}NnQtiv@AnI1*{s!b9m zmzZqV=XjS_^JBC^>r8jD*sm_syt{QFzI-#v_RhE5O!txs!v_ObbL#g_o!Dqw;1##M z*_Wvru=GIBtk7i$(zs@wbNTPjpdHAcX#hlp^%3^!pTGoae#n(Cy>ha}&Zo}6Rmjn4 zj%i8)1Tkb2_k~Y&7rY5$?0YZXw^e{xjT)NU7_40C(L+Dx>E-CXny^ST_y+lxHCVal z*v<8;A~AKQA`IDWJf4AL=Z|BbnLH!@!UgPRDdch0Q5I&zgWH^@+g(at46iJQuX(Oh zEiVkNJy-@SKsJNJE6&XA7nj5w?({N`Oc8eX#sk6i963wJw>Bp*=}?Wh;m)h+?OdFoxExq!s-O%2pHO-tg7 z0APy{tdc7F{LxGY@pb>RhMKXrU0Tw4ifrh;vzfNd;<_Ju0VDn#85sj`(?R1mz{w4< z#!HU!z#ajSHi=Gk1QnBJx^$1quj5lvs?x&xEzqA;S83cTr`}CDJC{AeWEZ@X>OJOC z2n)rfZ{yX`v2G~QNN52W6W^a-LBzm{AMnh`fO}LLB&DL;?gwt1Da}*#G9_m>oq<0bu+U4yKH|>JrfhlFF&o7=PyT zeYa@6$l|`J(Vwreb9?%DuezipP`KkDtwKwP!g#W3iz8cxD{^)_k?s{waY2heDs&dP zT=*&!@o!lKD*6>IZHk}lgi^>C#OE_%TY2zhExR^u&M~RlB@gXgH))~ak@x%>?CDDu zd*{2XDJzy0mn>(7#7gHm4#`BY1#40$*QqQ|n)ckXHz20JyS*~f-a+>um zH#}}(g3;2}vKMPV$?cypI4t?t5bqWm^C>ST?0(E>Cp--bsk-U0Wn-W_dm3yQ(EKsM zhmnX{npm66Y8cG0Sb}r@CKfst?Gfj|qG9J|Qa4+sTz9rE_k^&z0=A=_FZXS!ukB(X zLUy?nC-G9?$8@_8TR^|FBai95A%BDbV592u2vFg=yNFpMQx|5aW3qF50!0iRGCGQK zP8!$_^*}{TN@d;NUsfmd!JNZ!pwEFd&+zm~Sbyhp0u(1~r+_>B-rWpbyELE|Y)Mg= zk)8jhz{UsVnl^*Ib|ZIy1sW$O;PW+SmuBOaN-_ZqQM(gx=yb zG_ty}y#qA^=}d`c2F1V>r?eonNrtk->)hZlhMG_{WZ=xg{J5Jxjfj=M-JN}`eBBVz z6Pwq%p}AqKm0_y!jiuDM$>kfn*buC^*2t+MtL&!yR{y3)>`lej3xKomSBbyyYoOM% zrE}R?&gMdFT}5B4J0bQG*dr9W8~|lpz?t|0~yRGH_ulEGQAnc5?W3KI+s+t*M%%){)qDEU=`nT zyeOvX=`o9AO}JWqJFds=hEq`MXNnw=1X$8*^@e!?g|nCLUnLz>u=4QRw0;N_|3!48 z)%}eJX~RC)<~P6jb;}re9Z4iXM063YVko|`tKF5|3@COY5fj}7ZM9T-ihYma_HBKl zK{(SJ7k%t}QNDr-d288=a?XBBGL$GKRQe|h^^}(SP=gJYSvw#jtI*og;JJw}GjNiY z$I2~3cPms1!D;{4oWb1W`xjrwhKh4>Z0sV#9oky#o=zGOieMMQ=Zl~l2jyptN`b)^ zliZ$=;IwSR+hO-E#hoACJe`GiHt#o$q{j!1L?Fd*=N3-}_I_czI+I-Jm{!ulZ>sVw z?6Ks{4Y%AFXQJ+r#)S#Yjk!$mSzSz3Qs8ljM_wSe>$0BXQytF)ar7q??XFRhvkruM z9e`xZLpoU_XO5uKK8yPsD4ZQ0c>9^Q=I9L;30UFE6`ph{(u}pD5u_$UrQG?-1gH^v z8{S8K5V{_vhMLLF$1zD`?4&$G*LM@l`rNNsc313)F=&-FP{%~tmYz(xGfx+y3x$Ok{}a7%Y2F-6*^mTy5z~qD?m}3q;*G6?;kYk-}eE< z<-GZujosB|Ug`@vKfs?E->HEb$UeNq(_l+864Yf`(yATjnzn+uhvMx+p|#fwFg(^@ z*^H_K=SI2{^Nf9HHCzQ|l;7D!@B}hTp6-~{I`}g@-*7;)E6bd*7Lvm{xS4SGP1y>h z%`Czt{M1;IWR(hSeAxXuhE>WVd`eHi(EHrdGJ5WsPHc!7n$FUzhI=(+zP9bQz_8bU zZQo&dDdRT%RzzsvC2NLd$s5v~SNR=Ld?TT&&hFySugi$uqXYh<@wfGZz`XlejmR+^ zsuU@jE4k*gq5ex|^@eIJH=@7cMoe$EmUvd*5}a!D*@kXbR72p}XHmG}xX^%$TTf|S z$fC;+FlohfxzHYUv*o%x!L8kHI)MX$v9w*=qy_YCt_myU|=W`v)NNFsNQ4m`p&=MMs{ zKipv^oQ~!CbDxr)2aGhJ+QG^Ovfv4GlJeC@wD=@4<#GC;{(e4hzX33=BOYig_}Z6)mQ(*XUNPQ_V%Y@&As@O zFK%OE^VMlA((BMyHjRP(p!GYu6CeoV=0Z~@n7=D*G<@^JmQ5Lm4?&14fWFzrmcvol zc+X>{hGMcWaT;+x5Lk|mv;${tNzzl?=mnu#n&-E>*@<=^DLUk@=oV}S{FGz~4L>k9Cmk&ya&GU)7ho=dmxb4$ z|Np%8|NW&9DG2^YSjxG?#z+|O z3IKy;-gB63t_=Y!m%e&;Y{_c1PI~(w3CZ)-EFYLkPtdB9I+p(IC|8daBQTV}LmnFR!K|WcNF4PL`xznlgp2>`bWYco4 zk~~m=b!9NWZ=XS8N=lL;1kA4tNw5V|gkJF9%f}P!={i=%f^QCrUOf9!kNxU`3P8t% zetRkp-vQ|r{iSP)t`X{yMUf|>?4vqNX0suqR3bgfQs&& zM_Y5+o2dn;t#Y!;ud{U7Tg$=%bi?YO*CRAxmPZQ&g7uUAfef7~4A zlc@;rv)<${UR_2wFG=bp_Eqq6@a^B*aHRs*%5+XkpE5a_rgkNmr((AdDAV4y5M_hA zPuP{>qL_zp64lR*M{3cRs^PEhyygC6y~kjv{1|+p$xNp@@C|=)--0w^wrjc&!D<6h zO5hj3;y(&8-+rscs4q-t(;}B4vblgjr|ySn0db-vv|##89ij%0GxLSJFF)wW9DDQW1lr;bsQ|>>FzHG-BH2=BpK;cN zz+P)vwN0J%S;^5S2jVOSZ4W#cO`O&m*?XQzXbRR) zqJ9^0{iEsr+K{0``^078`+?VQ#&72(X> zCp4#M1R*iahxryYoKZgM3?d#kcjXonY{bT9e4GeaGsn;y|0sq#(4&x`K^DQ6A20%3h1sJ^|LqeZ5>@zIT#wSLM6^`VF{0 z7ts5zK;X_Znp*T-Qt8BHGB=9KzpU(=}!PUd>K`4)jEzcRg@kwJfzQMAC8P4W{R8s4lqm`PC4MQnJ zp9|g#9yKs85rW8KgNnWEcj?&{3p zCfXi+Ut>sf*@fUmqmrsuxQdleb7y!a{}2-l7;uF*7O+g6*z%c_8)XOdQ{N2 zDZ5Wqs1^JO*ovm)hG+U)=5JYJ66U-`9zdAgp5aIWA4Pelkyg@e z%Zv9he!jk61CqjP*nm%PmN%jhp10|%4>m93>z11uq5Oh}KVNt?yYkT6J+;u;oW8qBW7%fO*G;CL9kAzXYI$g2-3e4QM$o$%_CIYpi#Rx zt;00(gp2$}pp6j}eFhfOoyL__`e5VZqs0P~5B(GlC;nUS$H@v)DQlHf$;m=n9hXvA zF_u{YK2!19c=NOeHXnoU6dr|AS}-4mdnII1C}#uLhJzg+&k8d*WubDi!-u=C$;(eg zxSiBF`eg0Cg%E@5o@+P#UtbYKoC0x-r zjhe1%)ezJ*gyvz7Rh*q^%3!@G8D)5-fMl8(+#@RoXMV|VDq?aOc^QgaH^+gq27lWe zPGCx+BQboc4@r=^Q&N9I%55=z?tQ27?$lEwtpVN!aXG8Op^A7a5iv=iTAzg_C}N^v z&g*Zx>r4Rs!>WCJx3_&ndEI#=ct?>vEy3opR#X#`(m|H;--BT%XZpeV#A_+{K}_rP z6qII}=aGq^NcItbmE!1;=1PgmL|*0zV9nNXUP4;#$SV~J?7D7U7)0u=C0I7f6`t4n zoPm61m0R~os4n&mz?MR>abv+>9ql8}hLobzB=Q(8|;V~nG4wZZOU|kGH&^ z)SB6k%f1v=6k(%%l_G0uX7H6k$%PwS{B=bToMkI+w6%$aHrjjZCFyX?nMQlB$2ksnK~$|po`ioNc( zFrcW>J`U^V+>3AC;#-|`s#=<2S?abI)-_C9{rDq~Dtsx(wJXY32bJ@qPxD=PfMLqu z+%$`Uyg~+hDn#27{^63%mEN3%WpiPQHtpS8 zHvJDu1~c)5nS4W|t}_*PbevtBMKO6Rw@?Xds$ZsUJ1J%qmLI!j(_L#`QhzD?L=OHa zZbsZ^^0f~$UG?TLSSda^W8=E}zG-Gd+B5mXW!m{g*WS_IOtjQ?OC7$yb9ppZWVYM0 z^L`)eoay%up0A8gG@sW2Q=h!R|0!Uwha7@JbAG%yW*JzSE}mwKpzs!+vKW2|5eqMEQ-rPB~F&nI*y z5e{eDU-CY*A*?0B9r_vbtK{?>-pXD{=$XF66*VEN`>(-!!UuqQ(39&3_j2q%+%39Fk)SBt1WArHv-J z;C zR1Tir*B(IHgZ&T!Cr#wSAUBc=D;~&!JisAwlGUI-`kztj!p+uDpzr}ZJ$ZlSV21JX z@!F15y3bFDx{Cv2Mtf$pe}=5Z<2OY>3icx~8NC8_$B-xRh!++AzP;D%7S}&01<=5z zt@uBmaDtzRG@tlFjzh0UM<0`wn+341GAv>1EXX{AEaSdta2=hT6$#O8|gx5%_z7g;jKtz%@WPNip@D4a5>|}QX!zbegBHz@y`K+ zbiUZBQU_6O=WDdeb@?XcOY2$}(ELH_SE9}03LYw0gT=eigro+q|Cbuvs5DC24aBc% zu^LYdBl{Glt{`%rRDBSP^CgFwpRE(WmihrnED&%1-6uQoNm4u8q{~^NX2juG@!;8zvN;JXJLlx@jdsFZ*!3>DuI;xXHHf!ZfTidtH%N!m>C;qCw}@R zizX%8_XQN!9N63s?KhcfgO=-za9PrLBL3SJ0UF*)mfl%j!jBU-jnuAynt_jl!WMjw zBf1hdrimiUdn`kQ*W>b7tgN>qDrB;Jfy%tQ_cOepSora~dfg6A|)NI7}g- zfw;|XnQh0y^EFbQ$PHen?%gb%|{5EWrYS6o9u)-=uLl{#5($isxD|ykX5-`aL4%N{{pG-n^yn; delta 33684 zcmc$`c{r5s`#-FevQ;YC%bJj3>}#@?eb3&6!3fDt+`S``ErhXeS!Qe@WEm5RXei8( zoyaow82gOp=KcA+f1mI7dA`5nc#h*){-~qlp6kBO^E%J-I`8Xzov*9GuO|n(PQEcc z`EIe&T;Yt+#!D8`j;um0t;PsJ*Cey|>i{9sbUWEe@Hqi_1Lx1=;J9|GNmTL_V_JJ+ z^BGov0ZM|t>$$KVVNk82czvXp)n>$=&@wug*6ehtH5SDqxrnzNwWl&ufh+8zY@9e0 zkAqj;(<{AZAD)f- z84s0qu<+~EY+w^>{U0uY=ceN2fT=8cm70p&m#@Q1&!hdvXvWI;L_Y@l# z;~bLdVvzg46$b?@c!YD3FqN;V(m3Z&OLo^{gb^Z%90bNjZ+pn;fX>zvqeG46| z-N^hi=6a;&+fKRIwzgz>?#HE>cE%F|^g}td>1;(PmYQ*ss)H-NW7Jf?-<-pRAO&ztY4h#gRSuOwHVGchWexfrC+dfsK^NiprwYMgHE0z6wv@>iTP7|` zT{`IO@MnfNOi3|XmKkkS z&BB~@_+BS2DZi~vHPaPWLv!1DZPLK1JM;_iSz<9=KW{^JhER&KNz0PRzErkYu*Qkr z5+C`sbt31Qc+`;oasv?=`6QHO_Fiy?(lXNN`M&cSCzGK(Vi8U;ruyW)$Ou5kM-%gI zeVwUtVXXoDB3+!{F2D*|gGo*#>5KRZ9~qfqrqH2x%82eNfGLbrI9` zqv{elokzjYD08&nh|XkSl5wYntGX-tEMi@ZN~dlm8~52OMys3-P(Kn(Nn}x1uD29* ze$tI65)EfPjJkPOo})9<8qMFwp-X^wc>p06kKi=ag?1}-M2L(P%h6C3B<>!Ckf}gg z8d+2f;crsM>GY-BTntr@gBjMJ@&$->O`x zavqCkgKm{07PItcGmgpnO9gJ}DxBCn>k$lnDQ{Dvq*1dt1Tf7$d+5GM4>gaCTeiFX z6wV+?-b~Y~6^~e{Tu@H!jf&g`7I#|IB_+nC_O)R&0g+jj^|5fgS|H?tEV>r3 zjy&6)%d0-fHfom7@%Z~vLf_Cist31IUoIE<1`}@vK8-%a7$Epp^q0q2!}At?DkhKj z%RWIAnk~Ml4Z`hG6^=we@{5p`*Z|(N7m&`)Y}~b3iy1}r&0F;k)RRN1SSBS$T=-8IikP3hd12F$-0&=XzW3hcGBGR9#O(- zBvu4J=jCg-*gbpS`=m|G$!o4;EY%%PC#J@pOg%J05keaSRYi*Fa|ekL_>8$W3rcQR zpn9#jYkGG_s6Uq+eg&r_i z%{0H~PI)&q3PLk=sf7D&4|pV@OQUqksTQ33IRr)+XAsqvb#{a}qdQeK5AJ$|X*dhj zox~tInM55rC-9E|P%4eHwlzBYRwP{jcRIMxJH_*b#?3Lu4>=t7{a8etoyuRlWogxc z^t@e3xQx&BPI;HZP>|1i#%K1{^1wCtZBfzRpXTP6ot&6Ojis)z6l{30RIac&=AmHW zu5!iEjfHf7a>Vzd+GH4SX|v7sl7~(uw$e>Rsqh7GiHC=tw+Cb@XV^c@RI-=QLd9e2 zJhCS~din;E2WprW=F1Z21k2Rh=Y}JrlcJH)RwFjzWA7ksk{l-OHpXWI3|PotU>Vd& z1u+}*l%axt_I*u|&cyd}MOZ80eRSRfDurxEPYCi+D zRi(8*R(9vXUo|gNqc*(mc|7eARoI#*XmTp;hDO{RQ`flHeqTeUU036K?DS}17)$xW z5Ak1V;$Kz2eH3MwR`?+7meE0S(vN0QGU50bU??-1uj7Pccwk+Cr7vh3>odc|Q+a~t9#mGZ! zJZ%6SyybTBAjnk@BdO^iOI!nwAfy*d(3`Eu;q5XwtuPfFB=}Z#(?0%=%0>U$m#=oT6S30P`_d(SmC-*U{?@IeinH51c8^KBeN&!*0M*sqeDo366 zuCHF^SDX2E&{KzXTa%1wmRTh)_>K8Z1p5kcD{rj$O&rp$vK)MgY`3^Q@M_l&_?lwV z{HMQTcZDk`QAgBw@pQ!@Wp)2g1n0HUY>b#7Zf$Z!fIKO+8n1A3|DN(qve;V|+u4A| zQ`~>T*T(%06Jt-joyuHP=LS4M^YY=AL|but7vO)c<7QNlg0wLHQ>{4fu+#+_Xf;eP z;}xV@DJ)fi1{!by-gOt*`5Xe}fWhTjagUKq0^GP#Mi@V1s}5&aYSjg}_;s9)CNeb^ z0%e>197zLRR7G}%LK3NAg~DN}bTrWZi||4o94=hellw>{@c)C%{}c)Qf3(j3l=+_` zf&baI$#MdmT;rY{QC$jND zs@sdEWW*28oBPBcO&LG+yI)&AGUeK5f)7X3lh1Sq?f0kPtJk~rxT(Di9Z8 z8rjc&@yD9^#^n~=im4|H47niVp;7|Y6Zyx7e?~;qK&6>{jr(Pr7`cWtEpFUf_3}zG z{#sXHTfx?g)`_Mtu>>}w;NUP1b&Z+BB> zye`1uJShVq=x(S0I*7N)KM-ko-rNLj-u}ppzew9NTFZ80 z-IV4Lb9dyu*y=`mZ=2eJ&yZ@*O>uC~!d<=c8Z?`V%1hT)S$q;DT{o8oNN=}FMuI+! z^B~5o?3LsrUX>J?kyMbCwD*ki>oq8RTT(2BK`pvdc7N2EI?smN5$=LI19M9_=QBm@ zcrkmx`HZR{!Lru9lc6m-D6hQDezj0s6~R2JZdww9?i~m*@(FHW^`UEqfZ64%WNr2^ z9}%}P$$4jDrsed^Xr`~;db2_DE_VQl)UCWTz*(^g=`Vfd_t*nrd*lWiM9QCkX-;W& z!;h-N1FLBT(Rcl|rGnHNOQstEyY0|?`=ZyjQxl&eO@o*8kzzc}@$#?s_?_!D#?Of3 z_?}4nCwWtk+IVlU(PPmCVJwQ*Ned{x8Ur$F;l>}$_rtSp=e?V7t_E3oG;*(~C*B7WD>{;igZJ=QQMo#Y(Y~XTnn-E;WQJGJ@F`+`<}AWacMU zVl85zxS(g%&U#EdsPpyORkyV24tF!Oz8DrDuO+fHzWEVd#p!c+Nt!tyKH^pD i zQ`5To1_1guP46ScCSEufzgRDc&=UQapL=WAk<`m2=rOqb(+!CVS0!7J?`V^08A;N+ znNwa7ITl+UnD@4p3hgIQlaCq7duF$+jPqZ`V*> zsC7T?D;yepvY$nL7^{C~}`vO&TFcnz)?>JpZ;Lt^In-Bhbn|}_Xbe%uULd|^$ zbjfdMz?-eIKRu1fmV0AqT6dKlBj+2e)!15gm2|vAUKP{kQOfG*-m^GK?scnsc8sHk zy`%`{!ZoTN3K2Q8OG z1bx=~9EDu~o_O>64D&_k#uYhp8I1`h70JezA_J1Ism>TBuRttaOd>5T)`(Rnn)er{kEe}M95hgxUB)p5 z2Me*0oEPMEDEtImVZ3;Z@4zN2$rVV$EVmjQtxFfI#*4;gr`V+bGN8 zTB+>{FM%R#@N0L0w0O9wC9-n*oo0K*K=X9%6&Co?wZfG?o9j57Mmd^nlJ2O7_xl0w zw&C42nXtNFBT|>wKub>j@gW|`o!-7&6!_Aur1^JT1zl6wHZQKYWu*ep6CDkgNvR#h)u@ zqnJkY6Cuobw42lCvZz@2wijAV6gFR`NUracA$f*hK6JU>s$(&u_u)8i{F&suJNBN^ zy;Nqn{TNeY`2;HiH299#a7Zgv+-=i&^l;d3wDxXWbRFC;-wFKYRF}ybj&V~Ye)l{| zYbYQ}B63&T_I3;gqZwfy{r*0|OGJpClL^#vqHTYt6HL<_Tttx-M|wnw=V1CMp@En4?4F~)%h!mrs%h8!ihB#V`>p+;uNuk5oo<^NlMl2~ zcyL@n&#OdzQC;FdyYu4vtXn@V-bD&VS^xe05oTPuvFXO4%S!5A{(c?(6v7u^7xfCe zzx0|O>iaewZN*v4@G_i5F=U}pLis35NC@z+T(J0E(OaEvGaa&`&C!;9j^rkkmyEB( z0Ctu$KK$;^RN!Yu3xvDq+`L~d8dg}k5Ql{ptP}BkMvE`nG&x?!4r?2N&QSI4A4zJ- zS*X!fXURm|c&sKG!J|}{8O{$PKu@W2jsi~V4lC+1^R_I zuhKv@xuK{#u#H8i#`0=rSzCnLdoaq{-{;R|mD@T}^90DFl<{X#lOA!ac(h34gZ@*? zW}A%3qf56LkG&IgoX0n*x9{wo3~I8%V++*%nHI^JSN6&)-nnPUiiqP*kBTN7E=#L= z)M`#==*q&{`+?vTxCSyc#@ccpB^97&V!r^8F4wzk?lf#CmldoO`A6ucVemzh#NEMa zIp2a6)#_T(*`E&&TccUr?E9amTB(qs}Z zeYz}zGx3XTcEpbrE6q0=RiIoY{N4=DA0%noNShI)fpn`?<^GSdZ}+S@KCHYhQJTGG z#Q+Vx2)f4&cAO9nCdY-MXrX6rapQzX!ywRWF!-WZoD2`v@#|9Ei%{BNt1|LN5JKOfrv?-oSB z|EVJSe_!T*iUf|Uu>TKb7S3hd{0`w&+?fm=&+sP!ykHf4mqFSbx!cP{xiJ>Z+q4?I zx-mPSHHfGCLrC0<;_-T;LtksCMj6*9<98s_(bd+%^$y^JnQux;IGJf-*eqp#wJt_) zO|gPJ5|+vU4QG-6_39nhs3CGnW#|SuC%QEnx8X~zHbZ}d175qv9WP@hv0g5QlTqE> z0=N#p{}$755mG)Z_ft9?($9W2cDd+a zW+M0-6Lx=UVfujf@ONWqaz|43vv0uGW(S}o{!ux|-UvC>GSC^fl%y;{#suW{u2q0P$ zz45B*gC}QiwxXC44${de7X$-e`Di(ehm?YacXbxq1jz7T5C~v$S zO@8W?Mhz2<-uQI1tf6c&MDA!=w}|}FN5TwXbVbaP;Vljy8zcSP0GI~jZ@0+sgmHHp z`S{pzxqz&M+u|~VdJZ{wZ1PWd!o_23?oR4c-EN7`GTVaVG86EOI#UpyGv2GF2I0Bj zO61J`l~sOkaPs%S(c~U7j7D#*6lWWBQA)$)*@ppcRxLcwIKh)Ike%?KZk`2 zIFwU|_NxR}dmd#$PEkETv$WDt(RBdO>WP95U_ve94D2k`KnLxF*-@Y}nNmrs3b zpSUPS3l1w~gPr}PS1N+DUUO}wPL9E1g06{wxUdl{Ru z`^>U-#uz;g4$(b%PRM|1wuzgEr>QO%IUy@+PCVrI2pSm~xB|CTO6;)#ehCQxYj2u> zLhP?A75TV_@n8R z?DqOnmW2C9s@ia!8$QT|4bj(I1J&P^g60-&2g6bm=ls~4P{hvp5PDS!Iif3wd!Qc9m&75oE5YZF!>kt(p?Ym zz3Vt|bdGaaDp~zV=R3VL(ETXTZB)#ncD6 zHVu{5HkEmDX>kAh{bs4~)bJk8vQ(aWNoNf%oJk)SSr_`{$oW)MuQiYhLas;`aX<%6 zPCZ_|fkdm0U22<7O<`l%JsK!D=q4+yu)^lRK?AX%T*u_}&oj~VTSl{t&<4GlQs#`` z^>4Z0c*%1bMrVa&^&-(^33@dDaD~dqUrEIA)MsZ1Wsv%dp!S68xXl7Pt?9uj{9=Kn zG&k;Jf-WL|9Qc|D9$Uq)!JiSsE&()>Y^}Mz>W%2G?)yNexnI|9{}#5V&E}#c}C9_f$HYCW5$N>~m>f!_+i0`IOe!Y=b{- zCA^w^nd4?JhiOrpj`SJOq~Pj;YnnRH=D0OQzzFMGXcwUV)D@k|I~EgQYdyFK8)AW>Tcz*KB~n z;-SaN1Vw2#HdN2)j@r3Po1lsh?JmIg`YPhrt?~mi=_ag5LhwaeIH)6wuGB}L%ZRn8lnmO5%EJutOt8SIA0d9P;bR zl#=@zn2)x?u{&-|1Lm3}R@UY^q938$uiqcE!t3$eK60$0Rz0lnJ{wVgWBV&ZY%D>U z5v`C{@-cK&xMb>aZ5XL_nFC+G6*wRFXZLIPwbg_GboZ9ru)YY%tsq=h?F526Kk{n>IF*Xq`uMsJAwT~Vhm73M%sy1^6fj4PDtr32^h1Zw-pvEP-qQEk z-q->^z1Mvlh>Vo;sJi(^uq{YzZGu>xTV!9?woWie0 zE)&EMRd)}m3?ijTtr&!Q=Ty9ICS?URVzEE`d%yve;5Z>tTB8 ztjz>1?berx&P$e=3^;00Jqe>Ab-@5^d^tQF>+-$D+0JSMhFcps^TeLHu#)#0_;-5(KJ zr5={i!wlv!npNp(l0@UZuW;>OUrG1C)i1Ff8Bqo|uXbZos44JU#U&MhY~+EEsG#uQ zMgqfMPCKQiv%VNc-N_~5G3RcXqzl)Dk2#p5l)ZH;wh?aLc*JSCx&UxDlU0yIcIt;G zpI;Z9_uF4f8h1EFQqJl1PIftY7w!9lc%e|85LbNh@S%~q2*E|o)V!lyX>haaeG2GG z=L_&H^97*$C=Uglh^-F1S#=e-DT=d}mHRk7Ise+`B)Hg<7vWOc%>$fVJzHoYT@KEX z?+iXa@q66e%B^qG6cI9^Y%4RTM#RBoteIQ=G6FAhX5R#ZQr-k7ub$IdI3PG&w0huFUqorx5au;}pgpSM;| z8GL{-ST4JYlT=n{c*L#N|EghNuc7#z*USWq8#B%WXfYCMbULL?4PO|Grwpo?rT zV6p{y=Y!357-Yq8$i)j#U>VKX^YC#xi0A4Cdd$5dke<|;4?ZaKj-9XTjT`0*?#xvB z@C4W@2{H*rYqq#Tnta5X90{w{l+4dbTAD8B{9 z;sYf4JakIPYC~?mN!pBykgdxb&$r4)01`hClV{RTiE;s*M9IFVPO+h$Hi6P{+Cvb@g5bzZ7-ojWGsUWq_Opd z+$X82Mcn7&8{+|YnB!2J9aWC4z_P33#>x36Co`^YAZPONnna`A!Bz%&Gq?Luf6lVL zXaUwrj}F@7JUA_|h*s{VuKB_yU_;U>_%VrfIrnk!@hPw05-3~IGbvTS5d@oUwXyPo z#lZ}fi`@z2cO75Iq8~EOj#2o5xH80m+#cxU_r^h&;WKB-DU2=4R+;;HbCKhRO(~6+ z$@iV@c)BBqnqsx_#Ijx~N#rZ+7i8~q%J znSAdSR1h~3!XDg^nL$pQ9@a-kP=Gvwr^Z4#n2&@c+2>*yw z1o(NI2z6&8%xjz}c!00#b^+^Uc;eD%73SgJG#9EG(?hyEOW1&n=%3ja^Sayt=kQ&e zkD-OCsKps6PWGDt)|i2X3?3WoZ1&rQ_=16Su_vtS>BidW?;63NdVej56OK0Tyyf!w zK>AboA-_v1kW_fDMpvZd@Zp%mLx%BzoaM+d5sUmIdHLZTELS}aNVPIncvUy0;&uJ^ zL4+jonN^wbyKFv4;=>TP)eDj}Qe)`hzV4xlg>IGMR_lh%2Uq+fx@x|NKp`ud?!+p33H;8F4X_CR4F(NH_0OF|a+lQ{^gHWgJr zb}bfZSvD|4jMScu_A<5Dxnj!EcKoqP1JS!zuom+k7M!@{6Zro$Onp%shG$kRM;G^vw9!w7fQc_a->Nhr`s;i?? z{EV9^uGABxy5@~+K-`+^vhi{w!=cT4CA;_=a>^-FX_s91!&x>~ma&29eyeLqBTbDZ zhiC750ogB}-6zyqO+TMRPi%~oJf3046{P8%i6FiaY4k5~e2HjXEReG%)fbvyG6r*- z<&q;bGy8A*=@V^s=8>C*ZuY z6+vFkobvucVuUhJ!0eYIEdLFIyc~|s8~=L6Has=u`^@Qb<@KaQWq&Q(fmL8NXnena zHSa@GT*xH()^||gr9$pBNLz&PERRM2SGUK5RzYS&=HC<(YkwBS z<3c6*IV8U|dMxZKSlBJT1jnB{s!Sfxw9>%}X^%^}D0PsB>V4y=?0Hy814ha1qq>et z_$n+M(*N?<4qv!&Am03UjrSldRS*XD=vt1ds1_NersE?A@Pro~%R^m!h8}HiLY=+f z|L-~AYDm;6?aXVx7<1vF=^A%^%}widt9;a#XJ&8uWH^+wzWBF<=)KP982;Hf{vw%p zKKx_D8$6~(!FDy;AAaxr(7$EFf|8OM{YM4a!?aXO24v~9jKUHV{6#Tv>Fo8fLgO~} ze6JMGWAi)^ZpBSP619Yfrz%spnjZhU?MtR97@q1%%Adqy;xRT~;xEOLt793O@o1_*7H5oe|06^f36QKAhKsos(#7 zfA{WM|3&Fw8bBE*aqpeQ#53`OK!leUd!1uY&ZPg;3XcdM&brI7@uQ3~Rz^ON!Jq+* zwB35TLFCY1o-20O=BmyQmXwO`1$tKgVQ#i|Oe(Oc5G126z}v%Ek_1e=A-iqwqU=fE zL*?R-x_kKp!gViGUp01)C|cM_HvYxzyJw+>j2HdB42;Z4yJuwDVttm?+?5v2{?{Gg zTY#6zhW21yOZU{V%oQ+~n_D<;l77MBvHr}ipH(9klj@==Pb1xQ!j1Q)ujA+#pgnPS zh_4L!qUDNJ!@#tU&%3 z9V1Z;FNlyuZ?xyN@1_>b)V@tOCJPm0U7O>$awK&Wlvn&0||B8z1C+6q>sZKL?xrbzp7OIJ)>R(pGYo zK|>d_(sr5h-miu1V8B$-(tUJZR#Hn6CEWNmwyII$(*J_b1f`2c^L*K*VHtj=A8j3z zJO`s9zPNW4N5oDBF256Y6K5aHrh>t7`tVEWXL+^g>`xMZsaJT002_r6CgULXdF*(lE?o*g+;w`9v#j{t#Z+dEQo` zQu)ETM77M@IO?P)mwp}OqP3@e{f0!!`})j`RwW!nxIrx%0w0wRR$~t%?GA>5fPW>7 z2ucS~#wlXAGx{9W5>N~pVn5}uXo4ZF;Ph{hK=wIAusmy%Y@{|V%q--bTouEe7_P(7 zUje#uyW&N%;KtsvVA_Cwr}?RP$x|KTKPuBqnyKff6jA;IDq z>wGXBfIBP|B!$dg0hs6>4@0cN#(rLfKlTwlyml*bCupG%hem9hNM?^O+#zR4l1I`a z3R6BAwd(j_9QvM-GyTRRuCDrb$dB)C)zODAzOp^(5EAbSV^g2e1ZFf>4qtB5QI1vB zzMblJ*^1|HT~lI;RT ziTxEo{LiwAzG+nh52T|n}GXpmc}db*#X;)9T6-}AV)6-2>@bm zby%m{qP;K<;%^0e-MNAtcKH&ag5jD}(}`m) z7)U2`ya958vP|qboaW!uv-X-nSo`M}CRH?{FVHR&YKgQSabM-#w`h(J!&+gf z!pE=uJ+x5x&qwx+AL|v&#{@JB8t83G+E8MLjzi*_4M$>-4&+)A7rZcS# z*&YYKAteIS?vjZux=g@Kryde@g%jS>1A@P@!GG3E;uM5a)NJoN+yn`ab--?l!&`?^ zhtCe94x1XIi2tC#ffTvI>&JXIYrY7U1;Xwwh_^Fm2N1!pY?7Zhi`sp^_Q1lI%Sx=<=ojEhx%keTnT3x7~uRGFO48;^Hsf4scIN#I8qII{msi17umMNR`PZ*7Zyqrj6Xf1K$n^B><7zdtuebP~^Z z7q5(lB>LCTPlO1Cj=!Lm>KoqLG+%9k!L6oI{_w9J}3Nn358HB!VKnfwUkJD!7%aO!uvqLd!x+Y$)2pIz0Lhu94{ zAPQO~d;kb-`p78$499eP$Hc0Li{RTV;(`ut;2+O7oGsMw`MwxBpH+8W^aYUm>$lR= zh*bC;VpgGk!?fBagPY$>S4E11y#FO83W;?qktH}`tZ2knOaf!Rr(hmZ>B|boFZkLr zhjzYKL3*wyrUu_i1cZ6O$Hdh3gDIS5Psbggy1=c0X1mPklSa@6JRLQ$^wSiZEetDM zDc)^c@Yz2nVI>t)wAb(FZ_Q{3HH)0OIyJn-pw3}vIu`6G>q#XPgfz@t?ob}vgqV&_ zRc3c{^_;DXtr)sQ=O{8dIAB~NA9%%6KX2J!>}do`n>=~vU1+ai6q}^TPfRzLp0Ns0 z5)1$Kt0E<1Ve+2N&Y2QV&)J?sQUD#Tl*jee9^#oN` zMWp8D+j;6s&c+szA5)%yc;vJ0D*MZc}s|fOsjb@H5FXK+R+_ zi+?{)ZD5axP@Ln}?iMY(lxPOzG1lDh%7_=lJs4rv_o&SJl%6`8*{}ZoV=7`|q|Gi@ z)IKPxkp`;RQ^6uZIK9>twIe)=R)AhTOggP3m0!JW$Y1hg|O{-8AG=v7EAOyIy8L%ZJQ0G=M(S8hpnZkT5AkiWwSB-9#+N{VA z>kwYPWYk`+j(IwTwZ>uCNA$U6iQXqybT>n5G)KxnbLuid7R6^(!vbw%iJr_yJDDxC z{2ccC{9%P5r0d^Hr1Lr1edlu#Q?&8>Ya5n7V!kB|eS2*Aos=LSu*S=Ou$ZKb`>ex< zajRi=6@Y1EK9{}_scqyb^>Xev9pJQPNPw2$l?S~sf9GH8gc1P~U;QCwHNNDoix4(= z0&5g7OPigzBLEg$ldr7YB4F*iX@g8rr6rWdsfI^4nkJr)05N^sX)5?wx7K^Q93i1k zQs~9QQgx;m*b6O+8LvIwX3n%su50%e|2cv8l>Z^4ydb43wnz^3+R(2U4Azk15)w#1wIS?<%IM+_L>RS{b1|eDS^x67k-v znC-5OMj*AQJS)19;Cl@&tjPA$rNmHIujh1OF@dl->Cxw9_Ve``yx!zxEh%l-neo!5 zLk@T&Z}^Wt(S{gEP(l=xElW>Fj(7`kahd7L?k`retSS8Lw1ZY>KA!W&+P}+~I;U}; z>l2r(q2!eh`DW%Fo6={>28bkL=wQJ+-I~@7B2X0y$!{n+R4?Zs?06H`A^7Ko;bm8A z9$M9EC!sSRKEo3qm8W=nAN#SU6bmn`?YM#tf6-!C5>@{|{v0$O!ON7PI~5=c#z(1T zG+Sxf`QfAAZ2ve2;P7BGbqVD3cOIRX>V`pjYo^mlg0!8R>EYdi)bpFHWPk{p&9U_| zuC@$D^e;IxJYsHAKYXI1WhLzc7km~SwJ%n9J7ZHDlUVsidBK3)iua&au3Tvw% z_R4bI0rCrO>n%h~H?_~#FoftF7193NrvWt4-Nq*@P}$31BOreirV)tPxAhZKayg_s zo2d^~8t5ud*|a}CsgBS>eS)_iD~3cNIxVb+zJO`9k}I>lDRZ-S$AC0G8!G2;wjfpIs=F`bY-M&ew}8GrFhGFLX@ z{FSS4?w}Dj%nnofKN*k2)7KHt?%a+`Jcpiu`n#h7vI{1jxBk-rse5 zIuISNs>jR9m4bBTH4(08)ntf0YQ@b>A+wCwZ9sm>Q9Xn*i_<5duLzqFiI(_NHA6%0 zv2UFE9wX}JpkLzQL#O8=|%#Nhc0@|$6HPvC5$8I@WC{IxG>5s zR7KNX4y6=pU8n(NLI&h!ad?kCfJWf$j0gsZyQp*odQl_4VI`Mnw%>IbUMrX7Q;=5f zW-dD|R8qol`V^tB$x3J(B_|j$L9e+2Nu0N0>vsYqPnKaS>T7BPbqVF&PdsGOb0#`{ zLtX1S-P>^C8%bU$>PjryQ1KE1AgRQeN=g-K^q0zN1>dxhF04b@q~93-ahNmR>6_jj z7_Zo_;C-+t3AWTVK69k^#Cuwn5*NsLDimX2&OvgT4bD;g@I%zO!1R$^dYeCT1-v6} ztiWQyJ4k;^Sq*Wq=Jye?E*z5BcD^-wcaPfZMV3md>>WaB2u+S({FUSSXG~mLmKv%l z{X*%nD%juYaSoauG7~;lu7Oramw7WKVHPS=b zBtw73u@0Kri7pV45wQRUP6J(W0PJ1;eF%4DUZokkl9)^8A^EkYIGS`xFzmuum|<{U za?*p(^ke<^!6Yv&9>((OO9YF*FB2S+tnjwuXt@Ms+{4$7VJw^KNYCY9WW2$z-|kGa zijiLvbhbrI#@gy?Q9B@=y9v4+$Ap&~aeDiR& zCYD~sK&voTZE}4_{#~fH6+6PkO47hD22xG^@B2rBQ3_4R=2kx6Po}3$EKEeI&_1I%y-a;1-(xj}r!CIrv60?1+Q-w^Wc<+#)@jJ8dWW z@4HXdK^$-s+aD$pKV*i~vu$n$R*vmFq8G#44c%JAqm z*0Bk|ITob;>l|S$0<6e~@egYom1SMdF}c&4CI!}owyEyE{VIaiz~>-TUPG#}|26<< z)SdrkRLHb?sEo>Im9}mP7gJiaB#$jq@vRS%YChnGXF?%i_kLm^024?jp4d7mdk6DQxQXi2y$kd7h z+w}jue~sh6f&;D5ug_~-xj+BMQ9fR^S_Km3sX(j`B550#-P8J?iMfWhY;C%p+Ha zKIc|k*dkxz6o`AcvV9rwhryRf36KqfJ?o@AoEz@@q`a_el$Y;;T!#~ZRU$+~$ z8!FtWOs*8*KkHU-_Ujq_MkfM=7u< zA0%VfvT_`|q+UN0EwmHmTp4=Z#H(}o^d65&b^bSGgbS#LC8)?ggvYPisvF`TNs6$1=HbG`m+jyS+m~Jbn2&a{dLW zOgy1$Fgm)I><+v+Gu@Q<-&B~V$ZSdCWUz@U!oB3y!ai)bs-ym(G3M@t%l)Ot53dfC- zCrft7c-wVaiL=QISl8pe1@Qd1MKr_gOefqA44yt7R}HqAHl$MyPR87DjGd5FIi}7n zZHeP(LjG#c5#ROGJ#J$_8mro($w^lBWN}BW)VnLyO0e1T#+530u=zrj-n1U$AuNg0 z!Y<#-Ih|m-l;rAnNZuY927kN5SX5NBWm;9I9!7oCsiC^|I?*ssDDlo|W*~|Nx;+6L z2H))HP^NeW{k9x!@L4nmNak*C;J};+r|jT?X5Fn?FgQCn{C+||{TlQ7uBg1uqztRD zj`|KzHvGnXQpUjEBh}BD7>{Surx+C;f{Z(>`^d`d_x_hm_QFzQe869y4=Zkusv=tk zE*>%eAo8trPeJBg;+P`!$@iIw-LPA-TbE#GWpN;0^T|jcd`Go-XtFT=&6ugFd*Wjo zL-~4@d>(&)8v`H9y~|7Gt~H!oVEgIt0{l%IF7fswaX{%hc-uX-E&59HTFLL{$Nztb z5{&=VE!fW=ZgP@1F*!faA)5YY_f59UB?T_lp%4j+$UAQP$a!3=GRKq#O@1hgD-rKI>vKxiek;*kMRGpNI`}lEZ|Py}pcOu3MI4-n zI^+g8lgL5h??(y%wHZ6SweFk7&M<4qgmohyD?*+)YcCa!7x~--)1ZID3WpjHv#B*Z zz`sbJUfTZ@-fy{4I`>36piyA41TJ0d5k1RanQiGCyTVI|d0;{hE>-^mJfWPu1elvJ zD{`-Qze%}(kowT{5mDHlBt+~UWzR3EHToL06b);y2g*q~UH_tgg=?5A8nKXyz0|DQ zt4R$58SXAV=9khMwi3&QFS9rliG?a?rK6(J@#eT}Gj_<8VXy*xu zZZ49m)1bUZwL11AKk@WFT0Ow8#-s5{E_IxolG3wsO#SONZ)jEdB}s&C=N7WaJ1s;m8YN8;cyvhVFCAYk`@ z_8QCsw8+*8pu2Pyz*exXloV$a*g8!pCj~NFn3G+U)K*g(h_5CJ9pjSct%FN1;n?Bm z#XL=I`mm#8e#dvbb9+a$nIgQwUB_)B4aM6&!Jb>6HGbQWOnh!svJz%t<6~n6^3tHT ztIOq-DczX+KW#vVl0W?)t-WVhQ%xH+ijM`wf)(kgNKr(YT0P^Ye^_Lkrb-}v|iE*RC0l6ibxZ=o3vGQkBu5P_Ni;GCOaA9WH8Vm>3c4GCX-NXv9WE} zf%YLYgdaIuQp2vFyuG+NTZmXLkFkyEZKuNuk5p_pC$Tblgq4_x#fYMF+$& z5VbwbSYq)-`*lK=Td5BMd$uvp2zPZl_w=C3 zPa=6Ur8ajj2tVEvmWqU4{30V{u2w{DH7#xiqj&ax5iLaPD|RNKS<#Bwr6HMFq4%TJ zi@RABgjnKk*kC=D*jwqcm+55;)f=Q+4DLxXW~d-83jdT84>yWMv#@yjy%EoEXlPJl z+HWpjRkz+7ll)Lto>e?4#5rp%+Egzlv$3U_wa_gON&VWvbT1;VUg$6P0D1+GtO4wX zq(qQ)F;)-Ve<&JSu0WlP7G!weJ^AuCJE6A7nen?Q0 zIo)6801F;Cm;6aPJ#!^`0-8(Q8T;_ob$;vaDlAIGTmvDKo1Pl51Z!O4n`sm}o8ykgg$JvInoR(SHGU z+yXU}>)r;09)KTc^MmF0@IT> zAFnCO{S&B6-vl9wx=4M&VZTJj_s-st?nhzH@iKa`N=11WFOtn%S`R4d{o>ltKZ~TD zJmB-JNlP{a=0%E?>a}PmPdr(>wDC26%2?3wc$Kn*H(kk(g#2Llkw57$h@1~wRS@Ew zzTyS)VMi2wXIIv@vbmCLwql+w=#)MyZ@g`r5y))D9u#{%OE0eKwi)N(C2DundL_6k zvVZAMuMC*#e*V|K1%!cep_h@%)7Sy`h3HA1GX6(Yg0|iNAr3&lnFF&4fI0B;N&jt_ z`5eZsY~_57u#|?E*iU#bb=PC{p6Au)5G$AQ-99wdPB)vH*+LsUc7e#o$YTsXee6FZ zosRSFqq5DDG1_7ExdC&WB}%Mt-1&;yOirOBlHR4B+v5APb2Y9{>4ch;=}WFd53yok z%rs=hmEC^opSaFo`~3GXT``o)n(pZV>B4sn<2ED)Lc=P0Z>_Ex9eQmO5PLd_!e$(u zsTC=M*)02k{Ac-<`~&*m+8fk2UMqas%yW2DEa3!s)BpnjjGApppc`tvDxcP<*mhH# zbB7grXF=VRpMfCk+p2}1RU}7d#RB*&?}sc?xlYyivoc(@^Q^1$mfqO zRuH}~?&k<;^wux#qW42AsP?NSkBCji`0F^oA7I&LAv*oI@r_$@%Y~Tbt}`F;b4Fo^ z2OKc$b3nG=hV0bxJrD;ouU#X|66bjiacdPo8mEZMk`~M~=dvR5&gCgTYp4+0#ioS7 zsM~^`;H&dEi2Ai{(s9=+Tdvu-0t1^CkLpDSRQk}Y_0c8Rm&(eQTGea@9W^PQKce(i zlf5FV@GpWRx1SBfG0`X;gLQ1WuN_<@lJsin{z)5UK(OY%(|1I2G9ki$V}Gs0)B?&5 zy0Wt2Ig|Ro1b{PJxea=rW4A@A|8k`ngot|u8dgDKvfssSXj0qsUAaOnu{m4|?2_6p z%StG_tzdn`RK_A7QwP2-4JzFjASUhja^PwA4JwR8#FTxHj0t zgY%s-ZT-IeRSn?{7R&o=?n#&92Y35ckut`N$6y-+F6eC>z%DdJmQ_u|-Blyjm_hZdfxQm)`lj7U83asMdv zIG(jSN6%O%V1^BU0fBV+#D!m*&c5^;;9;kRNSH?DtqFL`PUT55UV>xvj*NrX7@yTS z@>B@-{1OOHvHgzm?7(;+o$mjEL&7K_kX~Prr(4aQ+8g#I0|F0DfrbDL z+hqq))O5o0srqqt&O?!REni7BgosU?fQgHCwySk_!+!}(f4kY#R-59h6E?gUUXdUG zgz!;VS#_WX4r??saN?sxG@&uo6vbzCPoC}dgKFi9;39&7qa(Q&79>=Lj2f(5{hwao zU+|7*F5kM7e+lZG?X3=c%^-w01@jP@=&R z@R-$o&Pm9 zq@m%b|DU08K`no_-FS9HohxAjGV|#*vaCC7a1_QMIzedQE!mj)*SjUXTJ!(DT2AlC zCyoAqdN=onobel!IzmSG8twvyp0W&pIl}VX)S))7joIOZp_aE7evu-8rN-WIol@f~ zIP_5%9T|QB@7tFb)}dGxxHoQXZOgD8(HG=FcNzb+)Hou7HuRBO1FGk^NwS~7=3&nd zYqQDbcH4vp@~GwSatedh49&&Ox2gG?Hy%a6*^6ajSC2K{^e7C{Gz?fP>jN~Kk|Pz< z7y~7&6G2p6-kEVV`+mDuAH$oO>(Zl%K@3Uh;S7j5&U}wEbD2!mr;c|@JdWv zSHV4`slwZz2H2@qCMTYe@iWmyBf?6D!C-P&rL^#bM_R1d=zBJAy470y@0X0uoeE1I zF?z8k;jfg$RWsXhAfY3rh3@7L=v|ev!>wgbi&!&j!FAe6_^Y^}{8`>M`y(wqY>NfY zFc}w^N{DZrI~<$p#VdzRRXBXnZ|C?Y;5jHtm)rKaG0cYypT!-Q=mxsC?8#3>E&bce z^hyGQx5k*F*)QRL4_#ChegtkGt`jyn((>LcEY33{oDl!c!Sz%LL=D?6%H7g9e=W?vz=ay^w@M#%;FajRJlW%wP4xD2>3)Ma?OO; z)wem!<#;;oL_=$b9snax-+`j2ck}UUA{jkB8R>^9ZF*Idm&NBq@LxIZuL||RZyk@q z$%fp!J!bvt%%`ipX~Cyi+_HUqBirvg#yC9=bk{k&mwHCKOD+$iqH6u5UY&;*f3?}B z|IRVD(>SzEMsW)AgWK-X;}BZ+GAR#7x49|Y8SM1k;M)@rJm)=SA#>?)729StYM`oG zd2#ZSk^Io(bQPwHsgq6&KpMyhk|ua<;D@%Y1~r8VSV%2BZw)hnML6G_Nk;VC+=e;l zpKoqicuB}=^ptaQ+3s^fX`~LvqN^E3(-LqU41PhS2!>~@jhFqHE(2k(AN+*)80-fw9m0OP^F>OZ&V+ zFAJEU^K=IAH4K%CnHei!spNT)=9q2)PC$thUegyXx^h0G~Y^_E~GYuk)2kU3wL zt?S zeor}e6!vRb$S>d>ZO*l*RDRiVb+$RNlApKtTlVVo9D@HuePDv!FG#rrpc^mN~w;*kf<3A&ErktbA!pt z6b$}w=W?p}V3l*H5#e3{5skEPg4ehUt{SbHuU<7!i}24J{5s2AkJ(UBZt-+LDjbiR zviuHbcUl)%)GoR1Y#p%0dViI{{79#O{o8N%fVmOY|D;)&YYbG@nTJ3-j_S;RHcR}( z4%h+no0s5yPHhXmO@gBf$I6;!<6Y)Hvn0y1)QH`n*&6OV$P%phm=?!%8INji6kiyO z>{xOdaNsVqZ1~|~74_oJbmck$BfQ#ufOVKu-4l*6ouxU8`&8)V!kPHsf>7+!rcVL- z(@(nK?2trd6qMo*$2jr7`=Qw<`T}!KcY3B$HsB;|Axgz;;FkRlneV#Wd=evMQx{-+%785 z%$@r8cSDE3zn^LJOjjuAsYG)%4t6A1XJlp0iilFKe(JK%$M(37PyG;0Xd4-HWF~HY$Lj_SJ)-~RluPHpC}ZKse5R0_wZQS^ zER!4jcu3mpB096Ma4?23ZS&HIK*!t@U?5sZ=fu&I1d-l*EgW<@d}TOX!;a@MzYQ#? zRXQ1HAF`Z$wXy!b-3)EdgOcetDopah+?;!WdbYS;&@3uN+G6vYcujPr9WX)+QNkTm z74=QBJ!2kyV3A$3I287&&u%GTBQ_SQVqMSk=1mk%O^~Lh7gcsn|CS=lI5@tNF{7)w z6Xj8?Z=DZTf%IlX?SsN#hyK_4qeen5UBgJ-XxYK~UhrzZ2wx!1t+k?FQf2haj$$?E zlGg?E^3t`V+bzm0f9l%(ni@aB)Of|*zku>(Z54bQdEp!aPv!EZl@*!_Dr&JWDG2haun?jH~c1FAiC90%n;LD^$iW+zM`!%hIoe>*s}0@2!{aY)pC_ zhXoX1;S)3dMUwa!PU9}0_l2cfjV|R2(4f0eR$Q9W<0|EjNe<7A>Y=?idWS?8vgOf3 zc3p;Wv>$|qj*)B(Nlu5Cjh(CT{MQ>y-FV(pE)3VnNq2EA+sQqdhs$=0g>idxoI!+} z@Koc;$0d@~f)MIAe$ySC7cLKVkH44P%^Z4fq%f4^*Qz$1NuT&+W2=D$d1-ESX%Y5^ z?nxrKhWf4ib8qUZoA@hWMKJ*mE{w~&yMVe0Y(dG^3Oj`{yRC256t~&M-+LF3WLs}sPFbgXd)(4ofh5xPlwztIANr)a;hCD)4&S*inLM#ks=#iSRx zZdU&B${t8rc!V)4O3o8FbD9sH`EB;`-w-V)0xl~r`1Y4sL7gy9mOQqpxuaRAKS1L# z+V4`>vMUW_Tpf7X@PWMo)y$1dAi+ax3XJ*%?4tJDzs;H8ptdH+X4 zDPM{ENna(XrT?$D_%7i~rsdI4RWyD&|1ZvMSRe8j#0Q)Rh><<_Mu;#iDstZS7mwJK z+#ej{&PBx7{u0r4`+w0C32@XVp9KDo?#M2LWN=LEzb#Q;kZ}#r7_`@aqdITpSUrViqKu)Y7k zMA&~O-Y+N4Uxx=$7)Dw_3d=lJx}f}(t7pZ#xi~Zb$j2; z;*cXbawHTa%*#Va7ho_vH*Lsz5aFT_wg@Gm|2pcLa2x>u3t#Ok;Lb}HzHq6*V^-fk z8||kggE>G9wMBAj3+NO9YBI8w@MZtquoPn!=&sMRn;;=c!hh80#G5?qxVIyi|9<=_ z46CslT^dP!2AigMA{DA3BB@7QfBfUa;veIhWAuO| z+49Qyw|{aRDMgrE5=cXzCpCT3-~wYnt41&Q{K<%u#|%L4C9Y(+vLtX$h{xM{6 zZ*b9L396)=?=!WXJqo+asL&$mDSUeg7IJ1j(@RFr4Y2H58;?C;w?v(JXO_ecuKE$? z5yJRb9F8zK`(ybk)y*qL5t#AbyQt9lR#uOM%;Mr0Q4&N+(N_@6n;3RSkLGEsfAB%i zZ=A(eyVvT%tCZzvLnWMj^M9$(?nid)LVvxOF{7!w^HEUu!6nt}cTp|ePGeMje0Xh- zc^QJV^VEVmHTgk5;Vr5HTfGnQeDYqF(Q)AN?s@EBgCcUkCd`zK3K;@PFVJ4eZa149*oKSeD^EVz{~Nlv&zJ5PMzvQxW{SN)rg z-PK+mZCI!doOxM)<-1??wgxL1a3y|%;cstAPex6N4>j-{_|RhHqvyyytu}*KfDV#Cqjv`bE)_Tjjz`RJ-_dJIttE8hxy4l>># zi~Jj+Jq$;P-yF|){tUqHAj>XvA~~b>bS%2T&efRfh#iNIWlqeyQW}c4fGOk0YjP26 zOS<=r_HEGrIDJRn7%PZR3OLb}e~ylmE(>J+=Y^C`4qG4Lbs5pWk$M#i9j3?wdxsRT zHRT2tF^}Him3T`{Z&y5%dWQ!hF#?I_9Y*qBVpNnX0(wrMB}*$Uj0MuU+maD{@1c6L2duMCEY;Du zWmWn2RsFG`@0Wk~-FM#+VTA@2cs zU~{f)C#Ar(zMBsN#?LS6F9|hLVhdD1@K*RRzwH)cG~A1=jw$L`-_s`00X zpPVF=n-6+YIqQ@rUc;zTVquL3Vtf|%ZJ!Q4UALoO?G=C|V?%X}Mm=gTW+S&mx2h(u z){zj{3ZRmbHs`k87KMNVk$J^KJ+-J~BQpx({(Bq5pB2Y860G8P#|-vysgmoV3zo~P zi%7HVi$Dn$YYQ2y{^08Z9EguhaCR2pefTuz8h-70zVlFBwUAp`31)biUdKRGcZw$C zTZ$9}vc@xP7jaTJjIgu1%5xP40xv6!m9Z4f;%&yinfqu-TR zYSP1mUq=S?HXCN~Q`*tAm)GsjCbC4O6!WVf<(7Ic3|8(0l)pHOSSVSP_^tff0lGH_ ze&2Wgg=(nKYb^^eGD9ORwxuY)?EjhT$aW3v+=S0A1OzpNp7Iyb?x!jLQd@nM6@82= zT5wly^ZHGc^&oQ!S2!k7H_!QwAhOTOFKEH0OJv(tNI>9(4mR;wD#-jNRK_2Lfxr`- zqj8M4Dpa5;if)!a85T1pN!9LTR)XAWYi3u}b));;(({`0!xdE-`RiCCpZJfi15hDa z+g|?lt-HmRck?Uvy7Y^OEw&j$5%2s?HkTfRBQB9)xp1kJ*lB7eiX8yGlEaEAtyIrO z>`->2{l@V^SEq=L&CYsE%}CB}8})_tM;e#Ts2J`j2*v-@X)EnD*x=!Z0660@B84W0o6{Lo;{A>OyYS?{3e$jDga z_}d3^vVA2aAFz3l$Q*keKx7eA!oJx-D}VQ3wg^V!kGdYTb;Sh_^_LY3ns0Wr-$SvO z_LNS{>T8@Fcx%+gZ!4M3jpV>FF3vo4wy70aJX9*8Gitr3*SFJJ(#>lz? zRiLu#uMmz@4FV#SgGf{MIextrZOK7CceSbhU|VJn26bs?cX!qD zYHj4TbiR}ZIs1X2k_;e0XK@hQF@E%*^`6^786XsNN(?Mwpprt-NqfN9JuZ~gT7gXR zk0Fx7oYf^t39@8Q!S0z1(#bQ+vwWnf33To?$gNNk>t@PMWiWLh76;lr%sWaA`S-rA zPY-0QpD&3pOy2(ygfg@y+ac`Mc(Lj=b{<@PbNDZ>V3|N zODB9oap1chY(*`dERzJ?q-ajKWM{T4vz$rEiV!a_sn2i8w4VK`I0QnNZ37b&pXq|Z z?-ORW7aAYU$& zLMB;=@kG?Hh;}F|oc6GXAlYD6V)(f|$=YD=4B{tuXz9~%{DJPT1Xph&50G<;uu%3Zk@a!Xz6H$@#aQ~ zn=^>utcvD$-1?A>o=DvIT&Ml}w^modw;ICh#ds9v1_yHVEJlSFKX@c225L$VcPt98 z^p2LVre#hH$d^$I*eWz`PiX0UFBNwB(J}w>)#zbA|Jxk{2f5%%*MO7*Njp250i4#M zz4UY~OXS@AuyyP4rrfNaTbu}ku9~sS-ue=!Z5C$^LqiK$#X%?dEKx1ccH$+=_9FwX z*b44g!gYEKG8@yHlm7FhLAGhhPwH43+=CIG;(<1Um_#>gH*qCKHkoz6sQJ6ck5K7@ zuI=cKkdq|Svzhyk1gAqFecUIbfZZ;R!nl#n<=MhktkJ++^nFYU;~m1)R_Eb)AG$Vb zw}*tDwO+czg|8mi8T0AL0IMDA{j7M4ho$1uU6N%`@PzuRdA}`(nblWtHJNsKLDXF#WpCOLs^A4qCJZk z%TGb3YuHL|Kaua$fucZ}g^iiS3}zi-bc{2C0~@>T!DZ1t?x>UzEpKnxWd`@*PPPI( zy2-g1={-LBvlWGvgO!n2bzR$?6GiTAT=pJJHqz|(N^3@p)?{r5tqD1xS_UvX=`=C> zeK(8ItjI){1jsP83!LMR5N;CeyYKv5TIkX72nk_We42p?5id@cX9K&?ekTLMbRlt# z$3Pb3=2-WmB3Bbe)fdGqfbn=a&9vU-os=<92J7phybhDcTW5bMt4Guq9Gkm}T6z&E zzSPHZIm|K0(vJFKi2It+$U(nH8Pw()*hzT!vx3=Kyw|&%z znD{Me-j{BmdTQg)Y@1r9a?po_<~Gp_0}Ck*uqce7-|0HRj{4!QKI=J)=3tqE(+Euy zCP(8AwOAE<4}&KyIq3-@b3wr+VcT=o%7Hk8ik?qhA_C_`I};L<6d*U!x|0c9K>ub? z^GK|=17diCw){Ut?3qbeAMk}cUR@RFIh{Ue-TrDP+(gKCQTmr7c!|cQMUqj(oDm|! zwQGh(@No!sNQz)>6czY>&V_xSQ}m)$Q(GehB>hOT^DP8eWnd|9L@?Mg-dzE ztsDwb8f(tV%=glQni7)13P)Y_)RtpFUb62f3_(%a(rTH&w}NEC=B)Xr%9WdF$q3En z%}|>>p4z3Vyj;5aBRa~uGFUTTUmkq(&K$oZik~D5wzxF5VyQb(kHz&qLh65{`$AQC z$cT1%2(OK`8H~P9=)F*}od(oXKs+Vyv(zC!ZxW?w)sBg6vvN^B?DiR%*;Y3ywbjq4 zj9reh7A>{xgV#8hOoNY>Df2v{Y{bzpGhD{ZvNWUGnvMQtxYSX%^Cj9aQE5sm^VH-} zqk^*lCNJFCe&-k$@`2XWkV|}%DH^)oA>MB{E63DT>QUNQ>Dv9q>B5G0%wDUUf2}I{ z)o|f!OWOb7)HfHWZZT+Xpa1P4P{u6|BTcBMsB|NcELS1KB^rBSE;4H+x|(S+#8$W@ z&DOLF=9_KjUn@(tsP9X_6x+JPGnY0OnsT{4+`kuqB2C-T9C&=SC!gS;q$S(r&BS@Y zyE^g085GT0nJYqSO1cg1j}o^AB-hy$4Ysyi%5biThvGehFc9!x^!26-J6M|Z$oOZK z-ff+>UFxU&u}|ha{l9#)Xz1khL|u6q&-y6lq&AW;21WNf=7&fp zmxGT^1NX!$_(zEUpYHnq{iYB(H2u4;i1HVDYBM~;zw217X1WZiD1`qhWL4*R02`Oa z^U?LCbIlS7-rWQ^@8#~$TW(tm0Hp%k=dhUySyo>5!2&mK}NW$vU2Tzoy3W zvN=b0KyDDpW#zOHd7_Z*Y%Avg$*oxxTLGM_$go8~ZKljW%f~Hb;K-@tU5|y?%4sNm z`2KnY10)V6L?&T!*j@%nn423H{w|&d41)Q5MQ;GK;r*sQ#T|w!W$3$KYmAefC8edM9y_}=LAbVAP}Qtf`7*dVzjhN4KFQU>a6=L`|3E}PUh$r@XAM|f>egM( z>)H@-GZq%fp6yKvfs)pvVbW(1*%wy!Ifi!0Ky6VXC&Qb-)~%v#m*xe%5WaqeUs%y$ ziloyB!LZM_IHl5_hXu2Gq}8^b1wl{-Er0p+mwjJ4VY&K(0Q}+i`)su0TCYUji?MyC zN;%|Ip#MsWLn*sKU&*fXJXP}Rcc8)+4p3vP^+)3%j}x$6C0#0?-0s%N?`M=BpQn0~ z^F&Tkiw$oj=!WXq+`x-$#Bn#x8KOcXDE7BSeeOL#Os}%M;q}+xeE%(cV6O`Z&VEb~ z6J%yz3mNRy1=@JT8Q;mag-^UQR+f%er+Fy2PsPK|2U-}*%@~rBNA*~(qw$V2t6lhD z!9!4-=Q_y(x+3tSI_L4548+OnbTD&@E!1Y_Ab&PDV4|u&1EBsYi(428GdrszM(0LP-!mVSe&6l+s3IKr3UX<~9a#5d#Xt%un}X;^+@6f;*_=^$EV$0Wm%h6(v_0xLKlRvR`k}p}AoPU(Y$kSBpEemzfFs+FB=NyrgIcEkZ* zhby$6lYK)4aKT_^yIU_C_-zXR`l4D_Vi~7b59%Di6izyT`YEzdgQtakAja17juvt3 zTYBTcNM5v9T%%SqsLc8Ee09PQLaT;164 zC&G_jckrcSg06q+%zG53AldqcK|IDIalKJ6*3MB<1lrCmlBNHr8?mJUXAwujG;nAO z2j57UsU3%iEc8I$6@0e}cvi4cB(vfJbEx5n48XWOM=^IEeDBj_*p>aizX4UMUh|p= z9r&UO$m#EcAzm2p&AmeMVT%TEwzFZ`#F$zL%}VIJ(1V*K>A8 z*T+T|njuNBtlw+C6Wz`;vcqr8_aGAuJ-k+he{{=YT`Pzec8Ek$6iiRmj^1|V5$#ap zp2U?DpDAUW`j(PzgK-gsB#vrag_96Oqe)3re@o8P07NT<_@{Gd-5#;AUg4&d)jH z$Ch}v7JJsJ%Py-)JTL(UtB&WKHzs;4;`|5OZh0=v2*8L?1##)p}&LeHEvcC-U#mTW>|RJwuFmS=0*i~WhnW0lctQ9&2V zYGQAiX7sd7@zotIN!+e3z)C8f#3|0Uyw@^FNA`Yl?&5tgf3WEF|2{Wg^VL-~SEIvf z%~3m3@0x=x^0lNS9aJ**aT@7@y)yA#-p$a2#RFTbxP-yM;;fRu!;(72E`-LQ@|PnIA9Xzsdm|)TTQgxW zKc6{UEQ*N1nts4MBBrHBIl=f+i$#15U{=QhE?-3R!cc)xd)lmcP#!BMI{RG5xjJYI zw)ZsSI?BvxkJcgXX_MTll@7!buRnT}rPNu)>Arc2heI9~V;wQdlqj&UV5s855X*dZ zs@f5!l5C-fE8bF{9mxhP5rL^?534ELl&#{$Z|=z>_3xXx7{J# z)m{cIwqP;ou&MzG=!&=D52{r#eQg#lYZ3J}(&`AKsXo=7A>yKwznhrch1x4|J7d$q zy`>^xn%MOg)32%XIllwm9|c#c1s)2r+YNpDKIgY*%UM=GSS{;o2xt*b6c+q>=&rc` zKJ?q@4O$1Za^0kXdi?e$31*17K1@5^1%uASq%Vbb?cMJzIpj8_+wN@0hj0#Z`LvNC z;3N`lF`G!^*u;!r?aS2;rcZOS`3l5so!_G$>bD!a?CG2;f5q)^x5E^c-0sL_;RZ8* zj?Y>SCV1wjsG4b6d$gbZ-d!um^}$Qa!O`aH&AJO$@h8|55t1E8VNwvt%dnevh_Rg{ z){Tj0o-BN|D!eD{5SKX-KU2`LGMtI=7C%S8NLSD=2U`Rgm!-G$XeWgD8ln3&wRH6R z1PoUg8JT2e^Rm1iae@5FInT!Norq0)5o4FtlPAZ zTU~FFlftUm@U^dZ%0eoTn6j?S+vE3sub*cSfYsZrQd=W7vTKGCD=cRDl=4d7?fIPc z`UWi8%Phm=qo8%VzD=7aw5E&Yu?RAZ&k!joj7a~wBK{zTu#8~Vw7_kdG7lvTVv&Ka zYWzAXT}RQG6L$zyW%s#tto53ewS>|hN~-U95C%J5^|o56zcTdEOD#*c({nuxtrTqf zrK51V(6lP?ulCRHBwit-F%01~{T9D^?!PU;UamS}Ig?4PH*E{y?(yg<6=!j}m)}ao zo8~Lp^PK*@EqF(QEVc7FXUu5bdC8L<^ox;}X_JZRPvhP%NFal_*5?zP{|;Gup2dKw8Wg=iMf)D?jBqO_jJuul|j^g9Vze5A6dno9irvv=>qyKX?P(QvxI6+ivE`#8ROf*e-w{`st0`-;ie0{D`*Hz{M0dKmoY?2Us^glvyp1wL3G3l@u zXg27dF?VkSwza$4=Zrz@`F{L-WQ3{nJ7Gn{^+@a-e*DqdM0HN3n+zN|+$4o8n|EYI z(f=G0RNQCBT&X|^EgecX-RqB6y(L$t{9%8V?pNHM+yD{bkq%NtW|;W4}t3%u$_!VO<+7uQq=?A69wj+<6L$wWZ|{sQ;JxnUq|okiuO) z_~8K1O+SKKU+}I@R&0#$?6slyiTgj@h?0wL&FEd1js0b4hX)KTXjq*z!g}Kk#1i86 zDlyu{bF-Rde~d$NE1Ab*nqg?OhA`XJ2A}9u8rq+Ts93{SQ|~Q*m)QPsu!3Mq#1gj? zq1Mo`{Gjku;(vH6Xs{uFxiD~H5-P6()g4*p#dJ;r)gL4uI3CcaY3YP>h2M;wKA zLwL$J6TXInsUj%}d=6_0%L&{HVw!}U@62KHtR*Cw_ZL<9t6NZOMETm+b87CO1r`s^`w; Date: Fri, 3 Sep 2021 11:20:25 +0800 Subject: [PATCH 19/87] fixed issues in database demo script --- database/demo/myems_system_db.sql | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/database/demo/myems_system_db.sql b/database/demo/myems_system_db.sql index bb79a7ff..d51208e9 100644 --- a/database/demo/myems_system_db.sql +++ b/database/demo/myems_system_db.sql @@ -144,7 +144,7 @@ INSERT INTO `myems_system_db`.`tbl_data_sources` (`id`, `name`, `uuid`,`gateway_id`, `protocol`, `connection`) VALUES (1, '示例ModbusTCP数据源', 'b3ace9d4-b63b-419b-818f-0f6d1d0603a4', 1, 'modbus-tcp', '{"host":"192.168.0.1", "port":502}'), -(2, '示例ModbusRTU数据源', 'b903f0af-9115-448c-9d46-8caf5f9995f3', 1, 'modbus-tru', '{"port": "/dev/ttyUSB0","slaveaddress": 1, "baudrate": 9600,"bytesize": 8,"parity": "N","stopbits": 1,"timeout": 0.05,"mode": "rtu"}'), +(2, '示例ModbusRTU数据源', 'b903f0af-9115-448c-9d46-8caf5f9995f3', 1, 'modbus-rtu', '{"port": "/dev/ttyUSB0","slaveaddress": 1, "baudrate": 9600,"bytesize": 8,"parity": "N","stopbits": 1,"timeout": 0.05,"mode": "rtu"}'), (3, '示例Bacnet/IP数据源', 'e2d5b30b-b554-4ebe-8ce7-f377ab380d19', 1, 'bacnet-ip', '{"host":"192.168.0.3", "port":47808}'), (4, '示例S7数据源', '9eb0d705-d02a-43f8-9c62-7e5ef508b255', 1, 's7', '{"host":"192.168.0.4", "port":102, "rack": 0, "slot": 2}'), (5, '示例ControlLogix数据源', 'd1dc9792-7861-4dd3-9b01-07511dae16c1', 1, 'control-logix', '{"host":"192.168.0.5","port":44818,"processorslot":3}'), @@ -449,25 +449,25 @@ INSERT INTO `myems_system_db`.`tbl_points` (`id`, `name`, `data_source_id`, `object_type`, `units`, `high_limit`, `low_limit`, `ratio`, `is_trend`, `address`, `description` ) VALUES (1, 'Active Energy Import Tariff 1', 1, 'ENERGY_VALUE', 'kWh', 99999999999, 0, 1.000, true, - '{\"slave_id\":1, \"function_code\":3, \"offset\":801, \"number_of_registers\":4, \"format\":\"=d\", \"swap_adjacent_bytes\":false}', null), + '{\"slave_id\":1, \"function_code\":3, \"offset\":801, \"number_of_registers\":4, \"format\":\"=d\", \"byte_swap\":false}', null), (2, 'Working hours counter', 1, 'ANALOG_VALUE', 'S', 999999999, 0, 1.000, true, - '{\"slave_id\":1, \"function_code\":3, \"offset\":209, \"number_of_registers\":2, \"format\":\"=L\", \"swap_adjacent_bytes\":true}', null), + '{\"slave_id\":1, \"function_code\":3, \"offset\":209, \"number_of_registers\":2, \"format\":\"=L\", \"byte_swap\":true}', null), (3, 'Current a', 1, 'ANALOG_VALUE', 'A', 5, 0, 1.000, true, - '{\"slave_id\":1, \"function_code\":3, \"offset\":13, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), + '{\"slave_id\":1, \"function_code\":3, \"offset\":13, \"number_of_registers\":2, \"format\":\"=f\", \"byte_swap\":false}', null), (4, 'Active Power a', 1, 'ANALOG_VALUE', 'W', 3450, 0, 1.000, true, - '{\"slave_id\":1, \"function_code\":3, \"offset\":25, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), + '{\"slave_id\":1, \"function_code\":3, \"offset\":25, \"number_of_registers\":2, \"format\":\"=f\", \"byte_swap\":false}', null), (5, 'Power Factor a', 1, 'ANALOG_VALUE', 'W', 1, 0, 1.000, true, - '{\"slave_id\":1, \"function_code\":3, \"offset\":37, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), + '{\"slave_id\":1, \"function_code\":3, \"offset\":37, \"number_of_registers\":2, \"format\":\"=f\", \"byte_swap\":false}', null), (6, '示例ModbusTCP数据点6', 2, 'ENERGY_VALUE', 'Wh', 99999999999, 0, 1.000, true, - '{\"slave_id\":1, \"function_code\":3, \"offset\":40001, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), + '{\"slave_id\":1, \"function_code\":3, \"offset\":40001, \"number_of_registers\":2, \"format\":\"=f\", \"byte_swap\":false}', null), (7, '示例数据点7', 2, 'ANALOG_VALUE', 'V', 690, 0, 1.000, true, - '{\"slave_id\":1, \"function_code\":3, \"offset\":40002, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), + '{\"slave_id\":1, \"function_code\":3, \"offset\":40002, \"number_of_registers\":2, \"format\":\"=f\", \"byte_swap\":false}', null), (8, 'BACnet示例数据点1', 3, 'ANALOG_VALUE', 'V', 690, 0, 1.000, true, '{\"object_type\":\"analogValue\", \"object_id\":3004860, \"property_name\":\"presentValue\", \"property_array_index\":null}', null), From 5cc9581092e65e70688f9fdf75390324639b2bac Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 3 Sep 2021 19:33:22 +0800 Subject: [PATCH 20/87] rename language cn to zh-ch in Admin UI --- admin/app/controllers/login/login.controller.js | 2 +- admin/app/translations.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/admin/app/controllers/login/login.controller.js b/admin/app/controllers/login/login.controller.js index 81b6b738..e048ef15 100644 --- a/admin/app/controllers/login/login.controller.js +++ b/admin/app/controllers/login/login.controller.js @@ -15,7 +15,7 @@ app.controller('LoginController', function ( $scope.dataLoading = false; $scope.isFullScreen = false; - $scope.language = $window.localStorage.getItem("language") || 'cn'; + $scope.language = $window.localStorage.getItem("language") || 'zh-cn'; $scope.fullScreenTitle = "FULLSCREEN"; $scope.cur_user = JSON.parse($window.localStorage.getItem("currentUser")); // login section start diff --git a/admin/app/translations.js b/admin/app/translations.js index 1e481ae2..a6196927 100644 --- a/admin/app/translations.js +++ b/admin/app/translations.js @@ -985,7 +985,7 @@ function config($translateProvider) { WECHAT_MESSAGE_NOT_FOUND: 'Wechat Message Not Found', }, }) - .translations('cn', { + .translations('zh-cn', { MY_EMS_NAME: 'MyEMS', LANGUAGE: '语 言', FULLSCREEN: '全屏显示', @@ -2959,7 +2959,7 @@ function config($translateProvider) { }, }) ; - var lang = window.localStorage.getItem("language") || "cn"; + var lang = window.localStorage.getItem("language") || "zh-cn"; $translateProvider.preferredLanguage(lang); From 086674f62d7a996c8d11a7664c01c54f5db0e052 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 3 Sep 2021 20:33:20 +0800 Subject: [PATCH 21/87] fixed Local Storage conflicts in Admin UI and Web UI --- admin/app/config.router.js | 6 +++--- admin/app/controllers/login/login.controller.js | 14 +++++++------- admin/app/controllers/main.controller.js | 2 +- .../settings/costcenter/costfile.controller.js | 2 +- .../knowledgefile/knowledgefile.controller.js | 2 +- .../settings/meter/offlinemeterfile.controller.js | 2 +- .../app/controllers/users/user/user.controller.js | 2 +- admin/app/translations.js | 4 ++-- admin/views/login/login.html | 2 +- web/src/Main.js | 6 +++--- web/src/components/MyEMS/auth/LoginForm.js | 2 +- web/src/components/side-panel/SidePanelModal.js | 2 +- web/src/config.js | 2 +- web/src/i18n.js | 10 +++++----- 14 files changed, 29 insertions(+), 29 deletions(-) diff --git a/admin/app/config.router.js b/admin/app/config.router.js index 70b62686..c8e7a696 100644 --- a/admin/app/config.router.js +++ b/admin/app/config.router.js @@ -13,11 +13,11 @@ app $rootScope.$state = $state; $transitions.onStart( { }, function(trans) { if ($location.$$path.indexOf('login')==-1) { - if ($window.localStorage.getItem("currentUser")){ - currentUser = JSON.parse($window.localStorage.getItem("currentUser")); + if ($window.localStorage.getItem("myems_admin_ui_current_user")){ + currentUser = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); } if (currentUser == undefined || currentUser.is_admin === false) { - $window.localStorage.removeItem("currentUser"); + $window.localStorage.removeItem("myems_admin_ui_current_user"); return $state.target("login.login"); } else { $rootScope.pageTitle = trans.to().data.pageTitle; diff --git a/admin/app/controllers/login/login.controller.js b/admin/app/controllers/login/login.controller.js index e048ef15..c2021c1e 100644 --- a/admin/app/controllers/login/login.controller.js +++ b/admin/app/controllers/login/login.controller.js @@ -15,9 +15,9 @@ app.controller('LoginController', function ( $scope.dataLoading = false; $scope.isFullScreen = false; - $scope.language = $window.localStorage.getItem("language") || 'zh-cn'; + $scope.language = $window.localStorage.getItem("myems_admin_ui_language") || "zh_CN"; $scope.fullScreenTitle = "FULLSCREEN"; - $scope.cur_user = JSON.parse($window.localStorage.getItem("currentUser")); + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); // login section start $scope.login = function (user) { $scope.dataLoading = true; @@ -30,10 +30,10 @@ app.controller('LoginController', function ( body: $translate.instant('TOASTER.LOGIN_SUCCESS'), showCloseButton: true, }); - $window.localStorage.setItem("currentUser", JSON.stringify(response.data)); + $window.localStorage.setItem("myems_admin_ui_current_user", JSON.stringify(response.data)); $location.path('/settings/space'); - $scope.cur_user = JSON.parse($window.localStorage.getItem("currentUser")); + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); } else if (angular.isDefined(response.status) && response.status === 400 || response.status === 404) { toaster.pop({ type: "error", @@ -64,7 +64,7 @@ app.controller('LoginController', function ( body: $translate.instant('TOASTER.LOGIN_SUCCESS'), showCloseButton: true, }); - $window.localStorage.removeItem("currentUser"); + $window.localStorage.removeItem("myems_admin_ui_current_user"); $location.path('/login'); } else { toaster.pop({ @@ -73,7 +73,7 @@ app.controller('LoginController', function ( body: $translate.instant(response.data.description), showCloseButton: true, }); - $window.localStorage.removeItem("currentUser"); + $window.localStorage.removeItem("myems_admin_ui_current_user"); $location.path('/login'); } }); @@ -202,7 +202,7 @@ app.controller('LoginController', function ( $scope.changeLanguage = function (langKey) { $translate.use(langKey); $scope.language = langKey; - $window.localStorage.setItem("language", langKey); + $window.localStorage.setItem("myems_admin_ui_language", langKey); }; // web message alarm section start diff --git a/admin/app/controllers/main.controller.js b/admin/app/controllers/main.controller.js index 1c0caab5..4d1f5f21 100644 --- a/admin/app/controllers/main.controller.js +++ b/admin/app/controllers/main.controller.js @@ -5,7 +5,7 @@ app.controller('MainController', [ $rootScope.$on("handleReLogin",function(){ $timeout(function(){ - $window.localStorage.removeItem("currentUser"); + $window.localStorage.removeItem("myems_admin_ui_current_user"); $location.path('/login'); },2000) }); diff --git a/admin/app/controllers/settings/costcenter/costfile.controller.js b/admin/app/controllers/settings/costcenter/costfile.controller.js index b1896188..f62ebf01 100644 --- a/admin/app/controllers/settings/costcenter/costfile.controller.js +++ b/admin/app/controllers/settings/costcenter/costfile.controller.js @@ -9,7 +9,7 @@ app.controller('CostFileController', function ( toaster, SweetAlert) { - $scope.cur_user = JSON.parse($window.localStorage.getItem("currentUser")); + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllCostFiles = function () { CostFileService.getAllCostFiles(function (response) { diff --git a/admin/app/controllers/settings/knowledgefile/knowledgefile.controller.js b/admin/app/controllers/settings/knowledgefile/knowledgefile.controller.js index 1d710015..776c8bd9 100644 --- a/admin/app/controllers/settings/knowledgefile/knowledgefile.controller.js +++ b/admin/app/controllers/settings/knowledgefile/knowledgefile.controller.js @@ -8,7 +8,7 @@ app.controller('KnowledgeFileController', function ( toaster, SweetAlert) { - $scope.cur_user = JSON.parse($window.localStorage.getItem("currentUser")); + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllKnowledgeFiles = function () { KnowledgeFileService.getAllKnowledgeFiles(function (response) { diff --git a/admin/app/controllers/settings/meter/offlinemeterfile.controller.js b/admin/app/controllers/settings/meter/offlinemeterfile.controller.js index 273d731e..0fec0a43 100644 --- a/admin/app/controllers/settings/meter/offlinemeterfile.controller.js +++ b/admin/app/controllers/settings/meter/offlinemeterfile.controller.js @@ -9,7 +9,7 @@ app.controller('OfflineMeterFileController', function( toaster, SweetAlert) { - $scope.cur_user = JSON.parse($window.localStorage.getItem("currentUser")); + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllOfflineMeterFiles = function() { OfflineMeterFileService.getAllOfflineMeterFiles(function (response) { diff --git a/admin/app/controllers/users/user/user.controller.js b/admin/app/controllers/users/user/user.controller.js index 6ae6a2ba..bd15f5cf 100644 --- a/admin/app/controllers/users/user/user.controller.js +++ b/admin/app/controllers/users/user/user.controller.js @@ -9,7 +9,7 @@ app.controller('UserController', function ($scope, $translate, SweetAlert) { - $scope.cur_user = JSON.parse($window.localStorage.getItem("currentUser")); + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllUsers = function () { UserService.getAllUsers(function (response) { if (angular.isDefined(response.status) && response.status === 200) { diff --git a/admin/app/translations.js b/admin/app/translations.js index a6196927..999df8cd 100644 --- a/admin/app/translations.js +++ b/admin/app/translations.js @@ -985,7 +985,7 @@ function config($translateProvider) { WECHAT_MESSAGE_NOT_FOUND: 'Wechat Message Not Found', }, }) - .translations('zh-cn', { + .translations('zh_CN', { MY_EMS_NAME: 'MyEMS', LANGUAGE: '语 言', FULLSCREEN: '全屏显示', @@ -2959,7 +2959,7 @@ function config($translateProvider) { }, }) ; - var lang = window.localStorage.getItem("language") || "zh-cn"; + var lang = window.localStorage.getItem("admin_ui_language") || "zh_CN"; $translateProvider.preferredLanguage(lang); diff --git a/admin/views/login/login.html b/admin/views/login/login.html index 069f81eb..df4ebf08 100644 --- a/admin/views/login/login.html +++ b/admin/views/login/login.html @@ -22,7 +22,7 @@
diff --git a/web/src/Main.js b/web/src/Main.js index aef302ea..e2b6aec3 100644 --- a/web/src/Main.js +++ b/web/src/Main.js @@ -23,7 +23,7 @@ const Main = props => { const [navbarCollapsed, setNavbarCollapsed] = useState(false); const [navbarStyle, setNavbarStyle] = useState(getItemFromStore('navbarStyle', settings.navbarStyle)); - const [language, setLanguage] = useState(getItemFromStore('language', settings.language)); + const [language, setLanguage] = useState(getItemFromStore('myems_web_ui_language', settings.language)); const toggleModal = () => setIsOpenSidePanel(prevIsOpenSidePanel => !prevIsOpenSidePanel); const value = { @@ -100,9 +100,9 @@ const Main = props => { setItemToStore('navbarStyle', navbarStyle); // eslint-disable-next-line }, [navbarStyle]); - + useEffect(() => { - setItemToStore('language', language); + setItemToStore('myems_web_ui_language', language); i18n.changeLanguage(language) // eslint-disable-next-line }, [language]); diff --git a/web/src/components/MyEMS/auth/LoginForm.js b/web/src/components/MyEMS/auth/LoginForm.js index 9ef72197..f9d0f595 100644 --- a/web/src/components/MyEMS/auth/LoginForm.js +++ b/web/src/components/MyEMS/auth/LoginForm.js @@ -113,7 +113,7 @@ const LoginForm = ({ setRedirect, hasLabel, layout, t }) => { value={language} onChange={({ target }) => setLanguage(target.value)} > - + diff --git a/web/src/components/side-panel/SidePanelModal.js b/web/src/components/side-panel/SidePanelModal.js index 9947ecf1..bcfc0235 100644 --- a/web/src/components/side-panel/SidePanelModal.js +++ b/web/src/components/side-panel/SidePanelModal.js @@ -220,7 +220,7 @@ const SidePanelModal = ({ autoShow, showOnce, autoShowDelay, cookieExpireTime, p

{t('Switch between languages')}

- + diff --git a/web/src/config.js b/web/src/config.js index 12ac70f6..ab88fad3 100644 --- a/web/src/config.js +++ b/web/src/config.js @@ -16,6 +16,6 @@ export const settings = { currency: '$', isNavbarVerticalCollapsed: false, navbarStyle: 'transparent', - language: 'zh_cn' + language: 'zh_CN' //en, de, zh_CN }; export default { version, navbarBreakPoint, topNavbarBreakpoint, settings, APIBaseURL }; diff --git a/web/src/i18n.js b/web/src/i18n.js index c202b14a..f10b33f6 100644 --- a/web/src/i18n.js +++ b/web/src/i18n.js @@ -102,7 +102,7 @@ const resources = { "Switch between styles for your vertical navbar": "Switch between styles for your vertical navbar", "Language": "Language", "Switch between languages": "Switch between languages", - "language-zh_cn": "简体中文", + "language-zh_CN": "简体中文", "language-en": "English", "language-de": "Deutsch", "Like What You See?": "Like What You See?", @@ -848,7 +848,7 @@ const resources = { "Switch between styles for your vertical navbar": "Wechseln Sie zwischen den Stilen für Ihre vertikale Navigationsleiste", "Language": "Sprache", "Switch between languages": "Zwischen den Sprachen wechseln", - "language-zh_cn": "简体中文", + "language-zh_CN": "简体中文", "language-en": "English", "language-de": "Deutsch", "Like What You See?": "Wie was du siehst?", @@ -1499,7 +1499,7 @@ const resources = { } }, - zh_cn: { + zh_CN: { translation: { // routes "Dashboard": "总览", @@ -1597,7 +1597,7 @@ const resources = { "Switch between styles for your vertical navbar": "切换垂直导航栏的样式", "Language": "语言", "Switch between languages": "切换语言", - "language-zh_cn": "简体中文", + "language-zh_CN": "简体中文", "language-en": "English", "language-de": "Deutsch", "Like What You See?": "喜欢这个系统?", @@ -2254,7 +2254,7 @@ i18n .use(initReactI18next) // passes i18n down to react-i18next .init({ resources, - lng: "zh_cn", + lng: "zh_CN", keySeparator: false, // we do not use keys in form messages.welcome From 13efbfc51659cc72d8d7571ad850b7961b9f1457 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sat, 4 Sep 2021 12:43:58 +0800 Subject: [PATCH 22/87] upgraded version number to v1.2.3 --- CHANGELOG.md | 47 +++++++++++++++++++--------- admin/views/common/footer-login.html | 2 +- admin/views/common/footer.html | 2 +- database/myems_system_db.sql | 2 +- web/package-lock.json | 4 +-- web/package.json | 2 +- web/src/config.js | 2 +- 7 files changed, 39 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e13b5bc..afa87e06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Removed - None. +## [v1.2.3] - 2021-09-04 +### Added +- added tbl_reports to myems_reporting_db in database. +- added trusted-host to Dockerfiles + +### Changed +- updated README. +- renamed language cn to zh-cn in Admin UI + +### Fixed +- fixed Local Storage conflicts in Admin UI and Web UI . +- fixed issues in database demo script + +### Removed +- None. + ## [v1.2.2] - 2021-08-28 ### Added - added user log to UserLogin, ChangePassword and ResetPassword in API @@ -407,19 +423,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Removed - None. -[Unreleased]: https://github.com/MyEMS/myems/compare/v1.2.2...HEAD -[v1.2.2]: https://github.com/MyEMS/myems/compare/v1.2.1...v1.2.2 -[v1.2.1]: https://github.com/MyEMS/myems/compare/v1.2.0...v1.2.1 -[v1.2.0]: https://github.com/MyEMS/myems/compare/v1.1.6...v1.2.0 -[v1.1.6]: https://github.com/MyEMS/myems/compare/v1.1.5...v1.1.6 -[v1.1.5]: https://github.com/MyEMS/myems/compare/v1.1.4...v1.1.5 -[v1.1.4]: https://github.com/MyEMS/myems/compare/v1.1.3...v1.1.4 -[v1.1.3]: https://github.com/MyEMS/myems/compare/v1.1.2...v1.1.3 -[v1.1.2]: https://github.com/MyEMS/myems/compare/v1.1.1...v1.1.2 -[v1.1.1]: https://github.com/MyEMS/myems/compare/v1.1.0...v1.1.1 -[v1.0.8]: https://github.com/MyEMS/myems/compare/v1.0.8...v1.1.0 -[v1.0.8]: https://github.com/MyEMS/myems/compare/v1.0.7...v1.0.8 -[v1.0.7]: https://github.com/MyEMS/myems/compare/v1.0.6...v1.0.7 -[v1.0.6]: https://github.com/MyEMS/myems/compare/v1.0.5...v1.0.6 -[v1.0.5]: https://github.com/MyEMS/myems/releases/tag/v1.0.5 +[Unreleased]: https://github.com/MyEMS/MyEMS/compare/v1.2.3...HEAD +[v1.2.3]: https://github.com/MyEMS/MyEMS/compare/v1.2.2...v1.2.3 +[v1.2.2]: https://github.com/MyEMS/MyEMS/compare/v1.2.1...v1.2.2 +[v1.2.1]: https://github.com/MyEMS/MyEMS/compare/v1.2.0...v1.2.1 +[v1.2.0]: https://github.com/MyEMS/MyEMS/compare/v1.1.6...v1.2.0 +[v1.1.6]: https://github.com/MyEMS/MyEMS/compare/v1.1.5...v1.1.6 +[v1.1.5]: https://github.com/MyEMS/MyEMS/compare/v1.1.4...v1.1.5 +[v1.1.4]: https://github.com/MyEMS/MyEMS/compare/v1.1.3...v1.1.4 +[v1.1.3]: https://github.com/MyEMS/MyEMS/compare/v1.1.2...v1.1.3 +[v1.1.2]: https://github.com/MyEMS/MyEMS/compare/v1.1.1...v1.1.2 +[v1.1.1]: https://github.com/MyEMS/MyEMS/compare/v1.1.0...v1.1.1 +[v1.0.8]: https://github.com/MyEMS/MyEMS/compare/v1.0.8...v1.1.0 +[v1.0.8]: https://github.com/MyEMS/MyEMS/compare/v1.0.7...v1.0.8 +[v1.0.7]: https://github.com/MyEMS/MyEMS/compare/v1.0.6...v1.0.7 +[v1.0.6]: https://github.com/MyEMS/MyEMS/compare/v1.0.5...v1.0.6 +[v1.0.5]: https://github.com/MyEMS/MyEMS/releases/tag/v1.0.5 diff --git a/admin/views/common/footer-login.html b/admin/views/common/footer-login.html index f71b157c..1560f91a 100644 --- a/admin/views/common/footer-login.html +++ b/admin/views/common/footer-login.html @@ -1,5 +1,5 @@ diff --git a/admin/views/common/footer.html b/admin/views/common/footer.html index 624aa98e..74993997 100644 --- a/admin/views/common/footer.html +++ b/admin/views/common/footer.html @@ -3,6 +3,6 @@ https://myems.io
- {{'MY_EMS_NAME' | translate}} v1.2.2 + {{'MY_EMS_NAME' | translate}} v1.2.3
diff --git a/database/myems_system_db.sql b/database/myems_system_db.sql index 3d54cd70..5182ae94 100644 --- a/database/myems_system_db.sql +++ b/database/myems_system_db.sql @@ -1243,6 +1243,6 @@ USE `myems_system_db`; INSERT INTO `myems_system_db`.`tbl_versions` (`id`, `version`, `release_date`) VALUES -(1, '1.2.2', '2021-08-28'); +(1, '1.2.3', '2021-09-04'); COMMIT; diff --git a/web/package-lock.json b/web/package-lock.json index c8cb36af..3952689e 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "myems", - "version": "1.2.2", + "version": "1.2.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "myems", - "version": "1.2.2", + "version": "1.2.3", "dependencies": { "@fortawesome/fontawesome-free": "^5.15.1", "@fortawesome/fontawesome-svg-core": "^1.2.30", diff --git a/web/package.json b/web/package.json index 9bb7c048..59399009 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "myems", - "version": "1.2.2", + "version": "1.2.3", "private": true, "dependencies": { "@fortawesome/fontawesome-free": "^5.15.1", diff --git a/web/src/config.js b/web/src/config.js index ab88fad3..d31aeab5 100644 --- a/web/src/config.js +++ b/web/src/config.js @@ -1,4 +1,4 @@ -export const version = '1.2.2'; +export const version = '1.2.3'; export const navbarBreakPoint = 'xl'; // Vertical navbar breakpoint export const topNavbarBreakpoint = 'lg'; //export const APIBaseURL = 'http://127.0.0.1:8000'; From 859ed6826ca3eba9c048e6d71cc5fd6167ff45ca Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sat, 4 Sep 2021 15:41:06 +0800 Subject: [PATCH 23/87] updated userlogger in API to pass HTTPError to client --- myems-api/core/userlogger.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/myems-api/core/userlogger.py b/myems-api/core/userlogger.py index 718f700c..fd76756d 100644 --- a/myems-api/core/userlogger.py +++ b/myems-api/core/userlogger.py @@ -6,6 +6,7 @@ from datetime import datetime import uuid from gunicorn.http.body import Body import simplejson as json +import falcon def write_log(user_uuid, request_method, resource_type, resource_id, request_body): @@ -33,7 +34,7 @@ def write_log(user_uuid, request_method, resource_type, resource_id, request_bod )) cnx.commit() except Exception as e: - print(str(e)) + print('write_log:' + str(e)) finally: if cnx: cnx.disconnect() @@ -72,12 +73,15 @@ def user_logger(func): raw_json = reads.decode('utf-8') with open(file_name, "rb") as fr: req.stream = Body(fr) + os.remove(file_name) func(*args, **kwargs) write_log(user_uuid=user_uuid, request_method='POST', resource_type=class_name, resource_id=kwargs.get('id_'), request_body=raw_json) - os.remove(file_name) except Exception as e: - print('user_logger:' + str(e)) + if isinstance(e, falcon.HTTPError): + raise e + else: + print('user_logger:' + str(e)) return elif func_name == "on_put": try: @@ -88,12 +92,16 @@ def user_logger(func): raw_json = reads.decode('utf-8') with open(file_name, "rb") as fr: req.stream = Body(fr) + os.remove(file_name) func(*args, **kwargs) write_log(user_uuid=user_uuid, request_method='PUT', resource_type=class_name, resource_id=kwargs.get('id_'), request_body=raw_json) - os.remove(file_name) except Exception as e: - print('user_logger:' + str(e)) + if isinstance(e, falcon.HTTPError): + raise e + else: + print('user_logger:' + str(e)) + return elif func_name == "on_delete": try: @@ -101,7 +109,10 @@ def user_logger(func): write_log(user_uuid=user_uuid, request_method="DELETE", resource_type=class_name, resource_id=kwargs.get('id_'), request_body=json.dumps(kwargs)) except Exception as e: - print('user_logger:' + str(e)) + if isinstance(e, falcon.HTTPError): + raise e + else: + print('user_logger:' + str(e)) return return logger From 805e728db888dbd9b9e2c335c25e4d1467c443e7 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sat, 4 Sep 2021 18:21:49 +0800 Subject: [PATCH 24/87] fixed typo in translations of Admin UI --- admin/app/translations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/app/translations.js b/admin/app/translations.js index 999df8cd..11fb9c0b 100644 --- a/admin/app/translations.js +++ b/admin/app/translations.js @@ -2959,7 +2959,7 @@ function config($translateProvider) { }, }) ; - var lang = window.localStorage.getItem("admin_ui_language") || "zh_CN"; + var lang = window.localStorage.getItem("myems_admin_ui_language") || "zh_CN"; $translateProvider.preferredLanguage(lang); From f28b21077df9a0ac730f65fdc6cbbddd162f072b Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 5 Sep 2021 18:50:22 +0800 Subject: [PATCH 25/87] added tbl_aliyun_sms_api to myems_fdd_db in database --- database/myems_fdd_db.sql | 16 ++++++++++++++++ database/myems_system_db.sql | 2 +- database/upgrade/upgrade1.2.4.sql | 18 ++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 database/upgrade/upgrade1.2.4.sql diff --git a/database/myems_fdd_db.sql b/database/myems_fdd_db.sql index c21d38cf..d80c1d23 100644 --- a/database/myems_fdd_db.sql +++ b/database/myems_fdd_db.sql @@ -7,6 +7,22 @@ DROP DATABASE IF EXISTS `myems_fdd_db` ; CREATE DATABASE IF NOT EXISTS `myems_fdd_db` ; USE `myems_fdd_db` ; +-- --------------------------------------------------------------------------------------------------------------------- +-- Table `myems_fdd_db`.`tbl_aliyun_sms_api` +-- refer to https://dysms.console.aliyun.com/ +-- API Version 2017-05-25 +-- --------------------------------------------------------------------------------------------------------------------- +DROP TABLE IF EXISTS `myems_fdd_db`.`tbl_aliyun_sms_api` ; + +CREATE TABLE IF NOT EXISTS `myems_fdd_db`.`tbl_aliyun_sms_api` ( + `id` BIGINT NOT NULL AUTO_INCREMENT, + `access_key_id` VARCHAR(256) NOT NULL, + `access_key_secret` VARCHAR(256) NOT NULL, + `endpoint` VARCHAR(256) NOT NULL, + `sign_name` VARCHAR(256) NOT NULL, + `template_code` VARCHAR(256) NOT NULL, + PRIMARY KEY (`id`)); + -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_fdd_db`.`tbl_email_messages` -- --------------------------------------------------------------------------------------------------------------------- diff --git a/database/myems_system_db.sql b/database/myems_system_db.sql index 5182ae94..136ede93 100644 --- a/database/myems_system_db.sql +++ b/database/myems_system_db.sql @@ -1243,6 +1243,6 @@ USE `myems_system_db`; INSERT INTO `myems_system_db`.`tbl_versions` (`id`, `version`, `release_date`) VALUES -(1, '1.2.3', '2021-09-04'); +(1, '1.2.4', '2021-09-11'); COMMIT; diff --git a/database/upgrade/upgrade1.2.4.sql b/database/upgrade/upgrade1.2.4.sql new file mode 100644 index 00000000..0c262461 --- /dev/null +++ b/database/upgrade/upgrade1.2.4.sql @@ -0,0 +1,18 @@ +-- --------------------------------------------------------------------------------------------------------------------- +-- Table `myems_fdd_db`.`tbl_aliyun_sms_api` +-- refer to https://dysms.console.aliyun.com/ +-- API Version 2017-05-25 +-- --------------------------------------------------------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS `myems_fdd_db`.`tbl_aliyun_sms_api` ( + `id` BIGINT NOT NULL AUTO_INCREMENT, + `access_key_id` VARCHAR(256) NOT NULL, + `access_key_secret` VARCHAR(256) NOT NULL, + `endpoint` VARCHAR(256) NOT NULL, + `sign_name` VARCHAR(256) NOT NULL, + `template_code` VARCHAR(256) NOT NULL, + PRIMARY KEY (`id`)); + +DROP TABLE IF EXISTS `myems_fdd_db`.`tbl_gsm_modems` ; + +-- UPDATE VERSION NUMBER +UPDATE myems_system_db.tbl_versions SET version='1.2.4', release_date='2021-09-11' WHERE id=1; From 14d0b7aa77484b6806cdcbf0098c9a99e2c04a0d Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Mon, 6 Sep 2021 11:52:47 +0800 Subject: [PATCH 26/87] removed cookies usages from API --- myems-api/README.md | 16 +++++++--------- myems-api/config.py | 4 ---- myems-api/core/user.py | 9 --------- myems-api/core/userlogger.py | 8 ++++---- myems-api/reports/dashboard.py | 1 - 5 files changed, 11 insertions(+), 27 deletions(-) diff --git a/myems-api/README.md b/myems-api/README.md index 185d9a76..2a55fc7d 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -117,9 +117,7 @@ git clone https://github.com/MyEMS/myems.git cd ~/myems/myems-api sudo cp -R ~/myems/myems-api /myems-api ``` - Change the config file: - - Note: change cookie domain to the actual domain or IP address of Web UI and Admin UI + Change IP address in the config file: ```bash sudo nano /myems-api/config.py ``` @@ -283,9 +281,9 @@ curl -i -X GET {{base_url}}/costfiles curl -i -X DELETE {{base_url}}/costfiles/{id} ``` * POST Upload a Cost File - (user must login first to get cookie) + (call users login API to get 'User-UUID' and 'Token') ```bash -curl -i -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/costfiles +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/costfiles ``` * GET Restore a Cost File by ID from database to disk ```bash @@ -944,9 +942,9 @@ curl -i -X GET {{base_url}}/knowledgefiles curl -i -X DELETE {{base_url}}/knowledgefiles/{id} ``` * POST Upload a Knowledge File - (user must login first to get cookie) + (call users login API to get 'User-UUID' and 'Token') ```bash -curl -i -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/knowledgefiles +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/knowledgefiles ``` * GET Restore a Knowledge File by id from database to disk ```bash @@ -1140,9 +1138,9 @@ curl -i -X GET {{base_url}}/offlinemeterfiles curl -i -X DELETE {{base_url}}/offlinemeterfiles/{id} ``` * POST Upload an Offline Meter File - (user must log in first to get cookie) + (call users login API to get 'User-UUID' and 'Token') ```bash -curl -i -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/offlinemeterfiles +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/offlinemeterfiles ``` * GET Restore an Offline Meter File by ID from database to disk ```bash diff --git a/myems-api/config.py b/myems-api/config.py index 5a365c99..b762986a 100644 --- a/myems-api/config.py +++ b/myems-api/config.py @@ -61,10 +61,6 @@ myems_reporting_db = { 'database': 'myems_reporting_db', } -# address for Cookie domain -# use the actual domain or IP address of Web UI and Admin UI -myems_api_domain = '127.0.0.1' - # indicated in how many minutes to calculate meter energy consumption # 30 for half hourly period # 60 for hourly period diff --git a/myems-api/core/user.py b/myems-api/core/user.py index b78b5d3f..9d1fb7c6 100644 --- a/myems-api/core/user.py +++ b/myems-api/core/user.py @@ -447,10 +447,6 @@ class UserLogin: cnx.commit() cursor.close() cnx.disconnect() - resp.set_cookie('user_uuid', user_uuid, - domain=config.myems_api_domain, path='/', secure=False, http_only=False) - resp.set_cookie('token', token, - domain=config.myems_api_domain, path='/', secure=False, http_only=False) del result['salt'] del result['password'] result['token'] = token @@ -502,11 +498,6 @@ class UserLogout: if rowcount is None or rowcount == 0: raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND', description='API.USER_SESSION_NOT_FOUND') - - resp.set_cookie('user_uuid', '', - domain=config.myems_api_domain, path='/', secure=False, http_only=False) - resp.set_cookie('token', '', - domain=config.myems_api_domain, path='/', secure=False, http_only=False) resp.body = json.dumps("OK") resp.status = falcon.HTTP_200 diff --git a/myems-api/core/userlogger.py b/myems-api/core/userlogger.py index fd76756d..f40e5c4b 100644 --- a/myems-api/core/userlogger.py +++ b/myems-api/core/userlogger.py @@ -54,12 +54,12 @@ def user_logger(func): func(*args, **kwargs) return req, resp = args - cookies = req.cookies - if cookies is not None and 'user_uuid' in cookies.keys(): - user_uuid = cookies['user_uuid'] + headers = req.headers + if headers is not None and 'USER-UUID' in headers.keys(): + user_uuid = headers['USER-UUID'] else: # todo: deal with requests with NULL user_uuid - print('user_logger: user_uuid is NULL') + print('user_logger: USER-UUID is NULL') # do not log for NULL user_uuid func(*args, **kwargs) return diff --git a/myems-api/reports/dashboard.py b/myems-api/reports/dashboard.py index 844a0d7c..0b03d626 100644 --- a/myems-api/reports/dashboard.py +++ b/myems-api/reports/dashboard.py @@ -33,7 +33,6 @@ class Reporting: #################################################################################################################### @staticmethod def on_get(req, resp): - print(req.params) user_uuid = req.params.get('useruuid') period_type = req.params.get('periodtype') base_start_datetime_local = req.params.get('baseperiodstartdatetime') From 16630dc30e1fdff15645daa3a2098e8a95c1ef29 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Mon, 6 Sep 2021 15:01:24 +0800 Subject: [PATCH 27/87] modified API error message for knowledge file cannot be removed from disk --- admin/app/translations.js | 3 +++ myems-api/core/knowledgefile.py | 3 +-- web/README.md | 17 +++++++++++++---- web/src/i18n.js | 3 +++ 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/admin/app/translations.js b/admin/app/translations.js index 11fb9c0b..1f6497fb 100644 --- a/admin/app/translations.js +++ b/admin/app/translations.js @@ -834,6 +834,7 @@ function config($translateProvider) { INVALID_VIRTUAL_METER_NAME: 'Invalid Virtual Meter Name', INVALID_WEB_MESSAGE_ID: 'Invalid Web Message ID', INVALID_WECHAT_MESSAGE_ID: 'Invalid Wechat Message ID', + KNOWLEDGE_FILE_CANNOT_BE_REMOVED_FROM_DISK: 'Knowledge File Cannot be Removed from Disk', KNOWLEDGE_FILE_NOT_FOUND: 'Knowledge File Not Found', MASTER_METER_DOES_NOT_BELONG_TO_SAME_ENERGY_CATEGORY: 'Master Meter Does Not Belong To Same Energy Category', MASTER_METER_NOT_FOUND: 'Master Meter Not Found', @@ -1821,6 +1822,7 @@ function config($translateProvider) { INVALID_VIRTUAL_METER_NAME: 'Invalid Virtual Meter Name', INVALID_WEB_MESSAGE_ID: 'Invalid Web Message ID', INVALID_WECHAT_MESSAGE_ID: 'Invalid Wechat Message ID', + KNOWLEDGE_FILE_CANNOT_BE_REMOVED_FROM_DISK: 'Knowledge File Cannot be Removed from Disk', KNOWLEDGE_FILE_NOT_FOUND: 'Knowledge File Not Found', MASTER_METER_DOES_NOT_BELONG_TO_SAME_ENERGY_CATEGORY: 'Master Meter Does Not Belong To Same Energy Category', MASTER_METER_NOT_FOUND: 'Master Meter Not Found', @@ -2807,6 +2809,7 @@ function config($translateProvider) { INVALID_VIRTUAL_METER_NAME: 'Invalid Virtual Meter Name', INVALID_WEB_MESSAGE_ID: 'Invalid Web Message ID', INVALID_WECHAT_MESSAGE_ID: 'Invalid Wechat Message ID', + KNOWLEDGE_FILE_CANNOT_BE_REMOVED_FROM_DISK: 'Knowledge File Cannot be Removed from Disk', KNOWLEDGE_FILE_NOT_FOUND: 'Knowledge File Not Found', MASTER_METER_DOES_NOT_BELONG_TO_SAME_ENERGY_CATEGORY: 'Master Meter Does Not Belong To Same Energy Category', MASTER_METER_NOT_FOUND: 'Master Meter Not Found', diff --git a/myems-api/core/knowledgefile.py b/myems-api/core/knowledgefile.py index 43946971..75154c46 100644 --- a/myems-api/core/knowledgefile.py +++ b/myems-api/core/knowledgefile.py @@ -257,12 +257,11 @@ class KnowledgeFileItem: file_uuid = row[0] # Define file_path file_path = os.path.join(config.upload_path, file_uuid) - # remove the file from disk os.remove(file_path) except Exception as ex: raise falcon.HTTPError(falcon.HTTP_400, title='API.ERROR', - description='API.KNOWLEDGE_FILE_NOT_FOUND') + description='API.KNOWLEDGE_FILE_CANNOT_BE_REMOVED_FROM_DISK') cursor.execute(" DELETE FROM tbl_knowledge_files WHERE id = %s ", (id_,)) cnx.commit() diff --git a/web/README.md b/web/README.md index ad00db13..18b79969 100644 --- a/web/README.md +++ b/web/README.md @@ -42,17 +42,26 @@ npx -v ``` * Open the “myems/web” directory with your cmd or terminal -* Run 'sudo npm i --unsafe-perm=true --allow-root' - +```bash +cd myems/web +sudo npm i --unsafe-perm=true --allow-root +``` + This command will download all the necessary dependencies for falcon in the node_modules directory. * If you modified any scss files, then you need to compile SCSS -Run 'sudo npm run scss' command in your project directory to compile scss. +Run below command in your project directory to compile scss. +```bash +sudo npm run scss +``` * Run 'sudo npm start' A local web server will start at http://localhost:3000. We are using webpack and webpack-serve to automatically detect file changes. So, if you edit and save a file, your browser will automatically refresh and preview the change. ## Creating a Production Build -* Run 'sudo npm run build' command in your project directory to make the Production build. +* Run below command in your project directory to make the Production build. +```bash +sudo npm run build +``` This will create an optimized production build by compililing, merging and minifying all the source files as necessary and put them in the build/ folder. diff --git a/web/src/i18n.js b/web/src/i18n.js index f10b33f6..9bf58b21 100644 --- a/web/src/i18n.js +++ b/web/src/i18n.js @@ -597,6 +597,7 @@ const resources = { "API.INVALID_VIRTUAL_METER_NAME": "Invalid virtual meter name", "API.INVALID_WEB_MESSAGE_ID": "Invalid web message id", "API.INVALID_WECHAT_MESSAGE_ID": "Invalid wechat message id", + "API.KNOWLEDGE_FILE_CANNOT_BE_REMOVED_FROM_DISK": "Knowledge File Cannot be Removed from Disk", "API.KNOWLEDGE_FILE_NOT_FOUND": "Knowledge file not found", "API.MASTER_METER_DOES_NOT_BELONG_TO_SAME_ENERGY_CATEGORY": "Master meter does not belong to same energy category", "API.MASTER_METER_NOT_FOUND": "Master meter not found", @@ -1346,6 +1347,7 @@ const resources = { "API.INVALID_VIRTUAL_METER_NAME": "", "API.INVALID_WEB_MESSAGE_ID": "", "API.INVALID_WECHAT_MESSAGE_ID": "", + "API.KNOWLEDGE_FILE_CANNOT_BE_REMOVED_FROM_DISK": "", "API.KNOWLEDGE_FILE_NOT_FOUND": "", "API.MASTER_METER_DOES_NOT_BELONG_TO_SAME_ENERGY_CATEGORY": "", "API.MASTER_METER_NOT_FOUND": "", @@ -2095,6 +2097,7 @@ const resources = { "API.INVALID_VIRTUAL_METER_NAME": "", "API.INVALID_WEB_MESSAGE_ID": "", "API.INVALID_WECHAT_MESSAGE_ID": "", + "API.KNOWLEDGE_FILE_CANNOT_BE_REMOVED_FROM_DISK": "", "API.KNOWLEDGE_FILE_NOT_FOUND": "", "API.MASTER_METER_DOES_NOT_BELONG_TO_SAME_ENERGY_CATEGORY": "", "API.MASTER_METER_NOT_FOUND": "", From 53bb7e2ceff39859dcd1bae9acca785f09eacc2d Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Tue, 7 Sep 2021 12:24:28 +0800 Subject: [PATCH 28/87] updated Web UI README --- web/README.md | 75 ++++++++++++++++++------------------------- web/package-lock.json | 11 +++++++ web/package.json | 1 + web/server.js | 4 +-- 4 files changed, 45 insertions(+), 46 deletions(-) diff --git a/web/README.md b/web/README.md index 18b79969..57493eca 100644 --- a/web/README.md +++ b/web/README.md @@ -1,76 +1,63 @@ # MyEMS Web ## Introduction -MyEMS Web 用户界面,用于能源数据分析 -Providing Web UI for MyEMS users to analysis energy data +MyEMS Web 用户界面,用于查询能源报表 +Providing Web UI of MyEMS for viewing energy reports ## Prerequisites Node.js -nginx-1.18.0 or later - -## Running in Local environment -This project is scaffolded using Create React App. +## Running in Local Environment for Development * Install Node.js via binary archive on Linux Download Current Linux Binaries (x64) from https://nodejs.org/en/download/current/ -Unzip the binary archive to /usr/local/bin/nodejs, ```bash sudo mkdir -p /usr/local/lib/nodejs -sudo tar -xJvf node-v1x.x.x-linux-x64.tar.xz -C /usr/local/lib/nodejs +sudo tar -xJvf node-vxx.x.x-linux-x64.tar.xz -C /usr/local/lib/nodejs +sudo ln -s /usr/local/lib/nodejs/node-vxx.x.x-linux-x64/bin/node /usr/bin/node +sudo ln -s /usr/local/lib/nodejs/node-vxx.x.x-linux-x64/bin/npm /usr/bin/npm +sudo ln -s /usr/local/lib/nodejs/node-vxx.x.x-linux-x64/bin/npx /usr/bin/npx ``` -Using sudo to symlink node, npm, and npx into /usr/bin/: -```bash -sudo ln -s /usr/local/lib/nodejs/node-v1x.x.x-linux-x64/bin/node /usr/bin/node -``` -```bash -sudo ln -s /usr/local/lib/nodejs/node-v1x.x.x-linux-x64/bin/npm /usr/bin/npm -``` -```bash -sudo ln -s /usr/local/lib/nodejs/node-v1x.x.x-linux-x64/bin/npx /usr/bin/npx -``` -Test installation using +Test installation ```bash node -v -``` -```bash npm version -``` -```bash npx -v ``` -* Open the “myems/web” directory with your cmd or terminal +* Download all the necessary dependencies into the node_modules directory. ```bash cd myems/web sudo npm i --unsafe-perm=true --allow-root ``` - -This command will download all the necessary dependencies for falcon in the node_modules directory. -* If you modified any scss files, then you need to compile SCSS +* If you modified any scss files then you need to compile SCSS, else you can safely ignore this step. Run below command in your project directory to compile scss. ```bash sudo npm run scss ``` -* Run 'sudo npm start' +* Starting the Development Server A local web server will start at http://localhost:3000. We are using webpack and webpack-serve to automatically detect file changes. So, if you edit and save a file, your browser will automatically refresh and preview the change. +``` +sudo npm start +``` -## Creating a Production Build +## Install Production Build Option 1: on Node.js Web Server * Run below command in your project directory to make the Production build. +This will create an optimized production build by compililing, merging and minifying all the source files as necessary and put them in the build/ folder. ```bash sudo npm run build ``` +* Run the production build locally at http://localhost:80. +If you want to listen on other port, change it in myems/web/server.js +``` +sudo node server.js +``` -This will create an optimized production build by compililing, merging and minifying all the source files as necessary and put them in the build/ folder. - -You can run 'node server.js' to run the production build locally at http://localhost:5000. - -## Option 1: Install Production Build on NGINX Server +## Install Production Build Option 2: on NGINX Server (Highly Recommended) * Install NGINX Server - refer to http://nginx.org/en/docs/install.html * Configure NGINX @@ -116,16 +103,16 @@ Restart NGINX sudo systemctl restart nginx ``` -* Download myems: +* Download MyEMS: ```bash cd ~ git clone https://github.com/MyEMS/myems.git ``` -* Install myems-web : +* Install MyEMS Web UI: Check and change the config file if necessary: ```bash -cd ~/myems/web +cd myems/web sudo nano src/config.js ``` Build and Compress @@ -142,7 +129,7 @@ sudo rm -r /var/www/html/web sudo mv build /var/www/html/web ``` -## Option 2: Install Production Build on Apache2 Server +## Install Production Build Option 3: on Apache2 Server * Install Apache2 Server refer to https://httpd.apache.org/docs/2.4/install.html @@ -174,21 +161,21 @@ Add a new 'VirtualHost' as below
``` -* Download myems: +* Download MyEMS: ```bash cd ~ git clone https://github.com/MyEMS/myems.git ``` -* Install myems-web : +* Install MyEMS Web UI: Check and change the config file if necessary: ```bash -cd ~/myems/web +cd myems/web sudo nano src/config.js ``` Build and Compress ```bash -cd ~/myems/web/ +cd myems/web/ sudo npm run build tar czvf myems-web.tar.gz build ``` @@ -199,4 +186,4 @@ tar czvf myems-web.tar.gz build tar xzf myems-web.tar.gz sudo rm -r /var/www/web sudo mv build /var/www/web -``` \ No newline at end of file +``` diff --git a/web/package-lock.json b/web/package-lock.json index 3952689e..b7fe83ae 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -30,6 +30,7 @@ "echarts-for-react": "^2.0.16", "element-resize-event": "^3.0.3", "emoji-mart": "^3.0.0", + "express-rate-limit": "^5.3.0", "fuse.js": "^6.4.3", "google-maps-react": "^2.0.6", "i18next": "^19.6.3", @@ -8599,6 +8600,11 @@ "node": ">= 0.10.0" } }, + "node_modules/express-rate-limit": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.3.0.tgz", + "integrity": "sha512-qJhfEgCnmteSeZAeuOKQ2WEIFTX5ajrzE0xS6gCOBCoRQcU+xEzQmgYQQTpzCcqUAAzTEtu4YEih4pnLfvNtew==" + }, "node_modules/express/node_modules/array-flatten": { "version": "1.1.1", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" @@ -28780,6 +28786,11 @@ } } }, + "express-rate-limit": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.3.0.tgz", + "integrity": "sha512-qJhfEgCnmteSeZAeuOKQ2WEIFTX5ajrzE0xS6gCOBCoRQcU+xEzQmgYQQTpzCcqUAAzTEtu4YEih4pnLfvNtew==" + }, "ext": { "version": "1.4.0", "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", diff --git a/web/package.json b/web/package.json index 59399009..439b31e3 100644 --- a/web/package.json +++ b/web/package.json @@ -25,6 +25,7 @@ "echarts-for-react": "^2.0.16", "element-resize-event": "^3.0.3", "emoji-mart": "^3.0.0", + "express-rate-limit": "^5.3.0", "fuse.js": "^6.4.3", "google-maps-react": "^2.0.6", "i18next": "^19.6.3", diff --git a/web/server.js b/web/server.js index 2c37d479..11de3884 100644 --- a/web/server.js +++ b/web/server.js @@ -21,6 +21,6 @@ app.use(limiter); app.get('*', function(req, res) { res.sendFile(path.join(__dirname, 'build', 'index.html')); }); -app.listen(process.env.PORT || 5000, function() { - console.log(`Frontend start on http://localhost:5000`); +app.listen(process.env.PORT || 80, function() { + console.log(`Frontend start on http://localhost:80`); }); From 99f05c4311c0d498190a71e3da83ba1bee5bf888 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Tue, 7 Sep 2021 17:33:10 +0800 Subject: [PATCH 29/87] updated README for installing openpyxl --- docs/installation.rst | 16 +++++------ myems-api/README.md | 50 ++++++++++++++++++++--------------- myems-normalization/README.md | 17 ++++++------ 3 files changed, 44 insertions(+), 39 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index eb5dcbea..3457f290 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -68,15 +68,15 @@ Installation * Install openpyxl, refer to `https://foss.heptapod.net/openpyxl/openpyxl `_ - | Get the latest version of et_xmlfile from `https://bitbucket.org/openpyxl/et_xmlfile/downloads/ `_ + | Get the latest version of et_xmlfile from `https://foss.heptapod.net/openpyxl/et_xmlfile/ `_ | Get the latest version of jdcal from `https://github.com/phn/jdcal `_ - | Get the latest version of openpyxl from `https://bitbucket.org/openpyxl/openpyxl/downloads/ `_ + | Get the latest version of openpyxl from `https://foss.heptapod.net/openpyxl/openpyxl `_ :: $ cd ~/tools - $ wget https://foss.heptapod.net/openpyxl/et_xmlfile/-/archive/branch/default/et_xmlfile-branch-default.tar.gz - $ tar xzf et_xmlfile-branch-default.tar.gz - $ cd ~/tools/et_xmlfile-branch-default + $ wget https://foss.heptapod.net/openpyxl/et_xmlfile/-/archive/1.1/et_xmlfile-1.1.tar.gz + $ tar xzf et_xmlfile-1.1.tar.gz + $ cd ~/tools/et_xmlfile-1.1 $ sudo python3 setup.py install $ cd ~/tools $ git clone https://github.com/phn/jdcal.git @@ -86,9 +86,9 @@ Installation $ pip3 download Pillow $ sudo pip3 install --no-index --find-links ~/tools/pillow Pillow $ cd ~/tools - $ wget https://foss.heptapod.net/openpyxl/openpyxl/-/archive/branch/3.0/openpyxl-branch-3.0.tar.gz - $ tar xzf openpyxl-branch-3.0.tar.gz - $ cd openpyxl-branch-3.0 + $ wget https://foss.heptapod.net/openpyxl/openpyxl/-/archive/3.0.7/openpyxl-3.0.7.tar.gz + $ tar xzf openpyxl-3.0.7.tar.gz + $ cd openpyxl-3.0.7 $ sudo python3 setup.py install * Install gunicorn service for myems-api:: diff --git a/myems-api/README.md b/myems-api/README.md index 2a55fc7d..a4c1145c 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -79,31 +79,37 @@ sudo python3 setup.py install ``` * Install openpyxl, refer to https://foss.heptapod.net/openpyxl/openpyxl - -Get the latest version of et_xmlfile from https://foss.heptapod.net/openpyxl/et_xmlfile - -Get the latest version of jdcal from https://github.com/phn/jdcal - +Get the latest version of et_xmlfile from https://foss.heptapod.net/openpyxl/et_xmlfile/ +```bash +cd ~/tools +wget https://foss.heptapod.net/openpyxl/et_xmlfile/-/archive/1.1/et_xmlfile-1.1.tar.gz +tar xzf et_xmlfile-1.1.tar.gz +``` +Get jdcal +```bash +cd ~/tools +git clone https://github.com/phn/jdcal.git +``` +Get Pillow +``` +mkdir ~/tools/pillow && cd ~/tools/pillow +pip3 download Pillow +``` Get the latest version of openpyxl from https://foss.heptapod.net/openpyxl/openpyxl +```bash +cd ~/tools +wget https://foss.heptapod.net/openpyxl/openpyxl/-/archive/3.0.7/openpyxl-3.0.7.tar.gz +tar xzf openpyxl-3.0.7.tar.gz +``` ```bash - cd ~/tools - wget https://foss.heptapod.net/openpyxl/et_xmlfile/-/archive/branch/default/et_xmlfile-branch-default.tar.gz - tar xzf et_xmlfile-branch-default.tar.gz - cd ~/tools/et_xmlfile-branch-default - sudo python3 setup.py install - cd ~/tools - git clone https://github.com/phn/jdcal.git - cd ~/tools/jdcal - sudo python3 setup.py install - mkdir ~/tools/pillow && cd ~/tools/pillow - pip3 download Pillow - sudo pip3 install --no-index --find-links ~/tools/pillow Pillow - cd ~/tools - wget https://foss.heptapod.net/openpyxl/openpyxl/-/archive/branch/3.0/openpyxl-branch-3.0.tar.gz - tar xzf openpyxl-branch-3.0.tar.gz - cd openpyxl-branch-3.0 - sudo python3 setup.py install +cd ~/tools/et_xmlfile-1.1 +sudo python3 setup.py install +cd ~/tools/jdcal +sudo python3 setup.py install +sudo pip3 install --no-index --find-links ~/tools/pillow Pillow +cd ~/tools/openpyxl-3.0.7 +sudo python3 setup.py install ``` * Download myems: diff --git a/myems-normalization/README.md b/myems-normalization/README.md index 12a40430..00a3e4f7 100644 --- a/myems-normalization/README.md +++ b/myems-normalization/README.md @@ -45,28 +45,27 @@ Download and install openpyxl ```bash cd ~/tools ``` -Get the latest version of et_xmlfile from https://bitbucket.org/openpyxl/et_xmlfile/downloads/ +Get the latest version of et_xmlfile from https://foss.heptapod.net/openpyxl/et_xmlfile/ ```bash -wget https://bitbucket.org/openpyxl/et_xmlfile/get/50973a6de49c.zip -7z x 50973a6de49c.zip && mv openpyxl-et_xmlfile-50973a6de49c et_xmlfile +wget https://foss.heptapod.net/openpyxl/et_xmlfile/-/archive/1.1/et_xmlfile-1.1.tar.gz +tar xzf et_xmlfile-1.1.tar.gz ``` Get jdcal ```bash git clone https://github.com/phn/jdcal.git ``` - -Get the latest version of openpyxl from https://bitbucket.org/openpyxl/openpyxl/downloads/ +Get the latest version of openpyxl from https://foss.heptapod.net/openpyxl/openpyxl ```bash -wget https://bitbucket.org/openpyxl/openpyxl/get/8953233f5af2.zip -7z x 8953233f5af2.zip && mv openpyxl-openpyxl-8953233f5af2 openpyxl +wget https://foss.heptapod.net/openpyxl/openpyxl/-/archive/3.0.7/openpyxl-3.0.7.tar.gz +tar xzf openpyxl-3.0.7.tar.gz ``` ```bash -cd ~/tools/et_xmlfile +cd ~/tools/et_xmlfile-1.1 sudo python3 setup.py install cd ~/tools/jdcal sudo python3 setup.py install -cd ~/tools/openpyxl +cd ~/tools/openpyxl-3.0.7 sudo python3 setup.py install ``` From b6f6b4a74cb90f83749245b87d11053ec4cc52b8 Mon Sep 17 00:00:00 2001 From: hyh123a Date: Tue, 7 Sep 2021 15:18:31 +0800 Subject: [PATCH 30/87] fixed the 404 error --- web/nginx.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/web/nginx.conf b/web/nginx.conf index 69c29fee..2f901303 100644 --- a/web/nginx.conf +++ b/web/nginx.conf @@ -33,6 +33,7 @@ http { location / { root /var/www/html/web; index index.html index.htm; + try_files $uri /index.html; } #error_page 404 /404.html; From a38743b722d218273984a2a6e4cd9deb81d04919 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Tue, 7 Sep 2021 18:25:28 +0800 Subject: [PATCH 31/87] added try_files directive to avoid 404 error while refreshing pages in Web UI --- web/nginx.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/web/nginx.conf b/web/nginx.conf index 2f901303..e841df22 100644 --- a/web/nginx.conf +++ b/web/nginx.conf @@ -33,6 +33,7 @@ http { location / { root /var/www/html/web; index index.html index.htm; + # add try_files directive to avoid 404 error while refreshing pages try_files $uri /index.html; } From 0ca38136b492a521a7be06bf4ddec4f421ababdf Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Wed, 8 Sep 2021 14:42:42 +0800 Subject: [PATCH 32/87] updated README of Web UI --- web/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/README.md b/web/README.md index 57493eca..d275b7c6 100644 --- a/web/README.md +++ b/web/README.md @@ -87,6 +87,8 @@ Add a new 'server' section with direstives as below: location / { root /var/www/html/web; index index.html index.htm; + # add try_files directive to avoid 404 error while refreshing pages + try_files $uri /index.html; } -- To avoid CORS issue, use Nginx to proxy myems-api to path /api -- Add another location /api in 'server ', replace demo address http://127.0.0.1:8000/ with actual url From e30bd7048a78c66b5608949de0ef4f25505e5054 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Wed, 8 Sep 2021 15:43:01 +0800 Subject: [PATCH 33/87] updated i18n of Web UI --- web/src/i18n.js | 1597 +++++++++++++++++++++++------------------------ 1 file changed, 798 insertions(+), 799 deletions(-) diff --git a/web/src/i18n.js b/web/src/i18n.js index 9bf58b21..bef67565 100644 --- a/web/src/i18n.js +++ b/web/src/i18n.js @@ -1099,406 +1099,405 @@ const resources = { "RMB Account": "RMB-Konto", // button "Toggle Navigation": "Navigation umschalten", - //API - "API.ADMINISTRATOR_SESSION_NOT_FOUND": "", - "API.ADMINISTRATOR_SESSION_TIMEOUT": "", - "API.ADVANCED_REPORT_NOT_FOUND": "", - "API.BAD_REQUEST": "", - "API.CANNOT_SET_EXISTING_SUBMETER_AS_MASTER_METER": "", - "API.COMBINED_EQUIPMENT_EQUIPMENT_RELATION_EXISTS": "", - "API.COMBINED_EQUIPMENT_EQUIPMENT_RELATION_NOT_FOUND": "", - "API.COMBINED_EQUIPMENT_METER_RELATION_EXISTS": "", - "API.COMBINED_EQUIPMENT_METER_RELATION_NOT_FOUND": "", - "API.COMBINED_EQUIPMENT_NAME_IS_ALREADY_IN_USE": "", - "API.COMBINED_EQUIPMENT_NOT_FOUND": "", - "API.COMBINED_EQUIPMENT_OFFLINE_METER_RELATION_EXISTS": "", - "API.COMBINED_EQUIPMENT_OFFLINE_METER_RELATION_NOT_FOUND": "", - "API.COMBINED_EQUIPMENT_PARAMETER_NAME_IS_ALREADY_IN_USE": "", - "API.COMBINED_EQUIPMENT_PARAMETER_NOT_FOUND_OR_NOT_MATCH": "", - "API.COMBINED_EQUIPMENT_VIRTUAL_METER_RELATION_EXISTS": "", - "API.COMBINED_EQUIPMENT_VIRTUAL_METER_RELATION_NOT_FOUND": "", - "API.CONTACT_NAME_IS_ALREADY_IN_USE": "", - "API.CONTACT_NOT_FOUND": "", - "API.COST_CENTER_EXTERNAL_ID_EXISTS": "", - "API.COST_CENTER_NAME_EXISTS": "", - "API.COST_CENTER_NOT_FOUND": "", - "API.COST_FILE_NOT_FOUND": "", - "API.DATA_SOURCE_NAME_IS_ALREADY_IN_USE": "", - "API.DATA_SOURCE_NOT_FOUND": "", - "API.DATABASE_ERROR": "", - "API.DISTRIBUTION_CIRCUIT_NAME_IS_ALREADY_IN_USE": "", - "API.DISTRIBUTION_CIRCUIT_NOT_FOUND": "", - "API.DISTRIBUTION_CIRCUIT_POINT_RELATION_EXISTS": "", - "API.DISTRIBUTION_CIRCUIT_POINT_RELATION_NOT_FOUND": "", - "API.DISTRIBUTION_SYSTEM_NAME_IS_ALREADY_IN_USE": "", - "API.DISTRIBUTION_SYSTEM_NOT_FOUND": "", - "API.EMAIL_IS_ALREADY_IN_USE": "", - "API.EMAIL_MESSAGE_NOT_FOUND": "", - "API.EMAIL_SERVER_HOST_IS_ALREADY_IN_USE": "", - "API.EMAIL_SERVER_NOT_FOUND": "", - "API.EMPTY_VARIABLES_ARRAY": "", - "API.ENERGY_CATEGORY_NAME_IS_ALREADY_IN_USE": "", - "API.ENERGY_CATEGORY_NOT_FOUND": "", - "API.ENERGY_CATEGORY_USED_IN_ENERGY_ITEMS": "", - "API.ENERGY_CATEGORY_USED_IN_METER": "", - "API.ENERGY_CATEGORY_USED_IN_OFFLINE_METER": "", - "API.ENERGY_CATEGORY_USED_IN_TARIFFS": "", - "API.ENERGY_CATEGORY_USED_IN_VIRTUAL_METER": "", - "API.ENERGY_FLOW_DIAGRAM_LINK_IS_ALREADY_IN_USE": "", - "API.ENERGY_FLOW_DIAGRAM_LINK_NOT_FOUND_OR_NOT_MATCH": "", - "API.ENERGY_FLOW_DIAGRAM_NAME_IS_ALREADY_IN_USE": "", - "API.ENERGY_FLOW_DIAGRAM_NODE_NAME_IS_ALREADY_IN_USE": "", - "API.ENERGY_FLOW_DIAGRAM_NODE_NOT_FOUND_OR_NOT_MATCH": "", - "API.ENERGY_FLOW_DIAGRAM_NOT_FOUND": "", - "API.ENERGY_ITEM_DOES_NOT_BELONG_TO_ENERGY_CATEGORY": "", - "API.ENERGY_ITEM_IS_NOT_BELONG_TO_ENERGY_CATEGORY": "", - "API.ENERGY_ITEM_NAME_IS_ALREADY_IN_USE": "", - "API.ENERGY_ITEM_NOT_FOUND": "", - "API.ENERGY_ITEM_USED_IN_METER": "", - "API.ENERGY_ITEM_USED_IN_OFFLINE_METER": "", - "API.ENERGY_ITEM_USED_IN_VIRTUAL_METER": "", - "API.EQUIPMENT_METER_RELATION_EXISTS": "", - "API.EQUIPMENT_METER_RELATION_NOT_FOUND": "", - "API.EQUIPMENT_NAME_IS_ALREADY_IN_USE": "", - "API.EQUIPMENT_NOT_FOUND": "", - "API.EQUIPMENT_OFFLINE_METER_RELATION_EXISTS": "", - "API.EQUIPMENT_OFFLINE_METER_RELATION_NOT_FOUND": "", - "API.EQUIPMENT_PARAMETER_NAME_IS_ALREADY_IN_USE": "", - "API.EQUIPMENT_PARAMETER_NOT_FOUND_OR_NOT_MATCH": "", - "API.EQUIPMENT_VIRTUAL_METER_RELATION_EXISTS": "", - "API.EQUIPMENT_VIRTUAL_METER_RELATION_NOT_FOUND": "", - "API.ERROR": "", - "API.EXCEPTION": "", - "API.FAILED_TO_RESTORE_COST_FILE": "", - "API.FAILED_TO_RESTORE_KNOWLEDGE_FILE": "", - "API.FAILED_TO_RESTORE_OFFLINE_METER_FILE": "", - "API.FAILED_TO_UPLOAD_COST_FILE": "", - "API.FAILED_TO_UPLOAD_KNOWLEDGE_FILE": "", - "API.FAILED_TO_UPLOAD_OFFLINE_METER_FILE": "", - "API.GATEWAY_NAME_IS_ALREADY_IN_USE": "", - "API.GATEWAY_NOT_FOUND": "", - "API.GSM_MODEM_NOT_FOUND": "", - "API.GSM_MODEM_SERIAL_PORT_IS_ALREADY_IN_USE": "", - "API.INVALID_": "", - "API.INVALID_ADDRESS": "", - "API.INVALID_ADDRESS_VALUE": "", - "API.INVALID_ADVANCED_REPORT_ID": "", - "API.INVALID_AREA_VALUE": "", - "API.INVALID_BASE_PERIOD_END_DATETIME": "", - "API.INVALID_BASE_PERIOD_START_DATETIME": "", - "API.INVALID_BAUD_RATE": "", - "API.INVALID_BUILDINGS_VALUE": "", - "API.INVALID_CATEGORY": "", - "API.INVALID_CHANNEL": "", - "API.INVALID_COMBINED_EQUIPMENT_ID": "", - "API.INVALID_COMBINED_EQUIPMENT_NAME": "", - "API.INVALID_COMBINED_EQUIPMENT_PARAMETER_ID": "", - "API.INVALID_COMBINED_EQUIPMENT_PARAMETER_NAME": "", - "API.INVALID_COMBINED_EQUIPMENT_PARAMETER_TYPE": "", - "API.INVALID_CONNECTION": "", - "API.INVALID_CONSTANT_VALUE": "", - "API.INVALID_CONTACT_ID": "", - "API.INVALID_CONTACT_NAME": "", - "API.INVALID_COST_CENTER_ID": "", - "API.INVALID_COST_FILE_ID": "", - "API.INVALID_DATA_SOURCE_ID": "", - "API.INVALID_DATA_SOURCE_NAME": "", - "API.INVALID_DATA_SOURCE_PROTOCOL": "", - "API.INVALID_DENOMINATOR_METER_UUID": "", - "API.INVALID_DISPLAY_NAME": "", - "API.INVALID_DISTRIBUTION_CIRCUIT_ID": "", - "API.INVALID_DISTRIBUTION_CIRCUIT_NAME": "", - "API.INVALID_DISTRIBUTION_ROOM": "", - "API.INVALID_DISTRIBUTION_SYSTEM_ID": "", - "API.INVALID_DISTRIBUTION_SYSTEM_NAME": "", - "API.INVALID_EMAIL": "", - "API.INVALID_EMAIL_MESSAGE_ID": "", - "API.INVALID_EMAIL_SERVER_HOST": "", - "API.INVALID_EMAIL_SERVER_ID": "", - "API.INVALID_END_DATE_FORMAT": "", - "API.INVALID_END_DATETIME": "", - "API.INVALID_ENERGY_CATEGORY_ID": "", - "API.INVALID_ENERGY_CATEGORY_NAME": "", - "API.INVALID_ENERGY_FLOW_DIAGRAM_ID": "", - "API.INVALID_ENERGY_FLOW_DIAGRAM_LINK_ID": "", - "API.INVALID_ENERGY_FLOW_DIAGRAM_NAME": "", - "API.INVALID_ENERGY_FLOW_DIAGRAM_NODE_ID": "", - "API.INVALID_ENERGY_FLOW_DIAGRAM_NODE_NAME": "", - "API.INVALID_ENERGY_ITEM_ID": "", - "API.INVALID_ENERGY_ITEM_NAME": "", - "API.INVALID_EQUATION_IN_EXPRESSION": "", - "API.INVALID_EQUIPMENT_ID": "", - "API.INVALID_equipment_ID": "", - "API.INVALID_EQUIPMENT_NAME": "", - "API.INVALID_EQUIPMENT_PARAMETER_ID": "", - "API.INVALID_EQUIPMENT_PARAMETER_NAME": "", - "API.INVALID_EQUIPMENT_PARAMETER_TYPE": "", - "API.INVALID_EXPRESSION": "", - "API.INVALID_EXPRESSION_OBJECT": "", - "API.INVALID_FDD_CODE": "", - "API.INVALID_FLOORS_VALUE": "", - "API.INVALID_FROM_ADDR": "", - "API.INVALID_GATEWAY_ID": "", - "API.INVALID_GATEWAY_NAME": "", - "API.INVALID_GSM_MODEM_ID": "", - "API.INVALID_HOURLY_HIGH_LIMIT_VALUE": "", - "API.INVALID_HOURLY_LOW_LIMIT_VALUE": "", - "API.INVALID_IS_ADMIN_VALUE": "", - "API.INVALID_IS_COUNTED_VALUE": "", - "API.INVALID_IS_ENABLED": "", - "API.INVALID_IS_HIDDEN": "", - "API.INVALID_IS_IN_LEASE_VALUE": "", - "API.INVALID_IS_INPUT_COUNTED_VALUE": "", - "API.INVALID_IS_KEY_TENANT_VALUE": "", - "API.INVALID_IS_OUTPUT_COUNTED_VALUE": "", - "API.INVALID_IS_OUTPUT_VALUE": "", - "API.INVALID_IS_TREND_VALUE": "", - "API.INVALID_IS_VIRTUAL_VALUE": "", - "API.INVALID_KGCE": "", - "API.INVALID_KGCO2E": "", - "API.INVALID_KNOWLEDGE_FILE_ID": "", - "API.INVALID_LATITUDE_VALUE": "", - "API.INVALID_LEASE_NUMBER_VALUE": "", - "API.INVALID_LONGITUDE_VALUE": "", - "API.INVALID_LOW_LIMIT_VALUE": "", - "API.INVALID_MASTER_METER_ID": "", - "API.INVALID_MENU_ID": "", - "API.INVALID_MESSAGE_TEMPLATE": "", - "API.INVALID_METER_ID": "", - "API.INVALID_METER_NAME": "", - "API.INVALID_METER_UUID": "", - "API.INVALID_NAME_VALUE": "", - "API.INVALID_NEW_PASSWORD": "", - "API.INVALID_NOTIFICATION_ID": "", - "API.INVALID_NUMERATOR_METER_UUID": "", - "API.INVALID_OBJECT_TYPE": "", - "API.INVALID_OFFLINE_METER_FILE_ID": "", - "API.INVALID_OFFLINE_METER_ID": "", - "API.INVALID_OFFLINE_METER_NAME": "", - "API.INVALID_OLD_PASSWORD": "", - "API.INVALID_PARENT_SPACE_ID": "", - "API.INVALID_PASSWORD": "", - "API.INVALID_PEAK_CURRENT": "", - "API.INVALID_PEAK_LOAD": "", - "API.INVALID_PERIOD_TYPE": "", - "API.INVALID_POINT_ID": "", - "API.INVALID_POINT_NAME": "", - "API.INVALID_PORT": "", - "API.INVALID_PRIORITY": "", - "API.INVALID_PRIVILEGE": "", - "API.INVALID_PRIVILEGE_DATA": "", - "API.INVALID_PRIVILEGE_ID": "", - "API.INVALID_PRIVILEGE_NAME": "", - "API.INVALID_RATIO_VALUE": "", - "API.INVALID_REPLY": "", - "API.INVALID_REPORTING_PERIOD_END_DATETIME": "", - "API.INVALID_REPORTING_PERIOD_START_DATETIME": "", - "API.INVALID_REQUIRES_AUTHENTICATION": "", - "API.INVALID_ROOMS_VALUE": "", - "API.INVALID_RULE_ID": "", - "API.INVALID_RULE_NAME": "", - "API.INVALID_SENSOR_ID": "", - "API.INVALID_SENSOR_NAME": "", - "API.INVALID_SERIAL_PORT": "", - "API.INVALID_SESSION_PLEASE_RE_LOGIN": "", - "API.INVALID_SHOPFLOOR_ID": "", - "API.INVALID_SHOPFLOOR_NAME": "", - "API.INVALID_SOURCE_NODE_ID": "", - "API.INVALID_SPACE_ID": "", - "API.INVALID_SPACE_NAME": "", - "API.INVALID_START_DATE_FORMAT": "", - "API.INVALID_START_DATETIME": "", - "API.INVALID_STATUS": "", - "API.INVALID_STORE_ID": "", - "API.INVALID_STORE_NAME": "", - "API.INVALID_STORE_TYPE_DESCRIPTION": "", - "API.INVALID_STORE_TYPE_ID": "", - "API.INVALID_STORE_TYPE_NAME": "", - "API.INVALID_STORE_TYPE_SIMPLIFIED_CODE": "", - "API.INVALID_SVG": "", - "API.INVALID_SWITCHGEAR": "", - "API.INVALID_TARGET_NODE_ID": "", - "API.INVALID_TARIFF_BLOCK_PRICING": "", - "API.INVALID_TARIFF_ID": "", - "API.INVALID_TARIFF_TIME_OF_USE_PRICING": "", - "API.INVALID_TARIFF_TYPE": "", - "API.INVALID_TENANT_ID": "", - "API.INVALID_TENANT_NAME": "", - "API.INVALID_TENANT_TYPE_DESCRIPTION": "", - "API.INVALID_TENANT_TYPE_ID": "", - "API.INVALID_TENANT_TYPE_NAME": "", - "API.INVALID_TENANT_TYPE_SIMPLIFIED_CODE": "", - "API.INVALID_TEXT_MESSAGE_ID": "", - "API.INVALID_TIMEZONE_ID": "", - "API.INVALID_TOKEN": "", - "API.INVALID_UNIT_OF_MEASURE": "", - "API.INVALID_UNIT_OF_PRICE": "", - "API.INVALID_UNITS": "", - "API.INVALID_USER_ID": "", - "API.INVALID_USER_NAME": "", - "API.INVALID_USER_NAME_OR_EMAIL": "", - "API.INVALID_USER_PHONE": "", - "API.INVALID_USER_PLEASE_RE_LOGIN": "", - "API.INVALID_USER_UUID": "", - "API.INVALID_VARIABLE_METER_ID": "", - "API.INVALID_VARIABLE_METER_TYPE": "", - "API.INVALID_VARIABLE_NAME": "", - "API.INVALID_VIRTUAL_METER_ID": "", - "API.INVALID_VIRTUAL_METER_NAME": "", - "API.INVALID_WEB_MESSAGE_ID": "", - "API.INVALID_WECHAT_MESSAGE_ID": "", - "API.KNOWLEDGE_FILE_CANNOT_BE_REMOVED_FROM_DISK": "", - "API.KNOWLEDGE_FILE_NOT_FOUND": "", - "API.MASTER_METER_DOES_NOT_BELONG_TO_SAME_ENERGY_CATEGORY": "", - "API.MASTER_METER_NOT_FOUND": "", - "API.MENU_NOT_FOUND": "", - "API.METER_NAME_IS_ALREADY_IN_USE": "", - "API.METER_NOT_FOUND": "", - "API.METER_OF_VARIABLE_NOT_FOUND": "", - "API.METER_POINT_RELATION_EXISTS": "", - "API.METER_POINT_RELATION_NOT_FOUND": "", - "API.NOT_FOUND": "", - "API.NOTIFICATION_NOT_FOUND": "", - "API.OFFLINE_METER_FILE_NOT_FOUND": "", - "API.OFFLINE_METER_NAME_IS_ALREADY_IN_USE": "", - "API.OFFLINE_METER_NOT_FOUND": "", - "API.OFFLINE_METER_OF_VARIABLE_NOT_FOUND": "", - "API.PARENT_SPACE_NOT_FOUND": "", - "API.POINT_NAME_IS_ALREADY_IN_USE": "", - "API.POINT_NOT_FOUND": "", - "API.PRIVILEGE_NAME_IS_ALREADY_IN_USE": "", - "API.PRIVILEGE_NOT_FOUND": "", - "API.RULE_NAME_IS_ALREADY_IN_USE": "", - "API.RULE_NOT_FOUND": "", - "API.SENSOR_NAME_IS_ALREADY_IN_USE": "", - "API.SENSOR_NOT_FOUND": "", - "API.SENSOR_POINT_RELATION_EXISTS": "", - "API.SENSOR_POINT_RELATION_NOT_FOUND": "", - "API.SHOPFLOOR_EQUIPMENT_RELATION_EXISTS": "", - "API.SHOPFLOOR_EQUIPMENT_RELATION_NOT_FOUND": "", - "API.SHOPFLOOR_METER_RELATION_EXISTS": "", - "API.SHOPFLOOR_METER_RELATION_NOT_FOUND": "", - "API.SHOPFLOOR_NAME_IS_ALREADY_IN_USE": "", - "API.SHOPFLOOR_NOT_FOUND": "", - "API.SHOPFLOOR_OFFLINE_METER_RELATION_EXISTS": "", - "API.SHOPFLOOR_OFFLINE_METER_RELATION_NOT_FOUND": "", - "API.SHOPFLOOR_POINT_RELATION_EXISTS": "", - "API.SHOPFLOOR_POINT_RELATION_NOT_FOUND": "", - "API.SHOPFLOOR_SENSOR_RELATION_EXISTS": "", - "API.SHOPFLOOR_SENSOR_RELATION_NOT_FOUND": "", - "API.SHOPFLOOR_VIRTUAL_METER_RELATION_EXISTS": "", - "API.SHOPFLOOR_VIRTUAL_METER_RELATION_NOT_FOUND": "", - "API.SOURCE_NODE_NOT_FOUND": "", - "API.SPACE_COMBINED_EQUIPMENT_RELATION_EXISTS": "", - "API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND": "", - "API.SPACE_EQUIPMENT_RELATION_EXISTS": "", - "API.SPACE_EQUIPMENT_RELATION_NOT_FOUND": "", - "API.SPACE_METER_RELATION_EXISTS": "", - "API.SPACE_METER_RELATION_NOT_FOUND": "", - "API.SPACE_NAME_IS_ALREADY_IN_USE": "", - "API.SPACE_NOT_FOUND": "", - "API.SPACE_NOT_FOUND_IN_PRIVILEGE": "", - "API.SPACE_OFFLINE_METER_RELATION_EXISTS": "", - "API.SPACE_OFFLINE_METER_RELATION_NOT_FOUND": "", - "API.SPACE_POINT_RELATION_EXISTS": "", - "API.SPACE_POINT_RELATION_NOT_FOUND": "", - "API.SPACE_SENSOR_RELATION_EXISTS": "", - "API.SPACE_SENSOR_RELATION_NOT_FOUND": "", - "API.SPACE_SHOPFLOOR_RELATION_EXISTS": "", - "API.SPACE_SHOPFLOOR_RELATION_NOT_FOUND": "", - "API.SPACE_STORE_RELATION_EXISTS": "", - "API.SPACE_STORE_RELATION_NOT_FOUND": "", - "API.SPACE_TENANT_RELATION_EXISTS": "", - "API.SPACE_TENANT_RELATION_NOT_FOUND": "", - "API.SPACE_VIRTUAL_METER_RELATION_EXISTS": "", - "API.SPACE_VIRTUAL_METER_RELATION_NOT_FOUND": "", - "API.START_DATETIME_MUST_BE_EARLIER_THAN_END_DATETIME": "", - "API.STORE_METER_RELATION_EXISTS": "", - "API.STORE_METER_RELATION_NOT_FOUND": "", - "API.STORE_NAME_IS_ALREADY_IN_USE": "", - "API.STORE_NOT_FOUND": "", - "API.STORE_OFFLINE_METER_RELATION_EXISTS": "", - "API.STORE_OFFLINE_METER_RELATION_NOT_FOUND": "", - "API.STORE_POINT_RELATION_EXISTS": "", - "API.STORE_POINT_RELATION_NOT_FOUND": "", - "API.STORE_SENSOR_RELATION_EXISTS": "", - "API.STORE_SENSOR_RELATION_NOT_FOUND": "", - "API.STORE_TYPE_NAME_IS_ALREADY_IN_USE": "", - "API.STORE_TYPE_NOT_FOUND": "", - "API.STORE_TYPE_SIMPLIFIED_CODE_IS_ALREADY_IN_USE": "", - "API.STORE_TYPE_USED_IN_STORE": "", - "API.STORE_VIRTUAL_METER_RELATION_EXISTS": "", - "API.STORE_VIRTUAL_METER_RELATION_NOT_FOUND": "", - "API.TARGET_NODE_NOT_FOUND": "", - "API.TARIFF_IS_ALREADY_ASSOCIATED_WITH_COST_CENTER": "", - "API.TARIFF_IN_USE": "", - "API.TARIFF_IS_NOT_ASSOCIATED_WITH_COST_CENTER": "", - "API.TARIFF_NAME_IS_ALREADY_IN_USE": "", - "API.TARIFF_NOT_EMPTY": "", - "API.TARIFF_NOT_FOUND": "", - "API.TENANT_METER_RELATION_EXISTS": "", - "API.TENANT_METER_RELATION_NOT_FOUND": "", - "API.TENANT_NAME_IS_ALREADY_IN_USE": "", - "API.TENANT_NOT_FOUND": "", - "API.TENANT_OFFLINE_METER_RELATION_EXISTS": "", - "API.TENANT_OFFLINE_METER_RELATION_NOT_FOUND": "", - "API.TENANT_POINT_RELATION_EXISTS": "", - "API.TENANT_POINT_RELATION_NOT_FOUND": "", - "API.TENANT_SENSOR_RELATION_EXISTS": "", - "API.TENANT_SENSOR_RELATION_NOT_FOUND": "", - "API.TENANT_TYPE_NAME_IS_ALREADY_IN_USE": "", - "API.TENANT_TYPE_NOT_FOUND": "", - "API.TENANT_TYPE_SIMPLIFIED_CODE_IS_ALREADY_IN_USE": "", - "API.TENANT_TYPE_USED_IN_TENANT": "", - "API.TENANT_VIRTUAL_METER_RELATION_EXISTS": "", - "API.TENANT_VIRTUAL_METER_RELATION_NOT_FOUND": "", - "API.TEXT_MESSAGE_NOT_FOUND": "", - "API.THE_REPORTING_PERIOD_MUST_BE_LONGER_THAN_15_MINUTES": "", - "API.THERE_IS_ASSOCIATED_DISTRIBUTION_CIRCUITS": "", - "API.THERE_IS_RELATION_WITH_CHILD_METERS": "", - "API.THERE_IS_RELATION_WITH_CHILDREN_SPACES": "", - "API.THERE_IS_RELATION_WITH_COMBINED_EQUIPMENT_PARAMETERS": "", - "API.THERE_IS_RELATION_WITH_COMBINED_EQUIPMENTS": "", - "API.THERE_IS_RELATION_WITH_DATA_SOURCES": "", - "API.THERE_IS_RELATION_WITH_ENERGY_FLOW_DIAGRAM_LINKS": "", - "API.THERE_IS_RELATION_WITH_EQUIPMENT_PARAMETERS": "", - "API.THERE_IS_RELATION_WITH_EQUIPMENTS": "", - "API.THERE_IS_RELATION_WITH_METER": "", - "API.THERE_IS_RELATION_WITH_METERS": "", - "API.THERE_IS_RELATION_WITH_OFFLINE_METER": "", - "API.THERE_IS_RELATION_WITH_OFFLINE_METERS": "", - "API.THERE_IS_RELATION_WITH_OTHER_VIRTUAL_METERS": "", - "API.THERE_IS_RELATION_WITH_POINTS": "", - "API.THERE_IS_RELATION_WITH_SENSORS": "", - "API.THERE_IS_RELATION_WITH_SHOPFLOORS": "", - "API.THERE_IS_RELATION_WITH_SPACES": "", - "API.THERE_IS_RELATION_WITH_STORES": "", - "API.THERE_IS_RELATION_WITH_TARIFFS": "", - "API.THERE_IS_RELATION_WITH_TENANTS": "", - "API.THERE_IS_RELATION_WITH_VIRTUAL_METER": "", - "API.THERE_IS_RELATION_WITH_VIRTUAL_METERS": "", - "API.THERE_IS_RELATION_WITH_EQUIPMENTS": "", - "API.THERE_IS_RELATION_WITH_USERS": "", - "API.THIS_DATA_SOURCE_IS_BEING_USED_BY_A_METER": "", - "API.THIS_METER_IS_BEING_USED_BY_A_VIRTUAL_METER": "", - "API.THIS_OFFLINE_METER_IS_BEING_USED_BY_A_VIRTUAL_METER": "", - "API.THIS_SHOPFLOOR_CANNOT_BE_DELETED": "", - "API.THIS_SPACE_CANNOT_BE_DELETED": "", - "API.TIMEZONE_NOT_FOUND": "", - "API.TOKEN_NOT_FOUND_IN_HEADERS_PLEASE_LOGIN": "", - "API.USER_NAME_IS_ALREADY_IN_USE": "", - "API.USER_NOT_FOUND": "", - "API.USER_PRIVILEGE_NOT_FOUND": "", - "API.USER_SESSION_NOT_FOUND": "", - "API.USER_SESSION_TIMEOUT": "", - "API.USER_UUID_NOT_FOUND_IN_HEADERS_PLEASE_LOGIN": "", - "API.VIRTUAL_METER_NAME_IS_ALREADY_IN_USE": "", - "API.VIRTUAL_METER_NOT_FOUND": "", - "API.VIRTUAL_METER_OF_VARIABLE_NOT_FOUND": "", - "API.VIRTUAL_POINT_SHOULD_BE_ANALOG_VALUE": "", - "API.WEB_MESSAGE_NOT_FOUND": "", - "API.WECHAT_MESSAGE_NOT_FOUND": "", - + // API + "API.ADMINISTRATOR_SESSION_NOT_FOUND": "Administrator session not found", + "API.ADMINISTRATOR_SESSION_TIMEOUT": "Administrator session timeout", + "API.ADVANCED_REPORT_NOT_FOUND": "Advanced report not found", + "API.BAD_REQUEST": "Bad request", + "API.CANNOT_SET_EXISTING_SUBMETER_AS_MASTER_METER": "Cannot set existing submeter as master meter", + "API.COMBINED_EQUIPMENT_EQUIPMENT_RELATION_EXISTS": "Combined equipment equipment relation exists", + "API.COMBINED_EQUIPMENT_EQUIPMENT_RELATION_NOT_FOUND": "Combined equipment equipment relation not found", + "API.COMBINED_EQUIPMENT_METER_RELATION_EXISTS": "Combined equipment meter relation exists", + "API.COMBINED_EQUIPMENT_METER_RELATION_NOT_FOUND": "Combined equipment meter relation not found", + "API.COMBINED_EQUIPMENT_NAME_IS_ALREADY_IN_USE": "Combined equipment name is already in use", + "API.COMBINED_EQUIPMENT_NOT_FOUND": "Combined equipment not found", + "API.COMBINED_EQUIPMENT_OFFLINE_METER_RELATION_EXISTS": "Combined equipment offline meter relation exists", + "API.COMBINED_EQUIPMENT_OFFLINE_METER_RELATION_NOT_FOUND": "Combined equipment offline meter relation not found", + "API.COMBINED_EQUIPMENT_PARAMETER_NAME_IS_ALREADY_IN_USE": "Combined equipment parameter name is already in use", + "API.COMBINED_EQUIPMENT_PARAMETER_NOT_FOUND_OR_NOT_MATCH": "Combined equipment parameter not found or not match", + "API.COMBINED_EQUIPMENT_VIRTUAL_METER_RELATION_EXISTS": "Combined equipment virtual meter relation exists", + "API.COMBINED_EQUIPMENT_VIRTUAL_METER_RELATION_NOT_FOUND": "Combined equipment virtual meter relation not found", + "API.CONTACT_NAME_IS_ALREADY_IN_USE": "Contact name is already in use", + "API.CONTACT_NOT_FOUND": "Contact not found", + "API.COST_CENTER_EXTERNAL_ID_EXISTS": "Cost center external id exists", + "API.COST_CENTER_NAME_EXISTS": "Cost center name exists", + "API.COST_CENTER_NOT_FOUND": "Cost center not found", + "API.COST_FILE_NOT_FOUND": "Cost file not found", + "API.DATA_SOURCE_NAME_IS_ALREADY_IN_USE": "Data source name is already in use", + "API.DATA_SOURCE_NOT_FOUND": "Data source not found", + "API.DATABASE_ERROR": "Database error", + "API.DISTRIBUTION_CIRCUIT_NAME_IS_ALREADY_IN_USE": "Distribution circuit name is already in use", + "API.DISTRIBUTION_CIRCUIT_NOT_FOUND": "Distribution circuit not found", + "API.DISTRIBUTION_CIRCUIT_POINT_RELATION_EXISTS": "Distribution circuit point relation exists", + "API.DISTRIBUTION_CIRCUIT_POINT_RELATION_NOT_FOUND": "Distribution circuit point relation not found", + "API.DISTRIBUTION_SYSTEM_NAME_IS_ALREADY_IN_USE": "Distribution system name is already in use", + "API.DISTRIBUTION_SYSTEM_NOT_FOUND": "Distribution system not found", + "API.EMAIL_IS_ALREADY_IN_USE": "Email is already in use", + "API.EMAIL_MESSAGE_NOT_FOUND": "Email message not found", + "API.EMAIL_SERVER_HOST_IS_ALREADY_IN_USE": "Email server host is already in use", + "API.EMAIL_SERVER_NOT_FOUND": "Email server not found", + "API.EMPTY_VARIABLES_ARRAY": "Empty variables array", + "API.ENERGY_CATEGORY_NAME_IS_ALREADY_IN_USE": "Energy category name is already in use", + "API.ENERGY_CATEGORY_NOT_FOUND": "Energy category not found", + "API.ENERGY_CATEGORY_USED_IN_ENERGY_ITEMS": "Energy category used in energy items", + "API.ENERGY_CATEGORY_USED_IN_METER": "Energy category used in meter", + "API.ENERGY_CATEGORY_USED_IN_OFFLINE_METER": "Energy category used in offline meter", + "API.ENERGY_CATEGORY_USED_IN_TARIFFS": "Energy category used in tariffs", + "API.ENERGY_CATEGORY_USED_IN_VIRTUAL_METER": "Energy category used in virtual meter", + "API.ENERGY_FLOW_DIAGRAM_LINK_IS_ALREADY_IN_USE": "Energy flow diagram link is already in use", + "API.ENERGY_FLOW_DIAGRAM_LINK_NOT_FOUND_OR_NOT_MATCH": "Energy flow diagram link not found or not match", + "API.ENERGY_FLOW_DIAGRAM_NAME_IS_ALREADY_IN_USE": "Energy flow diagram name is already in use", + "API.ENERGY_FLOW_DIAGRAM_NODE_NAME_IS_ALREADY_IN_USE": "Energy flow diagram node name is already in use", + "API.ENERGY_FLOW_DIAGRAM_NODE_NOT_FOUND_OR_NOT_MATCH": "Energy flow diagram node not found or not match", + "API.ENERGY_FLOW_DIAGRAM_NOT_FOUND": "Energy flow diagram not found", + "API.ENERGY_ITEM_DOES_NOT_BELONG_TO_ENERGY_CATEGORY": "Energy item does not belong to energy category", + "API.ENERGY_ITEM_IS_NOT_BELONG_TO_ENERGY_CATEGORY": "Energy item is not belong to energy category", + "API.ENERGY_ITEM_NAME_IS_ALREADY_IN_USE": "Energy item name is already in use", + "API.ENERGY_ITEM_NOT_FOUND": "Energy item not found", + "API.ENERGY_ITEM_USED_IN_METER": "Energy item used in meter", + "API.ENERGY_ITEM_USED_IN_OFFLINE_METER": "Energy item used in offline meter", + "API.ENERGY_ITEM_USED_IN_VIRTUAL_METER": "Energy item used in virtual meter", + "API.EQUIPMENT_METER_RELATION_EXISTS": "Equipment meter relation exists", + "API.EQUIPMENT_METER_RELATION_NOT_FOUND": "Equipment meter relation not found", + "API.EQUIPMENT_NAME_IS_ALREADY_IN_USE": "Equipment name is already in use", + "API.EQUIPMENT_NOT_FOUND": "Equipment not found", + "API.EQUIPMENT_OFFLINE_METER_RELATION_EXISTS": "Equipment offline meter relation exists", + "API.EQUIPMENT_OFFLINE_METER_RELATION_NOT_FOUND": "Equipment offline meter relation not found", + "API.EQUIPMENT_PARAMETER_NAME_IS_ALREADY_IN_USE": "Equipment parameter name is already in use", + "API.EQUIPMENT_PARAMETER_NOT_FOUND_OR_NOT_MATCH": "Equipment parameter not found or not match", + "API.EQUIPMENT_VIRTUAL_METER_RELATION_EXISTS": "Equipment virtual meter relation exists", + "API.EQUIPMENT_VIRTUAL_METER_RELATION_NOT_FOUND": "Equipment virtual meter relation not found", + "API.ERROR": "Error", + "API.EXCEPTION": "Exception", + "API.FAILED_TO_RESTORE_COST_FILE": "Failed to restore cost file", + "API.FAILED_TO_RESTORE_KNOWLEDGE_FILE": "Failed to restore knowledge file", + "API.FAILED_TO_RESTORE_OFFLINE_METER_FILE": "Failed to restore offline meter file", + "API.FAILED_TO_UPLOAD_COST_FILE": "Failed to upload cost file", + "API.FAILED_TO_UPLOAD_KNOWLEDGE_FILE": "Failed to upload knowledge file", + "API.FAILED_TO_UPLOAD_OFFLINE_METER_FILE": "Failed to upload offline meter file", + "API.GATEWAY_NAME_IS_ALREADY_IN_USE": "Gateway name is already in use", + "API.GATEWAY_NOT_FOUND": "Gateway not found", + "API.GSM_MODEM_NOT_FOUND": "Gsm modem not found", + "API.GSM_MODEM_SERIAL_PORT_IS_ALREADY_IN_USE": "Gsm modem serial port is already in use", + "API.INVALID_": "Invalid ", + "API.INVALID_ADDRESS": "Invalid address", + "API.INVALID_ADDRESS_VALUE": "Invalid address value", + "API.INVALID_ADVANCED_REPORT_ID": "Invalid advanced report id", + "API.INVALID_AREA_VALUE": "Invalid area value", + "API.INVALID_BASE_PERIOD_END_DATETIME": "Invalid base period end datetime", + "API.INVALID_BASE_PERIOD_START_DATETIME": "Invalid base period start datetime", + "API.INVALID_BAUD_RATE": "Invalid baud rate", + "API.INVALID_BUILDINGS_VALUE": "Invalid buildings value", + "API.INVALID_CATEGORY": "Invalid category", + "API.INVALID_CHANNEL": "Invalid channel", + "API.INVALID_COMBINED_EQUIPMENT_ID": "Invalid combined equipment id", + "API.INVALID_COMBINED_EQUIPMENT_NAME": "Invalid combined equipment name", + "API.INVALID_COMBINED_EQUIPMENT_PARAMETER_ID": "Invalid combined equipment parameter id", + "API.INVALID_COMBINED_EQUIPMENT_PARAMETER_NAME": "Invalid combined equipment parameter name", + "API.INVALID_COMBINED_EQUIPMENT_PARAMETER_TYPE": "Invalid combined equipment parameter type", + "API.INVALID_CONNECTION": "Invalid connection", + "API.INVALID_CONSTANT_VALUE": "Invalid constant value", + "API.INVALID_CONTACT_ID": "Invalid contact id", + "API.INVALID_CONTACT_NAME": "Invalid contact name", + "API.INVALID_COST_CENTER_ID": "Invalid cost center id", + "API.INVALID_COST_FILE_ID": "Invalid cost file id", + "API.INVALID_DATA_SOURCE_ID": "Invalid data source id", + "API.INVALID_DATA_SOURCE_NAME": "Invalid data source name", + "API.INVALID_DATA_SOURCE_PROTOCOL": "Invalid data source protocol", + "API.INVALID_DENOMINATOR_METER_UUID": "Invalid denominator meter uuid", + "API.INVALID_DISPLAY_NAME": "Invalid display name", + "API.INVALID_DISTRIBUTION_CIRCUIT_ID": "Invalid distribution circuit id", + "API.INVALID_DISTRIBUTION_CIRCUIT_NAME": "Invalid distribution circuit name", + "API.INVALID_DISTRIBUTION_ROOM": "Invalid distribution room", + "API.INVALID_DISTRIBUTION_SYSTEM_ID": "Invalid distribution system id", + "API.INVALID_DISTRIBUTION_SYSTEM_NAME": "Invalid distribution system name", + "API.INVALID_EMAIL": "Invalid email", + "API.INVALID_EMAIL_MESSAGE_ID": "Invalid email message id", + "API.INVALID_EMAIL_SERVER_HOST": "Invalid email server host", + "API.INVALID_EMAIL_SERVER_ID": "Invalid email server id", + "API.INVALID_END_DATE_FORMAT": "Invalid end date format", + "API.INVALID_END_DATETIME": "Invalid end datetime", + "API.INVALID_ENERGY_CATEGORY_ID": "Invalid energy category id", + "API.INVALID_ENERGY_CATEGORY_NAME": "Invalid energy category name", + "API.INVALID_ENERGY_FLOW_DIAGRAM_ID": "Invalid energy flow diagram id", + "API.INVALID_ENERGY_FLOW_DIAGRAM_LINK_ID": "Invalid energy flow diagram link id", + "API.INVALID_ENERGY_FLOW_DIAGRAM_NAME": "Invalid energy flow diagram name", + "API.INVALID_ENERGY_FLOW_DIAGRAM_NODE_ID": "Invalid energy flow diagram node id", + "API.INVALID_ENERGY_FLOW_DIAGRAM_NODE_NAME": "Invalid energy flow diagram node name", + "API.INVALID_ENERGY_ITEM_ID": "Invalid energy item id", + "API.INVALID_ENERGY_ITEM_NAME": "Invalid energy item name", + "API.INVALID_EQUATION_IN_EXPRESSION": "Invalid equation in expression", + "API.INVALID_EQUIPMENT_ID": "Invalid equipment id", + "API.INVALID_equipment_ID": "Invalid equipment id", + "API.INVALID_EQUIPMENT_NAME": "Invalid equipment name", + "API.INVALID_EQUIPMENT_PARAMETER_ID": "Invalid equipment parameter id", + "API.INVALID_EQUIPMENT_PARAMETER_NAME": "Invalid equipment parameter name", + "API.INVALID_EQUIPMENT_PARAMETER_TYPE": "Invalid equipment parameter type", + "API.INVALID_EXPRESSION": "Invalid expression", + "API.INVALID_EXPRESSION_OBJECT": "Invalid expression object", + "API.INVALID_FDD_CODE": "Invalid fdd code", + "API.INVALID_FLOORS_VALUE": "Invalid floors value", + "API.INVALID_FROM_ADDR": "Invalid from addr", + "API.INVALID_GATEWAY_ID": "Invalid gateway id", + "API.INVALID_GATEWAY_NAME": "Invalid gateway name", + "API.INVALID_GSM_MODEM_ID": "Invalid gsm modem id", + "API.INVALID_HOURLY_HIGH_LIMIT_VALUE": "Invalid hourly high limit value", + "API.INVALID_HOURLY_LOW_LIMIT_VALUE": "Invalid hourly low limit value", + "API.INVALID_IS_ADMIN_VALUE": "Invalid is admin value", + "API.INVALID_IS_COUNTED_VALUE": "Invalid is counted value", + "API.INVALID_IS_ENABLED": "Invalid is enabled", + "API.INVALID_IS_HIDDEN": "Invalid is hidden", + "API.INVALID_IS_IN_LEASE_VALUE": "Invalid is in lease value", + "API.INVALID_IS_INPUT_COUNTED_VALUE": "Invalid is input counted value", + "API.INVALID_IS_KEY_TENANT_VALUE": "Invalid is key tenant value", + "API.INVALID_IS_OUTPUT_COUNTED_VALUE": "Invalid is output counted value", + "API.INVALID_IS_OUTPUT_VALUE": "Invalid is output value", + "API.INVALID_IS_TREND_VALUE": "Invalid is trend value", + "API.INVALID_IS_VIRTUAL_VALUE": "Invalid is virtual value", + "API.INVALID_KGCE": "Invalid kgce", + "API.INVALID_KGCO2E": "Invalid kgco2e", + "API.INVALID_KNOWLEDGE_FILE_ID": "Invalid knowledge file id", + "API.INVALID_LATITUDE_VALUE": "Invalid latitude value", + "API.INVALID_LEASE_NUMBER_VALUE": "Invalid lease number value", + "API.INVALID_LONGITUDE_VALUE": "Invalid longitude value", + "API.INVALID_LOW_LIMIT_VALUE": "Invalid low limit value", + "API.INVALID_MASTER_METER_ID": "Invalid master meter id", + "API.INVALID_MENU_ID": "Invalid menu id", + "API.INVALID_MESSAGE_TEMPLATE": "Invalid message template", + "API.INVALID_METER_ID": "Invalid meter id", + "API.INVALID_METER_NAME": "Invalid meter name", + "API.INVALID_METER_UUID": "Invalid meter uuid", + "API.INVALID_NAME_VALUE": "Invalid name value", + "API.INVALID_NEW_PASSWORD": "Invalid new password", + "API.INVALID_NOTIFICATION_ID": "Invalid notification id", + "API.INVALID_NUMERATOR_METER_UUID": "Invalid numerator meter uuid", + "API.INVALID_OBJECT_TYPE": "Invalid object type", + "API.INVALID_OFFLINE_METER_FILE_ID": "Invalid offline meter file id", + "API.INVALID_OFFLINE_METER_ID": "Invalid offline meter id", + "API.INVALID_OFFLINE_METER_NAME": "Invalid offline meter name", + "API.INVALID_OLD_PASSWORD": "Invalid old password", + "API.INVALID_PARENT_SPACE_ID": "Invalid parent space id", + "API.INVALID_PASSWORD": "Invalid password", + "API.INVALID_PEAK_CURRENT": "Invalid peak current", + "API.INVALID_PEAK_LOAD": "Invalid peak load", + "API.INVALID_PERIOD_TYPE": "Invalid period type", + "API.INVALID_POINT_ID": "Invalid point id", + "API.INVALID_POINT_NAME": "Invalid point name", + "API.INVALID_PORT": "Invalid port", + "API.INVALID_PRIORITY": "Invalid priority", + "API.INVALID_PRIVILEGE": "Invalid privilege", + "API.INVALID_PRIVILEGE_DATA": "Invalid privilege data", + "API.INVALID_PRIVILEGE_ID": "Invalid privilege id", + "API.INVALID_PRIVILEGE_NAME": "Invalid privilege name", + "API.INVALID_RATIO_VALUE": "Invalid ratio value", + "API.INVALID_REPLY": "Invalid reply", + "API.INVALID_REPORTING_PERIOD_END_DATETIME": "Invalid reporting period end datetime", + "API.INVALID_REPORTING_PERIOD_START_DATETIME": "Invalid reporting period start datetime", + "API.INVALID_REQUIRES_AUTHENTICATION": "Invalid requires authentication", + "API.INVALID_ROOMS_VALUE": "Invalid rooms value", + "API.INVALID_RULE_ID": "Invalid rule id", + "API.INVALID_RULE_NAME": "Invalid rule name", + "API.INVALID_SENSOR_ID": "Invalid sensor id", + "API.INVALID_SENSOR_NAME": "Invalid sensor name", + "API.INVALID_SERIAL_PORT": "Invalid serial port", + "API.INVALID_SESSION_PLEASE_RE_LOGIN": "Invalid session please re-login", + "API.INVALID_SHOPFLOOR_ID": "Invalid shopfloor id", + "API.INVALID_SHOPFLOOR_NAME": "Invalid shopfloor name", + "API.INVALID_SOURCE_NODE_ID": "Invalid source node id", + "API.INVALID_SPACE_ID": "Invalid space id", + "API.INVALID_SPACE_NAME": "Invalid space name", + "API.INVALID_START_DATE_FORMAT": "Invalid start date format", + "API.INVALID_START_DATETIME": "Invalid start datetime", + "API.INVALID_STATUS": "Invalid status", + "API.INVALID_STORE_ID": "Invalid store id", + "API.INVALID_STORE_NAME": "Invalid store name", + "API.INVALID_STORE_TYPE_DESCRIPTION": "Invalid store type description", + "API.INVALID_STORE_TYPE_ID": "Invalid store type id", + "API.INVALID_STORE_TYPE_NAME": "Invalid store type name", + "API.INVALID_STORE_TYPE_SIMPLIFIED_CODE": "Invalid store type simplified code", + "API.INVALID_SVG": "Invalid svg", + "API.INVALID_SWITCHGEAR": "Invalid switchgear", + "API.INVALID_TARGET_NODE_ID": "Invalid target node id", + "API.INVALID_TARIFF_BLOCK_PRICING": "Invalid tariff block pricing", + "API.INVALID_TARIFF_ID": "Invalid tariff id", + "API.INVALID_TARIFF_TIME_OF_USE_PRICING": "Invalid tariff time of use pricing", + "API.INVALID_TARIFF_TYPE": "Invalid tariff type", + "API.INVALID_TENANT_ID": "Invalid tenant id", + "API.INVALID_TENANT_NAME": "Invalid tenant name", + "API.INVALID_TENANT_TYPE_DESCRIPTION": "Invalid tenant type description", + "API.INVALID_TENANT_TYPE_ID": "Invalid tenant type id", + "API.INVALID_TENANT_TYPE_NAME": "Invalid tenant type name", + "API.INVALID_TENANT_TYPE_SIMPLIFIED_CODE": "Invalid tenant type simplified code", + "API.INVALID_TEXT_MESSAGE_ID": "Invalid text message id", + "API.INVALID_TIMEZONE_ID": "Invalid timezone id", + "API.INVALID_TOKEN": "Invalid token", + "API.INVALID_UNIT_OF_MEASURE": "Invalid unit of measure", + "API.INVALID_UNIT_OF_PRICE": "Invalid unit of price", + "API.INVALID_UNITS": "Invalid units", + "API.INVALID_USER_ID": "Invalid user id", + "API.INVALID_USER_NAME": "Invalid user name", + "API.INVALID_USER_NAME_OR_EMAIL": "Invalid user name or email", + "API.INVALID_USER_PHONE": "Invalid user phone", + "API.INVALID_USER_PLEASE_RE_LOGIN": "Invalid user please re-login", + "API.INVALID_USER_UUID": "Invalid user uuid", + "API.INVALID_VARIABLE_METER_ID": "Invalid variable meter id", + "API.INVALID_VARIABLE_METER_TYPE": "Invalid variable meter type", + "API.INVALID_VARIABLE_NAME": "Invalid variable name", + "API.INVALID_VIRTUAL_METER_ID": "Invalid virtual meter id", + "API.INVALID_VIRTUAL_METER_NAME": "Invalid virtual meter name", + "API.INVALID_WEB_MESSAGE_ID": "Invalid web message id", + "API.INVALID_WECHAT_MESSAGE_ID": "Invalid wechat message id", + "API.KNOWLEDGE_FILE_CANNOT_BE_REMOVED_FROM_DISK": "Knowledge File Cannot be Removed from Disk", + "API.KNOWLEDGE_FILE_NOT_FOUND": "Knowledge file not found", + "API.MASTER_METER_DOES_NOT_BELONG_TO_SAME_ENERGY_CATEGORY": "Master meter does not belong to same energy category", + "API.MASTER_METER_NOT_FOUND": "Master meter not found", + "API.MENU_NOT_FOUND": "Menu not found", + "API.METER_NAME_IS_ALREADY_IN_USE": "Meter name is already in use", + "API.METER_NOT_FOUND": "Meter not found", + "API.METER_OF_VARIABLE_NOT_FOUND": "Meter of variable not found", + "API.METER_POINT_RELATION_EXISTS": "Meter point relation exists", + "API.METER_POINT_RELATION_NOT_FOUND": "Meter point relation not found", + "API.NOT_FOUND": "Not found", + "API.NOTIFICATION_NOT_FOUND": "Notification not found", + "API.OFFLINE_METER_FILE_NOT_FOUND": "Offline meter file not found", + "API.OFFLINE_METER_NAME_IS_ALREADY_IN_USE": "Offline meter name is already in use", + "API.OFFLINE_METER_NOT_FOUND": "Offline meter not found", + "API.OFFLINE_METER_OF_VARIABLE_NOT_FOUND": "Offline meter of variable not found", + "API.PARENT_SPACE_NOT_FOUND": "Parent space not found", + "API.POINT_NAME_IS_ALREADY_IN_USE": "Point name is already in use", + "API.POINT_NOT_FOUND": "Point not found", + "API.PRIVILEGE_NAME_IS_ALREADY_IN_USE": "Privilege name is already in use", + "API.PRIVILEGE_NOT_FOUND": "Privilege not found", + "API.RULE_NAME_IS_ALREADY_IN_USE": "Rule name is already in use", + "API.RULE_NOT_FOUND": "Rule not found", + "API.SENSOR_NAME_IS_ALREADY_IN_USE": "Sensor name is already in use", + "API.SENSOR_NOT_FOUND": "Sensor not found", + "API.SENSOR_POINT_RELATION_EXISTS": "Sensor point relation exists", + "API.SENSOR_POINT_RELATION_NOT_FOUND": "Sensor point relation not found", + "API.SHOPFLOOR_EQUIPMENT_RELATION_EXISTS": "Shopfloor equipment relation exists", + "API.SHOPFLOOR_EQUIPMENT_RELATION_NOT_FOUND": "Shopfloor equipment relation not found", + "API.SHOPFLOOR_METER_RELATION_EXISTS": "Shopfloor meter relation exists", + "API.SHOPFLOOR_METER_RELATION_NOT_FOUND": "Shopfloor meter relation not found", + "API.SHOPFLOOR_NAME_IS_ALREADY_IN_USE": "Shopfloor name is already in use", + "API.SHOPFLOOR_NOT_FOUND": "Shopfloor not found", + "API.SHOPFLOOR_OFFLINE_METER_RELATION_EXISTS": "Shopfloor offline meter relation exists", + "API.SHOPFLOOR_OFFLINE_METER_RELATION_NOT_FOUND": "Shopfloor offline meter relation not found", + "API.SHOPFLOOR_POINT_RELATION_EXISTS": "Shopfloor point relation exists", + "API.SHOPFLOOR_POINT_RELATION_NOT_FOUND": "Shopfloor point relation not found", + "API.SHOPFLOOR_SENSOR_RELATION_EXISTS": "Shopfloor sensor relation exists", + "API.SHOPFLOOR_SENSOR_RELATION_NOT_FOUND": "Shopfloor sensor relation not found", + "API.SHOPFLOOR_VIRTUAL_METER_RELATION_EXISTS": "Shopfloor virtual meter relation exists", + "API.SHOPFLOOR_VIRTUAL_METER_RELATION_NOT_FOUND": "Shopfloor virtual meter relation not found", + "API.SOURCE_NODE_NOT_FOUND": "Source node not found", + "API.SPACE_COMBINED_EQUIPMENT_RELATION_EXISTS": "Space combined equipment relation exists", + "API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND": "Space combined equipment relation not found", + "API.SPACE_EQUIPMENT_RELATION_EXISTS": "Space equipment relation exists", + "API.SPACE_EQUIPMENT_RELATION_NOT_FOUND": "Space equipment relation not found", + "API.SPACE_METER_RELATION_EXISTS": "Space meter relation exists", + "API.SPACE_METER_RELATION_NOT_FOUND": "Space meter relation not found", + "API.SPACE_NAME_IS_ALREADY_IN_USE": "Space name is already in use", + "API.SPACE_NOT_FOUND": "Space not found", + "API.SPACE_NOT_FOUND_IN_PRIVILEGE": "Space not found in privilege", + "API.SPACE_OFFLINE_METER_RELATION_EXISTS": "Space offline meter relation exists", + "API.SPACE_OFFLINE_METER_RELATION_NOT_FOUND": "Space offline meter relation not found", + "API.SPACE_POINT_RELATION_EXISTS": "Space point relation exists", + "API.SPACE_POINT_RELATION_NOT_FOUND": "Space point relation not found", + "API.SPACE_SENSOR_RELATION_EXISTS": "Space sensor relation exists", + "API.SPACE_SENSOR_RELATION_NOT_FOUND": "Space sensor relation not found", + "API.SPACE_SHOPFLOOR_RELATION_EXISTS": "Space shopfloor relation exists", + "API.SPACE_SHOPFLOOR_RELATION_NOT_FOUND": "Space shopfloor relation not found", + "API.SPACE_STORE_RELATION_EXISTS": "Space store relation exists", + "API.SPACE_STORE_RELATION_NOT_FOUND": "Space store relation not found", + "API.SPACE_TENANT_RELATION_EXISTS": "Space tenant relation exists", + "API.SPACE_TENANT_RELATION_NOT_FOUND": "Space tenant relation not found", + "API.SPACE_VIRTUAL_METER_RELATION_EXISTS": "Space virtual meter relation exists", + "API.SPACE_VIRTUAL_METER_RELATION_NOT_FOUND": "Space virtual meter relation not found", + "API.START_DATETIME_MUST_BE_EARLIER_THAN_END_DATETIME": "Start datetime must be early than end datetime", + "API.STORE_METER_RELATION_EXISTS": "Store meter relation exists", + "API.STORE_METER_RELATION_NOT_FOUND": "Store meter relation not found", + "API.STORE_NAME_IS_ALREADY_IN_USE": "Store name is already in use", + "API.STORE_NOT_FOUND": "Store not found", + "API.STORE_OFFLINE_METER_RELATION_EXISTS": "Store offline meter relation exists", + "API.STORE_OFFLINE_METER_RELATION_NOT_FOUND": "Store offline meter relation not found", + "API.STORE_POINT_RELATION_EXISTS": "Store point relation exists", + "API.STORE_POINT_RELATION_NOT_FOUND": "Store point relation not found", + "API.STORE_SENSOR_RELATION_EXISTS": "Store sensor relation exists", + "API.STORE_SENSOR_RELATION_NOT_FOUND": "Store sensor relation not found", + "API.STORE_TYPE_NAME_IS_ALREADY_IN_USE": "Store type name is already in use", + "API.STORE_TYPE_NOT_FOUND": "Store type not found", + "API.STORE_TYPE_SIMPLIFIED_CODE_IS_ALREADY_IN_USE": "Store type simplified code is already in use", + "API.STORE_TYPE_USED_IN_STORE": "Store type used in store", + "API.STORE_VIRTUAL_METER_RELATION_EXISTS": "Store virtual meter relation exists", + "API.STORE_VIRTUAL_METER_RELATION_NOT_FOUND": "Store virtual meter relation not found", + "API.TARGET_NODE_NOT_FOUND": "Target node not found", + "API.TARIFF_IS_ALREADY_ASSOCIATED_WITH_COST_CENTER": "Tariff is already associated with cost center", + "API.TARIFF_IN_USE": "Tariff in use", + "API.TARIFF_IS_NOT_ASSOCIATED_WITH_COST_CENTER": "Tariff is not associated with cost center", + "API.TARIFF_NAME_IS_ALREADY_IN_USE": "Tariff name is already in use", + "API.TARIFF_NOT_EMPTY": "Tariff not empty", + "API.TARIFF_NOT_FOUND": "Tariff not found", + "API.TENANT_METER_RELATION_EXISTS": "Tenant meter relation exists", + "API.TENANT_METER_RELATION_NOT_FOUND": "Tenant meter relation not found", + "API.TENANT_NAME_IS_ALREADY_IN_USE": "Tenant name is already in use", + "API.TENANT_NOT_FOUND": "Tenant not found", + "API.TENANT_OFFLINE_METER_RELATION_EXISTS": "Tenant offline meter relation exists", + "API.TENANT_OFFLINE_METER_RELATION_NOT_FOUND": "Tenant offline meter relation not found", + "API.TENANT_POINT_RELATION_EXISTS": "Tenant point relation exists", + "API.TENANT_POINT_RELATION_NOT_FOUND": "Tenant point relation not found", + "API.TENANT_SENSOR_RELATION_EXISTS": "Tenant sensor relation exists", + "API.TENANT_SENSOR_RELATION_NOT_FOUND": "Tenant sensor relation not found", + "API.TENANT_TYPE_NAME_IS_ALREADY_IN_USE": "Tenant type name is already in use", + "API.TENANT_TYPE_NOT_FOUND": "Tenant type not found", + "API.TENANT_TYPE_SIMPLIFIED_CODE_IS_ALREADY_IN_USE": "Tenant type simplified code is already in use", + "API.TENANT_TYPE_USED_IN_TENANT": "Tenant type used in tenant", + "API.TENANT_VIRTUAL_METER_RELATION_EXISTS": "Tenant virtual meter relation exists", + "API.TENANT_VIRTUAL_METER_RELATION_NOT_FOUND": "Tenant virtual meter relation not found", + "API.TEXT_MESSAGE_NOT_FOUND": "Text message not found", + "API.THE_REPORTING_PERIOD_MUST_BE_LONGER_THAN_15_MINUTES": "The reporting period must be longer than 15 minutes", + "API.THERE_IS_ASSOCIATED_DISTRIBUTION_CIRCUITS": "There is associated distribution circuits", + "API.THERE_IS_RELATION_WITH_CHILD_METERS": "There is relation with child meters", + "API.THERE_IS_RELATION_WITH_CHILDREN_SPACES": "There is relation with children spaces", + "API.THERE_IS_RELATION_WITH_COMBINED_EQUIPMENT_PARAMETERS": "There is relation with combined equipment parameters", + "API.THERE_IS_RELATION_WITH_COMBINED_EQUIPMENTS": "There is relation with combined equipments", + "API.THERE_IS_RELATION_WITH_DATA_SOURCES": "There is relation with data sources", + "API.THERE_IS_RELATION_WITH_ENERGY_FLOW_DIAGRAM_LINKS": "There is relation with energy flow diagram links", + "API.THERE_IS_RELATION_WITH_EQUIPMENT_PARAMETERS": "There is relation with equipment parameters", + "API.THERE_IS_RELATION_WITH_EQUIPMENTS": "There is relation with equipments", + "API.THERE_IS_RELATION_WITH_METER": "There is relation with meter", + "API.THERE_IS_RELATION_WITH_METERS": "There is relation with meters", + "API.THERE_IS_RELATION_WITH_OFFLINE_METER": "There is relation with offline meter", + "API.THERE_IS_RELATION_WITH_OFFLINE_METERS": "There is relation with offline meters", + "API.THERE_IS_RELATION_WITH_OTHER_VIRTUAL_METERS": "There is relation with other virtual meters", + "API.THERE_IS_RELATION_WITH_POINTS": "There is relation with points", + "API.THERE_IS_RELATION_WITH_SENSORS": "There is relation with sensors", + "API.THERE_IS_RELATION_WITH_SHOPFLOORS": "There is relation with shopfloors", + "API.THERE_IS_RELATION_WITH_SPACES": "There is relation with spaces", + "API.THERE_IS_RELATION_WITH_STORES": "There is relation with stores", + "API.THERE_IS_RELATION_WITH_TARIFFS": "There is relation with tariffs", + "API.THERE_IS_RELATION_WITH_TENANTS": "There is relation with tenants", + "API.THERE_IS_RELATION_WITH_VIRTUAL_METER": "There is relation with virtual meter", + "API.THERE_IS_RELATION_WITH_VIRTUAL_METERS": "There is relation with virtual meters", + "API.THERE_IS_RELATION_WITH_EQUIPMENTS": "There is relation with equipments", + "API.THERE_IS_RELATION_WITH_USERS": "There is relation with users", + "API.THIS_DATA_SOURCE_IS_BEING_USED_BY_A_METER": "This data source is being used by a meter", + "API.THIS_METER_IS_BEING_USED_BY_A_VIRTUAL_METER": "This meter is being used by a virtual meter", + "API.THIS_OFFLINE_METER_IS_BEING_USED_BY_A_VIRTUAL_METER": "This offline meter is being used by a virtual meter", + "API.THIS_SHOPFLOOR_CANNOT_BE_DELETED": "This shopfloor cannot be deleted", + "API.THIS_SPACE_CANNOT_BE_DELETED": "This space cannot be deleted", + "API.TIMEZONE_NOT_FOUND": "Timezone not found", + "API.TOKEN_NOT_FOUND_IN_HEADERS_PLEASE_LOGIN": "Token not found in headers please login", + "API.USER_NAME_IS_ALREADY_IN_USE": "User name is already in use", + "API.USER_NOT_FOUND": "User not found", + "API.USER_PRIVILEGE_NOT_FOUND": "User privilege not found", + "API.USER_SESSION_NOT_FOUND": "User session not found", + "API.USER_SESSION_TIMEOUT": "User session timeout", + "API.USER_UUID_NOT_FOUND_IN_HEADERS_PLEASE_LOGIN": "User uuid not found in headers please login", + "API.VIRTUAL_METER_NAME_IS_ALREADY_IN_USE": "Virtual meter name is already in use", + "API.VIRTUAL_METER_NOT_FOUND": "Virtual meter not found", + "API.VIRTUAL_METER_OF_VARIABLE_NOT_FOUND": "Virtual meter of variable not found", + "API.VIRTUAL_POINT_SHOULD_BE_ANALOG_VALUE": "Virtual point should be analog value", + "API.WEB_MESSAGE_NOT_FOUND": "Web message not found", + "API.WECHAT_MESSAGE_NOT_FOUND": "Wechat message not found", } }, zh_CN: { @@ -1849,405 +1848,405 @@ const resources = { "RMB Account": "人民币账户", // button "Toggle Navigation": "切换导航", - //API - "API.ADMINISTRATOR_SESSION_NOT_FOUND": "", - "API.ADMINISTRATOR_SESSION_TIMEOUT": "", - "API.ADVANCED_REPORT_NOT_FOUND": "", - "API.BAD_REQUEST": "", - "API.CANNOT_SET_EXISTING_SUBMETER_AS_MASTER_METER": "", - "API.COMBINED_EQUIPMENT_EQUIPMENT_RELATION_EXISTS": "", - "API.COMBINED_EQUIPMENT_EQUIPMENT_RELATION_NOT_FOUND": "", - "API.COMBINED_EQUIPMENT_METER_RELATION_EXISTS": "", - "API.COMBINED_EQUIPMENT_METER_RELATION_NOT_FOUND": "", - "API.COMBINED_EQUIPMENT_NAME_IS_ALREADY_IN_USE": "", - "API.COMBINED_EQUIPMENT_NOT_FOUND": "", - "API.COMBINED_EQUIPMENT_OFFLINE_METER_RELATION_EXISTS": "", - "API.COMBINED_EQUIPMENT_OFFLINE_METER_RELATION_NOT_FOUND": "", - "API.COMBINED_EQUIPMENT_PARAMETER_NAME_IS_ALREADY_IN_USE": "", - "API.COMBINED_EQUIPMENT_PARAMETER_NOT_FOUND_OR_NOT_MATCH": "", - "API.COMBINED_EQUIPMENT_VIRTUAL_METER_RELATION_EXISTS": "", - "API.COMBINED_EQUIPMENT_VIRTUAL_METER_RELATION_NOT_FOUND": "", - "API.CONTACT_NAME_IS_ALREADY_IN_USE": "", - "API.CONTACT_NOT_FOUND": "", - "API.COST_CENTER_EXTERNAL_ID_EXISTS": "", - "API.COST_CENTER_NAME_EXISTS": "", - "API.COST_CENTER_NOT_FOUND": "", - "API.COST_FILE_NOT_FOUND": "", - "API.DATA_SOURCE_NAME_IS_ALREADY_IN_USE": "", - "API.DATA_SOURCE_NOT_FOUND": "", - "API.DATABASE_ERROR": "", - "API.DISTRIBUTION_CIRCUIT_NAME_IS_ALREADY_IN_USE": "", - "API.DISTRIBUTION_CIRCUIT_NOT_FOUND": "", - "API.DISTRIBUTION_CIRCUIT_POINT_RELATION_EXISTS": "", - "API.DISTRIBUTION_CIRCUIT_POINT_RELATION_NOT_FOUND": "", - "API.DISTRIBUTION_SYSTEM_NAME_IS_ALREADY_IN_USE": "", - "API.DISTRIBUTION_SYSTEM_NOT_FOUND": "", - "API.EMAIL_IS_ALREADY_IN_USE": "", - "API.EMAIL_MESSAGE_NOT_FOUND": "", - "API.EMAIL_SERVER_HOST_IS_ALREADY_IN_USE": "", - "API.EMAIL_SERVER_NOT_FOUND": "", - "API.EMPTY_VARIABLES_ARRAY": "", - "API.ENERGY_CATEGORY_NAME_IS_ALREADY_IN_USE": "", - "API.ENERGY_CATEGORY_NOT_FOUND": "", - "API.ENERGY_CATEGORY_USED_IN_ENERGY_ITEMS": "", - "API.ENERGY_CATEGORY_USED_IN_METER": "", - "API.ENERGY_CATEGORY_USED_IN_OFFLINE_METER": "", - "API.ENERGY_CATEGORY_USED_IN_TARIFFS": "", - "API.ENERGY_CATEGORY_USED_IN_VIRTUAL_METER": "", - "API.ENERGY_FLOW_DIAGRAM_LINK_IS_ALREADY_IN_USE": "", - "API.ENERGY_FLOW_DIAGRAM_LINK_NOT_FOUND_OR_NOT_MATCH": "", - "API.ENERGY_FLOW_DIAGRAM_NAME_IS_ALREADY_IN_USE": "", - "API.ENERGY_FLOW_DIAGRAM_NODE_NAME_IS_ALREADY_IN_USE": "", - "API.ENERGY_FLOW_DIAGRAM_NODE_NOT_FOUND_OR_NOT_MATCH": "", - "API.ENERGY_FLOW_DIAGRAM_NOT_FOUND": "", - "API.ENERGY_ITEM_DOES_NOT_BELONG_TO_ENERGY_CATEGORY": "", - "API.ENERGY_ITEM_IS_NOT_BELONG_TO_ENERGY_CATEGORY": "", - "API.ENERGY_ITEM_NAME_IS_ALREADY_IN_USE": "", - "API.ENERGY_ITEM_NOT_FOUND": "", - "API.ENERGY_ITEM_USED_IN_METER": "", - "API.ENERGY_ITEM_USED_IN_OFFLINE_METER": "", - "API.ENERGY_ITEM_USED_IN_VIRTUAL_METER": "", - "API.EQUIPMENT_METER_RELATION_EXISTS": "", - "API.EQUIPMENT_METER_RELATION_NOT_FOUND": "", - "API.EQUIPMENT_NAME_IS_ALREADY_IN_USE": "", - "API.EQUIPMENT_NOT_FOUND": "", - "API.EQUIPMENT_OFFLINE_METER_RELATION_EXISTS": "", - "API.EQUIPMENT_OFFLINE_METER_RELATION_NOT_FOUND": "", - "API.EQUIPMENT_PARAMETER_NAME_IS_ALREADY_IN_USE": "", - "API.EQUIPMENT_PARAMETER_NOT_FOUND_OR_NOT_MATCH": "", - "API.EQUIPMENT_VIRTUAL_METER_RELATION_EXISTS": "", - "API.EQUIPMENT_VIRTUAL_METER_RELATION_NOT_FOUND": "", - "API.ERROR": "", - "API.EXCEPTION": "", - "API.FAILED_TO_RESTORE_COST_FILE": "", - "API.FAILED_TO_RESTORE_KNOWLEDGE_FILE": "", - "API.FAILED_TO_RESTORE_OFFLINE_METER_FILE": "", - "API.FAILED_TO_UPLOAD_COST_FILE": "", - "API.FAILED_TO_UPLOAD_KNOWLEDGE_FILE": "", - "API.FAILED_TO_UPLOAD_OFFLINE_METER_FILE": "", - "API.GATEWAY_NAME_IS_ALREADY_IN_USE": "", - "API.GATEWAY_NOT_FOUND": "", - "API.GSM_MODEM_NOT_FOUND": "", - "API.GSM_MODEM_SERIAL_PORT_IS_ALREADY_IN_USE": "", - "API.INVALID_": "", - "API.INVALID_ADDRESS": "", - "API.INVALID_ADDRESS_VALUE": "", - "API.INVALID_ADVANCED_REPORT_ID": "", - "API.INVALID_AREA_VALUE": "", - "API.INVALID_BASE_PERIOD_END_DATETIME": "", - "API.INVALID_BASE_PERIOD_START_DATETIME": "", - "API.INVALID_BAUD_RATE": "", - "API.INVALID_BUILDINGS_VALUE": "", - "API.INVALID_CATEGORY": "", - "API.INVALID_CHANNEL": "", - "API.INVALID_COMBINED_EQUIPMENT_ID": "", - "API.INVALID_COMBINED_EQUIPMENT_NAME": "", - "API.INVALID_COMBINED_EQUIPMENT_PARAMETER_ID": "", - "API.INVALID_COMBINED_EQUIPMENT_PARAMETER_NAME": "", - "API.INVALID_COMBINED_EQUIPMENT_PARAMETER_TYPE": "", - "API.INVALID_CONNECTION": "", - "API.INVALID_CONSTANT_VALUE": "", - "API.INVALID_CONTACT_ID": "", - "API.INVALID_CONTACT_NAME": "", - "API.INVALID_COST_CENTER_ID": "", - "API.INVALID_COST_FILE_ID": "", - "API.INVALID_DATA_SOURCE_ID": "", - "API.INVALID_DATA_SOURCE_NAME": "", - "API.INVALID_DATA_SOURCE_PROTOCOL": "", - "API.INVALID_DENOMINATOR_METER_UUID": "", - "API.INVALID_DISPLAY_NAME": "", - "API.INVALID_DISTRIBUTION_CIRCUIT_ID": "", - "API.INVALID_DISTRIBUTION_CIRCUIT_NAME": "", - "API.INVALID_DISTRIBUTION_ROOM": "", - "API.INVALID_DISTRIBUTION_SYSTEM_ID": "", - "API.INVALID_DISTRIBUTION_SYSTEM_NAME": "", - "API.INVALID_EMAIL": "", - "API.INVALID_EMAIL_MESSAGE_ID": "", - "API.INVALID_EMAIL_SERVER_HOST": "", - "API.INVALID_EMAIL_SERVER_ID": "", - "API.INVALID_END_DATE_FORMAT": "", - "API.INVALID_END_DATETIME": "", - "API.INVALID_ENERGY_CATEGORY_ID": "", - "API.INVALID_ENERGY_CATEGORY_NAME": "", - "API.INVALID_ENERGY_FLOW_DIAGRAM_ID": "", - "API.INVALID_ENERGY_FLOW_DIAGRAM_LINK_ID": "", - "API.INVALID_ENERGY_FLOW_DIAGRAM_NAME": "", - "API.INVALID_ENERGY_FLOW_DIAGRAM_NODE_ID": "", - "API.INVALID_ENERGY_FLOW_DIAGRAM_NODE_NAME": "", - "API.INVALID_ENERGY_ITEM_ID": "", - "API.INVALID_ENERGY_ITEM_NAME": "", - "API.INVALID_EQUATION_IN_EXPRESSION": "", - "API.INVALID_EQUIPMENT_ID": "", - "API.INVALID_equipment_ID": "", - "API.INVALID_EQUIPMENT_NAME": "", - "API.INVALID_EQUIPMENT_PARAMETER_ID": "", - "API.INVALID_EQUIPMENT_PARAMETER_NAME": "", - "API.INVALID_EQUIPMENT_PARAMETER_TYPE": "", - "API.INVALID_EXPRESSION": "", - "API.INVALID_EXPRESSION_OBJECT": "", - "API.INVALID_FDD_CODE": "", - "API.INVALID_FLOORS_VALUE": "", - "API.INVALID_FROM_ADDR": "", - "API.INVALID_GATEWAY_ID": "", - "API.INVALID_GATEWAY_NAME": "", - "API.INVALID_GSM_MODEM_ID": "", - "API.INVALID_HOURLY_HIGH_LIMIT_VALUE": "", - "API.INVALID_HOURLY_LOW_LIMIT_VALUE": "", - "API.INVALID_IS_ADMIN_VALUE": "", - "API.INVALID_IS_COUNTED_VALUE": "", - "API.INVALID_IS_ENABLED": "", - "API.INVALID_IS_HIDDEN": "", - "API.INVALID_IS_IN_LEASE_VALUE": "", - "API.INVALID_IS_INPUT_COUNTED_VALUE": "", - "API.INVALID_IS_KEY_TENANT_VALUE": "", - "API.INVALID_IS_OUTPUT_COUNTED_VALUE": "", - "API.INVALID_IS_OUTPUT_VALUE": "", - "API.INVALID_IS_TREND_VALUE": "", - "API.INVALID_IS_VIRTUAL_VALUE": "", - "API.INVALID_KGCE": "", - "API.INVALID_KGCO2E": "", - "API.INVALID_KNOWLEDGE_FILE_ID": "", - "API.INVALID_LATITUDE_VALUE": "", - "API.INVALID_LEASE_NUMBER_VALUE": "", - "API.INVALID_LONGITUDE_VALUE": "", - "API.INVALID_LOW_LIMIT_VALUE": "", - "API.INVALID_MASTER_METER_ID": "", - "API.INVALID_MENU_ID": "", - "API.INVALID_MESSAGE_TEMPLATE": "", - "API.INVALID_METER_ID": "", - "API.INVALID_METER_NAME": "", - "API.INVALID_METER_UUID": "", - "API.INVALID_NAME_VALUE": "", - "API.INVALID_NEW_PASSWORD": "", - "API.INVALID_NOTIFICATION_ID": "", - "API.INVALID_NUMERATOR_METER_UUID": "", - "API.INVALID_OBJECT_TYPE": "", - "API.INVALID_OFFLINE_METER_FILE_ID": "", - "API.INVALID_OFFLINE_METER_ID": "", - "API.INVALID_OFFLINE_METER_NAME": "", - "API.INVALID_OLD_PASSWORD": "", - "API.INVALID_PARENT_SPACE_ID": "", - "API.INVALID_PASSWORD": "", - "API.INVALID_PEAK_CURRENT": "", - "API.INVALID_PEAK_LOAD": "", - "API.INVALID_PERIOD_TYPE": "", - "API.INVALID_POINT_ID": "", - "API.INVALID_POINT_NAME": "", - "API.INVALID_PORT": "", - "API.INVALID_PRIORITY": "", - "API.INVALID_PRIVILEGE": "", - "API.INVALID_PRIVILEGE_DATA": "", - "API.INVALID_PRIVILEGE_ID": "", - "API.INVALID_PRIVILEGE_NAME": "", - "API.INVALID_RATIO_VALUE": "", - "API.INVALID_REPLY": "", - "API.INVALID_REPORTING_PERIOD_END_DATETIME": "", - "API.INVALID_REPORTING_PERIOD_START_DATETIME": "", - "API.INVALID_REQUIRES_AUTHENTICATION": "", - "API.INVALID_ROOMS_VALUE": "", - "API.INVALID_RULE_ID": "", - "API.INVALID_RULE_NAME": "", - "API.INVALID_SENSOR_ID": "", - "API.INVALID_SENSOR_NAME": "", - "API.INVALID_SERIAL_PORT": "", - "API.INVALID_SESSION_PLEASE_RE_LOGIN": "", - "API.INVALID_SHOPFLOOR_ID": "", - "API.INVALID_SHOPFLOOR_NAME": "", - "API.INVALID_SOURCE_NODE_ID": "", - "API.INVALID_SPACE_ID": "", - "API.INVALID_SPACE_NAME": "", - "API.INVALID_START_DATE_FORMAT": "", - "API.INVALID_START_DATETIME": "", - "API.INVALID_STATUS": "", - "API.INVALID_STORE_ID": "", - "API.INVALID_STORE_NAME": "", - "API.INVALID_STORE_TYPE_DESCRIPTION": "", - "API.INVALID_STORE_TYPE_ID": "", - "API.INVALID_STORE_TYPE_NAME": "", - "API.INVALID_STORE_TYPE_SIMPLIFIED_CODE": "", - "API.INVALID_SVG": "", - "API.INVALID_SWITCHGEAR": "", - "API.INVALID_TARGET_NODE_ID": "", - "API.INVALID_TARIFF_BLOCK_PRICING": "", - "API.INVALID_TARIFF_ID": "", - "API.INVALID_TARIFF_TIME_OF_USE_PRICING": "", - "API.INVALID_TARIFF_TYPE": "", - "API.INVALID_TENANT_ID": "", - "API.INVALID_TENANT_NAME": "", - "API.INVALID_TENANT_TYPE_DESCRIPTION": "", - "API.INVALID_TENANT_TYPE_ID": "", - "API.INVALID_TENANT_TYPE_NAME": "", - "API.INVALID_TENANT_TYPE_SIMPLIFIED_CODE": "", - "API.INVALID_TEXT_MESSAGE_ID": "", - "API.INVALID_TIMEZONE_ID": "", - "API.INVALID_TOKEN": "", - "API.INVALID_UNIT_OF_MEASURE": "", - "API.INVALID_UNIT_OF_PRICE": "", - "API.INVALID_UNITS": "", - "API.INVALID_USER_ID": "", - "API.INVALID_USER_NAME": "", - "API.INVALID_USER_NAME_OR_EMAIL": "", - "API.INVALID_USER_PHONE": "", - "API.INVALID_USER_PLEASE_RE_LOGIN": "", - "API.INVALID_USER_UUID": "", - "API.INVALID_VARIABLE_METER_ID": "", - "API.INVALID_VARIABLE_METER_TYPE": "", - "API.INVALID_VARIABLE_NAME": "", - "API.INVALID_VIRTUAL_METER_ID": "", - "API.INVALID_VIRTUAL_METER_NAME": "", - "API.INVALID_WEB_MESSAGE_ID": "", - "API.INVALID_WECHAT_MESSAGE_ID": "", - "API.KNOWLEDGE_FILE_CANNOT_BE_REMOVED_FROM_DISK": "", - "API.KNOWLEDGE_FILE_NOT_FOUND": "", - "API.MASTER_METER_DOES_NOT_BELONG_TO_SAME_ENERGY_CATEGORY": "", - "API.MASTER_METER_NOT_FOUND": "", - "API.MENU_NOT_FOUND": "", - "API.METER_NAME_IS_ALREADY_IN_USE": "", - "API.METER_NOT_FOUND": "", - "API.METER_OF_VARIABLE_NOT_FOUND": "", - "API.METER_POINT_RELATION_EXISTS": "", - "API.METER_POINT_RELATION_NOT_FOUND": "", - "API.NOT_FOUND": "", - "API.NOTIFICATION_NOT_FOUND": "", - "API.OFFLINE_METER_FILE_NOT_FOUND": "", - "API.OFFLINE_METER_NAME_IS_ALREADY_IN_USE": "", - "API.OFFLINE_METER_NOT_FOUND": "", - "API.OFFLINE_METER_OF_VARIABLE_NOT_FOUND": "", - "API.PARENT_SPACE_NOT_FOUND": "", - "API.POINT_NAME_IS_ALREADY_IN_USE": "", - "API.POINT_NOT_FOUND": "", - "API.PRIVILEGE_NAME_IS_ALREADY_IN_USE": "", - "API.PRIVILEGE_NOT_FOUND": "", - "API.RULE_NAME_IS_ALREADY_IN_USE": "", - "API.RULE_NOT_FOUND": "", - "API.SENSOR_NAME_IS_ALREADY_IN_USE": "", - "API.SENSOR_NOT_FOUND": "", - "API.SENSOR_POINT_RELATION_EXISTS": "", - "API.SENSOR_POINT_RELATION_NOT_FOUND": "", - "API.SHOPFLOOR_EQUIPMENT_RELATION_EXISTS": "", - "API.SHOPFLOOR_EQUIPMENT_RELATION_NOT_FOUND": "", - "API.SHOPFLOOR_METER_RELATION_EXISTS": "", - "API.SHOPFLOOR_METER_RELATION_NOT_FOUND": "", - "API.SHOPFLOOR_NAME_IS_ALREADY_IN_USE": "", - "API.SHOPFLOOR_NOT_FOUND": "", - "API.SHOPFLOOR_OFFLINE_METER_RELATION_EXISTS": "", - "API.SHOPFLOOR_OFFLINE_METER_RELATION_NOT_FOUND": "", - "API.SHOPFLOOR_POINT_RELATION_EXISTS": "", - "API.SHOPFLOOR_POINT_RELATION_NOT_FOUND": "", - "API.SHOPFLOOR_SENSOR_RELATION_EXISTS": "", - "API.SHOPFLOOR_SENSOR_RELATION_NOT_FOUND": "", - "API.SHOPFLOOR_VIRTUAL_METER_RELATION_EXISTS": "", - "API.SHOPFLOOR_VIRTUAL_METER_RELATION_NOT_FOUND": "", - "API.SOURCE_NODE_NOT_FOUND": "", - "API.SPACE_COMBINED_EQUIPMENT_RELATION_EXISTS": "", - "API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND": "", - "API.SPACE_EQUIPMENT_RELATION_EXISTS": "", - "API.SPACE_EQUIPMENT_RELATION_NOT_FOUND": "", - "API.SPACE_METER_RELATION_EXISTS": "", - "API.SPACE_METER_RELATION_NOT_FOUND": "", - "API.SPACE_NAME_IS_ALREADY_IN_USE": "", - "API.SPACE_NOT_FOUND": "", - "API.SPACE_NOT_FOUND_IN_PRIVILEGE": "", - "API.SPACE_OFFLINE_METER_RELATION_EXISTS": "", - "API.SPACE_OFFLINE_METER_RELATION_NOT_FOUND": "", - "API.SPACE_POINT_RELATION_EXISTS": "", - "API.SPACE_POINT_RELATION_NOT_FOUND": "", - "API.SPACE_SENSOR_RELATION_EXISTS": "", - "API.SPACE_SENSOR_RELATION_NOT_FOUND": "", - "API.SPACE_SHOPFLOOR_RELATION_EXISTS": "", - "API.SPACE_SHOPFLOOR_RELATION_NOT_FOUND": "", - "API.SPACE_STORE_RELATION_EXISTS": "", - "API.SPACE_STORE_RELATION_NOT_FOUND": "", - "API.SPACE_TENANT_RELATION_EXISTS": "", - "API.SPACE_TENANT_RELATION_NOT_FOUND": "", - "API.SPACE_VIRTUAL_METER_RELATION_EXISTS": "", - "API.SPACE_VIRTUAL_METER_RELATION_NOT_FOUND": "", - "API.START_DATETIME_MUST_BE_EARLIER_THAN_END_DATETIME": "", - "API.STORE_METER_RELATION_EXISTS": "", - "API.STORE_METER_RELATION_NOT_FOUND": "", - "API.STORE_NAME_IS_ALREADY_IN_USE": "", - "API.STORE_NOT_FOUND": "", - "API.STORE_OFFLINE_METER_RELATION_EXISTS": "", - "API.STORE_OFFLINE_METER_RELATION_NOT_FOUND": "", - "API.STORE_POINT_RELATION_EXISTS": "", - "API.STORE_POINT_RELATION_NOT_FOUND": "", - "API.STORE_SENSOR_RELATION_EXISTS": "", - "API.STORE_SENSOR_RELATION_NOT_FOUND": "", - "API.STORE_TYPE_NAME_IS_ALREADY_IN_USE": "", - "API.STORE_TYPE_NOT_FOUND": "", - "API.STORE_TYPE_SIMPLIFIED_CODE_IS_ALREADY_IN_USE": "", - "API.STORE_TYPE_USED_IN_STORE": "", - "API.STORE_VIRTUAL_METER_RELATION_EXISTS": "", - "API.STORE_VIRTUAL_METER_RELATION_NOT_FOUND": "", - "API.TARGET_NODE_NOT_FOUND": "", - "API.TARIFF_IS_ALREADY_ASSOCIATED_WITH_COST_CENTER": "", - "API.TARIFF_IN_USE": "", - "API.TARIFF_IS_NOT_ASSOCIATED_WITH_COST_CENTER": "", - "API.TARIFF_NAME_IS_ALREADY_IN_USE": "", - "API.TARIFF_NOT_EMPTY": "", - "API.TARIFF_NOT_FOUND": "", - "API.TENANT_METER_RELATION_EXISTS": "", - "API.TENANT_METER_RELATION_NOT_FOUND": "", - "API.TENANT_NAME_IS_ALREADY_IN_USE": "", - "API.TENANT_NOT_FOUND": "", - "API.TENANT_OFFLINE_METER_RELATION_EXISTS": "", - "API.TENANT_OFFLINE_METER_RELATION_NOT_FOUND": "", - "API.TENANT_POINT_RELATION_EXISTS": "", - "API.TENANT_POINT_RELATION_NOT_FOUND": "", - "API.TENANT_SENSOR_RELATION_EXISTS": "", - "API.TENANT_SENSOR_RELATION_NOT_FOUND": "", - "API.TENANT_TYPE_NAME_IS_ALREADY_IN_USE": "", - "API.TENANT_TYPE_NOT_FOUND": "", - "API.TENANT_TYPE_SIMPLIFIED_CODE_IS_ALREADY_IN_USE": "", - "API.TENANT_TYPE_USED_IN_TENANT": "", - "API.TENANT_VIRTUAL_METER_RELATION_EXISTS": "", - "API.TENANT_VIRTUAL_METER_RELATION_NOT_FOUND": "", - "API.TEXT_MESSAGE_NOT_FOUND": "", - "API.THE_REPORTING_PERIOD_MUST_BE_LONGER_THAN_15_MINUTES": "", - "API.THERE_IS_ASSOCIATED_DISTRIBUTION_CIRCUITS": "", - "API.THERE_IS_RELATION_WITH_CHILD_METERS": "", - "API.THERE_IS_RELATION_WITH_CHILDREN_SPACES": "", - "API.THERE_IS_RELATION_WITH_COMBINED_EQUIPMENT_PARAMETERS": "", - "API.THERE_IS_RELATION_WITH_COMBINED_EQUIPMENTS": "", - "API.THERE_IS_RELATION_WITH_DATA_SOURCES": "", - "API.THERE_IS_RELATION_WITH_ENERGY_FLOW_DIAGRAM_LINKS": "", - "API.THERE_IS_RELATION_WITH_EQUIPMENT_PARAMETERS": "", - "API.THERE_IS_RELATION_WITH_EQUIPMENTS": "", - "API.THERE_IS_RELATION_WITH_METER": "", - "API.THERE_IS_RELATION_WITH_METERS": "", - "API.THERE_IS_RELATION_WITH_OFFLINE_METER": "", - "API.THERE_IS_RELATION_WITH_OFFLINE_METERS": "", - "API.THERE_IS_RELATION_WITH_OTHER_VIRTUAL_METERS": "", - "API.THERE_IS_RELATION_WITH_POINTS": "", - "API.THERE_IS_RELATION_WITH_SENSORS": "", - "API.THERE_IS_RELATION_WITH_SHOPFLOORS": "", - "API.THERE_IS_RELATION_WITH_SPACES": "", - "API.THERE_IS_RELATION_WITH_STORES": "", - "API.THERE_IS_RELATION_WITH_TARIFFS": "", - "API.THERE_IS_RELATION_WITH_TENANTS": "", - "API.THERE_IS_RELATION_WITH_VIRTUAL_METER": "", - "API.THERE_IS_RELATION_WITH_VIRTUAL_METERS": "", - "API.THERE_IS_RELATION_WITH_EQUIPMENTS": "", - "API.THERE_IS_RELATION_WITH_USERS": "", - "API.THIS_DATA_SOURCE_IS_BEING_USED_BY_A_METER": "", - "API.THIS_METER_IS_BEING_USED_BY_A_VIRTUAL_METER": "", - "API.THIS_OFFLINE_METER_IS_BEING_USED_BY_A_VIRTUAL_METER": "", - "API.THIS_SHOPFLOOR_CANNOT_BE_DELETED": "", - "API.THIS_SPACE_CANNOT_BE_DELETED": "", - "API.TIMEZONE_NOT_FOUND": "", - "API.TOKEN_NOT_FOUND_IN_HEADERS_PLEASE_LOGIN": "", - "API.USER_NAME_IS_ALREADY_IN_USE": "", - "API.USER_NOT_FOUND": "", - "API.USER_PRIVILEGE_NOT_FOUND": "", - "API.USER_SESSION_NOT_FOUND": "", - "API.USER_SESSION_TIMEOUT": "", - "API.USER_UUID_NOT_FOUND_IN_HEADERS_PLEASE_LOGIN": "", - "API.VIRTUAL_METER_NAME_IS_ALREADY_IN_USE": "", - "API.VIRTUAL_METER_NOT_FOUND": "", - "API.VIRTUAL_METER_OF_VARIABLE_NOT_FOUND": "", - "API.VIRTUAL_POINT_SHOULD_BE_ANALOG_VALUE": "", - "API.WEB_MESSAGE_NOT_FOUND": "", - "API.WECHAT_MESSAGE_NOT_FOUND": "", + // API + "API.ADMINISTRATOR_SESSION_NOT_FOUND": "Administrator session not found", + "API.ADMINISTRATOR_SESSION_TIMEOUT": "Administrator session timeout", + "API.ADVANCED_REPORT_NOT_FOUND": "Advanced report not found", + "API.BAD_REQUEST": "Bad request", + "API.CANNOT_SET_EXISTING_SUBMETER_AS_MASTER_METER": "Cannot set existing submeter as master meter", + "API.COMBINED_EQUIPMENT_EQUIPMENT_RELATION_EXISTS": "Combined equipment equipment relation exists", + "API.COMBINED_EQUIPMENT_EQUIPMENT_RELATION_NOT_FOUND": "Combined equipment equipment relation not found", + "API.COMBINED_EQUIPMENT_METER_RELATION_EXISTS": "Combined equipment meter relation exists", + "API.COMBINED_EQUIPMENT_METER_RELATION_NOT_FOUND": "Combined equipment meter relation not found", + "API.COMBINED_EQUIPMENT_NAME_IS_ALREADY_IN_USE": "Combined equipment name is already in use", + "API.COMBINED_EQUIPMENT_NOT_FOUND": "Combined equipment not found", + "API.COMBINED_EQUIPMENT_OFFLINE_METER_RELATION_EXISTS": "Combined equipment offline meter relation exists", + "API.COMBINED_EQUIPMENT_OFFLINE_METER_RELATION_NOT_FOUND": "Combined equipment offline meter relation not found", + "API.COMBINED_EQUIPMENT_PARAMETER_NAME_IS_ALREADY_IN_USE": "Combined equipment parameter name is already in use", + "API.COMBINED_EQUIPMENT_PARAMETER_NOT_FOUND_OR_NOT_MATCH": "Combined equipment parameter not found or not match", + "API.COMBINED_EQUIPMENT_VIRTUAL_METER_RELATION_EXISTS": "Combined equipment virtual meter relation exists", + "API.COMBINED_EQUIPMENT_VIRTUAL_METER_RELATION_NOT_FOUND": "Combined equipment virtual meter relation not found", + "API.CONTACT_NAME_IS_ALREADY_IN_USE": "Contact name is already in use", + "API.CONTACT_NOT_FOUND": "Contact not found", + "API.COST_CENTER_EXTERNAL_ID_EXISTS": "Cost center external id exists", + "API.COST_CENTER_NAME_EXISTS": "Cost center name exists", + "API.COST_CENTER_NOT_FOUND": "Cost center not found", + "API.COST_FILE_NOT_FOUND": "Cost file not found", + "API.DATA_SOURCE_NAME_IS_ALREADY_IN_USE": "Data source name is already in use", + "API.DATA_SOURCE_NOT_FOUND": "Data source not found", + "API.DATABASE_ERROR": "Database error", + "API.DISTRIBUTION_CIRCUIT_NAME_IS_ALREADY_IN_USE": "Distribution circuit name is already in use", + "API.DISTRIBUTION_CIRCUIT_NOT_FOUND": "Distribution circuit not found", + "API.DISTRIBUTION_CIRCUIT_POINT_RELATION_EXISTS": "Distribution circuit point relation exists", + "API.DISTRIBUTION_CIRCUIT_POINT_RELATION_NOT_FOUND": "Distribution circuit point relation not found", + "API.DISTRIBUTION_SYSTEM_NAME_IS_ALREADY_IN_USE": "Distribution system name is already in use", + "API.DISTRIBUTION_SYSTEM_NOT_FOUND": "Distribution system not found", + "API.EMAIL_IS_ALREADY_IN_USE": "Email is already in use", + "API.EMAIL_MESSAGE_NOT_FOUND": "Email message not found", + "API.EMAIL_SERVER_HOST_IS_ALREADY_IN_USE": "Email server host is already in use", + "API.EMAIL_SERVER_NOT_FOUND": "Email server not found", + "API.EMPTY_VARIABLES_ARRAY": "Empty variables array", + "API.ENERGY_CATEGORY_NAME_IS_ALREADY_IN_USE": "Energy category name is already in use", + "API.ENERGY_CATEGORY_NOT_FOUND": "Energy category not found", + "API.ENERGY_CATEGORY_USED_IN_ENERGY_ITEMS": "Energy category used in energy items", + "API.ENERGY_CATEGORY_USED_IN_METER": "Energy category used in meter", + "API.ENERGY_CATEGORY_USED_IN_OFFLINE_METER": "Energy category used in offline meter", + "API.ENERGY_CATEGORY_USED_IN_TARIFFS": "Energy category used in tariffs", + "API.ENERGY_CATEGORY_USED_IN_VIRTUAL_METER": "Energy category used in virtual meter", + "API.ENERGY_FLOW_DIAGRAM_LINK_IS_ALREADY_IN_USE": "Energy flow diagram link is already in use", + "API.ENERGY_FLOW_DIAGRAM_LINK_NOT_FOUND_OR_NOT_MATCH": "Energy flow diagram link not found or not match", + "API.ENERGY_FLOW_DIAGRAM_NAME_IS_ALREADY_IN_USE": "Energy flow diagram name is already in use", + "API.ENERGY_FLOW_DIAGRAM_NODE_NAME_IS_ALREADY_IN_USE": "Energy flow diagram node name is already in use", + "API.ENERGY_FLOW_DIAGRAM_NODE_NOT_FOUND_OR_NOT_MATCH": "Energy flow diagram node not found or not match", + "API.ENERGY_FLOW_DIAGRAM_NOT_FOUND": "Energy flow diagram not found", + "API.ENERGY_ITEM_DOES_NOT_BELONG_TO_ENERGY_CATEGORY": "Energy item does not belong to energy category", + "API.ENERGY_ITEM_IS_NOT_BELONG_TO_ENERGY_CATEGORY": "Energy item is not belong to energy category", + "API.ENERGY_ITEM_NAME_IS_ALREADY_IN_USE": "Energy item name is already in use", + "API.ENERGY_ITEM_NOT_FOUND": "Energy item not found", + "API.ENERGY_ITEM_USED_IN_METER": "Energy item used in meter", + "API.ENERGY_ITEM_USED_IN_OFFLINE_METER": "Energy item used in offline meter", + "API.ENERGY_ITEM_USED_IN_VIRTUAL_METER": "Energy item used in virtual meter", + "API.EQUIPMENT_METER_RELATION_EXISTS": "Equipment meter relation exists", + "API.EQUIPMENT_METER_RELATION_NOT_FOUND": "Equipment meter relation not found", + "API.EQUIPMENT_NAME_IS_ALREADY_IN_USE": "Equipment name is already in use", + "API.EQUIPMENT_NOT_FOUND": "Equipment not found", + "API.EQUIPMENT_OFFLINE_METER_RELATION_EXISTS": "Equipment offline meter relation exists", + "API.EQUIPMENT_OFFLINE_METER_RELATION_NOT_FOUND": "Equipment offline meter relation not found", + "API.EQUIPMENT_PARAMETER_NAME_IS_ALREADY_IN_USE": "Equipment parameter name is already in use", + "API.EQUIPMENT_PARAMETER_NOT_FOUND_OR_NOT_MATCH": "Equipment parameter not found or not match", + "API.EQUIPMENT_VIRTUAL_METER_RELATION_EXISTS": "Equipment virtual meter relation exists", + "API.EQUIPMENT_VIRTUAL_METER_RELATION_NOT_FOUND": "Equipment virtual meter relation not found", + "API.ERROR": "Error", + "API.EXCEPTION": "Exception", + "API.FAILED_TO_RESTORE_COST_FILE": "Failed to restore cost file", + "API.FAILED_TO_RESTORE_KNOWLEDGE_FILE": "Failed to restore knowledge file", + "API.FAILED_TO_RESTORE_OFFLINE_METER_FILE": "Failed to restore offline meter file", + "API.FAILED_TO_UPLOAD_COST_FILE": "Failed to upload cost file", + "API.FAILED_TO_UPLOAD_KNOWLEDGE_FILE": "Failed to upload knowledge file", + "API.FAILED_TO_UPLOAD_OFFLINE_METER_FILE": "Failed to upload offline meter file", + "API.GATEWAY_NAME_IS_ALREADY_IN_USE": "Gateway name is already in use", + "API.GATEWAY_NOT_FOUND": "Gateway not found", + "API.GSM_MODEM_NOT_FOUND": "Gsm modem not found", + "API.GSM_MODEM_SERIAL_PORT_IS_ALREADY_IN_USE": "Gsm modem serial port is already in use", + "API.INVALID_": "Invalid ", + "API.INVALID_ADDRESS": "Invalid address", + "API.INVALID_ADDRESS_VALUE": "Invalid address value", + "API.INVALID_ADVANCED_REPORT_ID": "Invalid advanced report id", + "API.INVALID_AREA_VALUE": "Invalid area value", + "API.INVALID_BASE_PERIOD_END_DATETIME": "Invalid base period end datetime", + "API.INVALID_BASE_PERIOD_START_DATETIME": "Invalid base period start datetime", + "API.INVALID_BAUD_RATE": "Invalid baud rate", + "API.INVALID_BUILDINGS_VALUE": "Invalid buildings value", + "API.INVALID_CATEGORY": "Invalid category", + "API.INVALID_CHANNEL": "Invalid channel", + "API.INVALID_COMBINED_EQUIPMENT_ID": "Invalid combined equipment id", + "API.INVALID_COMBINED_EQUIPMENT_NAME": "Invalid combined equipment name", + "API.INVALID_COMBINED_EQUIPMENT_PARAMETER_ID": "Invalid combined equipment parameter id", + "API.INVALID_COMBINED_EQUIPMENT_PARAMETER_NAME": "Invalid combined equipment parameter name", + "API.INVALID_COMBINED_EQUIPMENT_PARAMETER_TYPE": "Invalid combined equipment parameter type", + "API.INVALID_CONNECTION": "Invalid connection", + "API.INVALID_CONSTANT_VALUE": "Invalid constant value", + "API.INVALID_CONTACT_ID": "Invalid contact id", + "API.INVALID_CONTACT_NAME": "Invalid contact name", + "API.INVALID_COST_CENTER_ID": "Invalid cost center id", + "API.INVALID_COST_FILE_ID": "Invalid cost file id", + "API.INVALID_DATA_SOURCE_ID": "Invalid data source id", + "API.INVALID_DATA_SOURCE_NAME": "Invalid data source name", + "API.INVALID_DATA_SOURCE_PROTOCOL": "Invalid data source protocol", + "API.INVALID_DENOMINATOR_METER_UUID": "Invalid denominator meter uuid", + "API.INVALID_DISPLAY_NAME": "Invalid display name", + "API.INVALID_DISTRIBUTION_CIRCUIT_ID": "Invalid distribution circuit id", + "API.INVALID_DISTRIBUTION_CIRCUIT_NAME": "Invalid distribution circuit name", + "API.INVALID_DISTRIBUTION_ROOM": "Invalid distribution room", + "API.INVALID_DISTRIBUTION_SYSTEM_ID": "Invalid distribution system id", + "API.INVALID_DISTRIBUTION_SYSTEM_NAME": "Invalid distribution system name", + "API.INVALID_EMAIL": "Invalid email", + "API.INVALID_EMAIL_MESSAGE_ID": "Invalid email message id", + "API.INVALID_EMAIL_SERVER_HOST": "Invalid email server host", + "API.INVALID_EMAIL_SERVER_ID": "Invalid email server id", + "API.INVALID_END_DATE_FORMAT": "Invalid end date format", + "API.INVALID_END_DATETIME": "Invalid end datetime", + "API.INVALID_ENERGY_CATEGORY_ID": "Invalid energy category id", + "API.INVALID_ENERGY_CATEGORY_NAME": "Invalid energy category name", + "API.INVALID_ENERGY_FLOW_DIAGRAM_ID": "Invalid energy flow diagram id", + "API.INVALID_ENERGY_FLOW_DIAGRAM_LINK_ID": "Invalid energy flow diagram link id", + "API.INVALID_ENERGY_FLOW_DIAGRAM_NAME": "Invalid energy flow diagram name", + "API.INVALID_ENERGY_FLOW_DIAGRAM_NODE_ID": "Invalid energy flow diagram node id", + "API.INVALID_ENERGY_FLOW_DIAGRAM_NODE_NAME": "Invalid energy flow diagram node name", + "API.INVALID_ENERGY_ITEM_ID": "Invalid energy item id", + "API.INVALID_ENERGY_ITEM_NAME": "Invalid energy item name", + "API.INVALID_EQUATION_IN_EXPRESSION": "Invalid equation in expression", + "API.INVALID_EQUIPMENT_ID": "Invalid equipment id", + "API.INVALID_equipment_ID": "Invalid equipment id", + "API.INVALID_EQUIPMENT_NAME": "Invalid equipment name", + "API.INVALID_EQUIPMENT_PARAMETER_ID": "Invalid equipment parameter id", + "API.INVALID_EQUIPMENT_PARAMETER_NAME": "Invalid equipment parameter name", + "API.INVALID_EQUIPMENT_PARAMETER_TYPE": "Invalid equipment parameter type", + "API.INVALID_EXPRESSION": "Invalid expression", + "API.INVALID_EXPRESSION_OBJECT": "Invalid expression object", + "API.INVALID_FDD_CODE": "Invalid fdd code", + "API.INVALID_FLOORS_VALUE": "Invalid floors value", + "API.INVALID_FROM_ADDR": "Invalid from addr", + "API.INVALID_GATEWAY_ID": "Invalid gateway id", + "API.INVALID_GATEWAY_NAME": "Invalid gateway name", + "API.INVALID_GSM_MODEM_ID": "Invalid gsm modem id", + "API.INVALID_HOURLY_HIGH_LIMIT_VALUE": "Invalid hourly high limit value", + "API.INVALID_HOURLY_LOW_LIMIT_VALUE": "Invalid hourly low limit value", + "API.INVALID_IS_ADMIN_VALUE": "Invalid is admin value", + "API.INVALID_IS_COUNTED_VALUE": "Invalid is counted value", + "API.INVALID_IS_ENABLED": "Invalid is enabled", + "API.INVALID_IS_HIDDEN": "Invalid is hidden", + "API.INVALID_IS_IN_LEASE_VALUE": "Invalid is in lease value", + "API.INVALID_IS_INPUT_COUNTED_VALUE": "Invalid is input counted value", + "API.INVALID_IS_KEY_TENANT_VALUE": "Invalid is key tenant value", + "API.INVALID_IS_OUTPUT_COUNTED_VALUE": "Invalid is output counted value", + "API.INVALID_IS_OUTPUT_VALUE": "Invalid is output value", + "API.INVALID_IS_TREND_VALUE": "Invalid is trend value", + "API.INVALID_IS_VIRTUAL_VALUE": "Invalid is virtual value", + "API.INVALID_KGCE": "Invalid kgce", + "API.INVALID_KGCO2E": "Invalid kgco2e", + "API.INVALID_KNOWLEDGE_FILE_ID": "Invalid knowledge file id", + "API.INVALID_LATITUDE_VALUE": "Invalid latitude value", + "API.INVALID_LEASE_NUMBER_VALUE": "Invalid lease number value", + "API.INVALID_LONGITUDE_VALUE": "Invalid longitude value", + "API.INVALID_LOW_LIMIT_VALUE": "Invalid low limit value", + "API.INVALID_MASTER_METER_ID": "Invalid master meter id", + "API.INVALID_MENU_ID": "Invalid menu id", + "API.INVALID_MESSAGE_TEMPLATE": "Invalid message template", + "API.INVALID_METER_ID": "Invalid meter id", + "API.INVALID_METER_NAME": "Invalid meter name", + "API.INVALID_METER_UUID": "Invalid meter uuid", + "API.INVALID_NAME_VALUE": "Invalid name value", + "API.INVALID_NEW_PASSWORD": "Invalid new password", + "API.INVALID_NOTIFICATION_ID": "Invalid notification id", + "API.INVALID_NUMERATOR_METER_UUID": "Invalid numerator meter uuid", + "API.INVALID_OBJECT_TYPE": "Invalid object type", + "API.INVALID_OFFLINE_METER_FILE_ID": "Invalid offline meter file id", + "API.INVALID_OFFLINE_METER_ID": "Invalid offline meter id", + "API.INVALID_OFFLINE_METER_NAME": "Invalid offline meter name", + "API.INVALID_OLD_PASSWORD": "Invalid old password", + "API.INVALID_PARENT_SPACE_ID": "Invalid parent space id", + "API.INVALID_PASSWORD": "Invalid password", + "API.INVALID_PEAK_CURRENT": "Invalid peak current", + "API.INVALID_PEAK_LOAD": "Invalid peak load", + "API.INVALID_PERIOD_TYPE": "Invalid period type", + "API.INVALID_POINT_ID": "Invalid point id", + "API.INVALID_POINT_NAME": "Invalid point name", + "API.INVALID_PORT": "Invalid port", + "API.INVALID_PRIORITY": "Invalid priority", + "API.INVALID_PRIVILEGE": "Invalid privilege", + "API.INVALID_PRIVILEGE_DATA": "Invalid privilege data", + "API.INVALID_PRIVILEGE_ID": "Invalid privilege id", + "API.INVALID_PRIVILEGE_NAME": "Invalid privilege name", + "API.INVALID_RATIO_VALUE": "Invalid ratio value", + "API.INVALID_REPLY": "Invalid reply", + "API.INVALID_REPORTING_PERIOD_END_DATETIME": "Invalid reporting period end datetime", + "API.INVALID_REPORTING_PERIOD_START_DATETIME": "Invalid reporting period start datetime", + "API.INVALID_REQUIRES_AUTHENTICATION": "Invalid requires authentication", + "API.INVALID_ROOMS_VALUE": "Invalid rooms value", + "API.INVALID_RULE_ID": "Invalid rule id", + "API.INVALID_RULE_NAME": "Invalid rule name", + "API.INVALID_SENSOR_ID": "Invalid sensor id", + "API.INVALID_SENSOR_NAME": "Invalid sensor name", + "API.INVALID_SERIAL_PORT": "Invalid serial port", + "API.INVALID_SESSION_PLEASE_RE_LOGIN": "Invalid session please re-login", + "API.INVALID_SHOPFLOOR_ID": "Invalid shopfloor id", + "API.INVALID_SHOPFLOOR_NAME": "Invalid shopfloor name", + "API.INVALID_SOURCE_NODE_ID": "Invalid source node id", + "API.INVALID_SPACE_ID": "Invalid space id", + "API.INVALID_SPACE_NAME": "Invalid space name", + "API.INVALID_START_DATE_FORMAT": "Invalid start date format", + "API.INVALID_START_DATETIME": "Invalid start datetime", + "API.INVALID_STATUS": "Invalid status", + "API.INVALID_STORE_ID": "Invalid store id", + "API.INVALID_STORE_NAME": "Invalid store name", + "API.INVALID_STORE_TYPE_DESCRIPTION": "Invalid store type description", + "API.INVALID_STORE_TYPE_ID": "Invalid store type id", + "API.INVALID_STORE_TYPE_NAME": "Invalid store type name", + "API.INVALID_STORE_TYPE_SIMPLIFIED_CODE": "Invalid store type simplified code", + "API.INVALID_SVG": "Invalid svg", + "API.INVALID_SWITCHGEAR": "Invalid switchgear", + "API.INVALID_TARGET_NODE_ID": "Invalid target node id", + "API.INVALID_TARIFF_BLOCK_PRICING": "Invalid tariff block pricing", + "API.INVALID_TARIFF_ID": "Invalid tariff id", + "API.INVALID_TARIFF_TIME_OF_USE_PRICING": "Invalid tariff time of use pricing", + "API.INVALID_TARIFF_TYPE": "Invalid tariff type", + "API.INVALID_TENANT_ID": "Invalid tenant id", + "API.INVALID_TENANT_NAME": "Invalid tenant name", + "API.INVALID_TENANT_TYPE_DESCRIPTION": "Invalid tenant type description", + "API.INVALID_TENANT_TYPE_ID": "Invalid tenant type id", + "API.INVALID_TENANT_TYPE_NAME": "Invalid tenant type name", + "API.INVALID_TENANT_TYPE_SIMPLIFIED_CODE": "Invalid tenant type simplified code", + "API.INVALID_TEXT_MESSAGE_ID": "Invalid text message id", + "API.INVALID_TIMEZONE_ID": "Invalid timezone id", + "API.INVALID_TOKEN": "Invalid token", + "API.INVALID_UNIT_OF_MEASURE": "Invalid unit of measure", + "API.INVALID_UNIT_OF_PRICE": "Invalid unit of price", + "API.INVALID_UNITS": "Invalid units", + "API.INVALID_USER_ID": "Invalid user id", + "API.INVALID_USER_NAME": "Invalid user name", + "API.INVALID_USER_NAME_OR_EMAIL": "Invalid user name or email", + "API.INVALID_USER_PHONE": "Invalid user phone", + "API.INVALID_USER_PLEASE_RE_LOGIN": "Invalid user please re-login", + "API.INVALID_USER_UUID": "Invalid user uuid", + "API.INVALID_VARIABLE_METER_ID": "Invalid variable meter id", + "API.INVALID_VARIABLE_METER_TYPE": "Invalid variable meter type", + "API.INVALID_VARIABLE_NAME": "Invalid variable name", + "API.INVALID_VIRTUAL_METER_ID": "Invalid virtual meter id", + "API.INVALID_VIRTUAL_METER_NAME": "Invalid virtual meter name", + "API.INVALID_WEB_MESSAGE_ID": "Invalid web message id", + "API.INVALID_WECHAT_MESSAGE_ID": "Invalid wechat message id", + "API.KNOWLEDGE_FILE_CANNOT_BE_REMOVED_FROM_DISK": "Knowledge File Cannot be Removed from Disk", + "API.KNOWLEDGE_FILE_NOT_FOUND": "Knowledge file not found", + "API.MASTER_METER_DOES_NOT_BELONG_TO_SAME_ENERGY_CATEGORY": "Master meter does not belong to same energy category", + "API.MASTER_METER_NOT_FOUND": "Master meter not found", + "API.MENU_NOT_FOUND": "Menu not found", + "API.METER_NAME_IS_ALREADY_IN_USE": "Meter name is already in use", + "API.METER_NOT_FOUND": "Meter not found", + "API.METER_OF_VARIABLE_NOT_FOUND": "Meter of variable not found", + "API.METER_POINT_RELATION_EXISTS": "Meter point relation exists", + "API.METER_POINT_RELATION_NOT_FOUND": "Meter point relation not found", + "API.NOT_FOUND": "Not found", + "API.NOTIFICATION_NOT_FOUND": "Notification not found", + "API.OFFLINE_METER_FILE_NOT_FOUND": "Offline meter file not found", + "API.OFFLINE_METER_NAME_IS_ALREADY_IN_USE": "Offline meter name is already in use", + "API.OFFLINE_METER_NOT_FOUND": "Offline meter not found", + "API.OFFLINE_METER_OF_VARIABLE_NOT_FOUND": "Offline meter of variable not found", + "API.PARENT_SPACE_NOT_FOUND": "Parent space not found", + "API.POINT_NAME_IS_ALREADY_IN_USE": "Point name is already in use", + "API.POINT_NOT_FOUND": "Point not found", + "API.PRIVILEGE_NAME_IS_ALREADY_IN_USE": "Privilege name is already in use", + "API.PRIVILEGE_NOT_FOUND": "Privilege not found", + "API.RULE_NAME_IS_ALREADY_IN_USE": "Rule name is already in use", + "API.RULE_NOT_FOUND": "Rule not found", + "API.SENSOR_NAME_IS_ALREADY_IN_USE": "Sensor name is already in use", + "API.SENSOR_NOT_FOUND": "Sensor not found", + "API.SENSOR_POINT_RELATION_EXISTS": "Sensor point relation exists", + "API.SENSOR_POINT_RELATION_NOT_FOUND": "Sensor point relation not found", + "API.SHOPFLOOR_EQUIPMENT_RELATION_EXISTS": "Shopfloor equipment relation exists", + "API.SHOPFLOOR_EQUIPMENT_RELATION_NOT_FOUND": "Shopfloor equipment relation not found", + "API.SHOPFLOOR_METER_RELATION_EXISTS": "Shopfloor meter relation exists", + "API.SHOPFLOOR_METER_RELATION_NOT_FOUND": "Shopfloor meter relation not found", + "API.SHOPFLOOR_NAME_IS_ALREADY_IN_USE": "Shopfloor name is already in use", + "API.SHOPFLOOR_NOT_FOUND": "Shopfloor not found", + "API.SHOPFLOOR_OFFLINE_METER_RELATION_EXISTS": "Shopfloor offline meter relation exists", + "API.SHOPFLOOR_OFFLINE_METER_RELATION_NOT_FOUND": "Shopfloor offline meter relation not found", + "API.SHOPFLOOR_POINT_RELATION_EXISTS": "Shopfloor point relation exists", + "API.SHOPFLOOR_POINT_RELATION_NOT_FOUND": "Shopfloor point relation not found", + "API.SHOPFLOOR_SENSOR_RELATION_EXISTS": "Shopfloor sensor relation exists", + "API.SHOPFLOOR_SENSOR_RELATION_NOT_FOUND": "Shopfloor sensor relation not found", + "API.SHOPFLOOR_VIRTUAL_METER_RELATION_EXISTS": "Shopfloor virtual meter relation exists", + "API.SHOPFLOOR_VIRTUAL_METER_RELATION_NOT_FOUND": "Shopfloor virtual meter relation not found", + "API.SOURCE_NODE_NOT_FOUND": "Source node not found", + "API.SPACE_COMBINED_EQUIPMENT_RELATION_EXISTS": "Space combined equipment relation exists", + "API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND": "Space combined equipment relation not found", + "API.SPACE_EQUIPMENT_RELATION_EXISTS": "Space equipment relation exists", + "API.SPACE_EQUIPMENT_RELATION_NOT_FOUND": "Space equipment relation not found", + "API.SPACE_METER_RELATION_EXISTS": "Space meter relation exists", + "API.SPACE_METER_RELATION_NOT_FOUND": "Space meter relation not found", + "API.SPACE_NAME_IS_ALREADY_IN_USE": "Space name is already in use", + "API.SPACE_NOT_FOUND": "Space not found", + "API.SPACE_NOT_FOUND_IN_PRIVILEGE": "Space not found in privilege", + "API.SPACE_OFFLINE_METER_RELATION_EXISTS": "Space offline meter relation exists", + "API.SPACE_OFFLINE_METER_RELATION_NOT_FOUND": "Space offline meter relation not found", + "API.SPACE_POINT_RELATION_EXISTS": "Space point relation exists", + "API.SPACE_POINT_RELATION_NOT_FOUND": "Space point relation not found", + "API.SPACE_SENSOR_RELATION_EXISTS": "Space sensor relation exists", + "API.SPACE_SENSOR_RELATION_NOT_FOUND": "Space sensor relation not found", + "API.SPACE_SHOPFLOOR_RELATION_EXISTS": "Space shopfloor relation exists", + "API.SPACE_SHOPFLOOR_RELATION_NOT_FOUND": "Space shopfloor relation not found", + "API.SPACE_STORE_RELATION_EXISTS": "Space store relation exists", + "API.SPACE_STORE_RELATION_NOT_FOUND": "Space store relation not found", + "API.SPACE_TENANT_RELATION_EXISTS": "Space tenant relation exists", + "API.SPACE_TENANT_RELATION_NOT_FOUND": "Space tenant relation not found", + "API.SPACE_VIRTUAL_METER_RELATION_EXISTS": "Space virtual meter relation exists", + "API.SPACE_VIRTUAL_METER_RELATION_NOT_FOUND": "Space virtual meter relation not found", + "API.START_DATETIME_MUST_BE_EARLIER_THAN_END_DATETIME": "Start datetime must be early than end datetime", + "API.STORE_METER_RELATION_EXISTS": "Store meter relation exists", + "API.STORE_METER_RELATION_NOT_FOUND": "Store meter relation not found", + "API.STORE_NAME_IS_ALREADY_IN_USE": "Store name is already in use", + "API.STORE_NOT_FOUND": "Store not found", + "API.STORE_OFFLINE_METER_RELATION_EXISTS": "Store offline meter relation exists", + "API.STORE_OFFLINE_METER_RELATION_NOT_FOUND": "Store offline meter relation not found", + "API.STORE_POINT_RELATION_EXISTS": "Store point relation exists", + "API.STORE_POINT_RELATION_NOT_FOUND": "Store point relation not found", + "API.STORE_SENSOR_RELATION_EXISTS": "Store sensor relation exists", + "API.STORE_SENSOR_RELATION_NOT_FOUND": "Store sensor relation not found", + "API.STORE_TYPE_NAME_IS_ALREADY_IN_USE": "Store type name is already in use", + "API.STORE_TYPE_NOT_FOUND": "Store type not found", + "API.STORE_TYPE_SIMPLIFIED_CODE_IS_ALREADY_IN_USE": "Store type simplified code is already in use", + "API.STORE_TYPE_USED_IN_STORE": "Store type used in store", + "API.STORE_VIRTUAL_METER_RELATION_EXISTS": "Store virtual meter relation exists", + "API.STORE_VIRTUAL_METER_RELATION_NOT_FOUND": "Store virtual meter relation not found", + "API.TARGET_NODE_NOT_FOUND": "Target node not found", + "API.TARIFF_IS_ALREADY_ASSOCIATED_WITH_COST_CENTER": "Tariff is already associated with cost center", + "API.TARIFF_IN_USE": "Tariff in use", + "API.TARIFF_IS_NOT_ASSOCIATED_WITH_COST_CENTER": "Tariff is not associated with cost center", + "API.TARIFF_NAME_IS_ALREADY_IN_USE": "Tariff name is already in use", + "API.TARIFF_NOT_EMPTY": "Tariff not empty", + "API.TARIFF_NOT_FOUND": "Tariff not found", + "API.TENANT_METER_RELATION_EXISTS": "Tenant meter relation exists", + "API.TENANT_METER_RELATION_NOT_FOUND": "Tenant meter relation not found", + "API.TENANT_NAME_IS_ALREADY_IN_USE": "Tenant name is already in use", + "API.TENANT_NOT_FOUND": "Tenant not found", + "API.TENANT_OFFLINE_METER_RELATION_EXISTS": "Tenant offline meter relation exists", + "API.TENANT_OFFLINE_METER_RELATION_NOT_FOUND": "Tenant offline meter relation not found", + "API.TENANT_POINT_RELATION_EXISTS": "Tenant point relation exists", + "API.TENANT_POINT_RELATION_NOT_FOUND": "Tenant point relation not found", + "API.TENANT_SENSOR_RELATION_EXISTS": "Tenant sensor relation exists", + "API.TENANT_SENSOR_RELATION_NOT_FOUND": "Tenant sensor relation not found", + "API.TENANT_TYPE_NAME_IS_ALREADY_IN_USE": "Tenant type name is already in use", + "API.TENANT_TYPE_NOT_FOUND": "Tenant type not found", + "API.TENANT_TYPE_SIMPLIFIED_CODE_IS_ALREADY_IN_USE": "Tenant type simplified code is already in use", + "API.TENANT_TYPE_USED_IN_TENANT": "Tenant type used in tenant", + "API.TENANT_VIRTUAL_METER_RELATION_EXISTS": "Tenant virtual meter relation exists", + "API.TENANT_VIRTUAL_METER_RELATION_NOT_FOUND": "Tenant virtual meter relation not found", + "API.TEXT_MESSAGE_NOT_FOUND": "Text message not found", + "API.THE_REPORTING_PERIOD_MUST_BE_LONGER_THAN_15_MINUTES": "The reporting period must be longer than 15 minutes", + "API.THERE_IS_ASSOCIATED_DISTRIBUTION_CIRCUITS": "There is associated distribution circuits", + "API.THERE_IS_RELATION_WITH_CHILD_METERS": "There is relation with child meters", + "API.THERE_IS_RELATION_WITH_CHILDREN_SPACES": "There is relation with children spaces", + "API.THERE_IS_RELATION_WITH_COMBINED_EQUIPMENT_PARAMETERS": "There is relation with combined equipment parameters", + "API.THERE_IS_RELATION_WITH_COMBINED_EQUIPMENTS": "There is relation with combined equipments", + "API.THERE_IS_RELATION_WITH_DATA_SOURCES": "There is relation with data sources", + "API.THERE_IS_RELATION_WITH_ENERGY_FLOW_DIAGRAM_LINKS": "There is relation with energy flow diagram links", + "API.THERE_IS_RELATION_WITH_EQUIPMENT_PARAMETERS": "There is relation with equipment parameters", + "API.THERE_IS_RELATION_WITH_EQUIPMENTS": "There is relation with equipments", + "API.THERE_IS_RELATION_WITH_METER": "There is relation with meter", + "API.THERE_IS_RELATION_WITH_METERS": "There is relation with meters", + "API.THERE_IS_RELATION_WITH_OFFLINE_METER": "There is relation with offline meter", + "API.THERE_IS_RELATION_WITH_OFFLINE_METERS": "There is relation with offline meters", + "API.THERE_IS_RELATION_WITH_OTHER_VIRTUAL_METERS": "There is relation with other virtual meters", + "API.THERE_IS_RELATION_WITH_POINTS": "There is relation with points", + "API.THERE_IS_RELATION_WITH_SENSORS": "There is relation with sensors", + "API.THERE_IS_RELATION_WITH_SHOPFLOORS": "There is relation with shopfloors", + "API.THERE_IS_RELATION_WITH_SPACES": "There is relation with spaces", + "API.THERE_IS_RELATION_WITH_STORES": "There is relation with stores", + "API.THERE_IS_RELATION_WITH_TARIFFS": "There is relation with tariffs", + "API.THERE_IS_RELATION_WITH_TENANTS": "There is relation with tenants", + "API.THERE_IS_RELATION_WITH_VIRTUAL_METER": "There is relation with virtual meter", + "API.THERE_IS_RELATION_WITH_VIRTUAL_METERS": "There is relation with virtual meters", + "API.THERE_IS_RELATION_WITH_EQUIPMENTS": "There is relation with equipments", + "API.THERE_IS_RELATION_WITH_USERS": "There is relation with users", + "API.THIS_DATA_SOURCE_IS_BEING_USED_BY_A_METER": "This data source is being used by a meter", + "API.THIS_METER_IS_BEING_USED_BY_A_VIRTUAL_METER": "This meter is being used by a virtual meter", + "API.THIS_OFFLINE_METER_IS_BEING_USED_BY_A_VIRTUAL_METER": "This offline meter is being used by a virtual meter", + "API.THIS_SHOPFLOOR_CANNOT_BE_DELETED": "This shopfloor cannot be deleted", + "API.THIS_SPACE_CANNOT_BE_DELETED": "This space cannot be deleted", + "API.TIMEZONE_NOT_FOUND": "Timezone not found", + "API.TOKEN_NOT_FOUND_IN_HEADERS_PLEASE_LOGIN": "Token not found in headers please login", + "API.USER_NAME_IS_ALREADY_IN_USE": "User name is already in use", + "API.USER_NOT_FOUND": "User not found", + "API.USER_PRIVILEGE_NOT_FOUND": "User privilege not found", + "API.USER_SESSION_NOT_FOUND": "User session not found", + "API.USER_SESSION_TIMEOUT": "User session timeout", + "API.USER_UUID_NOT_FOUND_IN_HEADERS_PLEASE_LOGIN": "User uuid not found in headers please login", + "API.VIRTUAL_METER_NAME_IS_ALREADY_IN_USE": "Virtual meter name is already in use", + "API.VIRTUAL_METER_NOT_FOUND": "Virtual meter not found", + "API.VIRTUAL_METER_OF_VARIABLE_NOT_FOUND": "Virtual meter of variable not found", + "API.VIRTUAL_POINT_SHOULD_BE_ANALOG_VALUE": "Virtual point should be analog value", + "API.WEB_MESSAGE_NOT_FOUND": "Web message not found", + "API.WECHAT_MESSAGE_NOT_FOUND": "Wechat message not found", } } From dee5dfd7f1bde9cd905e9c9615af5dd9c72e9a7e Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Wed, 8 Sep 2021 16:42:45 +0800 Subject: [PATCH 34/87] updated translations of KGCE & KGCO2E in Admin UI --- admin/app/translations.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/admin/app/translations.js b/admin/app/translations.js index 1f6497fb..ef1480b2 100644 --- a/admin/app/translations.js +++ b/admin/app/translations.js @@ -239,8 +239,8 @@ function config($translateProvider) { EXPRESSION: 'Expression', VARIABLE_NAME: 'Variable Name', POINT: 'Point', - KGCE: 'KGCE', - KGCO2E: 'KGCO2E', + KGCE: 'Kilogram of Standard Coal', + KGCO2E: 'Kilogram CO2 Emission', START_DATETIME: 'Start Datetime', START_TIME: 'Start Time', @@ -1174,8 +1174,8 @@ function config($translateProvider) { INPUT_UNIT: '请输入单位', INPUT_CONTACT: '请输入联系人', INPUT_EXPRESSION: '请输入表达式', - INPUT_KGCE: '请输入标准煤系数', - INPUT_KGCO2E: '请输入二氧化碳排放系数', + INPUT_KGCE: '请输入千克标准煤', + INPUT_KGCO2E: '请输入千克二氧化碳排放', INPUT_HOST: '请输入服务器', INPUT_PORT: '请输入端口号', INPUT_USER_NAME: '请输入用户名', @@ -1222,8 +1222,8 @@ function config($translateProvider) { EXPRESSION: '表达式', VARIABLE_NAME: '变量名', POINT: '数据点', - KGCE: '标准煤系数', - KGCO2E: '二氧化碳排放系数', + KGCE: '千克标准煤', + KGCO2E: '千克二氧化碳排放', START_DATETIME: '起始时间', START_TIME: '开始时间', @@ -2162,8 +2162,8 @@ function config($translateProvider) { INPUT_UNIT: 'Bitte geben Sie eine Einheit ein', INPUT_CONTACT: 'Bitte geben Sie einen Kontakt ein', INPUT_EXPRESSION: 'Bitte geben Sie einen Ausdruck ein', - INPUT_KGCE: 'Bitte geben Sie den Standardkohlekoeffizienten ein', - INPUT_KGCO2E: 'Bitte geben Sie den CO2-Emissionsfaktor ein', + INPUT_KGCE: 'Bitte geben Sie den Kilogramm Standardkohle ein', + INPUT_KGCO2E: 'Bitte geben Sie Kilogramm Kohlendioxid-Emissionen ein', INPUT_HOST: 'Bitte geben Sie den Server ein', INPUT_PORT: 'Bitte geben Sie die Portnummer ein', INPUT_USER_NAME: 'Bitte geben sie einen Benutzernamen ein', @@ -2210,8 +2210,8 @@ function config($translateProvider) { EXPRESSION: 'Ausdruck', VARIABLE_NAME: 'Variablennamen', POINT: 'Datenpunkt', - KGCE: 'Standardkohlekoeffizient', - KGCO2E: 'CO2-Emissionsfaktor', + KGCE: 'Kilogramm Standardkohle', + KGCO2E: 'Kilogramm CO2-Emission', START_DATETIME: 'Startzeit', START_TIME: 'Anfangszeit', From 1c14c0e75d6ab1961ac5bdd0ed470aa6adb4e34d Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 9 Sep 2021 12:10:02 +0800 Subject: [PATCH 35/87] added spinners to Dashboard of Web UI --- web/src/components/MyEMS/dashboard/Dashboard.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/web/src/components/MyEMS/dashboard/Dashboard.js b/web/src/components/MyEMS/dashboard/Dashboard.js index ffcaf316..cfcc0e19 100644 --- a/web/src/components/MyEMS/dashboard/Dashboard.js +++ b/web/src/components/MyEMS/dashboard/Dashboard.js @@ -1,6 +1,9 @@ import React, { Fragment, useEffect, useState } from 'react'; import CountUp from 'react-countup'; -import { Col, Row } from 'reactstrap'; +import { + Col, + Row, + Spinner, } from 'reactstrap'; import CardSummary from '../common/CardSummary'; import LineChart from '../common/LineChart'; import { toast } from 'react-toastify'; @@ -23,6 +26,9 @@ const Dashboard = ({ setRedirect, setRedirectUrl, t }) => { const [basePeriodEndsDatetime, setBasePeriodEndsDatetime] = useState(current_moment.clone().subtract(1, 'years')); const [reportingPeriodBeginsDatetime, setReportingPeriodBeginsDatetime] = useState(current_moment.clone().startOf('year')); const [reportingPeriodEndsDatetime, setReportingPeriodEndsDatetime] = useState(current_moment); + + const [spinnerHidden, setSpinnerHidden] = useState(false); + //Results const [costShareData, setCostShareData] = useState([]); const [timeOfUseShareData, setTimeOfUseShareData] = useState([]); @@ -101,6 +107,8 @@ const Dashboard = ({ setRedirect, setRedirectUrl, t }) => { if (isResponseOK) { console.log(json); setFetchSuccess(true); + // hide spinner + setSpinnerHidden(true); let thisYearInputCardSummaryArray = [] json['reporting_period_input']['names'].forEach((currentValue, index) => { let cardSummaryItem = {} @@ -355,6 +363,13 @@ const Dashboard = ({ setRedirect, setRedirectUrl, t }) => { return (
+
- +
+
+
+ +
+
+
+
+
+ +
+
-
-
diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index d150668b..10a7d96c 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -5959,7 +5959,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\"data\":{\"name\":\"Starbucks\", \"buildings\":\"Building #1\", \"floors\":\"L1 L2 L3\", \"rooms\":\"1201b+2247+3F\", \"area\":418.8, \"tenant_type_id\":9, \"is_input_counted\":true, \"is_key_tenant\":true,\n\"lease_number\":\"6b0da806\", \"lease_start_datetime_utc\":\"2019-12-31T16:00:00\", \"lease_end_datetime_utc\":\"2022-12-31T16:00:00\", \"is_in_lease\":true, \"contact_id\":1, \"cost_center_id\":1, \"description\":\"my description\"}}" + "raw": "{\"data\":{\"name\":\"Starbucks\", \"buildings\":\"Building #1\", \"floors\":\"L1 L2 L3\", \"rooms\":\"1201b+2247+3F\", \"area\":418.8, \"tenant_type_id\":9, \"is_input_counted\":true, \"is_key_tenant\":true,\n\"lease_number\":\"6b0da806\", \"lease_start_datetime\":\"2021-01-01T00:00:00\", \"lease_end_datetime\":\"2022-01-01T00:00:00\", \"is_in_lease\":true, \"contact_id\":1, \"cost_center_id\":1, \"description\":\"my description\"}}" }, "url": { "raw": "{{base_url}}/tenants", @@ -5980,7 +5980,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\"data\":{\"name\":\"Hermes 爱马仕\", \"buildings\":\"Building #1\", \"floors\":\"L1 L2 L3 L4 L5\", \"rooms\":\"1201b+2247+3F\", \"area\":818.8, \"tenant_type_id\":9, \"is_input_counted\":true, \"is_key_tenant\":true,\n\"lease_number\":\"6b0da806\", \"lease_start_datetime_utc\":\"2019-12-31T16:00:00\", \"lease_end_datetime_utc\":\"2022-12-31T16:00:00\", \"is_in_lease\":true, \"contact_id\":1, \"cost_center_id\":1, \"description\":\"my description\"}}" + "raw": "{\"data\":{\"name\":\"Hermes 爱马仕\", \"buildings\":\"Building #1\", \"floors\":\"L1 L2 L3 L4 L5\", \"rooms\":\"1201b+2247+3F\", \"area\":818.8, \"tenant_type_id\":9, \"is_input_counted\":true, \"is_key_tenant\":true,\n\"lease_number\":\"6b0da806\", \"lease_start_datetime_utc\":\"2021-01-01T00:00:00\", \"lease_end_datetime_utc\":\"2022-01-01T00:00:00\", \"is_in_lease\":true, \"contact_id\":1, \"cost_center_id\":1, \"description\":\"my description\"}}" }, "url": { "raw": "{{base_url}}/tenants/2", diff --git a/myems-api/core/tenant.py b/myems-api/core/tenant.py index 385aa1b0..4b102085 100644 --- a/myems-api/core/tenant.py +++ b/myems-api/core/tenant.py @@ -68,6 +68,10 @@ class TenantCollection: cursor.execute(query) rows_spaces = cursor.fetchall() + timezone_offset = int(config.utc_offset[1:3]) * 60 + int(config.utc_offset[4:6]) + if config.utc_offset[0] == '-': + timezone_offset = -timezone_offset + result = list() if rows_spaces is not None and len(rows_spaces) > 0: for row in rows_spaces: @@ -75,8 +79,10 @@ class TenantCollection: contact = contact_dict.get(row['contact_id'], None) cost_center = cost_center_dict.get(row['cost_center_id'], None) - lease_start_datetime_utc = row['lease_start_datetime_utc'].replace(tzinfo=timezone.utc) - lease_end_datetime_utc = row['lease_end_datetime_utc'].replace(tzinfo=timezone.utc) + lease_start_datetime_local = row['lease_start_datetime_utc'].replace(tzinfo=timezone.utc) + \ + timedelta(minutes=timezone_offset) + lease_end_datetime_local = row['lease_end_datetime_utc'].replace(tzinfo=timezone.utc) + \ + timedelta(minutes=timezone_offset) meta_result = {"id": row['id'], "name": row['name'], @@ -89,8 +95,8 @@ class TenantCollection: "is_input_counted": bool(row['is_input_counted']), "is_key_tenant": bool(row['is_key_tenant']), "lease_number": row['lease_number'], - "lease_start_datetime_utc": lease_start_datetime_utc.timestamp() * 1000, - "lease_end_datetime_utc": lease_end_datetime_utc.timestamp() * 1000, + "lease_start_datetime": lease_start_datetime_local.strftime('%Y-%m-%dT%H:%M:%S'), + "lease_end_datetime": lease_end_datetime_local.strftime('%Y-%m-%dT%H:%M:%S'), "is_in_lease": bool(row['is_in_lease']), "contact": contact, "cost_center": cost_center, @@ -184,12 +190,12 @@ class TenantCollection: timezone_offset = -timezone_offset # todo: validate datetime values - lease_start_datetime_utc = datetime.strptime(new_values['data']['lease_start_datetime_utc'], + lease_start_datetime_utc = datetime.strptime(new_values['data']['lease_start_datetime'], '%Y-%m-%dT%H:%M:%S') lease_start_datetime_utc = lease_start_datetime_utc.replace(tzinfo=timezone.utc) lease_start_datetime_utc -= timedelta(minutes=timezone_offset) - lease_end_datetime_utc = datetime.strptime(new_values['data']['lease_end_datetime_utc'], + lease_end_datetime_utc = datetime.strptime(new_values['data']['lease_end_datetime'], '%Y-%m-%dT%H:%M:%S') lease_end_datetime_utc = lease_end_datetime_utc.replace(tzinfo=timezone.utc) lease_end_datetime_utc -= timedelta(minutes=timezone_offset) @@ -364,6 +370,14 @@ class TenantItem: tenant_type = tenant_type_dict.get(row['tenant_type_id'], None) contact = contact_dict.get(row['contact_id'], None) cost_center = cost_center_dict.get(row['cost_center_id'], None) + timezone_offset = int(config.utc_offset[1:3]) * 60 + int(config.utc_offset[4:6]) + if config.utc_offset[0] == '-': + timezone_offset = -timezone_offset + lease_start_datetime_local = row['lease_start_datetime_utc'].replace(tzinfo=timezone.utc) + \ + timedelta(minutes=timezone_offset) + lease_end_datetime_local = row['lease_end_datetime_utc'].replace(tzinfo=timezone.utc) + \ + timedelta(minutes=timezone_offset) + meta_result = {"id": row['id'], "name": row['name'], "uuid": row['uuid'], @@ -375,8 +389,8 @@ class TenantItem: "is_input_counted": bool(row['is_input_counted']), "is_key_tenant": bool(row['is_key_tenant']), "lease_number": row['lease_number'], - "lease_start_datetime_utc": row['lease_start_datetime_utc'].timestamp() * 1000, - "lease_end_datetime_utc": row['lease_end_datetime_utc'].timestamp() * 1000, + "lease_start_datetime": lease_start_datetime_local.strftime('%Y-%m-%dT%H:%M:%S'), + "lease_end_datetime": lease_end_datetime_local.strftime('%Y-%m-%dT%H:%M:%S'), "is_in_lease": bool(row['is_in_lease']), "contact": contact, "cost_center": cost_center, @@ -575,12 +589,12 @@ class TenantItem: timezone_offset = -timezone_offset # todo: validate datetime values - lease_start_datetime_utc = datetime.strptime(new_values['data']['lease_start_datetime_utc'], + lease_start_datetime_utc = datetime.strptime(new_values['data']['lease_start_datetime'], '%Y-%m-%dT%H:%M:%S') lease_start_datetime_utc = lease_start_datetime_utc.replace(tzinfo=timezone.utc) lease_start_datetime_utc -= timedelta(minutes=timezone_offset) - lease_end_datetime_utc = datetime.strptime(new_values['data']['lease_end_datetime_utc'], + lease_end_datetime_utc = datetime.strptime(new_values['data']['lease_end_datetime'], '%Y-%m-%dT%H:%M:%S') lease_end_datetime_utc = lease_end_datetime_utc.replace(tzinfo=timezone.utc) lease_end_datetime_utc -= timedelta(minutes=timezone_offset) From 022c6f49d4bc630ff2dd146b947fc28ed92532f6 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Wed, 22 Sep 2021 16:10:10 +0800 Subject: [PATCH 63/87] changed lease start&end datetime formater for tenant from timestamp to strftime --- myems-api/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/myems-api/README.md b/myems-api/README.md index 11f7167b..afbf9b66 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -1787,8 +1787,8 @@ Result | is_input_counted| boolean | Indicates if this tenant's input energy is counted into parent space| | is_key_tenant | boolean | Indicates if this is a key tenant | | lease_number | string | Tenant lease number | -| lease_start_datetime_utc | float | Lease start datetime in utc timezone (POSIX timestamp * 1000) | -| lease_end_datetime_utc | float | Lease end datetime in utc timezone (POSIX timestamp * 1000) | +| lease_start_datetime | string | Lease start datetime string in local timezone | +| lease_end_datetime | string | Lease end datetime string in local timezone | | is_in_lease | boolean | Indicates if this tenant is in lease | | contact | Object | Contact Object | | cost_center | Object | Cost Center Object | @@ -1800,11 +1800,11 @@ curl -i -X GET {{base_url}}/tenants ``` * POST Create New Tenant ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Starbucks", "buildings":"Building #1", "floors":"L1 L2 L3", "rooms":"1201b+2247+3F", "area":418.8, "tenant_type_id":9, "is_input_counted": true, "is_key_tenant":true, "lease_number":"6b0da806", "lease_start_datetime_utc":"2019-12-31T16:00:00", "lease_end_datetime_utc":"2022-12-31T16:00:00", "is_in_lease":true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/tenants +curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Starbucks", "buildings":"Building #1", "floors":"L1 L2 L3", "rooms":"1201b+2247+3F", "area":418.8, "tenant_type_id":9, "is_input_counted": true, "is_key_tenant":true, "lease_number":"6b0da806", "lease_start_datetime":"2021-01-01T00:00:00", "lease_end_datetime":"2022-01-01T00:00:00", "is_in_lease":true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/tenants ``` * PUT Update a Tenant ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Hermes 爱马仕", "buildings":"Building #1", "floors":"L1 L2 L3 L4 L5", "rooms":"1201b+2247+3F", "area":818.8, "tenant_type_id":9, "is_input_counted": true, "is_key_tenant":true, "lease_number":"6b0da806", "lease_start_datetime_utc":"2019-12-31T16:00:00", "lease_end_datetime_utc":"2022-12-31T16:00:00", "is_in_lease":true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/tenants/{id} +curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Hermes 爱马仕", "buildings":"Building #1", "floors":"L1 L2 L3 L4 L5", "rooms":"1201b+2247+3F", "area":818.8, "tenant_type_id":9, "is_input_counted": true, "is_key_tenant":true, "lease_number":"6b0da806", "lease_start_datetime":"2021-01-01T00:00:00", "lease_end_datetime":"2022-01-01T00:00:00", "is_in_lease":true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/tenants/{id} ``` * DELETE Tenant by ID ```bash From 2539b129e5157cb89a2c17a0244d81c58f616470 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Wed, 22 Sep 2021 18:09:13 +0800 Subject: [PATCH 64/87] changed start&end datetime formater for tariff from timestamp to strftime --- .../settings/tariff/tariff.controller.js | 4 +- admin/views/settings/tariff/tariff.html | 4 +- myems-api/core/tariff.py | 87 +++++++++++-------- 3 files changed, 54 insertions(+), 41 deletions(-) diff --git a/admin/app/controllers/settings/tariff/tariff.controller.js b/admin/app/controllers/settings/tariff/tariff.controller.js index d4f2102a..2b43c4f5 100644 --- a/admin/app/controllers/settings/tariff/tariff.controller.js +++ b/admin/app/controllers/settings/tariff/tariff.controller.js @@ -163,7 +163,7 @@ app.controller('ModalAddTariffCtrl', function($scope, $timeout, $uibModalInstanc }, timePicker: true, timePicker24Hour: true, - timePickerIncrement: 15, + timePickerIncrement: 1, singleDatePicker: true, }; $scope.showPeakType = function(type) { @@ -244,7 +244,7 @@ app.controller('ModalEditTariffCtrl', function($scope, $timeout, $uibModalInstan }, timePicker: true, timePicker24Hour: true, - timePickerIncrement: 15, + timePickerIncrement: 1, singleDatePicker: true, }; $scope.showPeakType = function(type) { diff --git a/admin/views/settings/tariff/tariff.html b/admin/views/settings/tariff/tariff.html index 3ce282e6..f6294a6d 100644 --- a/admin/views/settings/tariff/tariff.html +++ b/admin/views/settings/tariff/tariff.html @@ -28,8 +28,8 @@ {{ tariff.energy_category.name }} {{showTariffType(tariff.tariff_type) | translate}} {{ tariff.unit_of_price }} - {{ tariff.valid_from | date:'yyyy-MM-ddTHH:mm:ss' }} - {{ tariff.valid_through | date:'yyyy-MM-ddTHH:mm:ss' }} + {{ tariff.valid_from }} + {{ tariff.valid_through }} {{'SETTING.EDIT' | translate}} {{'SETTING.DELETE' | translate}} diff --git a/myems-api/core/tariff.py b/myems-api/core/tariff.py index 33889c21..e8e5a732 100644 --- a/myems-api/core/tariff.py +++ b/myems-api/core/tariff.py @@ -20,7 +20,7 @@ class TariffCollection: @staticmethod def on_get(req, resp): cnx = mysql.connector.connect(**config.myems_system_db) - cursor = cnx.cursor() + cursor = cnx.cursor(dictionary=True) query = (" SELECT t.id, t.name, t.uuid, " " ec.id AS energy_category_id, ec.name AS energy_category_name, " @@ -32,21 +32,26 @@ class TariffCollection: cursor.execute(query) rows = cursor.fetchall() + timezone_offset = int(config.utc_offset[1:3]) * 60 + int(config.utc_offset[4:6]) + if config.utc_offset[0] == '-': + timezone_offset = -timezone_offset + result = list() if rows is not None and len(rows) > 0: for row in rows: - valid_from = row[7].replace(tzinfo=timezone.utc) - valid_through = row[8].replace(tzinfo=timezone.utc) - - meta_result = {"id": row[0], - "name": row[1], - "uuid": row[2], - "energy_category": {"id": row[3], - "name": row[4]}, - "tariff_type": row[5], - "unit_of_price": row[6], - "valid_from": valid_from.timestamp() * 1000, - "valid_through": valid_through.timestamp() * 1000} + valid_from = row['valid_from_datetime_utc'].replace(tzinfo=timezone.utc) + \ + timedelta(minutes=timezone_offset) + valid_through = row['valid_through_datetime_utc'].replace(tzinfo=timezone.utc) + \ + timedelta(minutes=timezone_offset) + meta_result = {"id": row['id'], + "name": row['name'], + "uuid": row['uuid'], + "energy_category": {"id": row['energy_category_id'], + "name": row['energy_category_name']}, + "tariff_type": row['tariff_type'], + "unit_of_price": row['unit_of_price'], + "valid_from": valid_from.strftime('%Y-%m-%dT%H:%M:%S'), + "valid_through": valid_through.strftime('%Y-%m-%dT%H:%M:%S')} if meta_result['tariff_type'] == 'block': meta_result['block'] = list() @@ -58,9 +63,9 @@ class TariffCollection: rows_block = cursor.fetchall() if rows_block is not None and len(rows_block) > 0: for row_block in rows_block: - meta_data = {"start_amount": row_block[0], - "end_amount": row_block[1], - "price": row_block[2]} + meta_data = {"start_amount": row_block['start_amount'], + "end_amount": row_block['end_amount'], + "price": row_block['price']} meta_result['block'].append(meta_data) elif meta_result['tariff_type'] == 'timeofuse': @@ -73,10 +78,10 @@ class TariffCollection: rows_timeofuses = cursor.fetchall() if rows_timeofuses is not None and len(rows_timeofuses) > 0: for row_timeofuse in rows_timeofuses: - meta_data = {"start_time_of_day": str(row_timeofuse[0]), - "end_time_of_day": str(row_timeofuse[1]), - "peak_type": row_timeofuse[2], - "price": row_timeofuse[3]} + meta_data = {"start_time_of_day": str(row_timeofuse['start_time_of_day']), + "end_time_of_day": str(row_timeofuse['end_time_of_day']), + "peak_type": row_timeofuse['peak_type'], + "price": row_timeofuse['price']} meta_result['timeofuse'].append(meta_data) else: cursor.close() @@ -232,7 +237,7 @@ class TariffItem: description='API.INVALID_TARIFF_ID') cnx = mysql.connector.connect(**config.myems_system_db) - cursor = cnx.cursor() + cursor = cnx.cursor(dictionary=True) query = (" SELECT t.id, t.name, t.uuid, " " ec.id AS energy_category_id, ec.name AS energy_category_name, " @@ -249,18 +254,24 @@ class TariffItem: raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND', description='API.TARIFF_NOT_FOUND') - valid_from = row[7].replace(tzinfo=timezone.utc) - valid_through = row[8].replace(tzinfo=timezone.utc) + timezone_offset = int(config.utc_offset[1:3]) * 60 + int(config.utc_offset[4:6]) + if config.utc_offset[0] == '-': + timezone_offset = -timezone_offset - result = {"id": row[0], - "name": row[1], - "uuid": row[2], - "energy_category": {"id": row[3], - "name": row[4]}, - "tariff_type": row[5], - "unit_of_price": row[6], - "valid_from": valid_from.timestamp() * 1000, - "valid_through": valid_through.timestamp() * 1000} + valid_from = row['valid_from_datetime_utc'].replace(tzinfo=timezone.utc) + \ + timedelta(minutes=timezone_offset) + valid_through = row['valid_through_datetime_utc'].replace(tzinfo=timezone.utc) + \ + timedelta(minutes=timezone_offset) + + result = {"id": row['id'], + "name": row['name'], + "uuid": row['uuid'], + "energy_category": {"id": row['energy_category_id'], + "name": row['energy_category_name']}, + "tariff_type": row['tariff_type'], + "unit_of_price": row['unit_of_price'], + "valid_from": valid_from.strftime('%Y-%m-%dT%H:%M:%S'), + "valid_through": valid_through.strftime('%Y-%m-%dT%H:%M:%S')} if result['tariff_type'] == 'block': result['block'] = list() @@ -272,7 +283,9 @@ class TariffItem: rows_block = cursor.fetchall() if rows_block is not None and len(rows_block) > 0: for row_block in rows_block: - meta_data = {"start_amount": row_block[0], "end_amount": row_block[1], "price": row_block[2]} + meta_data = {"start_amount": row_block['start_amount'], + "end_amount": row_block['end_amount'], + "price": row_block['price']} result['block'].append(meta_data) elif result['tariff_type'] == 'timeofuse': @@ -284,10 +297,10 @@ class TariffItem: rows_timeofuses = cursor.fetchall() if rows_timeofuses is not None and len(rows_timeofuses) > 0: for row_timeofuse in rows_timeofuses: - meta_data = {"start_time_of_day": str(row_timeofuse[0]), - "end_time_of_day": str(row_timeofuse[1]), - "peak_type": row_timeofuse[2], - "price": row_timeofuse[3]} + meta_data = {"start_time_of_day": str(row_timeofuse['start_time_of_day']), + "end_time_of_day": str(row_timeofuse['end_time_of_day']), + "peak_type": row_timeofuse['peak_type'], + "price": row_timeofuse['price']} result['timeofuse'].append(meta_data) cursor.close() From c65a24682ce863c68d91dbd85c076af026fda72d Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Wed, 22 Sep 2021 22:42:37 +0800 Subject: [PATCH 65/87] removed gsmmodem and aliyun sms api from API & Admin UI --- admin/app/config.router.js | 30 -- .../settings/gsmmodem/gsmmodem.controller.js | 155 ---------- .../settings/gsmmodem/gsmmodem.service.js | 53 ---- admin/app/translations.js | 11 - admin/views/common/navigation.html | 1 - admin/views/settings/gsmmodem/gsmmodem.html | 36 --- .../settings/gsmmodem/gsmmodem.model.html | 31 -- database/myems_fdd_db.sql | 40 --- database/upgrade/upgrade1.2.4.sql | 13 - myems-api/MyEMS.postman_collection.json | 101 ------- myems-api/README.md | 33 +-- myems-api/app.py | 6 +- myems-api/core/aliyunsmsapi.py | 268 ------------------ web/src/i18n.js | 24 -- 14 files changed, 2 insertions(+), 800 deletions(-) delete mode 100644 admin/app/controllers/settings/gsmmodem/gsmmodem.controller.js delete mode 100644 admin/app/services/settings/gsmmodem/gsmmodem.service.js delete mode 100644 admin/views/settings/gsmmodem/gsmmodem.html delete mode 100644 admin/views/settings/gsmmodem/gsmmodem.model.html delete mode 100644 myems-api/core/aliyunsmsapi.py diff --git a/admin/app/config.router.js b/admin/app/config.router.js index 0f125702..4aa78934 100644 --- a/admin/app/config.router.js +++ b/admin/app/config.router.js @@ -1058,36 +1058,6 @@ app ] } }) - .state('settings.gsmmodem', { - url: "/gsmmodem", - templateUrl: "views/settings/gsmmodem/gsmmodem.html", - data: { - pageTitle: 'MENU.SETTINGS.GSM_MODEM' - }, - resolve: { - deps: [ - '$ocLazyLoad', - function ($ocLazyLoad) { - return $ocLazyLoad.load(['ui.select', 'ui.checkbox', 'toaster']).then( - function () { - return $ocLazyLoad.load([{ - files: ['js/plugins/sweetalert/sweetalert.min.js', 'css/plugins/sweetalert/sweetalert.css'] - }, { - name: 'oitozero.ngSweetAlert', - files: ['js/plugins/sweetalert/angular-sweetalert.min.js'] - }, { - serie: true, - files: [ - 'app/services/settings/gsmmodem/gsmmodem.service.js', - 'app/controllers/settings/gsmmodem/gsmmodem.controller.js' - ] - }]); - } - ); - } - ] - } - }) .state('settings.knowledgefile', { url: "/knowledgefile", templateUrl: "views/settings/knowledgefile/knowledgefile.html", diff --git a/admin/app/controllers/settings/gsmmodem/gsmmodem.controller.js b/admin/app/controllers/settings/gsmmodem/gsmmodem.controller.js deleted file mode 100644 index 1827f029..00000000 --- a/admin/app/controllers/settings/gsmmodem/gsmmodem.controller.js +++ /dev/null @@ -1,155 +0,0 @@ -'use strict'; - -app.controller('GSMModemController', function($scope, $translate,$uibModal, GSMModemService,toaster,SweetAlert) { - - $scope.getAllGSMModems = function() { - GSMModemService.getAllGSMModems(function (response) { - if (angular.isDefined(response.status) && response.status === 200) { - $scope.gsmmodems = response.data; - } else { - $scope.gsmmodems = []; - } - }); - - }; - - $scope.addGSMModem = function() { - var modalInstance = $uibModal.open({ - templateUrl: 'views/settings/gsmmodem/gsmmodem.model.html', - controller: 'ModalAddGSMModemCtrl', - windowClass: "animated fadeIn", - resolve: { - params:function(){ - return { - gsmmodems:angular.copy($scope.gsmmodems) - }; - } - } - }); - modalInstance.result.then(function(gsmmodem) { - GSMModemService.addGSMModem(gsmmodem, function(response) { - if (angular.isDefined(response.status) && response.status === 201) { - toaster.pop({ - type: "success", - title: $translate.instant("TOASTER.SUCCESS_TITLE"), - body: $translate.instant("TOASTER.SUCCESS_ADD_BODY", {template: $translate.instant("SETTING.GSM_MODEM")}), - showCloseButton: true, - }); - $scope.getAllGSMModems(); - } else { - toaster.pop({ - type: "error", - title: $translate.instant("TOASTER.ERROR_ADD_BODY", {template: $translate.instant("SETTING.GSM_MODEM")}), - body: $translate.instant(response.data.description), - showCloseButton: true, - }); - } - }); - }, function() { - - }); - }; - - $scope.editGSMModem=function(gsmmodem){ - var modalInstance = $uibModal.open({ - windowClass: "animated fadeIn", - templateUrl: 'views/settings/gsmmodem/gsmmodem.model.html', - controller: 'ModalEditGSMModemCtrl', - resolve: { - params:function(){ - return { - gsmmodem:angular.copy(gsmmodem), - gsmmodems:angular.copy($scope.gsmmodems) - }; - } - } - }); - - modalInstance.result.then(function (modifiedGSMModem) { - GSMModemService.editGSMModem(modifiedGSMModem,function (response){ - if(angular.isDefined(response.status) && response.status === 200) { - toaster.pop({ - type: "success", - title: $translate.instant("TOASTER.SUCCESS_TITLE"), - body: $translate.instant("TOASTER.SUCCESS_UPDATE_BODY", {template: $translate.instant("SETTING.GSM_MODEM")}), - showCloseButton: true, - }); - $scope.getAllGSMModems(); - }else{ - toaster.pop({ - type: "error", - title: $translate.instant("TOASTER.ERROR_UPDATE_BODY", {template: $translate.instant("SETTING.GSM_MODEM")}), - body: $translate.instant(response.data.description), - showCloseButton: true, - }); - } - }); - }, function () { - //do nothing; - }); - }; - - $scope.deleteGSMModem=function(gsmmodem){ - SweetAlert.swal({ - title: $translate.instant("SWEET.TITLE"), - text: $translate.instant("SWEET.TEXT"), - type: "warning", - showCancelButton: true, - confirmButtonColor: "#DD6B55", - confirmButtonText: $translate.instant("SWEET.CONFIRM_BUTTON_TEXT"), - cancelButtonText: $translate.instant("SWEET.CANCEL_BUTTON_TEXT"), - closeOnConfirm: true, - closeOnCancel: true }, - function (isConfirm) { - if (isConfirm) { - GSMModemService.deleteGSMModem(gsmmodem, function(response) { - if (angular.isDefined(response.status) && response.status === 204) { - toaster.pop({ - type: "success", - title: $translate.instant("TOASTER.SUCCESS_TITLE"), - body: $translate.instant("TOASTER.SUCCESS_DELETE_BODY", {template: $translate.instant("SETTING.GSM_MODEM")}), - showCloseButton: true, - }); - $scope.getAllGSMModems(); - } else { - toaster.pop({ - type: "error", - title: $translate.instant("TOASTER.ERROR_DELETE_BODY", {template: $translate.instant("SETTING.GSM_MODEM")}), - body: $translate.instant(response.data.description), - showCloseButton: true, - }); - } - }); - } - }); - }; - - $scope.getAllGSMModems(); -}); - -app.controller('ModalAddGSMModemCtrl', function ($scope, $uibModalInstance,params) { - - $scope.operation="SETTING.ADD_GSM_MODEM"; - $scope.gsmmodems=params.gsmmodems; - $scope.ok = function () { - $uibModalInstance.close($scope.gsmmodem); - }; - - $scope.cancel = function () { - $uibModalInstance.dismiss('cancel'); - }; -}); - -app.controller('ModalEditGSMModemCtrl', function ($scope, $uibModalInstance, params) { - $scope.operation="SETTING.EDIT_GSM_MODEM"; - $scope.gsmmodem = params.gsmmodem; - $scope.gsmmodems=params.gsmmodems; - - $scope.ok = function () { - $uibModalInstance.close($scope.gsmmodem); - }; - - $scope.cancel = function () { - $uibModalInstance.dismiss('cancel'); - }; -}); diff --git a/admin/app/services/settings/gsmmodem/gsmmodem.service.js b/admin/app/services/settings/gsmmodem/gsmmodem.service.js deleted file mode 100644 index 689b0c0e..00000000 --- a/admin/app/services/settings/gsmmodem/gsmmodem.service.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict'; -app.factory('GSMModemService', function($http) { - return { - getAllGSMModems:function(callback){ - $http.get(getAPI()+'gsmmodems') - .then(function (response) { - callback(response); - }, function (response) { - callback(response); - }); - }, - searchGSMModems: function(query, callback) { - $http.get(getAPI()+'gsmmodems', { params: { q: query } }) - .then(function (response) { - callback(response); - }, function (response) { - callback(response); - }); - }, - addGSMModem: function(gsmmodem, callback) { - $http.post(getAPI()+'gsmmodems',{data:gsmmodem}) - .then(function (response) { - callback(response); - }, function (response) { - callback(response); - }); - }, - editGSMModem: function(gsmmodem, callback) { - $http.put(getAPI()+'gsmmodems/'+gsmmodem.id,{data:gsmmodem}) - .then(function (response) { - callback(response); - }, function (response) { - callback(response); - }); - }, - deleteGSMModem: function(gsmmodem, callback) { - $http.delete(getAPI()+'gsmmodems/'+gsmmodem.id) - .then(function (response) { - callback(response); - }, function (response) { - callback(response); - }); - }, - getGSMModem: function(id, callback) { - $http.get(getAPI()+'gsmmodems/'+id) - .then(function (response) { - callback(response); - }, function (response) { - callback(response); - }); - } - }; -}); diff --git a/admin/app/translations.js b/admin/app/translations.js index 9bf44184..2eacd7a5 100644 --- a/admin/app/translations.js +++ b/admin/app/translations.js @@ -96,7 +96,6 @@ function config($translateProvider) { MENU: 'Menu Settings', TARIFF: 'Tariff Settings', EMAIL_SERVER: 'Email Server Settings', - GSM_MODEM: 'GSM Modem Settings', CONTACT: 'Contacts', KNOWLEDGEFILE: 'Knowledge Base Settings' }, @@ -155,7 +154,6 @@ function config($translateProvider) { ADD_ENERGY_ITEM: 'Add Energy Item', ADD_CONTACT: 'Add Contact', ADD_EMAIL_SERVER: 'Add Email Server', - ADD_GSM_MODEM: 'Add GSM Modem', EDIT_SPACE: 'Edit Space', EDIT_TENANT: 'Edit Tenant', @@ -169,7 +167,6 @@ function config($translateProvider) { EDIT_CATEGORY: 'Edit Energy Category', EDIT_CONTACT: 'Edit Contact', EDIT_EMAIL_SERVER: 'Edit Email Server', - EDIT_GSM_MODEM: 'Edit GSM Modem', REQUIRES_AUTHENTICATION: 'Requires Authentication', SELECT_DATE: 'Please Select Date', @@ -1086,7 +1083,6 @@ function config($translateProvider) { MENU: '菜单管理', TARIFF: '能源费率管理', EMAIL_SERVER: '邮件服务器设置', - GSM_MODEM: '短信模块设置', CONTACT: '联系人管理', KNOWLEDGEFILE: '知识库管理' }, @@ -1145,7 +1141,6 @@ function config($translateProvider) { ADD_ENERGY_ITEM: '添加能耗分项', ADD_CONTACT: '添加联系人', ADD_EMAIL_SERVER: '添加邮件服务器', - ADD_GSM_MODEM: '添加短信模块', EDIT_SPACE: '编辑空间', EDIT_TENANT: '编辑租户', @@ -1160,7 +1155,6 @@ function config($translateProvider) { EDIT_ENERGY_ITEM: '编辑能耗分项', EDIT_CONTACT: '编辑联系人', EDIT_EMAIL_SERVER: '编辑邮箱服务器', - EDIT_GSM_MODEM: '编辑短信模块', REQUIRES_AUTHENTICATION: '需要身份验证', SELECT_DATE: '请选择日期', @@ -1194,7 +1188,6 @@ function config($translateProvider) { INPUT_BAUD_RATE: '请输入波特率', EMAIL_SERVER: '邮件服务器', - GSM_MODEM: '短信模块', INVALID_FORMAT: '格式不正确', INVALID_FROM_ADDR: '发件人地址不正确', INVALID_BAUD_RATE: '波特率不正确', @@ -2084,7 +2077,6 @@ function config($translateProvider) { MENU: 'Verwaltung des Menüs', TARIFF: 'Energieratenmanagement', EMAIL_SERVER: 'Mailserver-Einstellungen', - GSM_MODEM: 'SMS-Moduleinstellungen', CONTACT: 'Kontaktmanagement', KNOWLEDGEFILE: 'Wissensdatenbankverwaltung' }, @@ -2143,7 +2135,6 @@ function config($translateProvider) { ADD_ENERGY_ITEM: 'Unterelemente zum Energieverbrauch hinzufügen', ADD_CONTACT: 'Kontakt hinzufügen', ADD_EMAIL_SERVER: 'Mail-Server hinzufügen', - ADD_GSM_MODEM: 'SMS-Modul hinzufügen', EDIT_SPACE: 'Leerzeichen bearbeiten', EDIT_TENANT: 'Mieter bearbeiten', @@ -2158,7 +2149,6 @@ function config($translateProvider) { EDIT_ENERGY_ITEM: 'Unterelemente zum Energieverbrauch bearbeiten', EDIT_CONTACT: 'Kontakt bearbeiten', EDIT_EMAIL_SERVER: 'Postfachserver bearbeiten', - EDIT_GSM_MODEM: 'SMS-Modul bearbeiten', REQUIRES_AUTHENTICATION: 'Authentifizierung erforderlich', SELECT_DATE: 'Bitte wählen Sie ein Datum', @@ -2192,7 +2182,6 @@ function config($translateProvider) { INPUT_BAUD_RATE: 'Bitte geben Sie die Baudrate ein', EMAIL_SERVER: 'Mail-Server', - GSM_MODEM: 'SMS-Modul', INVALID_FORMAT: 'Falsches Format', INVALID_FROM_ADDR: 'Falsche Absenderadresse', INVALID_BAUD_RATE: 'Falsche Baudrate', diff --git a/admin/views/common/navigation.html b/admin/views/common/navigation.html index 7dce87db..605c107b 100644 --- a/admin/views/common/navigation.html +++ b/admin/views/common/navigation.html @@ -32,7 +32,6 @@
  • {{ 'MENU.SETTINGS.DISTRIBUTION_SYSTEM' | translate }}
  • {{ 'MENU.SETTINGS.MENU' | translate }}
  • {{ 'MENU.SETTINGS.EMAIL_SERVER' | translate }}
  • -
  • {{ 'MENU.SETTINGS.GSM_MODEM' | translate }}
  • {{ 'MENU.SETTINGS.KNOWLEDGEFILE' | translate }}
  • diff --git a/admin/views/settings/gsmmodem/gsmmodem.html b/admin/views/settings/gsmmodem/gsmmodem.html deleted file mode 100644 index 91f336f6..00000000 --- a/admin/views/settings/gsmmodem/gsmmodem.html +++ /dev/null @@ -1,36 +0,0 @@ -
    -
    -
    -
    - - -
    - - - - - - - - - - - - - - - - - - -
    {{'SETTING.ID' | translate}}{{'SETTING.SERIAL_PORT' | translate}}{{'SETTING.BAUD_RATE' | translate}}{{'SETTING.ACTION' | translate}}
    {{ gsmmodem.id }}{{ gsmmodem.serial_port }}{{ gsmmodem.baud_rate }} - {{'SETTING.EDIT' | translate}} - -
    -
    -
    -
    -
    -
    -
    -
    diff --git a/admin/views/settings/gsmmodem/gsmmodem.model.html b/admin/views/settings/gsmmodem/gsmmodem.model.html deleted file mode 100644 index 0e166e0f..00000000 --- a/admin/views/settings/gsmmodem/gsmmodem.model.html +++ /dev/null @@ -1,31 +0,0 @@ -
    - - - -
    diff --git a/database/myems_fdd_db.sql b/database/myems_fdd_db.sql index d80c1d23..473e9f4e 100644 --- a/database/myems_fdd_db.sql +++ b/database/myems_fdd_db.sql @@ -7,22 +7,6 @@ DROP DATABASE IF EXISTS `myems_fdd_db` ; CREATE DATABASE IF NOT EXISTS `myems_fdd_db` ; USE `myems_fdd_db` ; --- --------------------------------------------------------------------------------------------------------------------- --- Table `myems_fdd_db`.`tbl_aliyun_sms_api` --- refer to https://dysms.console.aliyun.com/ --- API Version 2017-05-25 --- --------------------------------------------------------------------------------------------------------------------- -DROP TABLE IF EXISTS `myems_fdd_db`.`tbl_aliyun_sms_api` ; - -CREATE TABLE IF NOT EXISTS `myems_fdd_db`.`tbl_aliyun_sms_api` ( - `id` BIGINT NOT NULL AUTO_INCREMENT, - `access_key_id` VARCHAR(256) NOT NULL, - `access_key_secret` VARCHAR(256) NOT NULL, - `endpoint` VARCHAR(256) NOT NULL, - `sign_name` VARCHAR(256) NOT NULL, - `template_code` VARCHAR(256) NOT NULL, - PRIMARY KEY (`id`)); - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_fdd_db`.`tbl_email_messages` -- --------------------------------------------------------------------------------------------------------------------- @@ -42,30 +26,6 @@ CREATE TABLE IF NOT EXISTS `myems_fdd_db`.`tbl_email_messages` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_email_messages_index_1` ON `myems_fdd_db`.`tbl_email_messages` (`status`, `scheduled_datetime_utc`); --- --------------------------------------------------------------------------------------------------------------------- --- Table `myems_fdd_db`.`tbl_gsm_modems` --- --------------------------------------------------------------------------------------------------------------------- -DROP TABLE IF EXISTS `myems_fdd_db`.`tbl_gsm_modems` ; - -CREATE TABLE IF NOT EXISTS `myems_fdd_db`.`tbl_gsm_modems` ( - `id` BIGINT NOT NULL AUTO_INCREMENT, - `serial_port` VARCHAR(64) NOT NULL, - `baud_rate` INT NOT NULL, - PRIMARY KEY (`id`)); - --- --------------------------------------------------------------------------------------------------------------------- --- Data for table `myems_fdd_db`.`tbl_gsm_modems` --- --------------------------------------------------------------------------------------------------------------------- -START TRANSACTION; -USE `myems_fdd_db`; - -INSERT INTO `myems_fdd_db`.`tbl_gsm_modems` -(`id`, `serial_port`, `baud_rate`) -VALUES -(1, '/dev/ttyS0', 115200); - -COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_fdd_db`.`tbl_rules` -- --------------------------------------------------------------------------------------------------------------------- diff --git a/database/upgrade/upgrade1.2.4.sql b/database/upgrade/upgrade1.2.4.sql index d0706fd1..f1f70c5a 100644 --- a/database/upgrade/upgrade1.2.4.sql +++ b/database/upgrade/upgrade1.2.4.sql @@ -1,16 +1,3 @@ --- --------------------------------------------------------------------------------------------------------------------- --- Table `myems_fdd_db`.`tbl_aliyun_sms_api` --- refer to https://dysms.console.aliyun.com/ --- API Version 2017-05-25 --- --------------------------------------------------------------------------------------------------------------------- -CREATE TABLE IF NOT EXISTS `myems_fdd_db`.`tbl_aliyun_sms_api` ( - `id` BIGINT NOT NULL AUTO_INCREMENT, - `access_key_id` VARCHAR(256) NOT NULL, - `access_key_secret` VARCHAR(256) NOT NULL, - `endpoint` VARCHAR(256) NOT NULL, - `sign_name` VARCHAR(256) NOT NULL, - `template_code` VARCHAR(256) NOT NULL, - PRIMARY KEY (`id`)); DROP TABLE IF EXISTS `myems_fdd_db`.`tbl_gsm_modems` ; diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 10a7d96c..66e63491 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -2701,107 +2701,6 @@ } ] }, - { - "name": "Aliyun SMS API", - "item": [ - { - "name": "GET All Aliyun SMS APIs", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{base_url}}/aliyunsmsapis", - "host": [ - "{{base_url}}" - ], - "path": [ - "aliyunsmsapis" - ] - } - }, - "response": [] - }, - { - "name": "GET an Aliyun SMS API by ID", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{base_url}}/aliyunsmsapis/1", - "host": [ - "{{base_url}}" - ], - "path": [ - "aliyunsmsapis", - "1" - ] - } - }, - "response": [] - }, - { - "name": "POST Create New Aliyun SMS API", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\"data\":{\"access_key_id\":\"xTAI5t8KUj8jXXXXXXXXXXXX\",\"access_key_secret\":\"fXXjFLA7GeXXXXXXXXXXXXXXXXXXXX\",\"endpoint\":\"https://dysmsapi.aliyuncs.com\",\"sign_name\":\"MYEMS\",\"template_code\":\"SMS_153055065\"}}" - }, - "url": { - "raw": "{{base_url}}/aliyunsmsapis", - "host": [ - "{{base_url}}" - ], - "path": [ - "aliyunsmsapis" - ] - } - }, - "response": [] - }, - { - "name": "PUT Update an Aliyun SMS API", - "request": { - "method": "PUT", - "header": [], - "body": { - "mode": "raw", - "raw": "{\"data\":{\"access_key_id\":\"LTAI5t8KUj8jXXXXXXXXXXXX\",\"access_key_secret\":\"fXXjFLA7GeXXXXXXXXXXXXXXXXXXXX\",\"endpoint\":\"https://dysmsapi.aliyuncs.com\",\"sign_name\":\"MYEMS\",\"template_code\":\"SMS_153055065\"}}" - }, - "url": { - "raw": "{{base_url}}/aliyunsmsapis/1", - "host": [ - "{{base_url}}" - ], - "path": [ - "aliyunsmsapis", - "1" - ] - } - }, - "response": [] - }, - { - "name": "DELETE an Aliyun SMS API by ID", - "request": { - "method": "DELETE", - "header": [], - "url": { - "raw": "{{base_url}}/aliyunsmsapis/2", - "host": [ - "{{base_url}}" - ], - "path": [ - "aliyunsmsapis", - "2" - ] - } - }, - "response": [] - } - ] - }, { "name": "Knowledge File", "item": [ diff --git a/myems-api/README.md b/myems-api/README.md index afbf9b66..f58f38c5 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -183,7 +183,7 @@ View in Postman: import the file MyEMS.postman_collection.json with Postman [Rule](#Rule) | [Email Message](#Email Message) | [Text Message](#Text Message) | [Web Message](#Web Message) | [Wechat Message](#Wechat Message) -[Email Server](#Email Server) | [GSM Modem](#GSM Modem) +[Email Server](#Email Server) [User](#User) | [Privilege](#Privilege) | [Contact](#Contact) | [Notification](#Notification) @@ -891,37 +891,6 @@ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Ga curl -i -X GET {{base_url}}/gateways/{id}/datasources ``` -### GSM Modem -* GET a GSM Modem by ID - -```bash -curl -i -X GET {{base_url}}/gsmmodems/{id} -``` -Result in JSON - -| Name | Data Type | Description | -|---------------|-----------|---------------------------------------| -| id | integer | GSM Modem ID | -| serial_port | string | GSM Modem serial port | -| baud_rate | integer | GSM Modem baud rate | - -* GET All GSM Modems -```bash -curl -i -X GET {{base_url}}/gsmmodems -``` -* DELETE a GSM Modem by ID -```bash -curl -i -X DELETE {{base_url}}/gsmmodems/{id} -``` -* POST Create New GSM Modem -```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"serial_port":"/dev/ttyS0","baud_rate":115200}}' {{base_url}}/gsmmodems -``` -* PUT Update a GSM Modem -```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"serial_port":"/dev/ttyS0","baud_rate":115200}}' {{base_url}}/gsmmodems/{id} -``` - ### Knowledge File * GET Knowledge File by ID diff --git a/myems-api/app.py b/myems-api/app.py index 406bbf4a..9c269659 100644 --- a/myems-api/app.py +++ b/myems-api/app.py @@ -1,7 +1,7 @@ import falcon from falcon_cors import CORS from falcon_multipart.middleware import MultipartMiddleware -from core import aliyunsmsapi, energyflowdiagram, privilege, textmessage, distributioncircuit, virtualmeter, \ +from core import energyflowdiagram, privilege, textmessage, distributioncircuit, virtualmeter, \ costcenter, point, knowledgefile, meter, tariff, user, storetype, timezone, \ costfile, offlinemeterfile, version, contact, emailserver, combinedequipment, datasource, equipment, tenant, \ shopfloor, webmessage, distributionsystem, store, emailmessage, tenanttype, wechatmessage, space, gateway, \ @@ -102,10 +102,6 @@ api = falcon.API(middleware=[cors.middleware, MultipartMiddleware()]) # Routes for System Core ######################################################################################################################## -api.add_route('/aliyunsmsapis', - aliyunsmsapi.AliyunSMSAPICollection()) -api.add_route('/aliyunsmsapis/{id_}', - aliyunsmsapi.AliyunSMSAPIItem()) api.add_route('/combinedequipments', combinedequipment.CombinedEquipmentCollection()) api.add_route('/combinedequipments/{id_}', diff --git a/myems-api/core/aliyunsmsapi.py b/myems-api/core/aliyunsmsapi.py deleted file mode 100644 index c9c329cd..00000000 --- a/myems-api/core/aliyunsmsapi.py +++ /dev/null @@ -1,268 +0,0 @@ -import falcon -import json -import mysql.connector -import config -from core.userlogger import user_logger - - -class AliyunSMSAPICollection: - @staticmethod - def __init__(): - """Initializes AliyunSMSAPICollection""" - pass - - @staticmethod - def on_options(req, resp): - resp.status = falcon.HTTP_200 - - @staticmethod - def on_get(req, resp): - cnx = mysql.connector.connect(**config.myems_fdd_db) - cursor = cnx.cursor() - - query = (" SELECT id, access_key_id, access_key_secret, endpoint, sign_name, template_code " - " FROM tbl_aliyun_sms_api ") - cursor.execute(query) - rows = cursor.fetchall() - cursor.close() - cnx.disconnect() - - result = list() - if rows is not None and len(rows) > 0: - for row in rows: - meta_result = {"id": row[0], - "access_key_id": row[1], - "access_key_secret": row[2], - "endpoint": row[3], - "sign_name": row[4], - "template_code": row[5]} - result.append(meta_result) - - resp.body = json.dumps(result) - - @staticmethod - @user_logger - def on_post(req, resp): - """Handles POST requests""" - try: - raw_json = req.stream.read().decode('utf-8') - except Exception as ex: - raise falcon.HTTPError(falcon.HTTP_400, title='API.ERROR', description=ex) - - new_values = json.loads(raw_json) - - if 'access_key_id' not in new_values['data'].keys() or \ - not isinstance(new_values['data']['access_key_id'], str) or \ - len(str.strip(new_values['data']['access_key_id'])) == 0: - raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description='API.INVALID_ALIYUN_SMS_API_ACCESS_KEY_ID') - access_key_id = str.strip(new_values['data']['access_key_id']) - - if 'access_key_secret' not in new_values['data'].keys() or \ - not isinstance(new_values['data']['access_key_secret'], str) or \ - len(new_values['data']['access_key_secret']) == 0: - raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description='API.INVALID_ALIYUN_SMS_API_ACCESS_KEY_SECRET') - access_key_secret = new_values['data']['access_key_secret'] - - if 'endpoint' not in new_values['data'].keys() or \ - not isinstance(new_values['data']['endpoint'], str) or \ - len(new_values['data']['endpoint']) == 0: - raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description='API.INVALID_ALIYUN_SMS_API_ENDPOINT') - endpoint = new_values['data']['endpoint'] - - if 'sign_name' not in new_values['data'].keys() or \ - not isinstance(new_values['data']['sign_name'], str) or \ - len(new_values['data']['sign_name']) == 0: - raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description='API.INVALID_ALIYUN_SMS_API_SIGN_NAME') - sign_name = new_values['data']['sign_name'] - - if 'template_code' not in new_values['data'].keys() or \ - not isinstance(new_values['data']['template_code'], str) or \ - len(new_values['data']['template_code']) == 0: - raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description='API.INVALID_ALIYUN_SMS_API_TEMPLATE_CODE') - template_code = new_values['data']['template_code'] - - cnx = mysql.connector.connect(**config.myems_fdd_db) - cursor = cnx.cursor() - - cursor.execute(" SELECT id " - " FROM tbl_aliyun_sms_api " - " WHERE access_key_id = %s ", (access_key_id,)) - if cursor.fetchone() is not None: - cursor.close() - cnx.disconnect() - raise falcon.HTTPError(falcon.HTTP_404, title='API.BAD_REQUEST', - description='API.ALIYUN_SMS_API_ACCESS_KEY_ID_IS_ALREADY_IN_USE') - - add_value = (" INSERT INTO tbl_aliyun_sms_api " - " (access_key_id, access_key_secret, endpoint, sign_name, template_code) " - " VALUES (%s, %s, %s, %s, %s) ") - cursor.execute(add_value, (access_key_id, - access_key_secret, - endpoint, - sign_name, - template_code)) - new_id = cursor.lastrowid - cnx.commit() - cursor.close() - cnx.disconnect() - - resp.status = falcon.HTTP_201 - resp.location = '/aliyunsmsapis/' + str(new_id) - - -class AliyunSMSAPIItem: - @staticmethod - def __init__(): - """Initializes AliyunSMSAPIItem""" - pass - - @staticmethod - def on_options(req, resp, id_): - resp.status = falcon.HTTP_200 - - @staticmethod - def on_get(req, resp, id_): - if not id_.isdigit() or int(id_) <= 0: - raise falcon.HTTPError(falcon.HTTP_400, '400 Bad Request') - - cnx = mysql.connector.connect(**config.myems_fdd_db) - cursor = cnx.cursor() - - query = (" SELECT id, access_key_id, access_key_secret, endpoint, sign_name, template_code " - " FROM tbl_aliyun_sms_api " - " WHERE id = %s ") - cursor.execute(query, (id_,)) - row = cursor.fetchone() - cursor.close() - cnx.disconnect() - if row is None: - raise falcon.HTTPError(falcon.HTTP_404, 'API.NOT_FOUND') - - result = {"id": row[0], - "access_key_id": row[1], - "access_key_secret": row[2], - "endpoint": row[3], - "sign_name": row[4], - "template_code": row[5]} - resp.body = json.dumps(result) - - @staticmethod - @user_logger - def on_delete(req, resp, id_): - if not id_.isdigit() or int(id_) <= 0: - raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description='API.INVALID_ALIYUN_SMS_API_ID') - - cnx = mysql.connector.connect(**config.myems_fdd_db) - cursor = cnx.cursor() - - cursor.execute(" SELECT access_key_id " - " FROM tbl_aliyun_sms_api " - " WHERE id = %s ", (id_,)) - if cursor.fetchone() is None: - cursor.close() - cnx.disconnect() - raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND', - description='API.ALIYUN_SMS_API_NOT_FOUND') - - cursor.execute(" DELETE FROM tbl_aliyun_sms_api WHERE id = %s ", (id_,)) - cnx.commit() - - cursor.close() - cnx.disconnect() - - resp.status = falcon.HTTP_204 - - @staticmethod - @user_logger - def on_put(req, resp, id_): - """Handles PUT requests""" - try: - raw_json = req.stream.read().decode('utf-8') - except Exception as ex: - raise falcon.HTTPError(falcon.HTTP_400, title='API.EXCEPTION', description=ex) - - if not id_.isdigit() or int(id_) <= 0: - raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description='API.INVALID_ALIYUN_SMS_API_ID') - - new_values = json.loads(raw_json) - - if 'access_key_id' not in new_values['data'].keys() or \ - not isinstance(new_values['data']['access_key_id'], str) or \ - len(str.strip(new_values['data']['access_key_id'])) == 0: - raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description='API.INVALID_ALIYUN_SMS_API_ACCESS_KEY_ID') - access_key_id = str.strip(new_values['data']['access_key_id']) - - if 'access_key_secret' not in new_values['data'].keys() or \ - not isinstance(new_values['data']['access_key_secret'], str) or \ - len(new_values['data']['access_key_secret']) == 0: - raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description='API.INVALID_ALIYUN_SMS_API_ACCESS_KEY_SECRET') - access_key_secret = new_values['data']['access_key_secret'] - - if 'endpoint' not in new_values['data'].keys() or \ - not isinstance(new_values['data']['endpoint'], str) or \ - len(new_values['data']['endpoint']) == 0: - raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description='API.INVALID_ALIYUN_SMS_API_ENDPOINT') - endpoint = new_values['data']['endpoint'] - - if 'sign_name' not in new_values['data'].keys() or \ - not isinstance(new_values['data']['sign_name'], str) or \ - len(new_values['data']['sign_name']) == 0: - raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description='API.INVALID_ALIYUN_SMS_API_SIGN_NAME') - sign_name = new_values['data']['sign_name'] - - if 'template_code' not in new_values['data'].keys() or \ - not isinstance(new_values['data']['template_code'], str) or \ - len(new_values['data']['template_code']) == 0: - raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description='API.INVALID_ALIYUN_SMS_API_TEMPLATE_CODE') - template_code = new_values['data']['template_code'] - - cnx = mysql.connector.connect(**config.myems_fdd_db) - cursor = cnx.cursor() - - cursor.execute(" SELECT access_key_id " - " FROM tbl_aliyun_sms_api " - " WHERE id = %s ", - (id_,)) - if cursor.fetchone() is None: - cursor.close() - cnx.disconnect() - raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND', - description='API.ALIYUN_SMS_API_NOT_FOUND') - - cursor.execute(" SELECT access_key_id " - " FROM tbl_aliyun_sms_api " - " WHERE access_key_id = %s AND id != %s ", (access_key_id, id_)) - if cursor.fetchone() is not None: - cursor.close() - cnx.disconnect() - raise falcon.HTTPError(falcon.HTTP_404, title='API.BAD_REQUEST', - description='API.ALIYUN_SMS_API_ACCESS_KEY_ID_IS_ALREADY_IN_USE') - - update_row = (" UPDATE tbl_aliyun_sms_api " - " SET access_key_id = %s, access_key_secret = %s, endpoint = %s, sign_name = %s, " - " template_code = %s " - " WHERE id = %s ") - cursor.execute(update_row, (access_key_id, - access_key_secret, - endpoint, - sign_name, - template_code, - id_,)) - cnx.commit() - - cursor.close() - cnx.disconnect() - - resp.status = falcon.HTTP_200 diff --git a/web/src/i18n.js b/web/src/i18n.js index af848b98..9321728c 100644 --- a/web/src/i18n.js +++ b/web/src/i18n.js @@ -353,8 +353,6 @@ const resources = { "API.ADMINISTRATOR_SESSION_NOT_FOUND": "Administrator session not found", "API.ADMINISTRATOR_SESSION_TIMEOUT": "Administrator session timeout", "API.ADVANCED_REPORT_NOT_FOUND": "Advanced report not found", - "API.ALIYUN_SMS_API_ACCESS_KEY_ID_IS_ALREADY_IN_USE": "Aliyun SMS API Access Key ID is Already in Use", - "API.ALIYUN_SMS_API_NOT_FOUND": "Aliyun SMS API Not Found", "API.BAD_REQUEST": "Bad request", "API.CANNOT_SET_EXISTING_SUBMETER_AS_MASTER_METER": "Cannot set existing submeter as master meter", "API.COMBINED_EQUIPMENT_EQUIPMENT_RELATION_EXISTS": "Combined equipment equipment relation exists", @@ -433,12 +431,6 @@ const resources = { "API.INVALID_ADDRESS": "Invalid address", "API.INVALID_ADDRESS_VALUE": "Invalid address value", "API.INVALID_ADVANCED_REPORT_ID": "Invalid advanced report id", - "API.INVALID_ALIYUN_SMS_API_ACCESS_KEY_ID": "Invalid Aliyun SMS API Access Key ID", - "API.INVALID_ALIYUN_SMS_API_ACCESS_KEY_SECRET": "Invalid Aliyun SMS API Access Key Secret", - "API.INVALID_ALIYUN_SMS_API_ENDPOINT": "Invalid Aliyun SMS API Endpoint", - "API.INVALID_ALIYUN_SMS_API_ID": "Invalid Aliyun SMS API ID", - "API.INVALID_ALIYUN_SMS_API_SIGN_NAME": "Invalid Aliyun SMS API Sign Name", - "API.INVALID_ALIYUN_SMS_API_TEMPLATE_CODE": "Invalid Aliyun SMS API Template Code", "API.INVALID_AREA_VALUE": "Invalid area value", "API.INVALID_BASE_PERIOD_END_DATETIME": "Invalid base period end datetime", "API.INVALID_BASE_PERIOD_START_DATETIME": "Invalid base period start datetime", @@ -1110,8 +1102,6 @@ const resources = { "API.ADMINISTRATOR_SESSION_NOT_FOUND": "Administrator session not found", "API.ADMINISTRATOR_SESSION_TIMEOUT": "Administrator session timeout", "API.ADVANCED_REPORT_NOT_FOUND": "Advanced report not found", - "API.ALIYUN_SMS_API_ACCESS_KEY_ID_IS_ALREADY_IN_USE": "Aliyun SMS API Access Key ID is Already in Use", - "API.ALIYUN_SMS_API_NOT_FOUND": "Aliyun SMS API Not Found", "API.BAD_REQUEST": "Bad request", "API.CANNOT_SET_EXISTING_SUBMETER_AS_MASTER_METER": "Cannot set existing submeter as master meter", "API.COMBINED_EQUIPMENT_EQUIPMENT_RELATION_EXISTS": "Combined equipment equipment relation exists", @@ -1190,12 +1180,6 @@ const resources = { "API.INVALID_ADDRESS": "Invalid address", "API.INVALID_ADDRESS_VALUE": "Invalid address value", "API.INVALID_ADVANCED_REPORT_ID": "Invalid advanced report id", - "API.INVALID_ALIYUN_SMS_API_ACCESS_KEY_ID": "Invalid Aliyun SMS API Access Key ID", - "API.INVALID_ALIYUN_SMS_API_ACCESS_KEY_SECRET": "Invalid Aliyun SMS API Access Key Secret", - "API.INVALID_ALIYUN_SMS_API_ENDPOINT": "Invalid Aliyun SMS API Endpoint", - "API.INVALID_ALIYUN_SMS_API_ID": "Invalid Aliyun SMS API ID", - "API.INVALID_ALIYUN_SMS_API_SIGN_NAME": "Invalid Aliyun SMS API Sign Name", - "API.INVALID_ALIYUN_SMS_API_TEMPLATE_CODE": "Invalid Aliyun SMS API Template Code", "API.INVALID_AREA_VALUE": "Invalid area value", "API.INVALID_BASE_PERIOD_END_DATETIME": "Invalid base period end datetime", "API.INVALID_BASE_PERIOD_START_DATETIME": "Invalid base period start datetime", @@ -1866,8 +1850,6 @@ const resources = { "API.ADMINISTRATOR_SESSION_NOT_FOUND": "Administrator session not found", "API.ADMINISTRATOR_SESSION_TIMEOUT": "Administrator session timeout", "API.ADVANCED_REPORT_NOT_FOUND": "Advanced report not found", - "API.ALIYUN_SMS_API_ACCESS_KEY_ID_IS_ALREADY_IN_USE": "Aliyun SMS API Access Key ID is Already in Use", - "API.ALIYUN_SMS_API_NOT_FOUND": "Aliyun SMS API Not Found", "API.BAD_REQUEST": "Bad request", "API.CANNOT_SET_EXISTING_SUBMETER_AS_MASTER_METER": "Cannot set existing submeter as master meter", "API.COMBINED_EQUIPMENT_EQUIPMENT_RELATION_EXISTS": "Combined equipment equipment relation exists", @@ -1946,12 +1928,6 @@ const resources = { "API.INVALID_ADDRESS": "Invalid address", "API.INVALID_ADDRESS_VALUE": "Invalid address value", "API.INVALID_ADVANCED_REPORT_ID": "Invalid advanced report id", - "API.INVALID_ALIYUN_SMS_API_ACCESS_KEY_ID": "Invalid Aliyun SMS API Access Key ID", - "API.INVALID_ALIYUN_SMS_API_ACCESS_KEY_SECRET": "Invalid Aliyun SMS API Access Key Secret", - "API.INVALID_ALIYUN_SMS_API_ENDPOINT": "Invalid Aliyun SMS API Endpoint", - "API.INVALID_ALIYUN_SMS_API_ID": "Invalid Aliyun SMS API ID", - "API.INVALID_ALIYUN_SMS_API_SIGN_NAME": "Invalid Aliyun SMS API Sign Name", - "API.INVALID_ALIYUN_SMS_API_TEMPLATE_CODE": "Invalid Aliyun SMS API Template Code", "API.INVALID_AREA_VALUE": "Invalid area value", "API.INVALID_BASE_PERIOD_END_DATETIME": "Invalid base period end datetime", "API.INVALID_BASE_PERIOD_START_DATETIME": "Invalid base period start datetime", From b3535225782f961ad96d7b5fd6e00efc1ba3f19c Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Wed, 22 Sep 2021 23:03:41 +0800 Subject: [PATCH 66/87] updated translations in Admin UI --- admin/app/translations.js | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/admin/app/translations.js b/admin/app/translations.js index 2eacd7a5..c4b48831 100644 --- a/admin/app/translations.js +++ b/admin/app/translations.js @@ -592,8 +592,6 @@ function config($translateProvider) { ADMINISTRATOR_SESSION_NOT_FOUND: 'Administrator Session Not Found', ADMINISTRATOR_SESSION_TIMEOUT: 'Administrator Session Timeout', ADVANCED_REPORT_NOT_FOUND: 'Advanced Report Not Found', - ALIYUN_SMS_API_ACCESS_KEY_ID_IS_ALREADY_IN_USE: 'Aliyun SMS API Access Key ID is Already in Use', - ALIYUN_SMS_API_NOT_FOUND: 'Aliyun SMS API Not Found', BAD_REQUEST: 'Bad Request', CANNOT_SET_EXISTING_SUBMETER_AS_MASTER_METER: 'Cannot Set Existing Submeter As Master Meter', COMBINED_EQUIPMENT_EQUIPMENT_RELATION_EXISTS: 'Combined Equipment Equipment Relation Exists', @@ -671,12 +669,6 @@ function config($translateProvider) { INVALID_ADDRESS: 'Invalid Address', INVALID_ADDRESS_VALUE: 'Invalid Address Value', INVALID_ADVANCED_REPORT_ID: 'Invalid Advanced Report ID', - INVALID_ALIYUN_SMS_API_ACCESS_KEY_ID: 'Invalid Aliyun SMS API Access Key ID', - INVALID_ALIYUN_SMS_API_ACCESS_KEY_SECRET: 'Invalid Aliyun SMS API Access Key Secret', - INVALID_ALIYUN_SMS_API_ENDPOINT: 'Invalid Aliyun SMS API Endpoint', - INVALID_ALIYUN_SMS_API_ID: 'Invalid Aliyun SMS API ID', - INVALID_ALIYUN_SMS_API_SIGN_NAME: 'Invalid Aliyun SMS API Sign Name', - INVALID_ALIYUN_SMS_API_TEMPLATE_CODE: 'Invalid Aliyun SMS API Template Code', INVALID_AREA_VALUE: 'Invalid Area Value', INVALID_BASE_PERIOD_END_DATETIME: 'Invalid Base Period End Datetime', INVALID_BASE_PERIOD_START_DATETIME: 'Invalid Base Period Start Datetime', @@ -1586,9 +1578,7 @@ function config($translateProvider) { ADMINISTRATOR_SESSION_NOT_FOUND: 'Administrator Session Not Found', ADMINISTRATOR_SESSION_TIMEOUT: 'Administrator Session Timeout', ADVANCED_REPORT_NOT_FOUND: 'Advanced Report Not Found', - ALIYUN_SMS_API_ACCESS_KEY_ID_IS_ALREADY_IN_USE: 'Aliyun SMS API Access Key ID is Already in Use', - ALIYUN_SMS_API_NOT_FOUND: 'Aliyun SMS API Not Found', - BAD_REQUEST: '错误的请求', + BAD_REQUEST: 'Bad Request', CANNOT_SET_EXISTING_SUBMETER_AS_MASTER_METER: 'Cannot Set Existing Submeter As Master Meter', COMBINED_EQUIPMENT_EQUIPMENT_RELATION_EXISTS: 'Combined Equipment Equipment Relation Exists', COMBINED_EQUIPMENT_EQUIPMENT_RELATION_NOT_FOUND: 'Combined Equipment Equipment Relation Not Found', @@ -1665,12 +1655,6 @@ function config($translateProvider) { INVALID_ADDRESS: 'Invalid Address', INVALID_ADDRESS_VALUE: 'Invalid Address Value', INVALID_ADVANCED_REPORT_ID: 'Invalid Advanced Report ID', - INVALID_ALIYUN_SMS_API_ACCESS_KEY_ID: 'Invalid Aliyun SMS API Access Key ID', - INVALID_ALIYUN_SMS_API_ACCESS_KEY_SECRET: 'Invalid Aliyun SMS API Access Key Secret', - INVALID_ALIYUN_SMS_API_ENDPOINT: 'Invalid Aliyun SMS API Endpoint', - INVALID_ALIYUN_SMS_API_ID: 'Invalid Aliyun SMS API ID', - INVALID_ALIYUN_SMS_API_SIGN_NAME: 'Invalid Aliyun SMS API Sign Name', - INVALID_ALIYUN_SMS_API_TEMPLATE_CODE: 'Invalid Aliyun SMS API Template Code', INVALID_AREA_VALUE: 'Invalid Area Value', INVALID_BASE_PERIOD_END_DATETIME: 'Invalid Base Period End Datetime', INVALID_BASE_PERIOD_START_DATETIME: 'Invalid Base Period Start Datetime', @@ -2579,8 +2563,6 @@ function config($translateProvider) { ADMINISTRATOR_SESSION_NOT_FOUND: 'Administrator Session Not Found', ADMINISTRATOR_SESSION_TIMEOUT: 'Administrator Session Timeout', ADVANCED_REPORT_NOT_FOUND: 'Advanced Report Not Found', - ALIYUN_SMS_API_ACCESS_KEY_ID_IS_ALREADY_IN_USE: 'Aliyun SMS API Access Key ID is Already in Use', - ALIYUN_SMS_API_NOT_FOUND: 'Aliyun SMS API Not Found', BAD_REQUEST: 'Bad Request', CANNOT_SET_EXISTING_SUBMETER_AS_MASTER_METER: 'Cannot Set Existing Submeter As Master Meter', COMBINED_EQUIPMENT_EQUIPMENT_RELATION_EXISTS: 'Combined Equipment Equipment Relation Exists', @@ -2658,12 +2640,6 @@ function config($translateProvider) { INVALID_ADDRESS: 'Invalid Address', INVALID_ADDRESS_VALUE: 'Invalid Address Value', INVALID_ADVANCED_REPORT_ID: 'Invalid Advanced Report ID', - INVALID_ALIYUN_SMS_API_ACCESS_KEY_ID: 'Invalid Aliyun SMS API Access Key ID', - INVALID_ALIYUN_SMS_API_ACCESS_KEY_SECRET: 'Invalid Aliyun SMS API Access Key Secret', - INVALID_ALIYUN_SMS_API_ENDPOINT: 'Invalid Aliyun SMS API Endpoint', - INVALID_ALIYUN_SMS_API_ID: 'Invalid Aliyun SMS API ID', - INVALID_ALIYUN_SMS_API_SIGN_NAME: 'Invalid Aliyun SMS API Sign Name', - INVALID_ALIYUN_SMS_API_TEMPLATE_CODE: 'Invalid Aliyun SMS API Template Code', INVALID_AREA_VALUE: 'Invalid Area Value', INVALID_BASE_PERIOD_END_DATETIME: 'Invalid Base Period End Datetime', INVALID_BASE_PERIOD_START_DATETIME: 'Invalid Base Period Start Datetime', From 3cbecd9d14ea09f4bb7945d9826034391dc5ccfc Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 23 Sep 2021 17:33:39 +0800 Subject: [PATCH 67/87] replaced Chinese with English in Excel Exporters of API --- .../excelexporters/combinedequipmentbatch.py | 10 ++-- .../excelexporters/combinedequipmentcost.py | 54 +++++++++--------- .../combinedequipmentefficiency.py | 22 ++++---- .../combinedequipmentenergycategory.py | 48 ++++++++-------- .../combinedequipmentenergyitem.py | 30 +++++----- .../excelexporters/combinedequipmentincome.py | 38 ++++++------- .../excelexporters/combinedequipmentload.py | 40 ++++++------- .../excelexporters/combinedequipmentoutput.py | 24 ++++---- .../excelexporters/combinedequipmentsaving.py | 46 +++++++-------- .../combinedequipmentstatistics.py | 45 +++++++-------- myems-api/excelexporters/equipmentbatch.py | 10 ++-- myems-api/excelexporters/equipmentcost.py | 50 ++++++++--------- .../excelexporters/equipmentefficiency.py | 22 ++++---- .../excelexporters/equipmentenergycategory.py | 50 ++++++++--------- .../excelexporters/equipmentenergyitem.py | 26 ++++----- myems-api/excelexporters/equipmentincome.py | 34 +++++------ myems-api/excelexporters/equipmentload.py | 32 +++++------ myems-api/excelexporters/equipmentoutput.py | 20 +++---- myems-api/excelexporters/equipmentsaving.py | 42 +++++++------- .../excelexporters/equipmentstatistics.py | 38 ++++++------- myems-api/excelexporters/equipmenttracking.py | 10 ++-- myems-api/excelexporters/meterbatch.py | 6 +- myems-api/excelexporters/metercost.py | 24 ++++---- myems-api/excelexporters/meterenergy.py | 28 +++++----- .../excelexporters/metersubmetersbalance.py | 26 ++++----- myems-api/excelexporters/metertracking.py | 16 +++--- myems-api/excelexporters/metertrend.py | 10 ++-- myems-api/excelexporters/offlinemetercost.py | 20 +++---- .../excelexporters/offlinemeterenergy.py | 20 +++---- myems-api/excelexporters/shopfloorbatch.py | 10 ++-- myems-api/excelexporters/shopfloorcost.py | 53 +++++++++--------- .../excelexporters/shopfloorenergycategory.py | 46 +++++++-------- .../excelexporters/shopfloorenergyitem.py | 28 +++++----- myems-api/excelexporters/shopfloorload.py | 42 +++++++------- myems-api/excelexporters/shopfloorsaving.py | 44 +++++++-------- .../excelexporters/shopfloorstatistics.py | 56 +++++++++---------- myems-api/excelexporters/spacecost.py | 54 +++++++++--------- myems-api/excelexporters/spaceefficiency.py | 22 ++++---- .../excelexporters/spaceenergycategory.py | 54 +++++++++--------- myems-api/excelexporters/spaceenergyitem.py | 32 +++++------ myems-api/excelexporters/spaceincome.py | 42 +++++++------- myems-api/excelexporters/spaceload.py | 41 +++++++------- myems-api/excelexporters/spaceoutput.py | 24 ++++---- myems-api/excelexporters/spacesaving.py | 48 ++++++++-------- myems-api/excelexporters/spacestatistics.py | 56 +++++++++---------- myems-api/excelexporters/storebatch.py | 6 +- myems-api/excelexporters/storecost.py | 45 +++++++-------- .../excelexporters/storeenergycategory.py | 46 +++++++-------- myems-api/excelexporters/storeenergyitem.py | 28 +++++----- myems-api/excelexporters/storeload.py | 42 +++++++------- myems-api/excelexporters/storesaving.py | 44 +++++++-------- myems-api/excelexporters/storestatistics.py | 56 +++++++++---------- myems-api/excelexporters/tenantbatch.py | 10 ++-- myems-api/excelexporters/tenantbill.py | 38 ++++++------- myems-api/excelexporters/tenantcost.py | 49 ++++++++-------- .../excelexporters/tenantenergycategory.py | 48 ++++++++-------- myems-api/excelexporters/tenantenergyitem.py | 28 +++++----- myems-api/excelexporters/tenantload.py | 41 +++++++------- myems-api/excelexporters/tenantsaving.py | 44 +++++++-------- myems-api/excelexporters/tenantstatistics.py | 56 +++++++++---------- myems-api/excelexporters/virtualmetercost.py | 20 +++---- .../excelexporters/virtualmeterenergy.py | 20 +++---- 62 files changed, 1060 insertions(+), 1054 deletions(-) diff --git a/myems-api/excelexporters/combinedequipmentbatch.py b/myems-api/excelexporters/combinedequipmentbatch.py index 0e4efcd6..8c590a74 100644 --- a/myems-api/excelexporters/combinedequipmentbatch.py +++ b/myems-api/excelexporters/combinedequipmentbatch.py @@ -73,7 +73,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) data_font = Font(name='Franklin Gothic Book', size=11) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') @@ -116,7 +116,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment - ws['B3'] = '空间:' + ws['B3'] = 'Space:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment ws['C3'].font = name_font @@ -124,7 +124,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['F3'].font = name_font ws['F3'].alignment = b_r_alignment - ws['F3'] = '日期:' + ws['F3'] = 'Date:' ws['G3'].border = b_border ws['G3'].alignment = b_c_alignment ws['G3'].font = name_font @@ -136,13 +136,13 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['B6'].font = name_font ws['B6'].alignment = c_c_alignment ws['B6'].fill = table_fill - ws['B6'] = '名称' + ws['B6'] = 'Name' ws['C6'].border = f_border ws['C6'].alignment = c_c_alignment ws['C6'].font = name_font ws['C6'].fill = table_fill - ws['C6'] = '空间' + ws['C6'] = 'Space' ca_len = len(report['energycategories']) diff --git a/myems-api/excelexporters/combinedequipmentcost.py b/myems-api/excelexporters/combinedequipmentcost.py index de978cfc..17ad0e2f 100644 --- a/myems-api/excelexporters/combinedequipmentcost.py +++ b/myems-api/excelexporters/combinedequipmentcost.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -165,7 +165,7 @@ def generate_excel(report, if has_energy_data_flag: ws['B6'].font = title_font - ws['B6'] = name + ' 报告期成本' + ws['B6'] = name + ' ' + 'Reporting Period Costs' category = reporting_period_data['names'] ca_len = len(category) @@ -176,12 +176,12 @@ def generate_excel(report, ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '成本' + ws['B8'] = 'Cost' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '环比' + ws['B9'] = 'Increment Rate' ws['B9'].border = f_border col = 'B' @@ -209,7 +209,7 @@ def generate_excel(report, ws[end_col + '7'].fill = table_fill ws[end_col + '7'].font = name_font ws[end_col + '7'].alignment = c_c_alignment - ws[end_col + '7'] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[end_col + '7'] = "Total (" + reporting_period_data['total_unit'] + ")" ws[end_col + '7'].border = f_border ws[end_col + '8'].font = name_font @@ -235,7 +235,7 @@ def generate_excel(report, if has_ele_peak_flag: ws['B12'].font = title_font - ws['B12'] = name + '分时用电成本' + ws['B12'] = name + 'Electricity Cost by Time-Of-Use' ws['B13'].fill = table_fill ws['B13'].font = name_font @@ -246,20 +246,20 @@ def generate_excel(report, ws['C13'].font = name_font ws['C13'].alignment = c_c_alignment ws['C13'].border = f_border - ws['C13'] = '分时用电成本' + ws['C13'] = 'Electricity Cost by Time-Of-Use' ws['D13'].fill = table_fill ws['D13'].font = name_font ws['D13'].alignment = c_c_alignment ws['D13'].border = f_border - ws['D13'] = '分时用电成本占比' + ws['D13'] = 'Electricity Cost Proportion by Time-Of-Use' costsum = round(reporting_period_data['toppeaks'][0], 2) + round(reporting_period_data['onpeaks'][0], 2) + \ round(reporting_period_data['midpeaks'][0], 2) + round(reporting_period_data['offpeaks'][0], 2) ws['B14'].font = title_font ws['B14'].alignment = c_c_alignment - ws['B14'] = '尖' + ws['B14'] = 'TopPeak' ws['B14'].border = f_border ws['C14'].font = title_font @@ -275,7 +275,7 @@ def generate_excel(report, ws['B15'].font = title_font ws['B15'].alignment = c_c_alignment - ws['B15'] = '峰' + ws['B15'] = 'OnPeak' ws['B15'].border = f_border ws['C15'].font = title_font @@ -291,7 +291,7 @@ def generate_excel(report, ws['B16'].font = title_font ws['B16'].alignment = c_c_alignment - ws['B16'] = '平' + ws['B16'] = 'MidPeak' ws['B16'].border = f_border ws['C16'].font = title_font @@ -307,7 +307,7 @@ def generate_excel(report, ws['B17'].font = title_font ws['B17'].alignment = c_c_alignment - ws['B17'] = '谷' + ws['B17'] = 'OffPeak' ws['B17'].border = f_border ws['C17'].font = title_font @@ -322,7 +322,7 @@ def generate_excel(report, if costsum is not None and costsum != Decimal(0.0) else " " pie = PieChart() - pie.title = name + '分时用电成本' + pie.title = name + 'Electricity Cost by Time-Of-Use' labels = Reference(ws, min_col=2, min_row=14, max_row=17) pie_data = Reference(ws, min_col=3, min_row=13, max_row=17) pie.add_data(pie_data, titles_from_data=True) @@ -352,7 +352,7 @@ def generate_excel(report, if has_subtotals_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 成本占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Costs Proportion' current_row_number += 1 @@ -367,13 +367,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '成本' + ws['C' + str(current_row_number)] = 'Cost' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '成本占比' + ws['D' + str(current_row_number)] = 'Costs Proportion' current_row_number += 1 @@ -403,7 +403,7 @@ def generate_excel(report, table_end_row_number = current_row_number - 1 pie = PieChart() - pie.title = name + ' 成本占比' + pie.title = name + ' ' + 'Costs Proportion' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -445,7 +445,7 @@ def generate_excel(report, ca_len = len(report['reporting_period']['names']) real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' table_start_row_number = (current_row_number + 1) + ca_len * 6 + real_timestamps_len * 7 current_row_number = table_start_row_number @@ -463,7 +463,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].border = f_border ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'B' @@ -482,7 +482,7 @@ def generate_excel(report, ws[end_col + str(current_row_number)].fill = table_fill ws[end_col + str(current_row_number)].font = title_font ws[end_col + str(current_row_number)].alignment = c_c_alignment - ws[end_col + str(current_row_number)] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[end_col + str(current_row_number)] = "Total (" + reporting_period_data['total_unit'] + ")" ws[end_col + str(current_row_number)].border = f_border current_row_number += 1 @@ -519,7 +519,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' ws['B' + str(current_row_number)].border = f_border col = 'B' @@ -533,7 +533,7 @@ def generate_excel(report, # line line = LineChart() - line.title = '报告期成本 - ' + ws.cell(column=3 + i, row=table_start_row_number).value + line.title = 'Reporting Period Costs - ' + ws.cell(column=3 + i, row=table_start_row_number).value labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) line.add_data(line_data, titles_from_data=True) @@ -583,7 +583,7 @@ def generate_excel(report, current_row_number += 1 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 相关设备数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Associated Equipment Data' current_row_number += 1 @@ -592,7 +592,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = name_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '相关设备' + ws['B' + str(current_row_number)] = 'Associated Equipment' ca_len = len(associated_equipment['energy_category_names']) for i in range(0, ca_len): @@ -609,7 +609,7 @@ def generate_excel(report, ws[end_col + str(current_row_number)].font = name_font ws[end_col + str(current_row_number)].alignment = c_c_alignment ws[end_col + str(current_row_number)].border = f_border - ws[end_col + str(current_row_number)] = "总计" + " (" + reporting_period_data['units'][i] + ")" + ws[end_col + str(current_row_number)] = "Total" + " (" + reporting_period_data['units'][i] + ")" associated_equipment_len = len(associated_equipment['associated_equipment_names_array'][0]) @@ -722,7 +722,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -778,7 +778,7 @@ def generate_excel(report, ######################################################## ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/combinedequipmentefficiency.py b/myems-api/excelexporters/combinedequipmentefficiency.py index b73c3d0c..730dd3bb 100644 --- a/myems-api/excelexporters/combinedequipmentefficiency.py +++ b/myems-api/excelexporters/combinedequipmentefficiency.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -170,7 +170,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期累积效率' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Cumulative Efficiency' current_row_number += 1 @@ -198,7 +198,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '累积效率' + ws['B' + str(current_row_number)] = 'Cumulative Efficiency' col = 'C' @@ -215,7 +215,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -272,7 +272,7 @@ def generate_excel(report, time = reporting_period_data['timestamps'][0] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期累积效率' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Cumulative Efficiency' current_row_number += 1 @@ -286,7 +286,7 @@ def generate_excel(report, current_row_number += 6*real_timestamps_len + 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 @@ -297,7 +297,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -334,7 +334,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -370,7 +370,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期累积效率 - ' + \ + line.title = 'Reporting Period Cumulative Efficiency - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -463,7 +463,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -519,7 +519,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/combinedequipmentenergycategory.py b/myems-api/excelexporters/combinedequipmentenergycategory.py index 6220fa4b..0a4d920d 100644 --- a/myems-api/excelexporters/combinedequipmentenergycategory.py +++ b/myems-api/excelexporters/combinedequipmentenergycategory.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -156,7 +156,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 能耗分析 + # First: Consumption # 6: title # 7: table title # 8~10 table_data @@ -173,7 +173,7 @@ def generate_excel(report, if has_energy_data_flag: ws['B6'].font = title_font - ws['B6'] = name+' 能耗分析' + ws['B6'] = name + ' ' + 'Consumption' category = reporting_period_data['names'] ca_len = len(category) @@ -184,12 +184,12 @@ def generate_excel(report, ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '能耗' + ws['B8'] = 'Consumption' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '环比' + ws['B9'] = 'Increment Rate' ws['B9'].border = f_border col = '' @@ -222,7 +222,7 @@ def generate_excel(report, ws[tce_col + '7'].fill = table_fill ws[tce_col + '7'].font = name_font ws[tce_col + '7'].alignment = c_c_alignment - ws[tce_col + '7'] = "吨标准煤 (TCE)" + ws[tce_col + '7'] = 'Ton of Standard Coal (TCE)' ws[tce_col + '7'].border = f_border ws[tce_col + '8'].font = name_font @@ -242,7 +242,7 @@ def generate_excel(report, ws[tco2e_col + '7'].fill = table_fill ws[tco2e_col + '7'].font = name_font ws[tco2e_col + '7'].alignment = c_c_alignment - ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)" + ws[tco2e_col + '7'] = 'Ton of Carbon Dioxide Emissions (TCO2E)' ws[tco2e_col + '7'].border = f_border ws[tco2e_col + '8'].font = name_font @@ -260,7 +260,7 @@ def generate_excel(report, for i in range(6, 9 + 1): ws.row_dimensions[i].height = 0.1 #################################################################################################################### - # Second: 分时电耗 + # Second: Electricity Consumption by Time-Of-Use # 12: title # 13: table title # 14~17 table_data @@ -274,7 +274,7 @@ def generate_excel(report, if has_ele_peak_flag: ws['B12'].font = title_font - ws['B12'] = name+' 分时电耗' + ws['B12'] = name + ' ' + 'Electricity Consumption by Time-Of-Use' ws.row_dimensions[13].height = 60 ws['B13'].fill = table_fill @@ -286,11 +286,11 @@ def generate_excel(report, ws['C13'].font = name_font ws['C13'].alignment = c_c_alignment ws['C13'].border = f_border - ws['C13'] = '分时电耗' + ws['C13'] = 'Electricity Consumption by Time-Of-Use' ws['B14'].font = title_font ws['B14'].alignment = c_c_alignment - ws['B14'] = '尖' + ws['B14'] = 'TopPeak' ws['B14'].border = f_border ws['C14'].font = title_font @@ -300,7 +300,7 @@ def generate_excel(report, ws['B15'].font = title_font ws['B15'].alignment = c_c_alignment - ws['B15'] = '峰' + ws['B15'] = 'OnPeak' ws['B15'].border = f_border ws['C15'].font = title_font @@ -310,7 +310,7 @@ def generate_excel(report, ws['B16'].font = title_font ws['B16'].alignment = c_c_alignment - ws['B16'] = '平' + ws['B16'] = 'MidPeak' ws['B16'].border = f_border ws['C16'].font = title_font @@ -320,7 +320,7 @@ def generate_excel(report, ws['B17'].font = title_font ws['B17'].alignment = c_c_alignment - ws['B17'] = '谷' + ws['B17'] = 'OffPeak' ws['B17'].border = f_border ws['C17'].font = title_font @@ -329,7 +329,7 @@ def generate_excel(report, ws['C17'] = round(reporting_period_data['offpeaks'][0], 2) pie = PieChart() - pie.title = name+' 分时电耗' + pie.title = name + ' ' + 'Electricity Consumption by Time-Of-Use' labels = Reference(ws, min_col=2, min_row=14, max_row=17) pie_data = Reference(ws, min_col=3, min_row=13, max_row=17) pie.add_data(pie_data, titles_from_data=True) @@ -349,7 +349,7 @@ def generate_excel(report, ws.row_dimensions[i].height = 0.1 #################################################################################################################### - # Fourth: 能耗详情 + # Fourth: Detailed Data # current_row_number: title # current_row_number+1 ~ current_row_number+1+ca_len*6-1: line # current_row_number+1+ca_len*6: table title @@ -370,14 +370,14 @@ def generate_excel(report, if has_detail_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name+' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' ws.row_dimensions[table_row].height = 60 ws['B'+str(table_row)].fill = table_fill ws['B' + str(table_row)].font = title_font ws['B'+str(table_row)].border = f_border ws['B'+str(table_row)].alignment = c_c_alignment - ws['B'+str(table_row)] = '日期时间' + ws['B'+str(table_row)] = 'Datetime' time = times[0] has_data = False max_row = 0 @@ -424,7 +424,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -436,7 +436,7 @@ def generate_excel(report, # line # 39~: line line = LineChart() - line.title = '报告期消耗 - ' + ws.cell(column=3+i, row=table_row).value + line.title = 'Reporting Period Consumption - ' + ws.cell(column=3+i, row=table_row).value labels = Reference(ws, min_col=2, min_row=table_row+1, max_row=max_row) line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) # openpyxl bug line.add_data(line_data, titles_from_data=True) @@ -473,7 +473,7 @@ def generate_excel(report, associated_equipment = report['associated_equipment'] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 相关设备数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Associated Equipment Data' current_row_number += 1 table_start_row_number = current_row_number @@ -483,7 +483,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = name_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '相关设备' + ws['B' + str(current_row_number)] = 'Associated Equipment' ca_len = len(associated_equipment['energy_category_names']) for i in range(0, ca_len): @@ -598,7 +598,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -653,7 +653,7 @@ def generate_excel(report, ######################################################## ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/combinedequipmentenergyitem.py b/myems-api/excelexporters/combinedequipmentenergyitem.py index 70f8e5fc..e81c39b0 100644 --- a/myems-api/excelexporters/combinedequipmentenergyitem.py +++ b/myems-api/excelexporters/combinedequipmentenergyitem.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -169,7 +169,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期消耗' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Consumption' current_row_number += 1 @@ -215,7 +215,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -237,8 +237,8 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)] = \ - name + ' ' + category_dict_name + ' (' + reporting_period_data['units'][category_dict_values[0]] + \ - ') 分项消耗占比' + name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ + ') by Energy Item' current_row_number += 1 table_start_row_number = current_row_number @@ -271,8 +271,8 @@ def generate_excel(report, pie = PieChart() pie.title = \ - name + ' ' + category_dict_name + ' (' + reporting_period_data['units'][category_dict_values[0]] + \ - ') 分项消耗占比' + name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ + ') by Energy Item' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -312,7 +312,7 @@ def generate_excel(report, time = reporting_period_data['timestamps'][0] real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 @@ -326,7 +326,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -363,7 +363,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -399,7 +399,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期消耗 - ' + \ + line.title = 'Reporting Period Consumption - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -439,7 +439,7 @@ def generate_excel(report, associated_equipment = report['associated_equipment'] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 相关设备数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Associated Equipment Data' current_row_number += 1 table_start_row_number = current_row_number @@ -449,7 +449,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = name_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '相关设备' + ws['B' + str(current_row_number)] = 'Associated Equipment' ca_len = len(associated_equipment['energy_item_names']) for i in range(0, ca_len): @@ -563,7 +563,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -619,7 +619,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/combinedequipmentincome.py b/myems-api/excelexporters/combinedequipmentincome.py index c6f405e2..3a9bedb0 100644 --- a/myems-api/excelexporters/combinedequipmentincome.py +++ b/myems-api/excelexporters/combinedequipmentincome.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -169,7 +169,7 @@ def generate_excel(report, if has_cost_data_flag: ws['B5'].font = title_font - ws['B5'] = name + ' 报告期收入' + ws['B5'] = name + ' ' + 'Reporting Period Income' category = reporting_period_data['names'] ca_len = len(category) @@ -179,12 +179,12 @@ def generate_excel(report, ws['B7'].font = title_font ws['B7'].alignment = c_c_alignment - ws['B7'] = '报告期收入' + ws['B7'] = 'Reporting Period Income' ws['B7'].border = f_border ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '环比' + ws['B8'] = 'Increment Rate' ws['B8'].border = f_border col = '' @@ -214,7 +214,7 @@ def generate_excel(report, ws[col + '6'].fill = table_fill ws[col + '6'].font = name_font ws[col + '6'].alignment = c_c_alignment - ws[col + '6'] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[col + '6'] = "Total (" + reporting_period_data['total_unit'] + ")" ws[col + '6'].border = f_border ws[col + '7'].font = name_font @@ -241,7 +241,7 @@ def generate_excel(report, if has_subtotals_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 收入占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Incomes by Energy Category' current_row_number += 1 @@ -256,13 +256,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '收入' + ws['C' + str(current_row_number)] = 'Incomes' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '收入占比' + ws['D' + str(current_row_number)] = 'Proportion' current_row_number += 1 @@ -293,7 +293,7 @@ def generate_excel(report, table_end_row_number = current_row_number - 1 pie = PieChart() - pie.title = name + ' 收入占比' + pie.title = name + ' ' + 'Incomes by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -330,14 +330,14 @@ def generate_excel(report, if has_detail_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' ws.row_dimensions[table_row].height = 60 ws['B' + str(table_row)].fill = table_fill ws['B' + str(table_row)].font = title_font ws['B' + str(table_row)].border = f_border ws['B' + str(table_row)].alignment = c_c_alignment - ws['B' + str(table_row)] = '日期时间' + ws['B' + str(table_row)] = 'Datetime' time = times[0] has_data = False max_row = 0 @@ -378,7 +378,7 @@ def generate_excel(report, line = LineChart() line.title = \ - '报告期收入 - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + 'Reporting Period Income - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_row + 1, max_row=max_row) line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) line.add_data(line_data, titles_from_data=True) @@ -402,7 +402,7 @@ def generate_excel(report, ws['B' + row].font = title_font ws['B' + row].alignment = c_c_alignment - ws['B' + row] = '小计' + ws['B' + row] = 'Subtotal' ws['B' + row].border = f_border col = '' @@ -420,7 +420,7 @@ def generate_excel(report, ws[col + str(table_row)].fill = table_fill ws[col + str(table_row)].font = title_font ws[col + str(table_row)].alignment = c_c_alignment - ws[col + str(table_row)] = '总计 (' + report['reporting_period']['total_unit'] + ')' + ws[col + str(table_row)] = 'Total (' + report['reporting_period']['total_unit'] + ')' ws[col + str(table_row)].border = f_border total_sum = 0 @@ -463,7 +463,7 @@ def generate_excel(report, associated_equipment = report['associated_equipment'] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 相关设备数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Associated Equipment Data' current_row_number += 1 @@ -472,7 +472,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = name_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '相关设备' + ws['B' + str(current_row_number)] = 'Associated Equipment' ca_len = len(associated_equipment['energy_category_names']) for i in range(0, ca_len): @@ -489,7 +489,7 @@ def generate_excel(report, ws[col_subtotal + str(current_row_number)].font = name_font ws[col_subtotal + str(current_row_number)].alignment = c_c_alignment ws[col_subtotal + str(current_row_number)].border = f_border - ws[col_subtotal + str(current_row_number)] = '总计 (' + report['reporting_period']['total_unit'] + ')' + ws[col_subtotal + str(current_row_number)] = 'Total (' + report['reporting_period']['total_unit'] + ')' associated_equipment_len = len(associated_equipment['associated_equipment_names_array'][0]) @@ -602,7 +602,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -658,7 +658,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/combinedequipmentload.py b/myems-api/excelexporters/combinedequipmentload.py index cc697c12..17185010 100644 --- a/myems-api/excelexporters/combinedequipmentload.py +++ b/myems-api/excelexporters/combinedequipmentload.py @@ -82,7 +82,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -152,7 +152,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 负荷分析 + # First: Load # 6: title # 7: table title # 8~2*ca_len table_data @@ -168,7 +168,7 @@ def generate_excel(report, return filename ws['B6'].font = title_font - ws['B6'] = name + ' 负荷分析' + ws['B6'] = name + ' ' + 'Load' category = reporting_period_data['names'] @@ -176,22 +176,22 @@ def generate_excel(report, ws['B7'].fill = table_fill ws['B7'].font = title_font ws['B7'].alignment = c_c_alignment - ws['B7'] = '报告期' + ws['B7'] = 'Reporting Period' ws['B7'].border = f_border ws['C7'].font = title_font ws['C7'].alignment = c_c_alignment - ws['C7'] = '平均负荷' + ws['C7'] = 'Average Load' ws['C7'].border = f_border ws['D7'].font = title_font ws['D7'].alignment = c_c_alignment - ws['D7'] = '最大负荷' + ws['D7'] = 'Maximum Load' ws['D7'].border = f_border ws['E7'].font = title_font ws['E7'].alignment = c_c_alignment - ws['E7'] = '负荷系数' + ws['E7'] = 'Load Factor' ws['E7'].border = f_border # table_data @@ -205,7 +205,7 @@ def generate_excel(report, ws['B' + str(row + 1)].font = name_font ws['B' + str(row + 1)].alignment = c_c_alignment - ws['B' + str(row + 1)] = "环比" + ws['B' + str(row + 1)] = 'Increment Rate' ws['B' + str(row + 1)].border = f_border ws['C' + str(row)].font = name_font @@ -248,7 +248,7 @@ def generate_excel(report, ws['E' + str(row + 1)].border = f_border #################################################################################################################### - # Third: 详细数据 + # Third: Detailed Data # analysis_end_row_number~ analysis_end_row_number + 6*cal_len: line # detailed_start_row_number: table title # detailed_start_row_number + 1~: table_data @@ -270,12 +270,12 @@ def generate_excel(report, detailed_start_row_number = analysis_end_row_number + line_charts_row_number + 1 + real_timestamps_len * 7 ws['B' + str(detailed_start_row_number)].font = title_font - ws['B' + str(detailed_start_row_number)] = name + ' 详细数据' + ws['B' + str(detailed_start_row_number)] = name + ' ' + 'Detailed Data' # table_title ws['B' + str(detailed_start_row_number + 1)].fill = table_fill ws['B' + str(detailed_start_row_number + 1)].font = name_font ws['B' + str(detailed_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(detailed_start_row_number + 1)] = "日期时间" + ws['B' + str(detailed_start_row_number + 1)] = "Datetime" ws['B' + str(detailed_start_row_number + 1)].border = f_border for i in range(0, ca_len): @@ -285,13 +285,13 @@ def generate_excel(report, ws[col_average + str(detailed_start_row_number + 1)].font = name_font ws[col_average + str(detailed_start_row_number + 1)].alignment = c_c_alignment ws[col_average + str(detailed_start_row_number + 1)] = \ - names[i] + " 平均负荷(" + reporting_period_data['units'][i] + "/H)" + names[i] + " Average Load(" + reporting_period_data['units'][i] + "/H)" ws[col_average + str(detailed_start_row_number + 1)].border = f_border ws[col_maximum + str(detailed_start_row_number + 1)].font = name_font ws[col_maximum + str(detailed_start_row_number + 1)].alignment = c_c_alignment ws[col_maximum + str(detailed_start_row_number + 1)] = \ - names[i] + " 最大负荷(" + reporting_period_data['units'][i] + "/H)" + names[i] + " Maximum Load(" + reporting_period_data['units'][i] + "/H)" ws[col_maximum + str(detailed_start_row_number + 1)].border = f_border # table_date for i in range(0, time_len): @@ -327,7 +327,7 @@ def generate_excel(report, ################################################################################################################ for i in range(0, ca_len): line = LineChart() - line.title = "报告期 最大负荷 - " + names[i] + "(" + reporting_period_data['units'][i] + ")" + line.title = "Reporting Period Maximum Load - " + names[i] + "(" + reporting_period_data['units'][i] + ")" line.style = 10 line.x_axis.majorTickMark = 'in' line.y_axis.majorTickMark = 'in' @@ -370,7 +370,7 @@ def generate_excel(report, associated_equipment = report['associated_equipment'] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 相关设备数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Associated Equipment Data' current_row_number += 1 table_start_row_number = current_row_number @@ -380,7 +380,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = name_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '相关设备' + ws['B' + str(current_row_number)] = 'Associated Equipment' ca_len = len(associated_equipment['energy_category_names']) for i in range(0, ca_len): @@ -389,13 +389,13 @@ def generate_excel(report, ws[col_average + str(current_row_number)].font = name_font ws[col_average + str(current_row_number)].alignment = c_c_alignment - ws[col_average + str(current_row_number)] = names[i] + " 平均负荷(" + \ + ws[col_average + str(current_row_number)] = names[i] + " Average Load(" + \ reporting_period_data['units'][i] + "/H)" ws[col_average + str(current_row_number)].border = f_border ws[col_maximum + str(current_row_number)].font = name_font ws[col_maximum + str(current_row_number)].alignment = c_c_alignment - ws[col_maximum + str(current_row_number)] = names[i] + " 最大负荷(" + \ + ws[col_maximum + str(current_row_number)] = names[i] + " Maximum Load(" + \ reporting_period_data['units'][i] + "/H)" ws[col_maximum + str(current_row_number)].border = f_border @@ -514,7 +514,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -570,7 +570,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/combinedequipmentoutput.py b/myems-api/excelexporters/combinedequipmentoutput.py index 52ae6148..f8584fb3 100644 --- a/myems-api/excelexporters/combinedequipmentoutput.py +++ b/myems-api/excelexporters/combinedequipmentoutput.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -169,7 +169,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期产出' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Output' current_row_number += 1 @@ -197,7 +197,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '产出' + ws['B' + str(current_row_number)] = 'Output' col = 'C' @@ -214,7 +214,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -251,7 +251,7 @@ def generate_excel(report, time = reporting_period_data['timestamps'][0] real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 @@ -265,7 +265,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -302,7 +302,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -338,7 +338,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期产出 - ' + \ + line.title = 'Reporting Period Output - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -379,7 +379,7 @@ def generate_excel(report, associated_equipment = report['associated_equipment'] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 相关设备数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Associated Equipment Data' current_row_number += 1 @@ -388,7 +388,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = name_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '相关设备' + ws['B' + str(current_row_number)] = 'Associated Equipment' ca_len = len(associated_equipment['energy_category_names']) for i in range(0, ca_len): @@ -502,7 +502,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -558,7 +558,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/combinedequipmentsaving.py b/myems-api/excelexporters/combinedequipmentsaving.py index d4dae235..47dbd4f2 100644 --- a/myems-api/excelexporters/combinedequipmentsaving.py +++ b/myems-api/excelexporters/combinedequipmentsaving.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -171,7 +171,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期节约' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Savings' current_row_number += 1 @@ -190,7 +190,7 @@ def generate_excel(report, ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border ws[col + str(current_row_number)] = \ - reporting_period_data['names'][i] + " (基线-实际) (" + reporting_period_data['units'][i] + ")" + reporting_period_data['names'][i] + ' ' + '(Baseline - Actual)(' + reporting_period_data['units'][i] + ")" col = chr(ord(col) + 1) @@ -198,7 +198,7 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '吨标准煤 (基线-实际) (TCE)' + ws[col + str(current_row_number)] = 'Ton of Standard Coal(Baseline - Actual)(TCE)' col = chr(ord(col) + 1) @@ -206,7 +206,7 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '吨二氧化碳排放 (基线-实际) (TCO2E)' + ws[col + str(current_row_number)] = 'Ton of Carbon Dioxide Emissions(Baseline - Actual)(TCO2E)' col = chr(ord(col) + 1) @@ -215,7 +215,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '节约' + ws['B' + str(current_row_number)] = 'Savings' col = 'C' @@ -246,7 +246,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -281,7 +281,7 @@ def generate_excel(report, current_row_number += 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨标准煤(TCE)占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -295,13 +295,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '节约' + ws['C' + str(current_row_number)] = 'Savings' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '吨标准煤(TCE) 节约占比' + ws['D' + str(current_row_number)] = 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 @@ -335,7 +335,7 @@ def generate_excel(report, current_row_number += 1 pie = PieChart() - pie.title = name + ' 吨标准煤(TCE)占比' + pie.title = name + ' ' + 'Ton of Standard Coal(TCE) by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -350,7 +350,7 @@ def generate_excel(report, ws.add_chart(pie, 'E' + str(chart_start_row_number)) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨二氧化碳排放(TCO2E)占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -364,13 +364,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '节约' + ws['C' + str(current_row_number)] = 'Savings' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '吨二氧化碳排放(TCO2E) 节约占比' + ws['D' + str(current_row_number)] = 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 @@ -404,7 +404,7 @@ def generate_excel(report, current_row_number += 1 pie = PieChart() - pie.title = name + ' 吨二氧化碳排放(TCO2E)占比' + pie.title = name + ' ' + 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -439,7 +439,7 @@ def generate_excel(report, time = reporting_period_data['timestamps'][0] real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 @@ -453,7 +453,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -490,7 +490,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -526,7 +526,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期节约 - ' + \ + line.title = 'Reporting Period Savings - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -566,7 +566,7 @@ def generate_excel(report, associated_equipment = report['associated_equipment'] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 相关设备数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Associated Equipment Data' current_row_number += 1 table_start_row_number = current_row_number @@ -576,7 +576,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = name_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '相关设备' + ws['B' + str(current_row_number)] = 'Associated Equipment' ca_len = len(associated_equipment['energy_category_names']) for i in range(0, ca_len): @@ -692,7 +692,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -748,7 +748,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/combinedequipmentstatistics.py b/myems-api/excelexporters/combinedequipmentstatistics.py index dc537b2e..790ad427 100644 --- a/myems-api/excelexporters/combinedequipmentstatistics.py +++ b/myems-api/excelexporters/combinedequipmentstatistics.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -153,7 +153,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 统计分析 + # First: Statistics # 6: title # 7: table title # 8~ca_len table_data @@ -168,7 +168,7 @@ def generate_excel(report, return filename ws['B6'].font = title_font - ws['B6'] = name + ' 统计分析' + ws['B6'] = name + ' ' + 'Statistics' category = reporting_period_data['names'] @@ -176,37 +176,37 @@ def generate_excel(report, ws['B7'].fill = table_fill ws['B7'].font = title_font ws['B7'].alignment = c_c_alignment - ws['B7'] = '报告期' + ws['B7'] = 'Reporting Period' ws['B7'].border = f_border ws['C7'].font = title_font ws['C7'].alignment = c_c_alignment - ws['C7'] = '算术平均数' + ws['C7'] = 'Arithmetic Mean' ws['C7'].border = f_border ws['D7'].font = title_font ws['D7'].alignment = c_c_alignment - ws['D7'] = '中位数' + ws['D7'] = 'Median (Middle Value)' ws['D7'].border = f_border ws['E7'].font = title_font ws['E7'].alignment = c_c_alignment - ws['E7'] = '最小值' + ws['E7'] = 'Minimum Value' ws['E7'].border = f_border ws['F7'].font = title_font ws['F7'].alignment = c_c_alignment - ws['F7'] = '最大值' + ws['F7'] = 'Maximum Value' ws['F7'].border = f_border ws['G7'].font = title_font ws['G7'].alignment = c_c_alignment - ws['G7'] = '样本标准差' + ws['G7'] = 'Sample Standard Deviation' ws['G7'].border = f_border ws['H7'].font = title_font ws['H7'].alignment = c_c_alignment - ws['H7'] = '样本方差' + ws['H7'] = 'Sample Variance' ws['H7'].border = f_border # table_data @@ -220,7 +220,7 @@ def generate_excel(report, ws['B' + str(row + 1)].font = name_font ws['B' + str(row + 1)].alignment = c_c_alignment - ws['B' + str(row + 1)] = "环比" + ws['B' + str(row + 1)] = 'Increment Rate' ws['B' + str(row + 1)].border = f_border ws['C' + str(row)].font = name_font @@ -302,7 +302,7 @@ def generate_excel(report, ws['H' + str(row + 1)].border = f_border #################################################################################################################### - # Second: 详细数据 + # Second: Detailed Data # analysis_end_row_number+1~ analysis_end_row_number+1+line_charts_row_number+: line # detailed_start_row_number~ : the detailed data table #################################################################################################################### @@ -325,12 +325,12 @@ def generate_excel(report, detailed_start_row_number = analysis_end_row_number + line_charts_row_number + real_timestamps_len * 7 ws['B' + str(detailed_start_row_number)].font = title_font - ws['B' + str(detailed_start_row_number)] = name + ' 详细数据' + ws['B' + str(detailed_start_row_number)] = name + ' ' + 'Detailed Data' # the detailed table_title ws['B' + str(detailed_start_row_number + 1)].fill = table_fill ws['B' + str(detailed_start_row_number + 1)].font = name_font ws['B' + str(detailed_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(detailed_start_row_number + 1)] = "时间" + ws['B' + str(detailed_start_row_number + 1)] = 'Datetime' ws['B' + str(detailed_start_row_number + 1)].border = f_border for i in range(0, ca_len): @@ -358,11 +358,11 @@ def generate_excel(report, ws[col + str(rows)].number_format = '0.00' ws[col + str(rows)].border = f_border - # 小计 + # Subtotal row_subtotals = detailed_start_row_number + 2 + time_len ws['B' + str(row_subtotals)].font = name_font ws['B' + str(row_subtotals)].alignment = c_c_alignment - ws['B' + str(row_subtotals)] = "小计" + ws['B' + str(row_subtotals)] = 'Subtotal' ws['B' + str(row_subtotals)].border = f_border for i in range(0, ca_len): @@ -381,9 +381,10 @@ def generate_excel(report, #################################################################################################################### for i in range(0, ca_len): line = LineChart() - line.title = "报告期消耗" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" + line.title = "Reporting Period Consumption" + " - " + names[i] + \ + "(" + reporting_period_data['units'][i] + ")" line.style = 10 - line.height = 8.40 # cm 1.05*8 1.05cm = 30 pt + line.height = 8.40 line.width = 24 line.x_axis.majorTickMark = 'in' line.y_axis.majorTickMark = 'in' @@ -420,7 +421,7 @@ def generate_excel(report, current_row_number = detailed_start_row_number + 4 + time_len ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 相关设备数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Associated Equipment Data' current_row_number += 1 table_start_row_number = current_row_number @@ -430,7 +431,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = name_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '相关设备' + ws['B' + str(current_row_number)] = 'Associated Equipment' ca_len = len(associated_equipment['energy_category_names']) for i in range(0, ca_len): @@ -544,7 +545,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -600,7 +601,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/equipmentbatch.py b/myems-api/excelexporters/equipmentbatch.py index 08ae927c..1f34fb18 100644 --- a/myems-api/excelexporters/equipmentbatch.py +++ b/myems-api/excelexporters/equipmentbatch.py @@ -73,7 +73,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) data_font = Font(name='Franklin Gothic Book', size=11) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') @@ -116,7 +116,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment - ws['B3'] = '空间:' + ws['B3'] = 'Space:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment ws['C3'].font = name_font @@ -124,7 +124,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['F3'].font = name_font ws['F3'].alignment = b_r_alignment - ws['F3'] = '日期:' + ws['F3'] = 'Datetime:' ws['G3'].border = b_border ws['G3'].alignment = b_c_alignment ws['G3'].font = name_font @@ -136,13 +136,13 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['B6'].font = name_font ws['B6'].alignment = c_c_alignment ws['B6'].fill = table_fill - ws['B6'] = '名称' + ws['B6'] = 'Name' ws['C6'].border = f_border ws['C6'].alignment = c_c_alignment ws['C6'].font = name_font ws['C6'].fill = table_fill - ws['C6'] = '空间' + ws['C6'] = 'Space' ca_len = len(report['energycategories']) diff --git a/myems-api/excelexporters/equipmentcost.py b/myems-api/excelexporters/equipmentcost.py index 84832e7b..6588ecdb 100644 --- a/myems-api/excelexporters/equipmentcost.py +++ b/myems-api/excelexporters/equipmentcost.py @@ -85,7 +85,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -155,7 +155,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 报告期成本分析 + # First: Reporting Period Costs # 6: title # 7: table title # 8~10 table_data @@ -172,7 +172,7 @@ def generate_excel(report, if has_energy_data_flag: ws['B6'].font = title_font - ws['B6'] = name+' 报告期成本分析' + ws['B6'] = name + ' ' + 'Reporting Period Costs' category = reporting_period_data['names'] ca_len = len(category) @@ -183,12 +183,12 @@ def generate_excel(report, ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '成本' + ws['B8'] = 'Cost' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '环比' + ws['B9'] = 'Increment Rate' ws['B9'].border = f_border col = '' @@ -219,7 +219,7 @@ def generate_excel(report, ws[col + '7'].fill = table_fill ws[col + '7'].font = name_font ws[col + '7'].alignment = c_c_alignment - ws[col + '7'] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[col + '7'] = "Total (" + reporting_period_data['total_unit'] + ")" ws[col + '7'].border = f_border ws[col + '8'].font = name_font @@ -237,7 +237,7 @@ def generate_excel(report, for i in range(6, 8 + 1): ws.row_dimensions[i].height = 0.1 #################################################################################################################### - # Second: 分时用电成本 + # Second: Electricity Cost by Time-Of-Use # 12: title # 13: table title # 14~17 table_data @@ -251,7 +251,7 @@ def generate_excel(report, if has_ele_peak_flag: ws['B12'].font = title_font - ws['B12'] = name+' 分时用电成本' + ws['B12'] = name + ' ' + 'Electricity Cost by Time-Of-Use' ws.row_dimensions[13].height = 60 ws['B13'].fill = table_fill @@ -263,11 +263,11 @@ def generate_excel(report, ws['C13'].font = name_font ws['C13'].alignment = c_c_alignment ws['C13'].border = f_border - ws['C13'] = '分时用电成本' + ws['C13'] = 'Electricity Cost by Time-Of-Use' ws['B14'].font = title_font ws['B14'].alignment = c_c_alignment - ws['B14'] = '尖' + ws['B14'] = 'TopPeak' ws['B14'].border = f_border ws['C14'].font = title_font @@ -277,7 +277,7 @@ def generate_excel(report, ws['B15'].font = title_font ws['B15'].alignment = c_c_alignment - ws['B15'] = '峰' + ws['B15'] = 'OnPeak' ws['B15'].border = f_border ws['C15'].font = title_font @@ -287,7 +287,7 @@ def generate_excel(report, ws['B16'].font = title_font ws['B16'].alignment = c_c_alignment - ws['B16'] = '平' + ws['B16'] = 'MidPeak' ws['B16'].border = f_border ws['C16'].font = title_font @@ -297,7 +297,7 @@ def generate_excel(report, ws['B17'].font = title_font ws['B17'].alignment = c_c_alignment - ws['B17'] = '谷' + ws['B17'] = 'OffPeak' ws['B17'].border = f_border ws['C17'].font = title_font @@ -306,7 +306,7 @@ def generate_excel(report, ws['C17'] = round(reporting_period_data['offpeaks'][0], 2) pie = PieChart() - pie.title = name+' 分时用电成本' + pie.title = name + ' ' + 'Electricity Cost by Time-Of-Use' labels = Reference(ws, min_col=2, min_row=14, max_row=17) pie_data = Reference(ws, min_col=3, min_row=13, max_row=17) pie.add_data(pie_data, titles_from_data=True) @@ -327,7 +327,7 @@ def generate_excel(report, # end_row 10 # start_row 12 #################################################################################################################### - # Second: 成本占比 + # Second: Costs Proportion by Energy Category #################################################################################################################### current_row_number = 19 @@ -339,7 +339,7 @@ def generate_excel(report, if has_subtotals_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 成本占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Costs Proportion' current_row_number += 1 table_start_row_number = current_row_number @@ -353,7 +353,7 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '成本占比' + ws['C' + str(current_row_number)] = 'Costs Proportion' current_row_number += 1 @@ -377,7 +377,7 @@ def generate_excel(report, table_end_row_number = current_row_number - 1 pie = PieChart() - pie.title = name + ' 成本占比' + pie.title = name + ' ' + 'Costs Proportion' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -398,7 +398,7 @@ def generate_excel(report, current_row_number += 1 #################################################################################################################### - # Fourth: 成本详情 + # Fourth: Detailed Data # current_row_number: title # current_row_number+1 ~ current_row_number+1+ca_len*6-1: line # current_row_number+1+ca_len*6: table title @@ -418,14 +418,14 @@ def generate_excel(report, if has_detail_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name+' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' ws.row_dimensions[table_row].height = 60 ws['B'+str(table_row)].fill = table_fill ws['B' + str(table_row)].font = title_font ws['B'+str(table_row)].border = f_border ws['B'+str(table_row)].alignment = c_c_alignment - ws['B'+str(table_row)] = '日期时间' + ws['B'+str(table_row)] = 'Datetime' time = times[0] has_data = False max_row = 0 @@ -471,7 +471,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -483,7 +483,7 @@ def generate_excel(report, # line # 39~: line line = LineChart() - line.title = '报告期消耗 - ' + ws.cell(column=3+i, row=table_row).value + line.title = 'Reporting Period Consumption - ' + ws.cell(column=3+i, row=table_row).value labels = Reference(ws, min_col=2, min_row=table_row+1, max_row=max_row) line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) # openpyxl bug line.add_data(line_data, titles_from_data=True) @@ -587,7 +587,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -643,7 +643,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/equipmentefficiency.py b/myems-api/excelexporters/equipmentefficiency.py index d683660e..a38e0bc5 100644 --- a/myems-api/excelexporters/equipmentefficiency.py +++ b/myems-api/excelexporters/equipmentefficiency.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -168,7 +168,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期累积效率' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Cumulative Efficiency' current_row_number += 1 @@ -196,7 +196,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '累积效率' + ws['B' + str(current_row_number)] = 'Cumulative Efficiency' col = 'C' @@ -213,7 +213,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -270,7 +270,7 @@ def generate_excel(report, time = reporting_period_data['timestamps'][0] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期累积效率' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Cumulative Efficiency' current_row_number += 1 @@ -284,7 +284,7 @@ def generate_excel(report, current_row_number += 6*real_timestamps_len + 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 @@ -295,7 +295,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -332,7 +332,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -368,7 +368,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期累积效率 - ' + \ + line.title = 'Reporting Period Cumulative Efficiency - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -461,7 +461,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -517,7 +517,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/equipmentenergycategory.py b/myems-api/excelexporters/equipmentenergycategory.py index 5ff5ccd7..6b3d41da 100644 --- a/myems-api/excelexporters/equipmentenergycategory.py +++ b/myems-api/excelexporters/equipmentenergycategory.py @@ -85,7 +85,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -155,7 +155,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 能耗分析 + # First: Consumption # 6: title # 7: table title # 8~10 table_data @@ -172,7 +172,7 @@ def generate_excel(report, if has_energy_data_flag: ws['B6'].font = title_font - ws['B6'] = name+' 能耗分析' + ws['B6'] = name + ' ' + 'Consumption' category = reporting_period_data['names'] ca_len = len(category) @@ -183,12 +183,12 @@ def generate_excel(report, ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '能耗' + ws['B8'] = 'Consumption' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '环比' + ws['B9'] = 'Increment Rate' ws['B9'].border = f_border col = '' @@ -221,7 +221,7 @@ def generate_excel(report, ws[tce_col + '7'].fill = table_fill ws[tce_col + '7'].font = name_font ws[tce_col + '7'].alignment = c_c_alignment - ws[tce_col + '7'] = "吨标准煤 (TCE)" + ws[tce_col + '7'] = 'Ton of Standard Coal (TCE)' ws[tce_col + '7'].border = f_border ws[tce_col + '8'].font = name_font @@ -240,7 +240,7 @@ def generate_excel(report, ws[tco2e_col + '7'].fill = table_fill ws[tco2e_col + '7'].font = name_font ws[tco2e_col + '7'].alignment = c_c_alignment - ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)" + ws[tco2e_col + '7'] = 'Ton of Carbon Dioxide Emissions (TCO2E)' ws[tco2e_col + '7'].border = f_border ws[tco2e_col + '8'].font = name_font @@ -257,7 +257,7 @@ def generate_excel(report, for i in range(6, 9 + 1): ws.row_dimensions[i].height = 0.1 #################################################################################################################### - # Second: 分时电耗 + # Second: Electricity Consumption by Time-Of-Use # 12: title # 13: table title # 14~17 table_data @@ -271,7 +271,7 @@ def generate_excel(report, if has_ele_peak_flag: ws['B12'].font = title_font - ws['B12'] = name+' 分时电耗' + ws['B12'] = name + ' ' + 'Electricity Consumption by Time-Of-Use' ws.row_dimensions[13].height = 60 ws['B13'].fill = table_fill @@ -283,11 +283,11 @@ def generate_excel(report, ws['C13'].font = name_font ws['C13'].alignment = c_c_alignment ws['C13'].border = f_border - ws['C13'] = '分时电耗' + ws['C13'] = 'Electricity Consumption by Time-Of-Use' ws['B14'].font = title_font ws['B14'].alignment = c_c_alignment - ws['B14'] = '尖' + ws['B14'] = 'TopPeak' ws['B14'].border = f_border ws['C14'].font = title_font @@ -297,7 +297,7 @@ def generate_excel(report, ws['B15'].font = title_font ws['B15'].alignment = c_c_alignment - ws['B15'] = '峰' + ws['B15'] = 'OnPeak' ws['B15'].border = f_border ws['C15'].font = title_font @@ -307,7 +307,7 @@ def generate_excel(report, ws['B16'].font = title_font ws['B16'].alignment = c_c_alignment - ws['B16'] = '平' + ws['B16'] = 'MidPeak' ws['B16'].border = f_border ws['C16'].font = title_font @@ -317,7 +317,7 @@ def generate_excel(report, ws['B17'].font = title_font ws['B17'].alignment = c_c_alignment - ws['B17'] = '谷' + ws['B17'] = 'OffPeak' ws['B17'].border = f_border ws['C17'].font = title_font @@ -326,7 +326,7 @@ def generate_excel(report, ws['C17'] = round(reporting_period_data['offpeaks'][0], 2) pie = PieChart() - pie.title = name+' 分时电耗' + pie.title = name + ' ' + 'Electricity Consumption by Time-Of-Use' labels = Reference(ws, min_col=2, min_row=14, max_row=17) pie_data = Reference(ws, min_col=3, min_row=13, max_row=17) pie.add_data(pie_data, titles_from_data=True) @@ -347,7 +347,7 @@ def generate_excel(report, # end_row 10 # start_row 12 #################################################################################################################### - # Third: 子空间能耗 + # Third: Child Spaces Data # 19: title # 20: table title # 21~24 table_data @@ -372,7 +372,7 @@ def generate_excel(report, child_subtotals = child['subtotals_array'][0] ws['B19'].font = title_font - ws['B19'] = name+' 子空间能耗' + ws['B19'] = name + ' ' + 'Child Spaces Data' ws.row_dimensions[20].height = 60 ws['B20'].fill = table_fill @@ -387,7 +387,7 @@ def generate_excel(report, ws[row + '20'].font = title_font ws[row + '20'].alignment = c_c_alignment ws[row + '20'].border = f_border - ws[row + '20'] = child['energy_category_names'][i] + ' (' + child['units'][i] + ')' + ws[row + '20'] = child['energy_category_names'][i] + ' ' + '(' + child['units'][i] + ')' space_len = len(child['child_space_names_array'][0]) @@ -440,7 +440,7 @@ def generate_excel(report, current_row_number += 1 #################################################################################################################### - # Fourth: 能耗详情 + # Fourth: Detailed Data # current_row_number: title # current_row_number+1 ~ current_row_number+1+ca_len*6-1: line # current_row_number+1+ca_len*6: table title @@ -460,14 +460,14 @@ def generate_excel(report, if has_detail_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name+' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' ws.row_dimensions[table_row].height = 60 ws['B'+str(table_row)].fill = table_fill ws['B' + str(table_row)].font = title_font ws['B'+str(table_row)].border = f_border ws['B'+str(table_row)].alignment = c_c_alignment - ws['B'+str(table_row)] = '日期时间' + ws['B'+str(table_row)] = 'Datetime' time = times[0] has_data = False max_row = 0 @@ -513,7 +513,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -525,7 +525,7 @@ def generate_excel(report, # line # 39~: line line = LineChart() - line.title = '报告期消耗 - ' + ws.cell(column=3+i, row=table_row).value + line.title = 'Reporting Period Consumption - ' + ws.cell(column=3+i, row=table_row).value labels = Reference(ws, min_col=2, min_row=table_row+1, max_row=max_row) line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) # openpyxl bug line.add_data(line_data, titles_from_data=True) @@ -629,7 +629,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -685,7 +685,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/equipmentenergyitem.py b/myems-api/excelexporters/equipmentenergyitem.py index f1cc14b3..7a4c277c 100644 --- a/myems-api/excelexporters/equipmentenergyitem.py +++ b/myems-api/excelexporters/equipmentenergyitem.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -167,7 +167,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期消耗' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Consumption' current_row_number += 1 @@ -213,7 +213,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -235,8 +235,8 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)] = \ - name + ' ' + category_dict_name + ' (' + reporting_period_data['units'][category_dict_values[0]] + \ - ') 分项消耗占比' + name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ + ') by Energy Item' current_row_number += 1 table_start_row_number = current_row_number @@ -269,8 +269,8 @@ def generate_excel(report, pie = PieChart() pie.title = \ - name + ' ' + category_dict_name + ' (' + reporting_period_data['units'][category_dict_values[0]] + \ - ') 分项消耗占比' + name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ + ') by Energy Item' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -310,7 +310,7 @@ def generate_excel(report, time = reporting_period_data['timestamps'][0] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 @@ -324,7 +324,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -361,7 +361,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -397,7 +397,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期消耗 - ' + \ + line.title = 'Reporting Period Consumption - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -504,7 +504,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -560,7 +560,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/equipmentincome.py b/myems-api/excelexporters/equipmentincome.py index b6d44d1b..30553781 100644 --- a/myems-api/excelexporters/equipmentincome.py +++ b/myems-api/excelexporters/equipmentincome.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -166,7 +166,7 @@ def generate_excel(report, if has_cost_data_flag: ws['B5'].font = title_font - ws['B5'] = name + ' 报告期收入' + ws['B5'] = name + ' ' + 'Reporting Period Income' category = reporting_period_data['names'] ca_len = len(category) @@ -176,12 +176,12 @@ def generate_excel(report, ws['B7'].font = title_font ws['B7'].alignment = c_c_alignment - ws['B7'] = '报告期收入' + ws['B7'] = 'Reporting Period Income' ws['B7'].border = f_border ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '环比' + ws['B8'] = 'Increment Rate' ws['B8'].border = f_border col = '' @@ -211,7 +211,7 @@ def generate_excel(report, ws[col + '6'].fill = table_fill ws[col + '6'].font = name_font ws[col + '6'].alignment = c_c_alignment - ws[col + '6'] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[col + '6'] = "Total (" + reporting_period_data['total_unit'] + ")" ws[col + '6'].border = f_border ws[col + '7'].font = name_font @@ -238,7 +238,7 @@ def generate_excel(report, if has_subtotals_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 收入占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Incomes by Energy Category' current_row_number += 1 @@ -253,13 +253,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '收入' + ws['C' + str(current_row_number)] = 'Incomes' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '收入占比' + ws['D' + str(current_row_number)] = 'Proportion' current_row_number += 1 @@ -291,7 +291,7 @@ def generate_excel(report, table_end_row_number = current_row_number - 1 pie = PieChart() - pie.title = name + ' 收入占比' + pie.title = name + ' ' + 'Incomes by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -328,14 +328,14 @@ def generate_excel(report, if has_detail_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' ws.row_dimensions[table_row].height = 60 ws['B' + str(table_row)].fill = table_fill ws['B' + str(table_row)].font = title_font ws['B' + str(table_row)].border = f_border ws['B' + str(table_row)].alignment = c_c_alignment - ws['B' + str(table_row)] = '日期时间' + ws['B' + str(table_row)] = 'Datetime' time = times[0] has_data = False max_row = 0 @@ -376,7 +376,7 @@ def generate_excel(report, line = LineChart() line.title = \ - '报告期收入 - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + 'Reporting Period Income - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_row + 1, max_row=max_row) line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) line.add_data(line_data, titles_from_data=True) @@ -399,7 +399,7 @@ def generate_excel(report, ws['B' + row].font = title_font ws['B' + row].alignment = c_c_alignment - ws['B' + row] = '小计' + ws['B' + row] = 'Subtotal' ws['B' + row].border = f_border col = '' @@ -417,7 +417,7 @@ def generate_excel(report, ws[col + str(table_row)].fill = table_fill ws[col + str(table_row)].font = title_font ws[col + str(table_row)].alignment = c_c_alignment - ws[col + str(table_row)] = '总计 (' + report['reporting_period']['total_unit'] + ')' + ws[col + str(table_row)] = 'Total (' + report['reporting_period']['total_unit'] + ')' ws[col + str(table_row)].border = f_border total_sum = 0 @@ -525,7 +525,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -581,7 +581,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 @@ -632,7 +632,7 @@ def generate_excel(report, def reporting_period_values_periodic_sum(reporting_period_data, periodic_index, ca_len): - periodic_sum = 0.0 + periodic_sum = Decimal(0.0) for i in range(0, ca_len): periodic_sum += reporting_period_data['values'][i][periodic_index] diff --git a/myems-api/excelexporters/equipmentload.py b/myems-api/excelexporters/equipmentload.py index 1869e62f..772b1c24 100644 --- a/myems-api/excelexporters/equipmentload.py +++ b/myems-api/excelexporters/equipmentload.py @@ -82,7 +82,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -150,7 +150,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 统计分析 + # First: Statistics # 6: title # 7: table title # 8~2*ca_len table_data @@ -165,7 +165,7 @@ def generate_excel(report, return filename ws['B6'].font = title_font - ws['B6'] = name + ' 统计分析' + ws['B6'] = name + ' ' + 'Statistics' category = reporting_period_data['names'] @@ -173,22 +173,22 @@ def generate_excel(report, ws['B7'].fill = table_fill ws['B7'].font = title_font ws['B7'].alignment = c_c_alignment - ws['B7'] = '报告期' + ws['B7'] = 'Reporting Period' ws['B7'].border = f_border ws['C7'].font = title_font ws['C7'].alignment = c_c_alignment - ws['C7'] = '平均负荷' + ws['C7'] = 'Average Load' ws['C7'].border = f_border ws['D7'].font = title_font ws['D7'].alignment = c_c_alignment - ws['D7'] = '最大负荷' + ws['D7'] = 'Maximum Load' ws['D7'].border = f_border ws['E7'].font = title_font ws['E7'].alignment = c_c_alignment - ws['E7'] = '负荷系数' + ws['E7'] = 'Load Factor' ws['E7'].border = f_border # table_data @@ -202,7 +202,7 @@ def generate_excel(report, ws['B' + str(row + 1)].font = name_font ws['B' + str(row + 1)].alignment = c_c_alignment - ws['B' + str(row + 1)] = "环比" + ws['B' + str(row + 1)] = 'Increment Rate' ws['B' + str(row + 1)].border = f_border ws['C' + str(row)].font = name_font @@ -245,7 +245,7 @@ def generate_excel(report, ws['E' + str(row + 1)].border = f_border #################################################################################################################### - # Third: 详细数据 + # Third: Detailed Data # row_sat~ row_sat + 6*cal_len: line # row_da: table title # row_da + 1~: table_data @@ -270,12 +270,12 @@ def generate_excel(report, row_da = row_sat + row_lines + real_timestamps_len * 7 + 2 ws['B' + str(row_da)].font = title_font - ws['B' + str(row_da)] = name + ' 详细数据' + ws['B' + str(row_da)] = name + ' ' + 'Detailed Data' # table_title ws['B' + str(row_da + 1)].fill = table_fill ws['B' + str(row_da + 1)].font = name_font ws['B' + str(row_da + 1)].alignment = c_c_alignment - ws['B' + str(row_da + 1)] = "日期时间" + ws['B' + str(row_da + 1)] = "Datetime" ws['B' + str(row_da + 1)].border = f_border for i in range(0, ca_len): @@ -284,13 +284,13 @@ def generate_excel(report, ws[col_average + str(row_da + 1)].font = name_font ws[col_average + str(row_da + 1)].alignment = c_c_alignment - ws[col_average + str(row_da + 1)] = names[i] + " 平均负荷(" + reporting_period_data['units'][ + ws[col_average + str(row_da + 1)] = names[i] + " Average Load(" + reporting_period_data['units'][ i] + "/H)" ws[col_average + str(row_da + 1)].border = f_border ws[col_maximum + str(row_da + 1)].font = name_font ws[col_maximum + str(row_da + 1)].alignment = c_c_alignment - ws[col_maximum + str(row_da + 1)] = names[i] + " 最大负荷(" + reporting_period_data['units'][ + ws[col_maximum + str(row_da + 1)] = names[i] + " Maximum Load(" + reporting_period_data['units'][ i] + "/H)" ws[col_maximum + str(row_da + 1)].border = f_border # table_date @@ -324,7 +324,7 @@ def generate_excel(report, # LineChart for i in range(0, ca_len): lc = LineChart() - lc.title = "报告期 最大负荷" + lc.title = "Reporting Period Maximum Load" lc.style = 10 lc.x_axis.majorTickMark = 'in' lc.y_axis.majorTickMark = 'in' @@ -432,7 +432,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -488,7 +488,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/equipmentoutput.py b/myems-api/excelexporters/equipmentoutput.py index eb67fb95..898c0466 100644 --- a/myems-api/excelexporters/equipmentoutput.py +++ b/myems-api/excelexporters/equipmentoutput.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -167,7 +167,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期产出' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Output' current_row_number += 1 @@ -195,7 +195,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '产出' + ws['B' + str(current_row_number)] = 'Output' col = 'C' @@ -212,7 +212,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -249,7 +249,7 @@ def generate_excel(report, time = reporting_period_data['timestamps'][0] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 @@ -263,7 +263,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -300,7 +300,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -336,7 +336,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期产出 - ' + \ + line.title = 'Reporting Period Output - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -443,7 +443,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -499,7 +499,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/equipmentsaving.py b/myems-api/excelexporters/equipmentsaving.py index 0183b0c9..bcdfab2e 100644 --- a/myems-api/excelexporters/equipmentsaving.py +++ b/myems-api/excelexporters/equipmentsaving.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -169,7 +169,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期节约' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Savings' current_row_number += 1 @@ -188,7 +188,7 @@ def generate_excel(report, ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border ws[col + str(current_row_number)] = \ - reporting_period_data['names'][i] + " (基线-实际) (" + reporting_period_data['units'][i] + ")" + reporting_period_data['names'][i] + " (Baseline - Actual) (" + reporting_period_data['units'][i] + ")" col = chr(ord(col) + 1) @@ -196,7 +196,7 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '吨标准煤 (基线-实际) (TCE)' + ws[col + str(current_row_number)] = 'Ton of Standard Coal (Baseline - Actual) (TCE)' col = chr(ord(col) + 1) @@ -204,7 +204,7 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '吨二氧化碳排放 (基线-实际) (TCO2E)' + ws[col + str(current_row_number)] = 'Ton of Carbon Dioxide Emissions (Baseline - Actual) (TCO2E)' col = chr(ord(col) + 1) @@ -213,7 +213,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '节约' + ws['B' + str(current_row_number)] = 'Savings' col = 'C' @@ -244,7 +244,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -279,7 +279,7 @@ def generate_excel(report, current_row_number += 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨标准煤(TCE)占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -293,13 +293,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '节约' + ws['C' + str(current_row_number)] = 'Savings' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '吨标准煤(TCE) 节约占比' + ws['D' + str(current_row_number)] = 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 @@ -333,7 +333,7 @@ def generate_excel(report, current_row_number += 1 pie = PieChart() - pie.title = name + ' 吨标准煤(TCE)占比' + pie.title = name + ' ' + 'Ton of Standard Coal(TCE) by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -348,7 +348,7 @@ def generate_excel(report, ws.add_chart(pie, 'E' + str(chart_start_row_number)) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨二氧化碳排放(TCO2E)占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -362,13 +362,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '节约' + ws['C' + str(current_row_number)] = 'Savings' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '吨二氧化碳排放(TCO2E) 节约占比' + ws['D' + str(current_row_number)] = 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 @@ -402,7 +402,7 @@ def generate_excel(report, current_row_number += 1 pie = PieChart() - pie.title = name + ' 吨二氧化碳排放(TCO2E)占比' + pie.title = name + ' ' + 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -437,7 +437,7 @@ def generate_excel(report, time = reporting_period_data['timestamps'][0] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 @@ -451,7 +451,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -488,7 +488,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -524,7 +524,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期节约 - ' + \ + line.title = 'Reporting Period Savings - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -631,7 +631,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -687,7 +687,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/equipmentstatistics.py b/myems-api/excelexporters/equipmentstatistics.py index 310fe736..90b006e2 100644 --- a/myems-api/excelexporters/equipmentstatistics.py +++ b/myems-api/excelexporters/equipmentstatistics.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -151,7 +151,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 统计分析 + # First: Statistics # 6: title # 7: table title # 8~ca_len table_data @@ -166,7 +166,7 @@ def generate_excel(report, return filename ws['B6'].font = title_font - ws['B6'] = name + ' 统计分析' + ws['B6'] = name + ' ' + 'Statistics' category = reporting_period_data['names'] @@ -174,37 +174,37 @@ def generate_excel(report, ws['B7'].fill = table_fill ws['B7'].font = title_font ws['B7'].alignment = c_c_alignment - ws['B7'] = '报告期' + ws['B7'] = 'Reporting Period' ws['B7'].border = f_border ws['C7'].font = title_font ws['C7'].alignment = c_c_alignment - ws['C7'] = '算术平均数' + ws['C7'] = 'Arithmetic Mean' ws['C7'].border = f_border ws['D7'].font = title_font ws['D7'].alignment = c_c_alignment - ws['D7'] = '中位数' + ws['D7'] = 'Median (Middle Value)' ws['D7'].border = f_border ws['E7'].font = title_font ws['E7'].alignment = c_c_alignment - ws['E7'] = '最小值' + ws['E7'] = 'Minimum Value' ws['E7'].border = f_border ws['F7'].font = title_font ws['F7'].alignment = c_c_alignment - ws['F7'] = '最大值' + ws['F7'] = 'Maximum Value' ws['F7'].border = f_border ws['G7'].font = title_font ws['G7'].alignment = c_c_alignment - ws['G7'] = '样本标准差' + ws['G7'] = 'Sample Standard Deviation' ws['G7'].border = f_border ws['H7'].font = title_font ws['H7'].alignment = c_c_alignment - ws['H7'] = '样本方差' + ws['H7'] = 'Sample Variance' ws['H7'].border = f_border # table_data @@ -218,7 +218,7 @@ def generate_excel(report, ws['B' + str(row + 1)].font = name_font ws['B' + str(row + 1)].alignment = c_c_alignment - ws['B' + str(row + 1)] = "环比" + ws['B' + str(row + 1)] = 'Increment Rate' ws['B' + str(row + 1)].border = f_border ws['C' + str(row)].font = name_font @@ -300,7 +300,7 @@ def generate_excel(report, ws['H' + str(row + 1)].border = f_border #################################################################################################################### - # Second: 详细数据 + # Second: Detailed Data # a+1~ analysis_end_row_number+1+line_charts_row_number+: line # detailed_start_row_number~ : the detailed data table #################################################################################################################### @@ -323,12 +323,12 @@ def generate_excel(report, detailed_start_row_number = analysis_end_row_number + line_charts_row_number + 1 + real_timestamps_len * 7 ws['B' + str(detailed_start_row_number)].font = title_font - ws['B' + str(detailed_start_row_number)] = name + ' 详细数据' + ws['B' + str(detailed_start_row_number)] = name + ' ' + 'Detailed Data' # the detailed table_title ws['B' + str(detailed_start_row_number + 1)].fill = table_fill ws['B' + str(detailed_start_row_number + 1)].font = name_font ws['B' + str(detailed_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(detailed_start_row_number + 1)] = "时间" + ws['B' + str(detailed_start_row_number + 1)] = 'Datetime' ws['B' + str(detailed_start_row_number + 1)].border = f_border for i in range(0, ca_len): @@ -356,11 +356,11 @@ def generate_excel(report, ws[col + str(rows)].number_format = '0.00' ws[col + str(rows)].border = f_border - # 小计 + # Subtotal row_subtotals = detailed_start_row_number + 2 + time_len ws['B' + str(row_subtotals)].font = name_font ws['B' + str(row_subtotals)].alignment = c_c_alignment - ws['B' + str(row_subtotals)] = "小计" + ws['B' + str(row_subtotals)] = 'Subtotal' ws['B' + str(row_subtotals)].border = f_border for i in range(0, ca_len): @@ -379,7 +379,7 @@ def generate_excel(report, #################################################################################################################### for i in range(0, ca_len): line = LineChart() - line.title = "报告期消耗" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" + line.title = "Reporting Period Consumption" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" line.style = 10 line.height = 8.40 line.width = 24 @@ -483,7 +483,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -539,7 +539,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/equipmenttracking.py b/myems-api/excelexporters/equipmenttracking.py index 83d61e6c..5cc0ec3c 100644 --- a/myems-api/excelexporters/equipmenttracking.py +++ b/myems-api/excelexporters/equipmenttracking.py @@ -62,7 +62,7 @@ def generate_excel(report, space_name): # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) f_border = Border(left=Side(border_style='medium', color='00000000'), right=Side(border_style='medium', color='00000000'), @@ -95,22 +95,22 @@ def generate_excel(report, space_name): ws['B3'].border = f_border ws['B3'].font = name_font ws['B3'].alignment = b_c_alignment - ws['B3'] = '名称' + ws['B3'] = 'Name' ws['C3'].border = f_border ws['C3'].alignment = b_c_alignment ws['C3'].font = name_font - ws['C3'] = '空间' + ws['C3'] = 'Space' ws['D3'].border = f_border ws['D3'].font = name_font ws['D3'].alignment = b_c_alignment - ws['D3'] = '成本中心' + ws['D3'] = 'Cost Center' ws['E3'].border = f_border ws['E3'].alignment = b_c_alignment ws['E3'].font = name_font - ws['E3'] = '描述' + ws['E3'] = 'Description' current_row_number = 4 for i in range(0, len(report['equipments'])): diff --git a/myems-api/excelexporters/meterbatch.py b/myems-api/excelexporters/meterbatch.py index b46cde55..d2af0c94 100644 --- a/myems-api/excelexporters/meterbatch.py +++ b/myems-api/excelexporters/meterbatch.py @@ -73,7 +73,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) data_font = Font(name='Franklin Gothic Book', size=11) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') @@ -116,7 +116,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment - ws['B3'] = '空间:' + ws['B3'] = 'Space:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment ws['C3'].font = name_font @@ -124,7 +124,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['F3'].font = name_font ws['F3'].alignment = b_r_alignment - ws['F3'] = '日期:' + ws['F3'] = 'Datetime:' ws['G3'].border = b_border ws['G3'].alignment = b_c_alignment ws['G3'].font = name_font diff --git a/myems-api/excelexporters/metercost.py b/myems-api/excelexporters/metercost.py index e3ae9244..caefd564 100644 --- a/myems-api/excelexporters/metercost.py +++ b/myems-api/excelexporters/metercost.py @@ -77,7 +77,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -158,7 +158,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_cost_data_flag: ws['B6'].font = title_font - ws['B6'] = name + '报告期成本' + ws['B6'] = name + 'Reporting Period Costs' reporting_period_data = report['reporting_period'] category = report['meter']['energy_category_name'] @@ -170,12 +170,12 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '成本' + ws['B8'] = 'Cost' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '环比' + ws['B9'] = 'Increment Rate' ws['B9'].border = f_border col = 'B' @@ -207,7 +207,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[tce_col + '7'].fill = table_fill ws[tce_col + '7'].font = name_font ws[tce_col + '7'].alignment = c_c_alignment - ws[tce_col + '7'] = "吨标准煤 (TCE)" + ws[tce_col + '7'] = 'Ton of Standard Coal (TCE)' ws[tce_col + '7'].border = f_border ws[tce_col + '8'].font = name_font @@ -226,7 +226,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[tco2e_col + '7'].fill = table_fill ws[tco2e_col + '7'].font = name_font ws[tco2e_col + '7'].alignment = c_c_alignment - ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)" + ws[tco2e_col + '7'] = 'Ton of Carbon Dioxide Emissions (TCO2E)' ws[tco2e_col + '7'].border = f_border ws[tco2e_col + '8'].font = name_font @@ -266,14 +266,14 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d start_detail_data_row_number = 13 + (parameters_parameters_datas_len + ca_len) * 6 ws['B11'].font = title_font - ws['B11'] = name + '详细数据' + ws['B11'] = name + 'Detailed Data' ws.row_dimensions[start_detail_data_row_number].height = 60 ws['B' + str(start_detail_data_row_number)].fill = table_fill ws['B' + str(start_detail_data_row_number)].font = title_font ws['B' + str(start_detail_data_row_number)].border = f_border ws['B' + str(start_detail_data_row_number)].alignment = c_c_alignment - ws['B' + str(start_detail_data_row_number)] = '日期时间' + ws['B' + str(start_detail_data_row_number)] = 'Datetime' time = times has_data = False max_row = 0 @@ -297,7 +297,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(end_data_row_number + 1)].font = title_font ws['B' + str(end_data_row_number + 1)].alignment = c_c_alignment - ws['B' + str(end_data_row_number + 1)] = '总计' + ws['B' + str(end_data_row_number + 1)] = 'Total' ws['B' + str(end_data_row_number + 1)].border = f_border for i in range(0, ca_len): @@ -328,7 +328,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[col + str(end_data_row_number + 1)].border = f_border line = LineChart() - line.title = '报告期成本 - ' + report['meter']['energy_category_name'] + \ + line.title = 'Reporting Period Costs - ' + report['meter']['energy_category_name'] + \ " (" + report['meter']['unit_of_measure'] + ")" line_data = Reference(ws, min_col=3, min_row=start_detail_data_row_number, max_row=max_row) line.series.append(Series(line_data, title_from_data=True)) @@ -435,7 +435,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -491,7 +491,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/meterenergy.py b/myems-api/excelexporters/meterenergy.py index b13a1856..79289210 100644 --- a/myems-api/excelexporters/meterenergy.py +++ b/myems-api/excelexporters/meterenergy.py @@ -74,7 +74,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -146,7 +146,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d return filename #################################################################################################################### - # First: 能耗分析 + # First: Consumption # 6: title # 7: table title # 8~9 table_data @@ -158,7 +158,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_energy_data_flag: ws['B6'].font = title_font - ws['B6'] = name + '能耗分析' + ws['B6'] = name + 'Consumption' reporting_period_data = report['reporting_period'] @@ -172,12 +172,12 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '能耗' + ws['B8'] = 'Consumption' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '环比' + ws['B9'] = 'Increment Rate' ws['B9'].border = f_border col = '' @@ -210,7 +210,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[tce_col + '7'].fill = table_fill ws[tce_col + '7'].font = name_font ws[tce_col + '7'].alignment = c_c_alignment - ws[tce_col + '7'] = "吨标准煤 (TCE)" + ws[tce_col + '7'] = 'Ton of Standard Coal (TCE)' ws[tce_col + '7'].border = f_border ws[tce_col + '8'].font = name_font @@ -229,7 +229,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[tco2e_col + '7'].fill = table_fill ws[tco2e_col + '7'].font = name_font ws[tco2e_col + '7'].alignment = c_c_alignment - ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)" + ws[tco2e_col + '7'] = 'Ton of Carbon Dioxide Emissions (TCO2E)' ws[tco2e_col + '7'].border = f_border ws[tco2e_col + '8'].font = name_font @@ -246,7 +246,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d for i in range(6, 9 + 1): ws.row_dimensions[i].height = 0.1 #################################################################################################################### - # Second: 能耗详情 + # Second: Detailed Data # 11: title # 12 ~ 16: chart # 18: table title @@ -272,7 +272,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d parameters_parameters_datas_len += 1 start_detail_data_row_num = 13 + (parameters_parameters_datas_len + ca_len) * 6 ws['B11'].font = title_font - ws['B11'] = name + '详细数据' + ws['B11'] = name + 'Detailed Data' ws.row_dimensions[start_detail_data_row_num].height = 60 @@ -280,7 +280,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(start_detail_data_row_num)].font = title_font ws['B' + str(start_detail_data_row_num)].border = f_border ws['B' + str(start_detail_data_row_num)].alignment = c_c_alignment - ws['B' + str(start_detail_data_row_num)] = '日期时间' + ws['B' + str(start_detail_data_row_num)] = 'Datetime' time = times has_data = False max_row = 0 @@ -323,7 +323,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # line # 13~: line line = LineChart() - line.title = '报告期消耗 - ' + report['meter']['energy_category_name'] + \ + line.title = 'Reporting Period Consumption - ' + report['meter']['energy_category_name'] + \ " (" + report['meter']['unit_of_measure'] + ")" labels = Reference(ws, min_col=2, min_row=start_detail_data_row_num + 1, max_row=max_row) bar_data = Reference(ws, min_col=3, min_row=start_detail_data_row_num, max_row=max_row) @@ -347,7 +347,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[col + row].font = title_font ws[col + row].alignment = c_c_alignment - ws[col + row] = '总计' + ws[col + row] = 'Total' ws[col + row].border = f_border for i in range(0, ca_len): @@ -450,7 +450,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -506,7 +506,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/metersubmetersbalance.py b/myems-api/excelexporters/metersubmetersbalance.py index 8225a955..2361a292 100644 --- a/myems-api/excelexporters/metersubmetersbalance.py +++ b/myems-api/excelexporters/metersubmetersbalance.py @@ -73,7 +73,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -158,7 +158,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d category = report['meter']['energy_category_name'] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period' current_row_number += 1 @@ -179,7 +179,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '总表消耗' + ws['B' + str(current_row_number)] = 'Master Meter Consumption' ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment @@ -191,7 +191,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '分表消耗' + ws['B' + str(current_row_number)] = 'Submeters Consumption' ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment @@ -203,7 +203,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '差值' + ws['B' + str(current_row_number)] = 'Difference' ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment @@ -215,7 +215,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '差值百分比' + ws['B' + str(current_row_number)] = 'Percentage Difference' ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment @@ -240,7 +240,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_time_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 chart_start_number = current_row_number @@ -253,7 +253,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].border = f_border ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' ws['C' + str(current_row_number)].fill = table_fill ws['C' + str(current_row_number)].font = title_font @@ -280,7 +280,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d table_end_number = current_row_number - 1 line = LineChart() - line.title = '报告期差值 - ' + report['meter']['energy_category_name'] + " (" + report['meter'][ + line.title = 'Difference - ' + report['meter']['energy_category_name'] + " (" + report['meter'][ 'unit_of_measure'] + ")" labels = Reference(ws, min_col=2, min_row=table_start_number + 1, max_row=table_end_number) line_data = Reference(ws, min_col=3, min_row=table_start_number, max_row=table_end_number) @@ -294,13 +294,13 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d line.width = 24 line.dLbls = DataLabelList() line.dLbls.dLblPos = 't' - line.dLbls.showVal = True # 数量显示 + line.dLbls.showVal = True ws.add_chart(line, "B" + str(chart_start_number)) ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].border = f_border ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)] = '总计' + ws['B' + str(current_row_number)] = 'Total' ws['C' + str(current_row_number)].font = title_font ws['C' + str(current_row_number)].border = f_border @@ -400,7 +400,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -456,7 +456,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/metertracking.py b/myems-api/excelexporters/metertracking.py index 6234e118..704a3c02 100644 --- a/myems-api/excelexporters/metertracking.py +++ b/myems-api/excelexporters/metertracking.py @@ -73,7 +73,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -135,43 +135,43 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['B6'].font = name_font ws['B6'].alignment = c_c_alignment ws['B6'].fill = table_fill - ws['B6'] = '名称' + ws['B6'] = 'Name' ws['C6'].border = f_border ws['C6'].alignment = c_c_alignment ws['C6'].font = name_font ws['C6'].fill = table_fill - ws['C6'] = '空间' + ws['C6'] = 'Space' ws['D6'].border = f_border ws['D6'].font = name_font ws['D6'].alignment = c_c_alignment ws['D6'].fill = table_fill - ws['D6'] = '成本中心' + ws['D6'] = 'Cost Center' ws['E6'].border = f_border ws['E6'].alignment = c_c_alignment ws['E6'].font = name_font ws['E6'].fill = table_fill - ws['E6'] = '能耗分类' + ws['E6'] = 'Energy Category' ws['F6'].border = f_border ws['F6'].font = name_font ws['F6'].alignment = c_c_alignment ws['F6'].fill = table_fill - ws['F6'] = ' 描述' + ws['F6'] = 'Description' ws['G6'].border = f_border ws['G6'].font = name_font ws['G6'].alignment = c_c_alignment ws['G6'].fill = table_fill - ws['G6'] = '开始值' + ws['G6'] = 'Start Value' ws['H6'].border = f_border ws['H6'].font = name_font ws['H6'].alignment = c_c_alignment ws['H6'].fill = table_fill - ws['H6'] = ' 结束值' + ws['H6'] = 'End Value' current_row_number = 7 for i in range(0, len(report['meters'])): diff --git a/myems-api/excelexporters/metertrend.py b/myems-api/excelexporters/metertrend.py index 18a410b7..b9b4a113 100644 --- a/myems-api/excelexporters/metertrend.py +++ b/myems-api/excelexporters/metertrend.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) data_font = Font(name='Franklin Gothic Book', size=11) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') @@ -199,14 +199,14 @@ def generate_excel(report, max_row = start_detail_data_row_num + len(time) ws['B6'].font = title_font - ws['B6'] = name + ' 趋势' + ws['B6'] = name + ' ' + '趋势' ws.row_dimensions[start_detail_data_row_num - 1].height = 60 ws['B' + str(start_detail_data_row_num - 1)].fill = table_fill ws['B' + str(start_detail_data_row_num - 1)].font = title_font ws['B' + str(start_detail_data_row_num - 1)].border = f_border ws['B' + str(start_detail_data_row_num - 1)].alignment = c_c_alignment - ws['B' + str(start_detail_data_row_num - 1)] = '日期时间' + ws['B' + str(start_detail_data_row_num - 1)] = 'Datetime' for i in range(0, len(time)): col = 'B' @@ -336,7 +336,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -392,7 +392,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/offlinemetercost.py b/myems-api/excelexporters/offlinemetercost.py index bbfec6d0..b3d5287e 100644 --- a/myems-api/excelexporters/offlinemetercost.py +++ b/myems-api/excelexporters/offlinemetercost.py @@ -76,7 +76,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -157,7 +157,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_cost_data_flag: ws['B6'].font = title_font - ws['B6'] = name + '报告期成本' + ws['B6'] = name + 'Reporting Period Costs' reporting_period_data = report['reporting_period'] category = report['offline_meter']['energy_category_name'] @@ -169,12 +169,12 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '成本' + ws['B8'] = 'Cost' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '环比' + ws['B9'] = 'Increment Rate' ws['B9'].border = f_border col = 'B' @@ -207,7 +207,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[tce_col + '7'].fill = table_fill ws[tce_col + '7'].font = name_font ws[tce_col + '7'].alignment = c_c_alignment - ws[tce_col + '7'] = "吨标准煤 (TCE)" + ws[tce_col + '7'] = 'Ton of Standard Coal (TCE)' ws[tce_col + '7'].border = f_border ws[tce_col + '8'].font = name_font @@ -226,7 +226,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[tco2e_col + '7'].fill = table_fill ws[tco2e_col + '7'].font = name_font ws[tco2e_col + '7'].alignment = c_c_alignment - ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)" + ws[tco2e_col + '7'] = 'Ton of Carbon Dioxide Emissions (TCO2E)' ws[tco2e_col + '7'].border = f_border ws[tco2e_col + '8'].font = name_font @@ -257,14 +257,14 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_cost_datail_flag: ws['B11'].font = title_font - ws['B11'] = name + '详细数据' + ws['B11'] = name + 'Detailed Data' ws.row_dimensions[18].height = 60 ws['B18'].fill = table_fill ws['B18'].font = title_font ws['B18'].border = f_border ws['B18'].alignment = c_c_alignment - ws['B18'] = '日期时间' + ws['B18'] = 'Datetime' time = times has_data = False max_row = 0 @@ -288,7 +288,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(end_data_row_number + 1)].font = title_font ws['B' + str(end_data_row_number + 1)].alignment = c_c_alignment - ws['B' + str(end_data_row_number + 1)] = '总计' + ws['B' + str(end_data_row_number + 1)] = 'Total' ws['B' + str(end_data_row_number + 1)].border = f_border for i in range(0, ca_len): @@ -319,7 +319,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[col + str(end_data_row_number + 1)].border = f_border line = LineChart() - line.title = '报告期成本 - ' + report['offline_meter']['energy_category_name'] + \ + line.title = 'Reporting Period Costs - ' + report['offline_meter']['energy_category_name'] + \ " (" + report['offline_meter']['unit_of_measure'] + ")" line_data = Reference(ws, min_col=3, min_row=18, max_row=max_row) line.series.append(Series(line_data, title_from_data=True)) diff --git a/myems-api/excelexporters/offlinemeterenergy.py b/myems-api/excelexporters/offlinemeterenergy.py index cbd2d402..00894e6b 100644 --- a/myems-api/excelexporters/offlinemeterenergy.py +++ b/myems-api/excelexporters/offlinemeterenergy.py @@ -73,7 +73,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -154,7 +154,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_energy_data_flag: ws['B6'].font = title_font - ws['B6'] = name + '能耗分析' + ws['B6'] = name + 'Consumption' reporting_period_data = report['reporting_period'] category = report['offline_meter']['energy_category_name'] @@ -167,12 +167,12 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '能耗' + ws['B8'] = 'Consumption' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '环比' + ws['B9'] = 'Increment Rate' ws['B9'].border = f_border col = '' @@ -206,7 +206,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[tce_col + '7'].fill = table_fill ws[tce_col + '7'].font = name_font ws[tce_col + '7'].alignment = c_c_alignment - ws[tce_col + '7'] = "吨标准煤 (TCE)" + ws[tce_col + '7'] = 'Ton of Standard Coal (TCE)' ws[tce_col + '7'].border = f_border ws[tce_col + '8'].font = name_font @@ -225,7 +225,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[tco2e_col + '7'].fill = table_fill ws[tco2e_col + '7'].font = name_font ws[tco2e_col + '7'].alignment = c_c_alignment - ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)" + ws[tco2e_col + '7'] = 'Ton of Carbon Dioxide Emissions (TCO2E)' ws[tco2e_col + '7'].border = f_border ws[tco2e_col + '8'].font = name_font @@ -257,7 +257,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ca_len = len(category) ws['B11'].font = title_font - ws['B11'] = name + '详细数据' + ws['B11'] = name + 'Detailed Data' ws.row_dimensions[18].height = 60 @@ -265,7 +265,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B18'].font = title_font ws['B18'].border = f_border ws['B18'].alignment = c_c_alignment - ws['B18'] = '日期时间' + ws['B18'] = 'Datetime' time = times has_data = False max_row = 0 @@ -304,7 +304,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[col + row].border = f_border line = LineChart() - line.title = '报告期消耗 - ' + report['offline_meter']['energy_category_name'] + \ + line.title = 'Reporting Period Consumption - ' + report['offline_meter']['energy_category_name'] + \ " (" + report['offline_meter']['unit_of_measure'] + ")" labels = Reference(ws, min_col=2, min_row=19, max_row=max_row) bar_data = Reference(ws, min_col=3, min_row=18, max_row=max_row) @@ -328,7 +328,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[col + row].font = title_font ws[col + row].alignment = c_c_alignment - ws[col + row] = '总计' + ws[col + row] = 'Total' ws[col + row].border = f_border for i in range(0, ca_len): diff --git a/myems-api/excelexporters/shopfloorbatch.py b/myems-api/excelexporters/shopfloorbatch.py index cf89ca5b..2cbe8c96 100644 --- a/myems-api/excelexporters/shopfloorbatch.py +++ b/myems-api/excelexporters/shopfloorbatch.py @@ -73,7 +73,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) data_font = Font(name='Franklin Gothic Book', size=11) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') @@ -116,7 +116,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment - ws['B3'] = '空间:' + ws['B3'] = 'Space:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment ws['C3'].font = name_font @@ -124,7 +124,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['F3'].font = name_font ws['F3'].alignment = b_r_alignment - ws['F3'] = '日期:' + ws['F3'] = 'Datetime:' ws['G3'].border = b_border ws['G3'].alignment = b_c_alignment ws['G3'].font = name_font @@ -136,13 +136,13 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['B6'].font = name_font ws['B6'].alignment = c_c_alignment ws['B6'].fill = table_fill - ws['B6'] = '名称' + ws['B6'] = 'Name' ws['C6'].border = f_border ws['C6'].alignment = c_c_alignment ws['C6'].font = name_font ws['C6'].fill = table_fill - ws['C6'] = '空间' + ws['C6'] = 'Space' ca_len = len(report['energycategories']) diff --git a/myems-api/excelexporters/shopfloorcost.py b/myems-api/excelexporters/shopfloorcost.py index 47b30846..d440c0fd 100644 --- a/myems-api/excelexporters/shopfloorcost.py +++ b/myems-api/excelexporters/shopfloorcost.py @@ -1,6 +1,7 @@ import base64 import uuid import os +from decimal import Decimal from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image @@ -83,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -166,7 +167,7 @@ def generate_excel(report, if has_energy_data_flag: ws['B6'].font = title_font - ws['B6'] = name + ' 报告期成本' + ws['B6'] = name + ' ' + 'Reporting Period Costs' category = reporting_period_data['names'] ca_len = len(category) @@ -177,17 +178,17 @@ def generate_excel(report, ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '成本' + ws['B8'] = 'Cost' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '单位面积值' + ws['B9'] = 'Per Unit Area' ws['B9'].border = f_border ws['B10'].font = title_font ws['B10'].alignment = c_c_alignment - ws['B10'] = '环比' + ws['B10'] = 'Increment Rate' ws['B10'].border = f_border col = 'B' @@ -220,7 +221,7 @@ def generate_excel(report, ws[end_col + '7'].fill = table_fill ws[end_col + '7'].font = name_font ws[end_col + '7'].alignment = c_c_alignment - ws[end_col + '7'] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[end_col + '7'] = "Total (" + reporting_period_data['total_unit'] + ")" ws[end_col + '7'].border = f_border ws[end_col + '8'].font = name_font @@ -253,7 +254,7 @@ def generate_excel(report, if has_ele_peak_flag: ws['B12'].font = title_font - ws['B12'] = name + '分时用电成本' + ws['B12'] = name + 'Electricity Cost by Time-Of-Use' ws['B13'].fill = table_fill ws['B13'].font = name_font @@ -264,20 +265,20 @@ def generate_excel(report, ws['C13'].font = name_font ws['C13'].alignment = c_c_alignment ws['C13'].border = f_border - ws['C13'] = '分时用电成本' + ws['C13'] = 'Electricity Cost by Time-Of-Use' ws['D13'].fill = table_fill ws['D13'].font = name_font ws['D13'].alignment = c_c_alignment ws['D13'].border = f_border - ws['D13'] = '分时用电成本占比' + ws['D13'] = 'Electricity Cost Proportion by Time-Of-Use' wssum = round(reporting_period_data['toppeaks'][0], 2) + round(reporting_period_data['onpeaks'][0], 2) + round( reporting_period_data['midpeaks'][0], 2) + round(reporting_period_data['offpeaks'][0], 2) ws['B14'].font = title_font ws['B14'].alignment = c_c_alignment - ws['B14'] = '尖' + ws['B14'] = 'TopPeak' ws['B14'].border = f_border ws['C14'].font = title_font @@ -293,7 +294,7 @@ def generate_excel(report, ws['B15'].font = title_font ws['B15'].alignment = c_c_alignment - ws['B15'] = '峰' + ws['B15'] = 'OnPeak' ws['B15'].border = f_border ws['C15'].font = title_font @@ -309,7 +310,7 @@ def generate_excel(report, ws['B16'].font = title_font ws['B16'].alignment = c_c_alignment - ws['B16'] = '平' + ws['B16'] = 'MidPeak' ws['B16'].border = f_border ws['C16'].font = title_font @@ -325,7 +326,7 @@ def generate_excel(report, ws['B17'].font = title_font ws['B17'].alignment = c_c_alignment - ws['B17'] = '谷' + ws['B17'] = 'OffPeak' ws['B17'].border = f_border ws['C17'].font = title_font @@ -340,7 +341,7 @@ def generate_excel(report, if wssum is not None and wssum != 0 else "0.00%" pie = PieChart() - pie.title = name + '分时用电成本' + pie.title = name + 'Electricity Cost by Time-Of-Use' labels = Reference(ws, min_col=2, min_row=14, max_row=17) pie_data = Reference(ws, min_col=3, min_row=13, max_row=17) pie.add_data(pie_data, titles_from_data=True) @@ -370,7 +371,7 @@ def generate_excel(report, if has_subtotals_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 成本占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Costs Proportion' current_row_number += 1 @@ -385,13 +386,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '成本' + ws['C' + str(current_row_number)] = 'Cost' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '成本占比' + ws['D' + str(current_row_number)] = 'Costs Proportion' current_row_number += 1 @@ -421,7 +422,7 @@ def generate_excel(report, table_end_row_number = current_row_number - 1 pie = PieChart() - pie.title = name + ' 成本占比' + pie.title = name + ' ' + 'Costs Proportion' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -469,7 +470,7 @@ def generate_excel(report, parameters_parameters_datas_len += 1 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 3 current_row_number = detail_data_table_start_row_number @@ -487,7 +488,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].border = f_border ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'B' @@ -506,7 +507,7 @@ def generate_excel(report, ws[end_col + str(current_row_number)].fill = table_fill ws[end_col + str(current_row_number)].font = title_font ws[end_col + str(current_row_number)].alignment = c_c_alignment - ws[end_col + str(current_row_number)] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[end_col + str(current_row_number)] = "Total (" + reporting_period_data['total_unit'] + ")" ws[end_col + str(current_row_number)].border = f_border current_row_number += 1 @@ -519,7 +520,7 @@ def generate_excel(report, col = 'B' - periodic_sum = 0.0 + periodic_sum = Decimal(0.0) for j in range(0, ca_len): col = chr(ord('C') + j) @@ -543,7 +544,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' ws['B' + str(current_row_number)].border = f_border col = 'B' @@ -557,7 +558,7 @@ def generate_excel(report, # line line = LineChart() - line.title = '报告期成本 - ' + \ + line.title = 'Reporting Period Costs - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1, max_row=table_end_row_number) @@ -678,7 +679,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -734,7 +735,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/shopfloorenergycategory.py b/myems-api/excelexporters/shopfloorenergycategory.py index 49d40630..464b31dd 100644 --- a/myems-api/excelexporters/shopfloorenergycategory.py +++ b/myems-api/excelexporters/shopfloorenergycategory.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -156,7 +156,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 能耗分析 + # First: Consumption # 6: title # 7: table title # 8~10 table_data @@ -173,7 +173,7 @@ def generate_excel(report, if has_energy_data_flag: ws['B6'].font = title_font - ws['B6'] = name+' 能耗分析' + ws['B6'] = name + ' ' + 'Consumption' category = reporting_period_data['names'] ca_len = len(category) @@ -184,17 +184,17 @@ def generate_excel(report, ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '能耗' + ws['B8'] = 'Consumption' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '单位面积能耗' + ws['B9'] = 'Per Unit Area' ws['B9'].border = f_border ws['B10'].font = title_font ws['B10'].alignment = c_c_alignment - ws['B10'] = '环比' + ws['B10'] = 'Increment Rate' ws['B10'].border = f_border col = '' @@ -232,7 +232,7 @@ def generate_excel(report, ws[tce_col + '7'].fill = table_fill ws[tce_col + '7'].font = name_font ws[tce_col + '7'].alignment = c_c_alignment - ws[tce_col + '7'] = "吨标准煤 (TCE)" + ws[tce_col + '7'] = 'Ton of Standard Coal (TCE)' ws[tce_col + '7'].border = f_border ws[tce_col + '8'].font = name_font @@ -256,7 +256,7 @@ def generate_excel(report, ws[tco2e_col + '7'].fill = table_fill ws[tco2e_col + '7'].font = name_font ws[tco2e_col + '7'].alignment = c_c_alignment - ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)" + ws[tco2e_col + '7'] = 'Ton of Carbon Dioxide Emissions (TCO2E)' ws[tco2e_col + '7'].border = f_border ws[tco2e_col + '8'].font = name_font @@ -278,7 +278,7 @@ def generate_excel(report, for i in range(6, 10 + 1): ws.row_dimensions[i].height = 0.1 #################################################################################################################### - # Second: 分时电耗 + # Second: Electricity Consumption by Time-Of-Use # 12: title # 13: table title # 14~17 table_data @@ -292,7 +292,7 @@ def generate_excel(report, if has_ele_peak_flag: ws['B12'].font = title_font - ws['B12'] = name+' 分时电耗' + ws['B12'] = name + ' ' + 'Electricity Consumption by Time-Of-Use' ws.row_dimensions[13].height = 60 ws['B13'].fill = table_fill @@ -304,11 +304,11 @@ def generate_excel(report, ws['C13'].font = name_font ws['C13'].alignment = c_c_alignment ws['C13'].border = f_border - ws['C13'] = '分时电耗' + ws['C13'] = 'Electricity Consumption by Time-Of-Use' ws['B14'].font = title_font ws['B14'].alignment = c_c_alignment - ws['B14'] = '尖' + ws['B14'] = 'TopPeak' ws['B14'].border = f_border ws['C14'].font = title_font @@ -318,7 +318,7 @@ def generate_excel(report, ws['B15'].font = title_font ws['B15'].alignment = c_c_alignment - ws['B15'] = '峰' + ws['B15'] = 'OnPeak' ws['B15'].border = f_border ws['C15'].font = title_font @@ -328,7 +328,7 @@ def generate_excel(report, ws['B16'].font = title_font ws['B16'].alignment = c_c_alignment - ws['B16'] = '平' + ws['B16'] = 'MidPeak' ws['B16'].border = f_border ws['C16'].font = title_font @@ -338,7 +338,7 @@ def generate_excel(report, ws['B17'].font = title_font ws['B17'].alignment = c_c_alignment - ws['B17'] = '谷' + ws['B17'] = 'OffPeak' ws['B17'].border = f_border ws['C17'].font = title_font @@ -347,7 +347,7 @@ def generate_excel(report, ws['C17'] = round(reporting_period_data['offpeaks'][0], 2) pie = PieChart() - pie.title = name+' 分时电耗' + pie.title = name + ' ' + 'Electricity Consumption by Time-Of-Use' labels = Reference(ws, min_col=2, min_row=14, max_row=17) pie_data = Reference(ws, min_col=3, min_row=13, max_row=17) pie.add_data(pie_data, titles_from_data=True) @@ -367,7 +367,7 @@ def generate_excel(report, ws.row_dimensions[i].height = 0.1 #################################################################################################################### - # Fourth: 能耗详情 + # Fourth: Detailed Data # current_row_number: title # current_row_number+1 ~ current_row_number+1+ca_len*6-1: line # current_row_number+1+ca_len*6: table title @@ -393,14 +393,14 @@ def generate_excel(report, if has_detail_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name+' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' ws.row_dimensions[table_row].height = 60 ws['B'+str(table_row)].fill = table_fill ws['B' + str(table_row)].font = title_font ws['B'+str(table_row)].border = f_border ws['B'+str(table_row)].alignment = c_c_alignment - ws['B'+str(table_row)] = '日期时间' + ws['B'+str(table_row)] = 'Datetime' time = times[0] has_data = False max_row = 0 @@ -447,7 +447,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -459,7 +459,7 @@ def generate_excel(report, # line # 39~: line line = LineChart() - line.title = '报告期消耗 - ' + ws.cell(column=3+i, row=table_row).value + line.title = 'Reporting Period Consumption - ' + ws.cell(column=3+i, row=table_row).value labels = Reference(ws, min_col=2, min_row=table_row+1, max_row=max_row) line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) # openpyxl bug line.add_data(line_data, titles_from_data=True) @@ -565,7 +565,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -621,7 +621,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/shopfloorenergyitem.py b/myems-api/excelexporters/shopfloorenergyitem.py index 5d16c31f..b61a511e 100644 --- a/myems-api/excelexporters/shopfloorenergyitem.py +++ b/myems-api/excelexporters/shopfloorenergyitem.py @@ -82,7 +82,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -168,7 +168,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期消耗' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Consumption' current_row_number += 1 @@ -214,7 +214,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '单位面积值' + ws['B' + str(current_row_number)] = 'Per Unit Area' col = 'C' @@ -231,7 +231,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -253,8 +253,8 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)] = \ - name + ' ' + category_dict_name + ' (' + reporting_period_data['units'][category_dict_values[0]] + \ - ') 分项消耗占比' + name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ + ') by Energy Item' current_row_number += 1 table_start_row_number = current_row_number @@ -287,8 +287,8 @@ def generate_excel(report, pie = PieChart() pie.title = \ - name + ' ' + category_dict_name + ' (' + reporting_period_data['units'][category_dict_values[0]] + \ - ') 分项消耗占比' + name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ + ') by Energy Item' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -332,7 +332,7 @@ def generate_excel(report, parameters_parameters_datas_len = 0 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' for i in range(0, parameters_names_len): if len(report['parameters']['timestamps'][i]) == 0: @@ -346,7 +346,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -383,7 +383,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -419,7 +419,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期消耗 - ' + \ + line.title = 'Reporting Period Consumption - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -528,7 +528,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -584,7 +584,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/shopfloorload.py b/myems-api/excelexporters/shopfloorload.py index 1d886b22..982ffbd8 100644 --- a/myems-api/excelexporters/shopfloorload.py +++ b/myems-api/excelexporters/shopfloorload.py @@ -82,7 +82,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -152,7 +152,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 统计分析 + # First: Statistics # 6: title # 7: table title # 8~ca_len table_data @@ -167,7 +167,7 @@ def generate_excel(report, return filename ws['B6'].font = title_font - ws['B6'] = name + ' 统计分析' + ws['B6'] = name + ' ' + 'Statistics' category = reporting_period_data['names'] @@ -175,22 +175,22 @@ def generate_excel(report, ws['B7'].fill = table_fill ws['B7'].font = title_font ws['B7'].alignment = c_c_alignment - ws['B7'] = '报告期' + ws['B7'] = 'Reporting Period' ws['B7'].border = f_border ws['C7'].font = title_font ws['C7'].alignment = c_c_alignment - ws['C7'] = '平均负荷' + ws['C7'] = 'Average Load' ws['C7'].border = f_border ws['D7'].font = title_font ws['D7'].alignment = c_c_alignment - ws['D7'] = '最大负荷' + ws['D7'] = 'Maximum Load' ws['D7'].border = f_border ws['E7'].font = title_font ws['E7'].alignment = c_c_alignment - ws['E7'] = '负荷系数' + ws['E7'] = 'Load Factor' ws['E7'].border = f_border # table_data @@ -204,7 +204,7 @@ def generate_excel(report, ws['B' + str(row + 1)].font = name_font ws['B' + str(row + 1)].alignment = c_c_alignment - ws['B' + str(row + 1)] = "环比" + ws['B' + str(row + 1)] = 'Increment Rate' ws['B' + str(row + 1)].border = f_border ws['C' + str(row)].font = name_font @@ -247,7 +247,7 @@ def generate_excel(report, ws['E' + str(row + 1)].border = f_border #################################################################################################################### - # Second: 报告期单位面积消耗 + # Second: Per Unit Area # 9 + ca_len * 2: title # 10 + ca_len * 2: table title # per_unit_area_start_row_number + 2 ~ per_unit_area_start_row_number + 2 + ca_len : table_data @@ -258,7 +258,7 @@ def generate_excel(report, per_unit_area_start_row_number = 9 + ca_len * 2 ws['B' + str(per_unit_area_start_row_number)].font = title_font - ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['shopfloor']['area']) + 'M²' + ws['B' + str(per_unit_area_start_row_number)] = name + ' ' + 'Per Unit Area' + str(report['shopfloor']['area']) + 'M²' category = reporting_period_data['names'] @@ -266,17 +266,17 @@ def generate_excel(report, ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' + ws['B' + str(per_unit_area_start_row_number + 1)] = 'Reporting Period' ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['C' + str(per_unit_area_start_row_number + 1)] = '平均负荷' + ws['C' + str(per_unit_area_start_row_number + 1)] = 'Average Load' ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['D' + str(per_unit_area_start_row_number + 1)] = '最大负荷' + ws['D' + str(per_unit_area_start_row_number + 1)] = 'Maximum Load' ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border # table_data @@ -306,7 +306,7 @@ def generate_excel(report, ws['D' + str(row_data)].number_format = '0.00' #################################################################################################################### - # Third: 详细数据 + # Third: Detailed Data # analysis_end_row_number~ analysis_end_row_number + 6*cal_len: line # detailed_start_row_number: table title # detailed_start_row_number + 1~: table_data @@ -333,12 +333,12 @@ def generate_excel(report, detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' # table_title ws['B' + str(detail_data_table_start_row_number)].fill = table_fill ws['B' + str(detail_data_table_start_row_number)].font = name_font ws['B' + str(detail_data_table_start_row_number)].alignment = c_c_alignment - ws['B' + str(detail_data_table_start_row_number)] = "日期时间" + ws['B' + str(detail_data_table_start_row_number)] = "Datetime" ws['B' + str(detail_data_table_start_row_number)].border = f_border for i in range(0, ca_len): @@ -348,13 +348,13 @@ def generate_excel(report, ws[col_average + str(detail_data_table_start_row_number)].font = name_font ws[col_average + str(detail_data_table_start_row_number)].alignment = c_c_alignment ws[col_average + str(detail_data_table_start_row_number)] = \ - names[i] + " 平均负荷(" + reporting_period_data['units'][i] + "/H)" + names[i] + " Average Load(" + reporting_period_data['units'][i] + "/H)" ws[col_average + str(detail_data_table_start_row_number)].border = f_border ws[col_maximum + str(detail_data_table_start_row_number)].font = name_font ws[col_maximum + str(detail_data_table_start_row_number)].alignment = c_c_alignment ws[col_maximum + str(detail_data_table_start_row_number)] = \ - names[i] + " 最大负荷(" + reporting_period_data['units'][i] + "/H)" + names[i] + " Maximum Load(" + reporting_period_data['units'][i] + "/H)" ws[col_maximum + str(detail_data_table_start_row_number)].border = f_border # table_date for i in range(0, time_len): @@ -390,7 +390,7 @@ def generate_excel(report, #################################################################################################################### for i in range(0, ca_len): line = LineChart() - line.title = "报告期 最大负荷 - " + names[i] + "(" + reporting_period_data['units'][i] + ")" + line.title = "Reporting Period Maximum Load - " + names[i] + "(" + reporting_period_data['units'][i] + ")" line.style = 10 line.x_axis.majorTickMark = 'in' line.y_axis.majorTickMark = 'in' @@ -501,7 +501,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -557,7 +557,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/shopfloorsaving.py b/myems-api/excelexporters/shopfloorsaving.py index 6fb2a58c..2bc601e7 100644 --- a/myems-api/excelexporters/shopfloorsaving.py +++ b/myems-api/excelexporters/shopfloorsaving.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -171,7 +171,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期节约' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Savings' current_row_number += 1 @@ -190,7 +190,7 @@ def generate_excel(report, ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border ws[col + str(current_row_number)] = \ - reporting_period_data['names'][i] + " (基线-实际) (" + reporting_period_data['units'][i] + ")" + reporting_period_data['names'][i] + " (Baseline - Actual) (" + reporting_period_data['units'][i] + ")" col = chr(ord(col) + 1) @@ -198,7 +198,7 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '吨标准煤 (基线-实际) (TCE)' + ws[col + str(current_row_number)] = 'Ton of Standard Coal (Baseline - Actual) (TCE)' col = chr(ord(col) + 1) @@ -206,7 +206,7 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '吨二氧化碳排放 (基线-实际) (TCO2E)' + ws[col + str(current_row_number)] = 'Ton of Carbon Dioxide Emissions (Baseline - Actual) (TCO2E)' col = chr(ord(col) + 1) @@ -215,7 +215,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '节约' + ws['B' + str(current_row_number)] = 'Savings' col = 'C' @@ -246,7 +246,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '单位面积值' + ws['B' + str(current_row_number)] = 'Per Unit Area' col = 'C' @@ -278,7 +278,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -313,7 +313,7 @@ def generate_excel(report, current_row_number += 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨标准煤(TCE)占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -327,13 +327,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '节约' + ws['C' + str(current_row_number)] = 'Savings' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '吨标准煤(TCE) 节约占比' + ws['D' + str(current_row_number)] = 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 @@ -367,7 +367,7 @@ def generate_excel(report, current_row_number += 1 pie = PieChart() - pie.title = name + ' 吨标准煤(TCE)占比' + pie.title = name + ' ' + 'Ton of Standard Coal(TCE) by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -382,7 +382,7 @@ def generate_excel(report, ws.add_chart(pie, 'E' + str(chart_start_row_number)) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨二氧化碳排放(TCO2E)占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -396,13 +396,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '节约' + ws['C' + str(current_row_number)] = 'Savings' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '吨二氧化碳排放(TCO2E) 节约占比' + ws['D' + str(current_row_number)] = 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 @@ -436,7 +436,7 @@ def generate_excel(report, current_row_number += 1 pie = PieChart() - pie.title = name + ' 吨二氧化碳排放(TCO2E)占比' + pie.title = name + ' ' + 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -475,7 +475,7 @@ def generate_excel(report, parameters_parameters_datas_len = 0 ws['B' + str(current_row_number - 1)].font = title_font - ws['B' + str(current_row_number - 1)] = name + ' 详细数据' + ws['B' + str(current_row_number - 1)] = name + ' ' + 'Detailed Data' for i in range(0, parameters_names_len): if len(report['parameters']['timestamps'][i]) == 0: @@ -490,7 +490,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -527,7 +527,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -563,7 +563,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期节约 - ' + \ + line.title = 'Reporting Period Savings - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -673,7 +673,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -729,7 +729,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/shopfloorstatistics.py b/myems-api/excelexporters/shopfloorstatistics.py index 3d5bbe32..30587021 100644 --- a/myems-api/excelexporters/shopfloorstatistics.py +++ b/myems-api/excelexporters/shopfloorstatistics.py @@ -82,7 +82,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -150,7 +150,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 统计分析 + # First: Statistics # 6: title # 7: table title # 8~ca_len table_data @@ -165,7 +165,7 @@ def generate_excel(report, return filename ws['B6'].font = title_font - ws['B6'] = name + ' 统计分析' + ws['B6'] = name + ' ' + 'Statistics' category = reporting_period_data['names'] @@ -173,37 +173,37 @@ def generate_excel(report, ws['B7'].fill = table_fill ws['B7'].font = title_font ws['B7'].alignment = c_c_alignment - ws['B7'] = '报告期' + ws['B7'] = 'Reporting Period' ws['B7'].border = f_border ws['C7'].font = title_font ws['C7'].alignment = c_c_alignment - ws['C7'] = '算术平均数' + ws['C7'] = 'Arithmetic Mean' ws['C7'].border = f_border ws['D7'].font = title_font ws['D7'].alignment = c_c_alignment - ws['D7'] = '中位数' + ws['D7'] = 'Median (Middle Value)' ws['D7'].border = f_border ws['E7'].font = title_font ws['E7'].alignment = c_c_alignment - ws['E7'] = '最小值' + ws['E7'] = 'Minimum Value' ws['E7'].border = f_border ws['F7'].font = title_font ws['F7'].alignment = c_c_alignment - ws['F7'] = '最大值' + ws['F7'] = 'Maximum Value' ws['F7'].border = f_border ws['G7'].font = title_font ws['G7'].alignment = c_c_alignment - ws['G7'] = '样本标准差' + ws['G7'] = 'Sample Standard Deviation' ws['G7'].border = f_border ws['H7'].font = title_font ws['H7'].alignment = c_c_alignment - ws['H7'] = '样本方差' + ws['H7'] = 'Sample Variance' ws['H7'].border = f_border # table_data @@ -217,7 +217,7 @@ def generate_excel(report, ws['B' + str(row + 1)].font = name_font ws['B' + str(row + 1)].alignment = c_c_alignment - ws['B' + str(row + 1)] = "环比" + ws['B' + str(row + 1)] = 'Increment Rate' ws['B' + str(row + 1)].border = f_border ws['C' + str(row)].font = name_font @@ -298,7 +298,7 @@ def generate_excel(report, if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' ws['H' + str(row + 1)].border = f_border #################################################################################################################### - # Second: 报告期消耗 + # Second: Reporting Period Consumption # 9 + ca_len * 2: title # 10 + ca_len * 2: table title # per_unit_area_start_row_number + 2 ~ per_unit_area_start_row_number + 2 + ca_len : table_data @@ -310,7 +310,7 @@ def generate_excel(report, per_unit_area_start_row_number = 9 + ca_len * 2 ws['B' + str(per_unit_area_start_row_number)].font = title_font - ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['shopfloor']['area']) + 'M²' + ws['B' + str(per_unit_area_start_row_number)] = name + ' ' + 'Per Unit Area' + str(report['shopfloor']['area']) + 'M²' category = reporting_period_data['names'] @@ -318,37 +318,37 @@ def generate_excel(report, ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' + ws['B' + str(per_unit_area_start_row_number + 1)] = 'Reporting Period' ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['C' + str(per_unit_area_start_row_number + 1)] = '算术平均数' + ws['C' + str(per_unit_area_start_row_number + 1)] = 'Arithmetic Mean' ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['D' + str(per_unit_area_start_row_number + 1)] = '中位数' + ws['D' + str(per_unit_area_start_row_number + 1)] = 'Median (Middle Value)' ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border ws['E' + str(per_unit_area_start_row_number + 1)].font = title_font ws['E' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['E' + str(per_unit_area_start_row_number + 1)] = '最小值' + ws['E' + str(per_unit_area_start_row_number + 1)] = 'Minimum Value' ws['E' + str(per_unit_area_start_row_number + 1)].border = f_border ws['F' + str(per_unit_area_start_row_number + 1)].font = title_font ws['F' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['F' + str(per_unit_area_start_row_number + 1)] = '最大值' + ws['F' + str(per_unit_area_start_row_number + 1)] = 'Maximum Value' ws['F' + str(per_unit_area_start_row_number + 1)].border = f_border ws['G' + str(per_unit_area_start_row_number + 1)].font = title_font ws['G' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['G' + str(per_unit_area_start_row_number + 1)] = '样本标准差' + ws['G' + str(per_unit_area_start_row_number + 1)] = 'Sample Standard Deviation' ws['G' + str(per_unit_area_start_row_number + 1)].border = f_border ws['H' + str(per_unit_area_start_row_number + 1)].font = title_font ws['H' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['H' + str(per_unit_area_start_row_number + 1)] = '样本方差' + ws['H' + str(per_unit_area_start_row_number + 1)] = 'Sample Variance' ws['H' + str(per_unit_area_start_row_number + 1)].border = f_border # table_data @@ -410,7 +410,7 @@ def generate_excel(report, ws['H' + str(row_data)].number_format = '0.00' #################################################################################################################### - # Third: 详细数据 + # Third: Detailed Data # detailed_start_row_number~ detailed_start_row_number+time_len: line # detailed_start_row_number+1: table title # i + analysis_end_row_number + 2 + 6 * ca_len~: table_data @@ -438,12 +438,12 @@ def generate_excel(report, detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' # table_title ws['B' + str(detail_data_table_start_row_number)].fill = table_fill ws['B' + str(detail_data_table_start_row_number)].font = name_font ws['B' + str(detail_data_table_start_row_number)].alignment = c_c_alignment - ws['B' + str(detail_data_table_start_row_number)] = "时间" + ws['B' + str(detail_data_table_start_row_number)] = 'Datetime' ws['B' + str(detail_data_table_start_row_number)].border = f_border for i in range(0, ca_len): @@ -472,11 +472,11 @@ def generate_excel(report, ws[col + str(rows)].number_format = '0.00' ws[col + str(rows)].border = f_border - # 小计 + # Subtotal row_subtotals = detail_data_table_start_row_number + 1 + time_len ws['B' + str(row_subtotals)].font = name_font ws['B' + str(row_subtotals)].alignment = c_c_alignment - ws['B' + str(row_subtotals)] = "小计" + ws['B' + str(row_subtotals)] = 'Subtotal' ws['B' + str(row_subtotals)].border = f_border for i in range(0, ca_len): @@ -496,7 +496,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = "报告期消耗" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" + line.title = "Reporting Period Consumption" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" line.style = 10 line.x_axis.majorTickMark = 'in' line.y_axis.majorTickMark = 'in' @@ -606,7 +606,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -662,7 +662,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/spacecost.py b/myems-api/excelexporters/spacecost.py index 99e17752..a4d74096 100644 --- a/myems-api/excelexporters/spacecost.py +++ b/myems-api/excelexporters/spacecost.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -169,7 +169,7 @@ def generate_excel(report, if has_cost_data_flag: ws['B6'].font = title_font - ws['B6'] = name + ' 报告期成本' + ws['B6'] = name + ' ' + 'Reporting Period Costs' category = reporting_period_data['names'] ca_len = len(category) @@ -180,17 +180,17 @@ def generate_excel(report, ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '成本' + ws['B8'] = 'Cost' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '单位面积值' + ws['B9'] = 'Per Unit Area' ws['B9'].border = f_border ws['B10'].font = title_font ws['B10'].alignment = c_c_alignment - ws['B10'] = '环比' + ws['B10'] = 'Increment Rate' ws['B10'].border = f_border col = '' @@ -225,7 +225,7 @@ def generate_excel(report, ws[col + '7'].fill = table_fill ws[col + '7'].font = name_font ws[col + '7'].alignment = c_c_alignment - ws[col + '7'] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[col + '7'] = "Total (" + reporting_period_data['total_unit'] + ")" ws[col + '7'].border = f_border ws[col + '8'].font = name_font @@ -258,7 +258,7 @@ def generate_excel(report, if has_ele_peak_flag: ws['B12'].font = title_font - ws['B12'] = name + ' 分时用电成本' + ws['B12'] = name + ' ' + 'Electricity Cost by Time-Of-Use' ws.row_dimensions[13].height = 60 ws['B13'].fill = table_fill @@ -270,11 +270,11 @@ def generate_excel(report, ws['C13'].font = name_font ws['C13'].alignment = c_c_alignment ws['C13'].border = f_border - ws['C13'] = '分时用电成本' + ws['C13'] = 'Electricity Cost by Time-Of-Use' ws['B14'].font = title_font ws['B14'].alignment = c_c_alignment - ws['B14'] = '尖' + ws['B14'] = 'TopPeak' ws['B14'].border = f_border ws['C14'].font = title_font @@ -284,7 +284,7 @@ def generate_excel(report, ws['B15'].font = title_font ws['B15'].alignment = c_c_alignment - ws['B15'] = '峰' + ws['B15'] = 'OnPeak' ws['B15'].border = f_border ws['C15'].font = title_font @@ -294,7 +294,7 @@ def generate_excel(report, ws['B16'].font = title_font ws['B16'].alignment = c_c_alignment - ws['B16'] = '平' + ws['B16'] = 'MidPeak' ws['B16'].border = f_border ws['C16'].font = title_font @@ -304,7 +304,7 @@ def generate_excel(report, ws['B17'].font = title_font ws['B17'].alignment = c_c_alignment - ws['B17'] = '谷' + ws['B17'] = 'OffPeak' ws['B17'].border = f_border ws['C17'].font = title_font @@ -313,7 +313,7 @@ def generate_excel(report, ws['C17'] = round(reporting_period_data['offpeaks'][0], 2) pie = PieChart() - pie.title = name + '分时用电成本' + pie.title = name + 'Electricity Cost by Time-Of-Use' labels = Reference(ws, min_col=2, min_row=14, max_row=17) pie_data = Reference(ws, min_col=3, min_row=13, max_row=17) pie.add_data(pie_data, titles_from_data=True) @@ -344,7 +344,7 @@ def generate_excel(report, if has_subtotals_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 成本占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Costs Proportion' current_row_number += 1 table_start_row_number = current_row_number @@ -358,7 +358,7 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '成本占比' + ws['C' + str(current_row_number)] = 'Costs Proportion' current_row_number += 1 @@ -382,7 +382,7 @@ def generate_excel(report, table_end_row_number = current_row_number - 1 pie = PieChart() - pie.title = name + ' 成本占比' + pie.title = name + ' ' + 'Costs Proportion' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -418,14 +418,14 @@ def generate_excel(report, if has_detail_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' ws.row_dimensions[table_row].height = 60 ws['B' + str(table_row)].fill = table_fill ws['B' + str(table_row)].font = title_font ws['B' + str(table_row)].border = f_border ws['B' + str(table_row)].alignment = c_c_alignment - ws['B' + str(table_row)] = '日期时间' + ws['B' + str(table_row)] = 'Datetime' time = times[0] has_data = False max_row = 0 @@ -466,7 +466,7 @@ def generate_excel(report, line = LineChart() line.title = \ - '报告期成本 - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + 'Reporting Period Costs - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_row + 1, max_row=max_row) line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) line.add_data(line_data, titles_from_data=True) @@ -490,7 +490,7 @@ def generate_excel(report, ws['B' + row].font = title_font ws['B' + row].alignment = c_c_alignment - ws['B' + row] = '小计' + ws['B' + row] = 'Subtotal' ws['B' + row].border = f_border col = '' @@ -508,7 +508,7 @@ def generate_excel(report, ws[col + str(table_row)].fill = table_fill ws[col + str(table_row)].font = title_font ws[col + str(table_row)].alignment = c_c_alignment - ws[col + str(table_row)] = '总计 (' + report['reporting_period']['total_unit'] + ')' + ws[col + str(table_row)] = 'Total (' + report['reporting_period']['total_unit'] + ')' ws[col + str(table_row)].border = f_border total_sum = 0 @@ -546,7 +546,7 @@ def generate_excel(report, child = report['child_space'] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 子空间数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Child Spaces Data' current_row_number += 1 table_start_row_number = current_row_number @@ -556,7 +556,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = name_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '子空间' + ws['B' + str(current_row_number)] = 'Child Space' ca_len = len(child['energy_category_names']) col = '' @@ -567,14 +567,14 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = child['energy_category_names'][i] + ' (' + child['units'][i] + ')' + ws[col + str(current_row_number)] = child['energy_category_names'][i] + ' ' + '(' + child['units'][i] + ')' col = chr(ord(col) + 1) ws[col + str(current_row_number)].fill = table_fill ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '总计 (' + report['reporting_period']['total_unit'] + ')' + ws[col + str(current_row_number)] = 'Total (' + report['reporting_period']['total_unit'] + ')' space_len = len(child['child_space_names_array'][0]) @@ -722,7 +722,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -778,7 +778,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/spaceefficiency.py b/myems-api/excelexporters/spaceefficiency.py index 6114f6e1..75ae3aac 100644 --- a/myems-api/excelexporters/spaceefficiency.py +++ b/myems-api/excelexporters/spaceefficiency.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -170,7 +170,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期累积效率' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Cumulative Efficiency' current_row_number += 1 @@ -198,7 +198,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '累积效率' + ws['B' + str(current_row_number)] = 'Cumulative Efficiency' col = 'C' @@ -216,7 +216,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -273,7 +273,7 @@ def generate_excel(report, time = reporting_period_data['timestamps'][0] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期累积效率' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Cumulative Efficiency' current_row_number += 1 @@ -287,7 +287,7 @@ def generate_excel(report, current_row_number += 6*real_timestamps_len + 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 @@ -298,7 +298,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -335,7 +335,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -372,7 +372,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期累积效率 - ' + \ + line.title = 'Reporting Period Cumulative Efficiency - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -465,7 +465,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -521,7 +521,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/spaceenergycategory.py b/myems-api/excelexporters/spaceenergycategory.py index 76fe2a8c..b4c76c02 100644 --- a/myems-api/excelexporters/spaceenergycategory.py +++ b/myems-api/excelexporters/spaceenergycategory.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -169,7 +169,7 @@ def generate_excel(report, if has_energy_data_flag: ws['B6'].font = title_font - ws['B6'] = name+' 报告期消耗' + ws['B6'] = name + ' ' + 'Reporting Period Consumption' category = reporting_period_data['names'] ca_len = len(category) @@ -179,17 +179,17 @@ def generate_excel(report, ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '能耗' + ws['B8'] = 'Consumption' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '单位面积值' + ws['B9'] = 'Per Unit Area' ws['B9'].border = f_border ws['B10'].font = title_font ws['B10'].alignment = c_c_alignment - ws['B10'] = '环比' + ws['B10'] = 'Increment Rate' ws['B10'].border = f_border col = 'B' @@ -225,7 +225,7 @@ def generate_excel(report, ws[tce_col + '7'].fill = table_fill ws[tce_col + '7'].font = name_font ws[tce_col + '7'].alignment = c_c_alignment - ws[tce_col + '7'] = "吨标准煤 (TCE)" + ws[tce_col + '7'] = 'Ton of Standard Coal (TCE)' ws[tce_col + '7'].border = f_border ws[tce_col + '8'].font = name_font @@ -249,7 +249,7 @@ def generate_excel(report, ws[tco2e_col + '7'].fill = table_fill ws[tco2e_col + '7'].font = name_font ws[tco2e_col + '7'].alignment = c_c_alignment - ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)" + ws[tco2e_col + '7'] = 'Ton of Carbon Dioxide Emissions (TCO2E)' ws[tco2e_col + '7'].border = f_border ws[tco2e_col + '8'].font = name_font @@ -281,7 +281,7 @@ def generate_excel(report, if has_ele_peak_flag: ws['B12'].font = title_font - ws['B12'] = name+' 分时电耗' + ws['B12'] = name + ' ' + 'Electricity Consumption by Time-Of-Use' ws['B13'].fill = table_fill ws['B13'].font = name_font @@ -292,11 +292,11 @@ def generate_excel(report, ws['C13'].font = name_font ws['C13'].alignment = c_c_alignment ws['C13'].border = f_border - ws['C13'] = '分时电耗' + ws['C13'] = 'Electricity Consumption by Time-Of-Use' ws['B14'].font = title_font ws['B14'].alignment = c_c_alignment - ws['B14'] = '尖' + ws['B14'] = 'TopPeak' ws['B14'].border = f_border ws['C14'].font = title_font @@ -306,7 +306,7 @@ def generate_excel(report, ws['B15'].font = title_font ws['B15'].alignment = c_c_alignment - ws['B15'] = '峰' + ws['B15'] = 'OnPeak' ws['B15'].border = f_border ws['C15'].font = title_font @@ -316,7 +316,7 @@ def generate_excel(report, ws['B16'].font = title_font ws['B16'].alignment = c_c_alignment - ws['B16'] = '平' + ws['B16'] = 'MidPeak' ws['B16'].border = f_border ws['C16'].font = title_font @@ -326,7 +326,7 @@ def generate_excel(report, ws['B17'].font = title_font ws['B17'].alignment = c_c_alignment - ws['B17'] = '谷' + ws['B17'] = 'OffPeak' ws['B17'].border = f_border ws['C17'].font = title_font @@ -335,7 +335,7 @@ def generate_excel(report, ws['C17'] = round(reporting_period_data['offpeaks'][0], 2) pie = PieChart() - pie.title = name + ' 分时电耗' + pie.title = name + ' ' + 'Electricity Consumption by Time-Of-Use' labels = Reference(ws, min_col=2, min_row=14, max_row=17) pie_data = Reference(ws, min_col=3, min_row=13, max_row=17) pie.add_data(pie_data, titles_from_data=True) @@ -365,7 +365,7 @@ def generate_excel(report, if has_kgce_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨标准煤 (TCE) 占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -380,7 +380,7 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '吨标准煤 (TCE) 占比' + ws['C' + str(current_row_number)] = 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 @@ -433,7 +433,7 @@ def generate_excel(report, if has_kgco2e_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨二氧化碳排放 (TCO2E) 占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -448,7 +448,7 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '吨二氧化碳排放 (TCO2E) 占比' + ws['C' + str(current_row_number)] = 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 @@ -503,7 +503,7 @@ def generate_excel(report, child = report['child_space'] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 子空间占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Child Spaces Data' current_row_number += 1 table_start_row_number = current_row_number @@ -513,7 +513,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = name_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '子空间' + ws['B' + str(current_row_number)] = 'Child Space' ca_len = len(child['energy_category_names']) col = '' @@ -524,7 +524,7 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = child['energy_category_names'][i] + ' (' + child['units'][i] + ')' + ws[col + str(current_row_number)] = child['energy_category_names'][i] + ' ' + '(' + child['units'][i] + ')' space_len = len(child['child_space_names_array'][0]) @@ -590,7 +590,7 @@ def generate_excel(report, ca_len = len(report['reporting_period']['names']) real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' table_start_row_number = (current_row_number + 2) + ca_len * 6 + real_timestamps_len * 7 current_row_number = table_start_row_number @@ -608,7 +608,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].border = f_border ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -642,7 +642,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' ws['B' + str(current_row_number)].border = f_border for i in range(0, ca_len): @@ -654,7 +654,7 @@ def generate_excel(report, # line line = LineChart() - line.title = '报告期消耗 - ' + ws.cell(column=3+i, row=table_start_row_number).value + line.title = 'Reporting Period Consumption - ' + ws.cell(column=3+i, row=table_start_row_number).value labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) line.add_data(line_data, titles_from_data=True) @@ -760,7 +760,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -816,7 +816,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/spaceenergyitem.py b/myems-api/excelexporters/spaceenergyitem.py index b3f34f69..2b9da93f 100644 --- a/myems-api/excelexporters/spaceenergyitem.py +++ b/myems-api/excelexporters/spaceenergyitem.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -170,7 +170,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期消耗' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Consumption' current_row_number += 1 @@ -216,7 +216,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '单位面积值' + ws['B' + str(current_row_number)] = 'Per Unit Area' col = 'C' @@ -233,7 +233,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -255,8 +255,8 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)] = \ - name + ' ' + category_dict_name + ' (' + reporting_period_data['units'][category_dict_values[0]] + \ - ') 分项消耗占比' + name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ + ') by Energy Item' current_row_number += 1 table_start_row_number = current_row_number @@ -289,8 +289,8 @@ def generate_excel(report, pie = PieChart() pie.title = \ - name + ' ' + category_dict_name + ' (' + reporting_period_data['units'][category_dict_values[0]] + \ - ') 分项消耗占比' + name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ + ') by Energy Item' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -330,7 +330,7 @@ def generate_excel(report, time = reporting_period_data['timestamps'][0] real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 @@ -344,7 +344,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -381,7 +381,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -417,7 +417,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期消耗 - ' + \ + line.title = 'Reporting Period Consumption - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -456,7 +456,7 @@ def generate_excel(report, child = report['child_space'] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 子空间数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Child Spaces Data' current_row_number += 1 table_start_row_number = current_row_number @@ -466,7 +466,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = name_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '子空间' + ws['B' + str(current_row_number)] = 'Child Space' ca_len = len(child['energy_item_names']) for i in range(0, ca_len): @@ -614,7 +614,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -670,7 +670,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/spaceincome.py b/myems-api/excelexporters/spaceincome.py index 5b40abab..aab8d074 100644 --- a/myems-api/excelexporters/spaceincome.py +++ b/myems-api/excelexporters/spaceincome.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -169,7 +169,7 @@ def generate_excel(report, if has_cost_data_flag: ws['B5'].font = title_font - ws['B5'] = name + ' 报告期收入' + ws['B5'] = name + ' ' + 'Reporting Period Income' category = reporting_period_data['names'] ca_len = len(category) @@ -179,17 +179,17 @@ def generate_excel(report, ws['B7'].font = title_font ws['B7'].alignment = c_c_alignment - ws['B7'] = '报告期收入总计' + ws['B7'] = 'Total' ws['B7'].border = f_border ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '单位面积值' + ws['B8'] = 'Per Unit Area' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '环比' + ws['B9'] = 'Increment Rate' ws['B9'].border = f_border col = '' @@ -224,7 +224,7 @@ def generate_excel(report, ws[col + '6'].fill = table_fill ws[col + '6'].font = name_font ws[col + '6'].alignment = c_c_alignment - ws[col + '6'] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[col + '6'] = "Total (" + reporting_period_data['total_unit'] + ")" ws[col + '6'].border = f_border ws[col + '7'].font = name_font @@ -256,7 +256,7 @@ def generate_excel(report, if has_subtotals_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 收入占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Incomes by Energy Category' current_row_number += 1 @@ -271,13 +271,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '收入' + ws['C' + str(current_row_number)] = 'Incomes' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '收入占比' + ws['D' + str(current_row_number)] = 'Proportion' current_row_number += 1 @@ -308,7 +308,7 @@ def generate_excel(report, table_end_row_number = current_row_number - 1 pie = PieChart() - pie.title = name + ' 收入占比' + pie.title = name + ' ' + 'Incomes by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -345,14 +345,14 @@ def generate_excel(report, if has_detail_data_flag: current_end_row_number += ca_len * 6 + 1 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' ws.row_dimensions[table_row].height = 60 ws['B' + str(table_row)].fill = table_fill ws['B' + str(table_row)].font = title_font ws['B' + str(table_row)].border = f_border ws['B' + str(table_row)].alignment = c_c_alignment - ws['B' + str(table_row)] = '日期时间' + ws['B' + str(table_row)] = 'Datetime' time = times[0] has_data = False max_row = 0 @@ -394,7 +394,7 @@ def generate_excel(report, line = LineChart() line.title = \ - '报告期收入 - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + 'Reporting Period Income - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_row + 1, max_row=max_row) line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) line.add_data(line_data, titles_from_data=True) @@ -418,7 +418,7 @@ def generate_excel(report, ws['B' + row].font = title_font ws['B' + row].alignment = c_c_alignment - ws['B' + row] = '小计' + ws['B' + row] = 'Subtotal' ws['B' + row].border = f_border col = '' @@ -436,7 +436,7 @@ def generate_excel(report, ws[col + str(table_row)].fill = table_fill ws[col + str(table_row)].font = title_font ws[col + str(table_row)].alignment = c_c_alignment - ws[col + str(table_row)] = '总计 (' + report['reporting_period']['total_unit'] + ')' + ws[col + str(table_row)] = 'Total (' + report['reporting_period']['total_unit'] + ')' ws[col + str(table_row)].border = f_border total_sum = Decimal(0.0) @@ -474,7 +474,7 @@ def generate_excel(report, child = report['child_space'] current_row_number = int(row) + 1 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 子空间数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Child Spaces Data' current_row_number += 1 table_start_row_number = current_row_number @@ -484,7 +484,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = name_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '子空间' + ws['B' + str(current_row_number)] = 'Child Space' ca_len = len(child['energy_category_names']) col = '' @@ -495,14 +495,14 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = child['energy_category_names'][i] + ' (' + child['units'][i] + ')' + ws[col + str(current_row_number)] = child['energy_category_names'][i] + ' ' + '(' + child['units'][i] + ')' col = chr(ord(col) + 1) ws[col + str(current_row_number)].fill = table_fill ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '总计 (' + report['reporting_period']['total_unit'] + ')' + ws[col + str(current_row_number)] = 'Total (' + report['reporting_period']['total_unit'] + ')' space_len = len(child['child_space_names_array'][0]) @@ -653,7 +653,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -709,7 +709,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/spaceload.py b/myems-api/excelexporters/spaceload.py index b87c1836..e99e9608 100644 --- a/myems-api/excelexporters/spaceload.py +++ b/myems-api/excelexporters/spaceload.py @@ -80,7 +80,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -165,7 +165,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ca_len = len(category) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + '报告期平均负荷' + ws['B' + str(current_row_number)] = name + 'Reporting Period Average Load' current_row_number += 1 @@ -186,7 +186,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '平均负荷' + ws['B' + str(current_row_number)] = 'Average Load' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -201,7 +201,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '单位面积值' + ws['B' + str(current_row_number)] = 'Per Unit Area' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -216,7 +216,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -230,7 +230,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d current_row_number += 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + '报告期最大负荷' + ws['B' + str(current_row_number)] = name + 'Reporting Period Maximum Load' current_row_number += 1 @@ -251,7 +251,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '最大负荷' + ws['B' + str(current_row_number)] = 'Maximum Load' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -266,7 +266,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '单位面积值' + ws['B' + str(current_row_number)] = 'Per Unit Area' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -281,7 +281,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -295,7 +295,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d current_row_number += 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + '报告期负荷系数' + ws['B' + str(current_row_number)] = name + 'Reporting Period Load Factor' current_row_number += 1 @@ -315,7 +315,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '负荷系数' + ws['B' + str(current_row_number)] = 'Load Factor' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -330,7 +330,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -360,7 +360,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d time = times[0] real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + '详细数据' + ws['B' + str(current_row_number)] = name + 'Detailed Data' current_row_number += 1 chart_start_number = current_row_number @@ -378,7 +378,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -389,7 +389,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border ws[col + str(current_row_number)] = reporting_period_data['names'][i] + \ - " 平均负荷(" + reporting_period_data['units'][i] + "/H)" + " Average Load(" + reporting_period_data['units'][i] + "/H)" col = chr(ord(col) + 1) if has_sub_maximums_data_flag: @@ -398,7 +398,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border ws[col + str(current_row_number)] = reporting_period_data['names'][i] + \ - " 最大负荷(" + reporting_period_data['units'][i] + "/H)" + " Maximum Load(" + reporting_period_data['units'][i] + "/H)" col = chr(ord(col) + 1) current_row_number += 1 @@ -440,7 +440,8 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_sub_averages_data_flag: line = LineChart() - line.title = '报告期 平均负荷 - ' + ws.cell(column=current_chart_col_number, row=table_start_number).value + line.title = 'Reporting Period Average Load - ' + ws.cell(column=current_chart_col_number, + row=table_start_number).value datas = Reference(ws, min_col=current_chart_col_number, min_row=table_start_number, max_row=table_end_number) line.add_data(datas, titles_from_data=True) @@ -460,7 +461,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_sub_maximums_data_flag: line = LineChart() - line.title = '报告期 最大负荷 - ' + ws.cell(column=current_chart_col_number, row=table_start_number).value + line.title = 'Reporting Period Maximum Load - ' + ws.cell(column=current_chart_col_number, row=table_start_number).value datas = Reference(ws, min_col=current_chart_col_number, min_row=table_start_number, max_row=table_end_number) line.add_data(datas, titles_from_data=True) @@ -560,7 +561,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -616,7 +617,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/spaceoutput.py b/myems-api/excelexporters/spaceoutput.py index dc8a7923..4bf9078d 100644 --- a/myems-api/excelexporters/spaceoutput.py +++ b/myems-api/excelexporters/spaceoutput.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -169,7 +169,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期产出' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Output' current_row_number += 1 @@ -197,7 +197,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '产出' + ws['B' + str(current_row_number)] = 'Output' col = 'C' @@ -214,7 +214,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '单位面积值' + ws['B' + str(current_row_number)] = 'Per Unit Area' col = 'C' @@ -231,7 +231,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -268,7 +268,7 @@ def generate_excel(report, time = reporting_period_data['timestamps'][0] real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 @@ -282,7 +282,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -319,7 +319,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -355,7 +355,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期产出 - ' + \ + line.title = 'Reporting Period Output - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -394,7 +394,7 @@ def generate_excel(report, child = report['child_space'] ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 子空间数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Child Spaces Data' current_row_number += 1 table_start_row_number = current_row_number @@ -549,7 +549,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -605,7 +605,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/spacesaving.py b/myems-api/excelexporters/spacesaving.py index ac8824ce..7b529734 100644 --- a/myems-api/excelexporters/spacesaving.py +++ b/myems-api/excelexporters/spacesaving.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -171,7 +171,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期节约' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Savings' current_row_number += 1 @@ -190,7 +190,7 @@ def generate_excel(report, ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border ws[col + str(current_row_number)] = \ - reporting_period_data['names'][i] + " (基线-实际) (" + reporting_period_data['units'][i] + ")" + reporting_period_data['names'][i] + " (Baseline - Actual) (" + reporting_period_data['units'][i] + ")" col = chr(ord(col) + 1) @@ -198,7 +198,7 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '吨标准煤 (基线-实际) (TCE)' + ws[col + str(current_row_number)] = 'Ton of Standard Coal (Baseline - Actual) (TCE)' col = chr(ord(col) + 1) @@ -206,7 +206,7 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '吨二氧化碳排放 (基线-实际) (TCO2E)' + ws[col + str(current_row_number)] = 'Ton of Carbon Dioxide Emissions (Baseline - Actual) (TCO2E)' col = chr(ord(col) + 1) @@ -215,7 +215,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '节约' + ws['B' + str(current_row_number)] = 'Savings' col = 'C' @@ -246,7 +246,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '单位面积值' + ws['B' + str(current_row_number)] = 'Per Unit Area' col = 'C' @@ -278,7 +278,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -313,7 +313,7 @@ def generate_excel(report, current_row_number += 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨标准煤(TCE)占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -327,13 +327,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '节约' + ws['C' + str(current_row_number)] = 'Savings' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '吨标准煤(TCE) 节约占比' + ws['D' + str(current_row_number)] = 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 @@ -367,7 +367,7 @@ def generate_excel(report, current_row_number += 1 pie = PieChart() - pie.title = name + ' 吨标准煤(TCE)占比' + pie.title = name + ' ' + 'Ton of Standard Coal(TCE) by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -382,7 +382,7 @@ def generate_excel(report, ws.add_chart(pie, 'E' + str(chart_start_row_number)) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨二氧化碳排放(TCO2E)占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -396,13 +396,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '节约' + ws['C' + str(current_row_number)] = 'Savings' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '吨二氧化碳排放(TCO2E) 节约占比' + ws['D' + str(current_row_number)] = 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 @@ -436,7 +436,7 @@ def generate_excel(report, current_row_number += 1 pie = PieChart() - pie.title = name + ' 吨二氧化碳排放(TCO2E)占比' + pie.title = name + ' ' + 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -471,7 +471,7 @@ def generate_excel(report, time = reporting_period_data['timestamps'][0] real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 @@ -485,7 +485,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -522,7 +522,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -558,7 +558,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期节约 - ' + \ + line.title = 'Reporting Period Savings - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -598,7 +598,7 @@ def generate_excel(report, ca_len = len(child_space_data['energy_category_names']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 子空间数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Child Spaces Data' current_row_number += 1 table_start_row_number = current_row_number @@ -608,7 +608,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = name_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '子空间' + ws['B' + str(current_row_number)] = 'Child Space' col = 'C' @@ -758,7 +758,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -814,7 +814,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/spacestatistics.py b/myems-api/excelexporters/spacestatistics.py index 3564d80e..dfb2c32c 100644 --- a/myems-api/excelexporters/spacestatistics.py +++ b/myems-api/excelexporters/spacestatistics.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -151,7 +151,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 统计分析 + # First: Statistics # 6: title # 7: table title # 8~ca_len table_data @@ -166,7 +166,7 @@ def generate_excel(report, return filename ws['B6'].font = title_font - ws['B6'] = name + ' 统计分析' + ws['B6'] = name + ' ' + 'Statistics' category = reporting_period_data['names'] @@ -174,37 +174,37 @@ def generate_excel(report, ws['B7'].fill = table_fill ws['B7'].font = title_font ws['B7'].alignment = c_c_alignment - ws['B7'] = '报告期' + ws['B7'] = 'Reporting Period' ws['B7'].border = f_border ws['C7'].font = title_font ws['C7'].alignment = c_c_alignment - ws['C7'] = '算术平均数' + ws['C7'] = 'Arithmetic Mean' ws['C7'].border = f_border ws['D7'].font = title_font ws['D7'].alignment = c_c_alignment - ws['D7'] = '中位数' + ws['D7'] = 'Median (Middle Value)' ws['D7'].border = f_border ws['E7'].font = title_font ws['E7'].alignment = c_c_alignment - ws['E7'] = '最小值' + ws['E7'] = 'Minimum Value' ws['E7'].border = f_border ws['F7'].font = title_font ws['F7'].alignment = c_c_alignment - ws['F7'] = '最大值' + ws['F7'] = 'Maximum Value' ws['F7'].border = f_border ws['G7'].font = title_font ws['G7'].alignment = c_c_alignment - ws['G7'] = '样本标准差' + ws['G7'] = 'Sample Standard Deviation' ws['G7'].border = f_border ws['H7'].font = title_font ws['H7'].alignment = c_c_alignment - ws['H7'] = '样本方差' + ws['H7'] = 'Sample Variance' ws['H7'].border = f_border # table_data @@ -218,7 +218,7 @@ def generate_excel(report, ws['B' + str(row + 1)].font = name_font ws['B' + str(row + 1)].alignment = c_c_alignment - ws['B' + str(row + 1)] = "环比" + ws['B' + str(row + 1)] = 'Increment Rate' ws['B' + str(row + 1)].border = f_border ws['C' + str(row)].font = name_font @@ -299,7 +299,7 @@ def generate_excel(report, if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' ws['H' + str(row + 1)].border = f_border #################################################################################################################### - # Second: 报告期消耗 + # Second: Reporting Period Consumption # 9 + ca_len * 2: title # 10 + ca_len * 2: table title # per_unit_area_start_row_number + 2 ~ per_unit_area_start_row_number + 2 + ca_len : table_data @@ -311,7 +311,7 @@ def generate_excel(report, per_unit_area_start_row_number = 9 + ca_len * 2 ws['B' + str(per_unit_area_start_row_number)].font = title_font - ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + ws['B' + str(per_unit_area_start_row_number)] = name + ' ' + 'Per Unit Area' ws['D' + str(per_unit_area_start_row_number)].font = title_font ws['D' + str(per_unit_area_start_row_number)] = str(report['space']['area']) + 'M²' @@ -321,37 +321,37 @@ def generate_excel(report, ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' + ws['B' + str(per_unit_area_start_row_number + 1)] = 'Reporting Period' ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['C' + str(per_unit_area_start_row_number + 1)] = '算术平均数' + ws['C' + str(per_unit_area_start_row_number + 1)] = 'Arithmetic Mean' ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['D' + str(per_unit_area_start_row_number + 1)] = '中位数' + ws['D' + str(per_unit_area_start_row_number + 1)] = 'Median (Middle Value)' ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border ws['E' + str(per_unit_area_start_row_number + 1)].font = title_font ws['E' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['E' + str(per_unit_area_start_row_number + 1)] = '最小值' + ws['E' + str(per_unit_area_start_row_number + 1)] = 'Minimum Value' ws['E' + str(per_unit_area_start_row_number + 1)].border = f_border ws['F' + str(per_unit_area_start_row_number + 1)].font = title_font ws['F' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['F' + str(per_unit_area_start_row_number + 1)] = '最大值' + ws['F' + str(per_unit_area_start_row_number + 1)] = 'Maximum Value' ws['F' + str(per_unit_area_start_row_number + 1)].border = f_border ws['G' + str(per_unit_area_start_row_number + 1)].font = title_font ws['G' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['G' + str(per_unit_area_start_row_number + 1)] = '样本标准差' + ws['G' + str(per_unit_area_start_row_number + 1)] = 'Sample Standard Deviation' ws['G' + str(per_unit_area_start_row_number + 1)].border = f_border ws['H' + str(per_unit_area_start_row_number + 1)].font = title_font ws['H' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['H' + str(per_unit_area_start_row_number + 1)] = '样本方差' + ws['H' + str(per_unit_area_start_row_number + 1)] = 'Sample Variance' ws['H' + str(per_unit_area_start_row_number + 1)].border = f_border # table_data @@ -413,7 +413,7 @@ def generate_excel(report, ws['H' + str(row_data)].number_format = '0.00' #################################################################################################################### - # Third: 详细数据 + # Third: Detailed Data # analysis_end_row_number~ analysis_end_row_number+time_len: line # analysis_end_row_number+1+line_charts_row_number: table title # i + analysis_end_row_number + 2 + 10 * ca_len~: table_data @@ -437,12 +437,12 @@ def generate_excel(report, detailed_start_row_number = analysis_end_row_number + line_charts_row_number + 1 ws['B' + str(detailed_start_row_number)].font = title_font - ws['B' + str(detailed_start_row_number)] = name + ' 详细数据' + ws['B' + str(detailed_start_row_number)] = name + ' ' + 'Detailed Data' # table_title ws['B' + str(detailed_start_row_number + 1)].fill = table_fill ws['B' + str(detailed_start_row_number + 1)].font = name_font ws['B' + str(detailed_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(detailed_start_row_number + 1)] = "时间" + ws['B' + str(detailed_start_row_number + 1)] = 'Datetime' ws['B' + str(detailed_start_row_number + 1)].border = f_border for i in range(0, ca_len): @@ -470,11 +470,11 @@ def generate_excel(report, ws[col + str(rows)].number_format = '0.00' ws[col + str(rows)].border = f_border - # 小计 + # Subtotal row_subtotals = detailed_start_row_number + 2 + time_len ws['B' + str(row_subtotals)].font = name_font ws['B' + str(row_subtotals)].alignment = c_c_alignment - ws['B' + str(row_subtotals)] = "小计" + ws['B' + str(row_subtotals)] = 'Subtotal' ws['B' + str(row_subtotals)].border = f_border for i in range(0, ca_len): @@ -494,7 +494,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = "报告期消耗" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" + line.title = "Reporting Period Consumption" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" line.style = 10 line.x_axis.majorTickMark = 'in' line.y_axis.majorTickMark = 'in' @@ -599,7 +599,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -655,7 +655,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/storebatch.py b/myems-api/excelexporters/storebatch.py index a58c74bd..67f64931 100644 --- a/myems-api/excelexporters/storebatch.py +++ b/myems-api/excelexporters/storebatch.py @@ -73,7 +73,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) data_font = Font(name='Franklin Gothic Book', size=11) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') @@ -116,7 +116,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment - ws['B3'] = '空间:' + ws['B3'] = 'Space:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment ws['C3'].font = name_font @@ -124,7 +124,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['F3'].font = name_font ws['F3'].alignment = b_r_alignment - ws['F3'] = '日期:' + ws['F3'] = 'Datetime:' ws['G3'].border = b_border ws['G3'].alignment = b_c_alignment ws['G3'].font = name_font diff --git a/myems-api/excelexporters/storecost.py b/myems-api/excelexporters/storecost.py index 35fc9cd9..60d403b4 100644 --- a/myems-api/excelexporters/storecost.py +++ b/myems-api/excelexporters/storecost.py @@ -1,6 +1,7 @@ import base64 import uuid import os +from decimal import Decimal from openpyxl.chart import PieChart, Reference, LineChart from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image @@ -83,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -163,7 +164,7 @@ def generate_excel(report, if has_energy_data_flag: ws['B6'].font = title_font - ws['B6'] = name+' 报告期成本' + ws['B6'] = name + ' ' + 'Reporting Period Costs' category = reporting_period_data['names'] ca_len = len(category) @@ -172,17 +173,17 @@ def generate_excel(report, ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '成本' + ws['B8'] = 'Cost' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '单位面积能耗' + ws['B9'] = 'Per Unit Area' ws['B9'].border = f_border ws['B10'].font = title_font ws['B10'].alignment = c_c_alignment - ws['B10'] = '环比' + ws['B10'] = 'Increment Rate' ws['B10'].border = f_border col = 'B' @@ -215,7 +216,7 @@ def generate_excel(report, ws[end_col + '7'].fill = table_fill ws[end_col + '7'].font = name_font ws[end_col + '7'].alignment = c_c_alignment - ws[end_col + '7'] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[end_col + '7'] = "Total (" + reporting_period_data['total_unit'] + ")" ws[end_col + '7'].border = f_border ws[end_col + '8'].font = name_font @@ -248,7 +249,7 @@ def generate_excel(report, if has_ele_peak_flag: ws['B12'].font = title_font - ws['B12'] = name+' 分时电耗' + ws['B12'] = name + ' ' + 'Electricity Consumption by Time-Of-Use' ws['B13'].fill = table_fill ws['B13'].font = name_font @@ -259,11 +260,11 @@ def generate_excel(report, ws['C13'].font = name_font ws['C13'].alignment = c_c_alignment ws['C13'].border = f_border - ws['C13'] = '分时电耗' + ws['C13'] = 'Electricity Consumption by Time-Of-Use' ws['B14'].font = title_font ws['B14'].alignment = c_c_alignment - ws['B14'] = '尖' + ws['B14'] = 'TopPeak' ws['B14'].border = f_border ws['C14'].font = title_font @@ -273,7 +274,7 @@ def generate_excel(report, ws['B15'].font = title_font ws['B15'].alignment = c_c_alignment - ws['B15'] = '峰' + ws['B15'] = 'OnPeak' ws['B15'].border = f_border ws['C15'].font = title_font @@ -283,7 +284,7 @@ def generate_excel(report, ws['B16'].font = title_font ws['B16'].alignment = c_c_alignment - ws['B16'] = '平' + ws['B16'] = 'MidPeak' ws['B16'].border = f_border ws['C16'].font = title_font @@ -293,7 +294,7 @@ def generate_excel(report, ws['B17'].font = title_font ws['B17'].alignment = c_c_alignment - ws['B17'] = '谷' + ws['B17'] = 'OffPeak' ws['B17'].border = f_border ws['C17'].font = title_font @@ -331,7 +332,7 @@ def generate_excel(report, if has_subtotals_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 成本占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Costs Proportion' current_row_number += 1 @@ -346,7 +347,7 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '成本占比' + ws['C' + str(current_row_number)] = 'Costs Proportion' current_row_number += 1 @@ -414,7 +415,7 @@ def generate_excel(report, detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 3 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name+' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number = detail_data_table_start_row_number @@ -430,7 +431,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].border = f_border ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'B' @@ -449,7 +450,7 @@ def generate_excel(report, ws[end_col + str(current_row_number)].fill = table_fill ws[end_col + str(current_row_number)].font = title_font ws[end_col + str(current_row_number)].alignment = c_c_alignment - ws[end_col + str(current_row_number)] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[end_col + str(current_row_number)] = "Total (" + reporting_period_data['total_unit'] + ")" ws[end_col + str(current_row_number)].border = f_border current_row_number += 1 @@ -462,7 +463,7 @@ def generate_excel(report, col = 'B' - periodic_sum = 0.0 + periodic_sum = Decimal(0.0) for j in range(0, ca_len): col = chr(ord('C') + j) @@ -486,7 +487,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' ws['B' + str(current_row_number)].border = f_border col = 'B' @@ -520,7 +521,7 @@ def generate_excel(report, ws[col + str(current_row_number)].border = f_border line = LineChart() - line.title = '报告期成本 - ' + \ + line.title = 'Reporting Period Costs - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1, max_row=table_end_row_number) @@ -644,7 +645,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -700,7 +701,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/storeenergycategory.py b/myems-api/excelexporters/storeenergycategory.py index 04b324e4..8da548e1 100644 --- a/myems-api/excelexporters/storeenergycategory.py +++ b/myems-api/excelexporters/storeenergycategory.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -156,7 +156,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 能耗分析 + # First: Consumption # 6: title # 7: table title # 8~10 table_data @@ -173,7 +173,7 @@ def generate_excel(report, if has_energy_data_flag: ws['B6'].font = title_font - ws['B6'] = name+' 能耗分析' + ws['B6'] = name + ' ' + 'Consumption' category = reporting_period_data['names'] ca_len = len(category) @@ -184,17 +184,17 @@ def generate_excel(report, ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '能耗' + ws['B8'] = 'Consumption' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '单位面积能耗' + ws['B9'] = 'Per Unit Area' ws['B9'].border = f_border ws['B10'].font = title_font ws['B10'].alignment = c_c_alignment - ws['B10'] = '环比' + ws['B10'] = 'Increment Rate' ws['B10'].border = f_border col = '' @@ -232,7 +232,7 @@ def generate_excel(report, ws[tce_col + '7'].fill = table_fill ws[tce_col + '7'].font = name_font ws[tce_col + '7'].alignment = c_c_alignment - ws[tce_col + '7'] = "吨标准煤 (TCE)" + ws[tce_col + '7'] = 'Ton of Standard Coal (TCE)' ws[tce_col + '7'].border = f_border ws[tce_col + '8'].font = name_font @@ -256,7 +256,7 @@ def generate_excel(report, ws[tco2e_col + '7'].fill = table_fill ws[tco2e_col + '7'].font = name_font ws[tco2e_col + '7'].alignment = c_c_alignment - ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)" + ws[tco2e_col + '7'] = 'Ton of Carbon Dioxide Emissions (TCO2E)' ws[tco2e_col + '7'].border = f_border ws[tco2e_col + '8'].font = name_font @@ -278,7 +278,7 @@ def generate_excel(report, for i in range(6, 10 + 1): ws.row_dimensions[i].height = 0.1 #################################################################################################################### - # Second: 分时电耗 + # Second: Electricity Consumption by Time-Of-Use # 12: title # 13: table title # 14~17 table_data @@ -292,7 +292,7 @@ def generate_excel(report, if has_ele_peak_flag: ws['B12'].font = title_font - ws['B12'] = name+' 分时电耗' + ws['B12'] = name + ' ' + 'Electricity Consumption by Time-Of-Use' ws.row_dimensions[13].height = 60 ws['B13'].fill = table_fill @@ -304,11 +304,11 @@ def generate_excel(report, ws['C13'].font = name_font ws['C13'].alignment = c_c_alignment ws['C13'].border = f_border - ws['C13'] = '分时电耗' + ws['C13'] = 'Electricity Consumption by Time-Of-Use' ws['B14'].font = title_font ws['B14'].alignment = c_c_alignment - ws['B14'] = '尖' + ws['B14'] = 'TopPeak' ws['B14'].border = f_border ws['C14'].font = title_font @@ -318,7 +318,7 @@ def generate_excel(report, ws['B15'].font = title_font ws['B15'].alignment = c_c_alignment - ws['B15'] = '峰' + ws['B15'] = 'OnPeak' ws['B15'].border = f_border ws['C15'].font = title_font @@ -328,7 +328,7 @@ def generate_excel(report, ws['B16'].font = title_font ws['B16'].alignment = c_c_alignment - ws['B16'] = '平' + ws['B16'] = 'MidPeak' ws['B16'].border = f_border ws['C16'].font = title_font @@ -338,7 +338,7 @@ def generate_excel(report, ws['B17'].font = title_font ws['B17'].alignment = c_c_alignment - ws['B17'] = '谷' + ws['B17'] = 'OffPeak' ws['B17'].border = f_border ws['C17'].font = title_font @@ -347,7 +347,7 @@ def generate_excel(report, ws['C17'] = round(reporting_period_data['offpeaks'][0], 2) pie = PieChart() - pie.title = name+' 分时电耗' + pie.title = name + ' ' + 'Electricity Consumption by Time-Of-Use' labels = Reference(ws, min_col=2, min_row=14, max_row=17) pie_data = Reference(ws, min_col=3, min_row=13, max_row=17) pie.add_data(pie_data, titles_from_data=True) @@ -367,7 +367,7 @@ def generate_excel(report, ws.row_dimensions[i].height = 0.1 #################################################################################################################### - # Fourth: 能耗详情 + # Fourth: Detailed Data # current_row_number: title # current_row_number+1 ~ current_row_number+1+ca_len*6-1: line # current_row_number+1+ca_len*6: table title @@ -393,14 +393,14 @@ def generate_excel(report, if has_detail_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name+' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' ws.row_dimensions[table_row].height = 60 ws['B'+str(table_row)].fill = table_fill ws['B' + str(table_row)].font = title_font ws['B'+str(table_row)].border = f_border ws['B'+str(table_row)].alignment = c_c_alignment - ws['B'+str(table_row)] = '日期时间' + ws['B'+str(table_row)] = 'Datetime' time = times[0] has_data = False max_row = 0 @@ -445,7 +445,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -457,7 +457,7 @@ def generate_excel(report, # line # 39~: line line = LineChart() - line.title = '报告期消耗 - ' + ws.cell(column=3+i, row=table_row).value + line.title = 'Reporting Period Consumption - ' + ws.cell(column=3+i, row=table_row).value labels = Reference(ws, min_col=2, min_row=table_row+1, max_row=max_row) line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) # openpyxl bug line.add_data(line_data, titles_from_data=True) @@ -564,7 +564,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -620,7 +620,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/storeenergyitem.py b/myems-api/excelexporters/storeenergyitem.py index dddd4184..312e25a0 100644 --- a/myems-api/excelexporters/storeenergyitem.py +++ b/myems-api/excelexporters/storeenergyitem.py @@ -82,7 +82,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -168,7 +168,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期消耗' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Consumption' current_row_number += 1 @@ -214,7 +214,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '单位面积值' + ws['B' + str(current_row_number)] = 'Per Unit Area' col = 'C' @@ -231,7 +231,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -253,8 +253,8 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)] = \ - name + ' ' + category_dict_name + ' (' + reporting_period_data['units'][category_dict_values[0]] + \ - ') 分项消耗占比' + name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ + ') by Energy Item' current_row_number += 1 table_start_row_number = current_row_number @@ -287,8 +287,8 @@ def generate_excel(report, pie = PieChart() pie.title = \ - name + ' ' + category_dict_name + ' (' + reporting_period_data['units'][category_dict_values[0]] + \ - ') 分项消耗占比' + name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ + ') by Energy Item' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -333,7 +333,7 @@ def generate_excel(report, parameters_parameters_datas_len = 0 ws['B' + str(current_row_number - 1)].font = title_font - ws['B' + str(current_row_number - 1)] = name + ' 详细数据' + ws['B' + str(current_row_number - 1)] = name + ' ' + 'Detailed Data' for i in range(0, parameters_names_len): if len(report['parameters']['timestamps'][i]) == 0: @@ -346,7 +346,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -383,7 +383,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -419,7 +419,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期消耗 - ' + \ + line.title = 'Reporting Period Consumption - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1, max_row=table_end_row_number) @@ -530,7 +530,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -586,7 +586,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/storeload.py b/myems-api/excelexporters/storeload.py index c5e4c5c8..3ea1b263 100644 --- a/myems-api/excelexporters/storeload.py +++ b/myems-api/excelexporters/storeload.py @@ -82,7 +82,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -152,7 +152,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 统计分析 + # First: Statistics # 6: title # 7: table title # 8~ca_len table_data @@ -167,7 +167,7 @@ def generate_excel(report, return filename ws['B6'].font = title_font - ws['B6'] = name + ' 统计分析' + ws['B6'] = name + ' ' + 'Statistics' category = reporting_period_data['names'] @@ -175,22 +175,22 @@ def generate_excel(report, ws['B7'].fill = table_fill ws['B7'].font = title_font ws['B7'].alignment = c_c_alignment - ws['B7'] = '报告期' + ws['B7'] = 'Reporting Period' ws['B7'].border = f_border ws['C7'].font = title_font ws['C7'].alignment = c_c_alignment - ws['C7'] = '平均负荷' + ws['C7'] = 'Average Load' ws['C7'].border = f_border ws['D7'].font = title_font ws['D7'].alignment = c_c_alignment - ws['D7'] = '最大负荷' + ws['D7'] = 'Maximum Load' ws['D7'].border = f_border ws['E7'].font = title_font ws['E7'].alignment = c_c_alignment - ws['E7'] = '负荷系数' + ws['E7'] = 'Load Factor' ws['E7'].border = f_border # table_data @@ -204,7 +204,7 @@ def generate_excel(report, ws['B' + str(row + 1)].font = name_font ws['B' + str(row + 1)].alignment = c_c_alignment - ws['B' + str(row + 1)] = "环比" + ws['B' + str(row + 1)] = 'Increment Rate' ws['B' + str(row + 1)].border = f_border ws['C' + str(row)].font = name_font @@ -247,7 +247,7 @@ def generate_excel(report, ws['E' + str(row + 1)].border = f_border #################################################################################################################### - # Second: 报告期单位面积消耗 + # Second: Per Unit Area # 9 + ca_len * 2: title # 10 + ca_len * 2: table title # per_unit_area_start_row_number + 2 ~ per_unit_area_start_row_number + 2 + ca_len : table_data @@ -258,7 +258,7 @@ def generate_excel(report, per_unit_area_start_row_number = 9 + ca_len * 2 ws['B' + str(per_unit_area_start_row_number)].font = title_font - ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['store']['area']) + 'M²' + ws['B' + str(per_unit_area_start_row_number)] = name + ' ' + 'Per Unit Area' + str(report['store']['area']) + 'M²' category = reporting_period_data['names'] @@ -266,17 +266,17 @@ def generate_excel(report, ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' + ws['B' + str(per_unit_area_start_row_number + 1)] = 'Reporting Period' ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['C' + str(per_unit_area_start_row_number + 1)] = '平均负荷' + ws['C' + str(per_unit_area_start_row_number + 1)] = 'Average Load' ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['D' + str(per_unit_area_start_row_number + 1)] = '最大负荷' + ws['D' + str(per_unit_area_start_row_number + 1)] = 'Maximum Load' ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border # table_data @@ -306,7 +306,7 @@ def generate_excel(report, ws['D' + str(row_data)].number_format = '0.00' #################################################################################################################### - # Third: 详细数据 + # Third: Detailed Data # analysis_end_row_number~ analysis_end_row_number + 6*cal_len: line # detailed_start_row_number: table title # detailed_start_row_number + 1~: table_data @@ -333,12 +333,12 @@ def generate_excel(report, detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' # table_title ws['B' + str(detail_data_table_start_row_number)].fill = table_fill ws['B' + str(detail_data_table_start_row_number)].font = name_font ws['B' + str(detail_data_table_start_row_number)].alignment = c_c_alignment - ws['B' + str(detail_data_table_start_row_number)] = "日期时间" + ws['B' + str(detail_data_table_start_row_number)] = "Datetime" ws['B' + str(detail_data_table_start_row_number)].border = f_border for i in range(0, ca_len): @@ -348,13 +348,13 @@ def generate_excel(report, ws[col_average + str(detail_data_table_start_row_number)].font = name_font ws[col_average + str(detail_data_table_start_row_number)].alignment = c_c_alignment ws[col_average + str(detail_data_table_start_row_number)] =\ - names[i] + " 平均负荷(" + reporting_period_data['units'][i] + "/H)" + names[i] + " Average Load(" + reporting_period_data['units'][i] + "/H)" ws[col_average + str(detail_data_table_start_row_number)].border = f_border ws[col_maximum + str(detail_data_table_start_row_number)].font = name_font ws[col_maximum + str(detail_data_table_start_row_number)].alignment = c_c_alignment ws[col_maximum + str(detail_data_table_start_row_number)] = \ - names[i] + " 最大负荷(" + reporting_period_data['units'][i] + "/H)" + names[i] + " Maximum Load(" + reporting_period_data['units'][i] + "/H)" ws[col_maximum + str(detail_data_table_start_row_number)].border = f_border # table_date for i in range(0, time_len): @@ -391,7 +391,7 @@ def generate_excel(report, ################################################################################################################ for i in range(0, ca_len): line = LineChart() - line.title = "报告期 最大负荷 - " + names[i] + "(" + reporting_period_data['units'][i] + ")" + line.title = "Reporting Period Maximum Load - " + names[i] + "(" + reporting_period_data['units'][i] + ")" times = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1, max_row=detail_data_table_start_row_number + 1 + time_len) line_data = Reference(ws, min_col=2 + 2 * (i + 1), min_row=detail_data_table_start_row_number, @@ -499,7 +499,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -555,7 +555,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/storesaving.py b/myems-api/excelexporters/storesaving.py index 2a3e164e..3f9a7359 100644 --- a/myems-api/excelexporters/storesaving.py +++ b/myems-api/excelexporters/storesaving.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -171,7 +171,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期节约' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Savings' current_row_number += 1 @@ -190,7 +190,7 @@ def generate_excel(report, ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border ws[col + str(current_row_number)] = \ - reporting_period_data['names'][i] + " (基线-实际) (" + reporting_period_data['units'][i] + ")" + reporting_period_data['names'][i] + " (Baseline - Actual) (" + reporting_period_data['units'][i] + ")" col = chr(ord(col) + 1) @@ -198,7 +198,7 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '吨标准煤 (基线-实际) (TCE)' + ws[col + str(current_row_number)] = 'Ton of Standard Coal (Baseline - Actual) (TCE)' col = chr(ord(col) + 1) @@ -206,7 +206,7 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '吨二氧化碳排放 (基线-实际) (TCO2E)' + ws[col + str(current_row_number)] = 'Ton of Carbon Dioxide Emissions (Baseline - Actual) (TCO2E)' col = chr(ord(col) + 1) @@ -215,7 +215,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '节约' + ws['B' + str(current_row_number)] = 'Savings' col = 'C' @@ -246,7 +246,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '单位面积值' + ws['B' + str(current_row_number)] = 'Per Unit Area' col = 'C' @@ -278,7 +278,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -313,7 +313,7 @@ def generate_excel(report, current_row_number += 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨标准煤(TCE)占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -327,13 +327,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '节约' + ws['C' + str(current_row_number)] = 'Savings' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '吨标准煤(TCE) 节约占比' + ws['D' + str(current_row_number)] = 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 @@ -367,7 +367,7 @@ def generate_excel(report, current_row_number += 1 pie = PieChart() - pie.title = name + ' 吨标准煤(TCE)占比' + pie.title = name + ' ' + 'Ton of Standard Coal(TCE) by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -382,7 +382,7 @@ def generate_excel(report, ws.add_chart(pie, 'E' + str(chart_start_row_number)) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨二氧化碳排放(TCO2E)占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -396,13 +396,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '节约' + ws['C' + str(current_row_number)] = 'Savings' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '吨二氧化碳排放(TCO2E) 节约占比' + ws['D' + str(current_row_number)] = 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 @@ -436,7 +436,7 @@ def generate_excel(report, current_row_number += 1 pie = PieChart() - pie.title = name + ' 吨二氧化碳排放(TCO2E)占比' + pie.title = name + ' ' + 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -475,7 +475,7 @@ def generate_excel(report, parameters_parameters_datas_len = 0 ws['B' + str(current_row_number - 1)].font = title_font - ws['B' + str(current_row_number - 1)] = name + ' 详细数据' + ws['B' + str(current_row_number - 1)] = name + ' ' + 'Detailed Data' for i in range(0, parameters_names_len): if len(report['parameters']['timestamps'][i]) == 0: @@ -490,7 +490,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -527,7 +527,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -563,7 +563,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期节约 - ' + \ + line.title = 'Reporting Period Savings - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -672,7 +672,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -728,7 +728,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/storestatistics.py b/myems-api/excelexporters/storestatistics.py index 1fd88f87..90266b60 100644 --- a/myems-api/excelexporters/storestatistics.py +++ b/myems-api/excelexporters/storestatistics.py @@ -82,7 +82,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -150,7 +150,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 统计分析 + # First: Statistics # 6: title # 7: table title # 8~ca_len table_data @@ -165,7 +165,7 @@ def generate_excel(report, return filename ws['B6'].font = title_font - ws['B6'] = name + ' 统计分析' + ws['B6'] = name + ' ' + 'Statistics' category = reporting_period_data['names'] @@ -173,37 +173,37 @@ def generate_excel(report, ws['B7'].fill = table_fill ws['B7'].font = title_font ws['B7'].alignment = c_c_alignment - ws['B7'] = '报告期' + ws['B7'] = 'Reporting Period' ws['B7'].border = f_border ws['C7'].font = title_font ws['C7'].alignment = c_c_alignment - ws['C7'] = '算术平均数' + ws['C7'] = 'Arithmetic Mean' ws['C7'].border = f_border ws['D7'].font = title_font ws['D7'].alignment = c_c_alignment - ws['D7'] = '中位数' + ws['D7'] = 'Median (Middle Value)' ws['D7'].border = f_border ws['E7'].font = title_font ws['E7'].alignment = c_c_alignment - ws['E7'] = '最小值' + ws['E7'] = 'Minimum Value' ws['E7'].border = f_border ws['F7'].font = title_font ws['F7'].alignment = c_c_alignment - ws['F7'] = '最大值' + ws['F7'] = 'Maximum Value' ws['F7'].border = f_border ws['G7'].font = title_font ws['G7'].alignment = c_c_alignment - ws['G7'] = '样本标准差' + ws['G7'] = 'Sample Standard Deviation' ws['G7'].border = f_border ws['H7'].font = title_font ws['H7'].alignment = c_c_alignment - ws['H7'] = '样本方差' + ws['H7'] = 'Sample Variance' ws['H7'].border = f_border # table_data @@ -217,7 +217,7 @@ def generate_excel(report, ws['B' + str(row + 1)].font = name_font ws['B' + str(row + 1)].alignment = c_c_alignment - ws['B' + str(row + 1)] = "环比" + ws['B' + str(row + 1)] = 'Increment Rate' ws['B' + str(row + 1)].border = f_border ws['C' + str(row)].font = name_font @@ -298,7 +298,7 @@ def generate_excel(report, if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' ws['H' + str(row + 1)].border = f_border #################################################################################################################### - # Second: 报告期消耗 + # Second: Reporting Period Consumption # 9 + ca_len * 2: title # 10 + ca_len * 2: table title # per_unit_area_start_row_number + 2 ~ per_unit_area_start_row_number + 2 + ca_len : table_data @@ -310,7 +310,7 @@ def generate_excel(report, per_unit_area_start_row_number = 9 + ca_len * 2 ws['B' + str(per_unit_area_start_row_number)].font = title_font - ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['store']['area']) + 'M²' + ws['B' + str(per_unit_area_start_row_number)] = name + ' ' + 'Per Unit Area' + str(report['store']['area']) + 'M²' category = reporting_period_data['names'] @@ -318,37 +318,37 @@ def generate_excel(report, ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' + ws['B' + str(per_unit_area_start_row_number + 1)] = 'Reporting Period' ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['C' + str(per_unit_area_start_row_number + 1)] = '算术平均数' + ws['C' + str(per_unit_area_start_row_number + 1)] = 'Arithmetic Mean' ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['D' + str(per_unit_area_start_row_number + 1)] = '中位数' + ws['D' + str(per_unit_area_start_row_number + 1)] = 'Median (Middle Value)' ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border ws['E' + str(per_unit_area_start_row_number + 1)].font = title_font ws['E' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['E' + str(per_unit_area_start_row_number + 1)] = '最小值' + ws['E' + str(per_unit_area_start_row_number + 1)] = 'Minimum Value' ws['E' + str(per_unit_area_start_row_number + 1)].border = f_border ws['F' + str(per_unit_area_start_row_number + 1)].font = title_font ws['F' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['F' + str(per_unit_area_start_row_number + 1)] = '最大值' + ws['F' + str(per_unit_area_start_row_number + 1)] = 'Maximum Value' ws['F' + str(per_unit_area_start_row_number + 1)].border = f_border ws['G' + str(per_unit_area_start_row_number + 1)].font = title_font ws['G' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['G' + str(per_unit_area_start_row_number + 1)] = '样本标准差' + ws['G' + str(per_unit_area_start_row_number + 1)] = 'Sample Standard Deviation' ws['G' + str(per_unit_area_start_row_number + 1)].border = f_border ws['H' + str(per_unit_area_start_row_number + 1)].font = title_font ws['H' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['H' + str(per_unit_area_start_row_number + 1)] = '样本方差' + ws['H' + str(per_unit_area_start_row_number + 1)] = 'Sample Variance' ws['H' + str(per_unit_area_start_row_number + 1)].border = f_border # table_data @@ -410,7 +410,7 @@ def generate_excel(report, ws['H' + str(row_data)].number_format = '0.00' #################################################################################################################### - # Third: 详细数据 + # Third: Detailed Data # detailed_start_row_number~ detailed_start_row_number+time_len: line # detailed_start_row_number+1: table title # i + analysis_end_row_number + 2 + 6 * ca_len~: table_data @@ -438,12 +438,12 @@ def generate_excel(report, detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' # table_title ws['B' + str(detail_data_table_start_row_number)].fill = table_fill ws['B' + str(detail_data_table_start_row_number)].font = name_font ws['B' + str(detail_data_table_start_row_number)].alignment = c_c_alignment - ws['B' + str(detail_data_table_start_row_number)] = "时间" + ws['B' + str(detail_data_table_start_row_number)] = 'Datetime' ws['B' + str(detail_data_table_start_row_number)].border = f_border current_row_number += 1 @@ -474,11 +474,11 @@ def generate_excel(report, ws[col + str(rows)].number_format = '0.00' ws[col + str(rows)].border = f_border - # 小计 + # Subtotal row_subtotals = detail_data_table_start_row_number + 1 + time_len ws['B' + str(row_subtotals)].font = name_font ws['B' + str(row_subtotals)].alignment = c_c_alignment - ws['B' + str(row_subtotals)] = "小计" + ws['B' + str(row_subtotals)] = 'Subtotal' ws['B' + str(row_subtotals)].border = f_border for i in range(0, ca_len): @@ -497,7 +497,7 @@ def generate_excel(report, #################################################################################################################### for i in range(0, ca_len): line = LineChart() - line.title = "报告期消耗" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" + line.title = "Reporting Period Consumption" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" line.style = 10 line.x_axis.majorTickMark = 'in' line.y_axis.majorTickMark = 'in' @@ -606,7 +606,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -662,7 +662,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/tenantbatch.py b/myems-api/excelexporters/tenantbatch.py index 58af6565..032545aa 100644 --- a/myems-api/excelexporters/tenantbatch.py +++ b/myems-api/excelexporters/tenantbatch.py @@ -73,7 +73,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) data_font = Font(name='Franklin Gothic Book', size=11) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') @@ -116,7 +116,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment - ws['B3'] = '空间:' + ws['B3'] = 'Space:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment ws['C3'].font = name_font @@ -124,7 +124,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['F3'].font = name_font ws['F3'].alignment = b_r_alignment - ws['F3'] = '日期:' + ws['F3'] = 'Datetime:' ws['G3'].border = b_border ws['G3'].alignment = b_c_alignment ws['G3'].font = name_font @@ -136,13 +136,13 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['B6'].font = name_font ws['B6'].alignment = c_c_alignment ws['B6'].fill = table_fill - ws['B6'] = '名称' + ws['B6'] = 'Name' ws['C6'].border = f_border ws['C6'].alignment = c_c_alignment ws['C6'].font = name_font ws['C6'].fill = table_fill - ws['C6'] = '空间' + ws['C6'] = 'Space' ca_len = len(report['energycategories']) diff --git a/myems-api/excelexporters/tenantbill.py b/myems-api/excelexporters/tenantbill.py index 7941be09..a5a10110 100644 --- a/myems-api/excelexporters/tenantbill.py +++ b/myems-api/excelexporters/tenantbill.py @@ -99,9 +99,9 @@ def generate_excel(report, ws.merge_cells('C24:I24') # Font - notice_font = Font(name='宋体', size=20, bold=True) + notice_font = Font(name='Arial', size=20, bold=True) name_font = Font(name='Constantia', size=12, bold=True) - title_font = Font(name='宋体', size=11, bold=True) + title_font = Font(name='Arial', size=11, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -131,7 +131,7 @@ def generate_excel(report, ws['C12'].font = notice_font ws['C12'].alignment = c_c_alignment - ws['C12'] = '付款通知书' + ws['C12'] = 'Payment Notice' # img img = Image("excelexporters/myemslogo.png") @@ -190,11 +190,11 @@ def generate_excel(report, ws['H' + str(i)].alignment = b_l_alignment ws['H' + str(i)].font = name_font - ws['E37'] = '账单号码:' - ws['E38'] = '租赁合同号码:' - ws['E39'] = '账单日期:' - ws['E40'] = '付款到期日:' - ws['E41'] = '应付款金额:' + ws['E37'] = 'Bill Number:' + ws['E38'] = 'Lease Contract Number:' + ws['E39'] = 'Bill Date:' + ws['E40'] = 'Payment Due Date:' + ws['E41'] = 'Amount Payable:' # Simulated data ws['H37'] = '' @@ -222,14 +222,14 @@ def generate_excel(report, ws[chr(i) + '53'].alignment = c_c_alignment ws[chr(i) + '53'].border = f_border - ws['B53'] = '能耗分类' - ws['C53'] = '结算期开始日期' - ws['D53'] = '结算期结束日期' - ws['E53'] = '数量' - ws['F53'] = '单位' - ws['G53'] = '金额' - ws['H53'] = '税率' - ws['I53'] = '税额' + ws['B53'] = 'Energy Category' + ws['C53'] = 'Billing Period Start' + ws['D53'] = 'Billing Period End' + ws['E53'] = 'Quantity' + ws['F53'] = 'Unit' + ws['G53'] = 'Amount' + ws['H53'] = 'Tax Rate' + ws['I53'] = 'VAT Output Tax' reporting_period_data = report['reporting_period'] names = reporting_period_data['names'] @@ -276,7 +276,7 @@ def generate_excel(report, ws.merge_cells('B{}:G{}'.format(i, i)) ws.merge_cells('H{}:I{}'.format(i, i)) - ws['B' + str(current_row_number)] = '小计:' + ws['B' + str(current_row_number)] = 'Subtotal:' ws['H' + str(current_row_number)] = report['reporting_period']['currency_unit'] + str( round(report['reporting_period']['total_cost'] if 'reporting_period' in report.keys() @@ -289,12 +289,12 @@ def generate_excel(report, # Simulated data taxes = Decimal(0.00) - ws['B' + str(current_row_number)] = '增值税销项税金:' + ws['B' + str(current_row_number)] = 'VAT Output Tax:' ws['H' + str(current_row_number)] = report['reporting_period']['currency_unit'] + str(round(taxes, 2)) current_row_number += 1 - ws['B' + str(current_row_number)] = '应付金额合计:' + ws['B' + str(current_row_number)] = 'Total Amount Payable:' ws['H' + str(current_row_number)] = report['reporting_period']['currency_unit'] + str( round(report['reporting_period']['total_cost'] + taxes if 'reporting_period' in report.keys() diff --git a/myems-api/excelexporters/tenantcost.py b/myems-api/excelexporters/tenantcost.py index 50513a08..a51d3c8a 100644 --- a/myems-api/excelexporters/tenantcost.py +++ b/myems-api/excelexporters/tenantcost.py @@ -1,6 +1,7 @@ import base64 import uuid import os +from decimal import Decimal from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image @@ -84,7 +85,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -167,7 +168,7 @@ def generate_excel(report, if has_energy_data_flag: ws['B6'].font = title_font - ws['B6'] = name+' 报告期成本' + ws['B6'] = name + ' ' + 'Reporting Period Costs' category = reporting_period_data['names'] ca_len = len(category) @@ -178,17 +179,17 @@ def generate_excel(report, ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '成本' + ws['B8'] = 'Cost' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '单位面积能耗' + ws['B9'] = 'Per Unit Area' ws['B9'].border = f_border ws['B10'].font = title_font ws['B10'].alignment = c_c_alignment - ws['B10'] = '环比' + ws['B10'] = 'Increment Rate' ws['B10'].border = f_border col = 'B' @@ -221,7 +222,7 @@ def generate_excel(report, ws[end_col + '7'].fill = table_fill ws[end_col + '7'].font = name_font ws[end_col + '7'].alignment = c_c_alignment - ws[end_col + '7'] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[end_col + '7'] = "Total (" + reporting_period_data['total_unit'] + ")" ws[end_col + '7'].border = f_border ws[end_col + '8'].font = name_font @@ -254,7 +255,7 @@ def generate_excel(report, if has_ele_peak_flag: ws['B12'].font = title_font - ws['B12'] = name+' 分时电耗' + ws['B12'] = name + ' ' + 'Electricity Consumption by Time-Of-Use' ws['B13'].fill = table_fill ws['B13'].font = name_font @@ -265,11 +266,11 @@ def generate_excel(report, ws['C13'].font = name_font ws['C13'].alignment = c_c_alignment ws['C13'].border = f_border - ws['C13'] = '分时电耗' + ws['C13'] = 'Electricity Consumption by Time-Of-Use' ws['B14'].font = title_font ws['B14'].alignment = c_c_alignment - ws['B14'] = '尖' + ws['B14'] = 'TopPeak' ws['B14'].border = f_border ws['C14'].font = title_font @@ -279,7 +280,7 @@ def generate_excel(report, ws['B15'].font = title_font ws['B15'].alignment = c_c_alignment - ws['B15'] = '峰' + ws['B15'] = 'OnPeak' ws['B15'].border = f_border ws['C15'].font = title_font @@ -289,7 +290,7 @@ def generate_excel(report, ws['B16'].font = title_font ws['B16'].alignment = c_c_alignment - ws['B16'] = '平' + ws['B16'] = 'MidPeak' ws['B16'].border = f_border ws['C16'].font = title_font @@ -299,7 +300,7 @@ def generate_excel(report, ws['B17'].font = title_font ws['B17'].alignment = c_c_alignment - ws['B17'] = '谷' + ws['B17'] = 'OffPeak' ws['B17'].border = f_border ws['C17'].font = title_font @@ -308,7 +309,7 @@ def generate_excel(report, ws['C17'] = round(reporting_period_data['offpeaks'][0], 2) pie = PieChart() - pie.title = name+' 分时电耗' + pie.title = name + ' ' + 'Electricity Consumption by Time-Of-Use' labels = Reference(ws, min_col=2, min_row=14, max_row=17) pie_data = Reference(ws, min_col=3, min_row=13, max_row=17) pie.add_data(pie_data, titles_from_data=True) @@ -338,7 +339,7 @@ def generate_excel(report, if has_subtotals_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 成本占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Costs Proportion' current_row_number += 1 @@ -353,7 +354,7 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '成本占比' + ws['C' + str(current_row_number)] = 'Costs Proportion' current_row_number += 1 @@ -375,7 +376,7 @@ def generate_excel(report, table_end_row_number = current_row_number - 1 pie = PieChart() - pie.title = name + ' 成本占比' + pie.title = name + ' ' + 'Costs Proportion' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -417,7 +418,7 @@ def generate_excel(report, ca_len = len(report['reporting_period']['names']) real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name+' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' table_start_row_number = (current_row_number + 1) + ca_len * 6 + real_timestamps_len * 7 current_row_number = table_start_row_number @@ -435,7 +436,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].border = f_border ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'B' @@ -454,7 +455,7 @@ def generate_excel(report, ws[end_col + str(current_row_number)].fill = table_fill ws[end_col + str(current_row_number)].font = title_font ws[end_col + str(current_row_number)].alignment = c_c_alignment - ws[end_col + str(current_row_number)] = "总计 (" + reporting_period_data['total_unit'] + ")" + ws[end_col + str(current_row_number)] = "Total (" + reporting_period_data['total_unit'] + ")" ws[end_col + str(current_row_number)].border = f_border current_row_number += 1 @@ -467,7 +468,7 @@ def generate_excel(report, col = 'B' - periodic_sum = 0.0 + periodic_sum = Decimal(0.0) for j in range(0, ca_len): col = chr(ord('C') + j) @@ -491,7 +492,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' ws['B' + str(current_row_number)].border = f_border col = 'B' @@ -505,7 +506,7 @@ def generate_excel(report, # line line = LineChart() - line.title = '报告期成本 - ' + ws.cell(column=3+i, row=table_start_row_number).value + line.title = 'Reporting Period Costs - ' + ws.cell(column=3+i, row=table_start_row_number).value labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) line.add_data(line_data, titles_from_data=True) @@ -620,7 +621,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -676,7 +677,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/tenantenergycategory.py b/myems-api/excelexporters/tenantenergycategory.py index ef74e4e9..d0135b0d 100644 --- a/myems-api/excelexporters/tenantenergycategory.py +++ b/myems-api/excelexporters/tenantenergycategory.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -168,7 +168,7 @@ def generate_excel(report, if has_energy_data_flag: ws['B6'].font = title_font - ws['B6'] = name+' 报告期消耗' + ws['B6'] = name + ' ' + 'Reporting Period Consumption' category = reporting_period_data['names'] ca_len = len(category) @@ -178,17 +178,17 @@ def generate_excel(report, ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '能耗' + ws['B8'] = 'Consumption' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '单位面积能耗' + ws['B9'] = 'Per Unit Area' ws['B9'].border = f_border ws['B10'].font = title_font ws['B10'].alignment = c_c_alignment - ws['B10'] = '环比' + ws['B10'] = 'Increment Rate' ws['B10'].border = f_border col = 'B' @@ -224,7 +224,7 @@ def generate_excel(report, ws[tce_col + '7'].fill = table_fill ws[tce_col + '7'].font = name_font ws[tce_col + '7'].alignment = c_c_alignment - ws[tce_col + '7'] = "吨标准煤 (TCE)" + ws[tce_col + '7'] = 'Ton of Standard Coal (TCE)' ws[tce_col + '7'].border = f_border ws[tce_col + '8'].font = name_font @@ -248,7 +248,7 @@ def generate_excel(report, ws[tco2e_col + '7'].fill = table_fill ws[tco2e_col + '7'].font = name_font ws[tco2e_col + '7'].alignment = c_c_alignment - ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)" + ws[tco2e_col + '7'] = 'Ton of Carbon Dioxide Emissions (TCO2E)' ws[tco2e_col + '7'].border = f_border ws[tco2e_col + '8'].font = name_font @@ -280,7 +280,7 @@ def generate_excel(report, if has_ele_peak_flag: ws['B12'].font = title_font - ws['B12'] = name+' 分时电耗' + ws['B12'] = name + ' ' + 'Electricity Consumption by Time-Of-Use' ws['B13'].fill = table_fill ws['B13'].font = name_font @@ -291,11 +291,11 @@ def generate_excel(report, ws['C13'].font = name_font ws['C13'].alignment = c_c_alignment ws['C13'].border = f_border - ws['C13'] = '分时电耗' + ws['C13'] = 'Electricity Consumption by Time-Of-Use' ws['B14'].font = title_font ws['B14'].alignment = c_c_alignment - ws['B14'] = '尖' + ws['B14'] = 'TopPeak' ws['B14'].border = f_border ws['C14'].font = title_font @@ -305,7 +305,7 @@ def generate_excel(report, ws['B15'].font = title_font ws['B15'].alignment = c_c_alignment - ws['B15'] = '峰' + ws['B15'] = 'OnPeak' ws['B15'].border = f_border ws['C15'].font = title_font @@ -315,7 +315,7 @@ def generate_excel(report, ws['B16'].font = title_font ws['B16'].alignment = c_c_alignment - ws['B16'] = '平' + ws['B16'] = 'MidPeak' ws['B16'].border = f_border ws['C16'].font = title_font @@ -325,7 +325,7 @@ def generate_excel(report, ws['B17'].font = title_font ws['B17'].alignment = c_c_alignment - ws['B17'] = '谷' + ws['B17'] = 'OffPeak' ws['B17'].border = f_border ws['C17'].font = title_font @@ -334,7 +334,7 @@ def generate_excel(report, ws['C17'] = round(reporting_period_data['offpeaks'][0], 2) pie = PieChart() - pie.title = name + ' 分时电耗' + pie.title = name + ' ' + 'Electricity Consumption by Time-Of-Use' labels = Reference(ws, min_col=2, min_row=14, max_row=17) pie_data = Reference(ws, min_col=3, min_row=13, max_row=17) pie.add_data(pie_data, titles_from_data=True) @@ -364,7 +364,7 @@ def generate_excel(report, if has_kgce_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨标准煤 (TCE) 占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -379,7 +379,7 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '吨标准煤 (TCE) 占比' + ws['C' + str(current_row_number)] = 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 @@ -436,7 +436,7 @@ def generate_excel(report, if has_kgco2e_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨二氧化碳排放 (TCO2E) 占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -451,7 +451,7 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '吨二氧化碳排放 (TCO2E) 占比' + ws['C' + str(current_row_number)] = 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 @@ -513,7 +513,7 @@ def generate_excel(report, ca_len = len(report['reporting_period']['names']) real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' table_start_row_number = (current_row_number + 1) + ca_len * 6 + real_timestamps_len * 7 current_row_number = table_start_row_number @@ -531,7 +531,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].border = f_border ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -565,7 +565,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' ws['B' + str(current_row_number)].border = f_border for i in range(0, ca_len): @@ -577,7 +577,7 @@ def generate_excel(report, # line line = LineChart() - line.title = '报告期消耗 - ' + ws.cell(column=3+i, row=table_start_row_number).value + line.title = 'Reporting Period Consumption - ' + ws.cell(column=3+i, row=table_start_row_number).value labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) line.add_data(line_data, titles_from_data=True) @@ -686,7 +686,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -742,7 +742,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/tenantenergyitem.py b/myems-api/excelexporters/tenantenergyitem.py index 6828bc10..462a6a9e 100644 --- a/myems-api/excelexporters/tenantenergyitem.py +++ b/myems-api/excelexporters/tenantenergyitem.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -169,7 +169,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期消耗' + ws['B' + str(current_row_number)] = name + ' ' + 'Reporting Period Consumption' current_row_number += 1 @@ -215,7 +215,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '单位面积值' + ws['B' + str(current_row_number)] = 'Per Unit Area' col = 'C' @@ -232,7 +232,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -254,8 +254,8 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)] = \ - name + ' ' + category_dict_name + ' (' + reporting_period_data['units'][category_dict_values[0]] + \ - ') 分项消耗占比' + name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ + ') by Energy Item' current_row_number += 1 table_start_row_number = current_row_number @@ -288,8 +288,8 @@ def generate_excel(report, pie = PieChart() pie.title = \ - name + ' ' + category_dict_name + ' (' + reporting_period_data['units'][category_dict_values[0]] + \ - ') 分项消耗占比' + name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ + ') by Energy Item' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -329,7 +329,7 @@ def generate_excel(report, time = reporting_period_data['timestamps'][0] real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 @@ -343,7 +343,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -380,7 +380,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -416,7 +416,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期消耗 - ' + \ + line.title = 'Reporting Period Consumption - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -521,7 +521,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -577,7 +577,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/tenantload.py b/myems-api/excelexporters/tenantload.py index 2c86e3b1..717d3996 100644 --- a/myems-api/excelexporters/tenantload.py +++ b/myems-api/excelexporters/tenantload.py @@ -80,7 +80,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -165,7 +165,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ca_len = len(category) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + '报告期平均负荷' + ws['B' + str(current_row_number)] = name + 'Reporting Period Average Load' current_row_number += 1 @@ -187,7 +187,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '平均负荷' + ws['B' + str(current_row_number)] = 'Average Load' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -202,7 +202,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '单位面积值' + ws['B' + str(current_row_number)] = 'Per Unit Area' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -217,7 +217,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -231,7 +231,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d current_row_number += 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + '报告期最大负荷' + ws['B' + str(current_row_number)] = name + 'Reporting Period Maximum Load' current_row_number += 1 @@ -252,7 +252,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '最大负荷' + ws['B' + str(current_row_number)] = 'Maximum Load' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -267,7 +267,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '单位面积值' + ws['B' + str(current_row_number)] = 'Per Unit Area' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -282,7 +282,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -296,7 +296,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d current_row_number += 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + '报告期负荷系数' + ws['B' + str(current_row_number)] = name + 'Reporting Period Load Factor' current_row_number += 1 @@ -316,7 +316,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '负荷系数' + ws['B' + str(current_row_number)] = 'Load Factor' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -331,7 +331,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' for i in range(0, ca_len): col = chr(ord('C') + i) @@ -361,7 +361,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d time = times[0] real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + '详细数据' + ws['B' + str(current_row_number)] = name + 'Detailed Data' current_row_number += 1 chart_start_number = current_row_number @@ -379,7 +379,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -390,7 +390,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border ws[col + str(current_row_number)] = reporting_period_data['names'][i] + \ - " 平均负荷(" + reporting_period_data['units'][i] + "/H)" + " Average Load(" + reporting_period_data['units'][i] + "/H)" col = chr(ord(col) + 1) if has_sub_maximums_data_flag: @@ -399,7 +399,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border ws[col + str(current_row_number)] = reporting_period_data['names'][i] + \ - " 最大负荷(" + reporting_period_data['units'][i] + "/H)" + " Maximum Load(" + reporting_period_data['units'][i] + "/H)" col = chr(ord(col) + 1) current_row_number += 1 @@ -441,7 +441,8 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_sub_averages_data_flag: line = LineChart() - line.title = '报告期 平均负荷 - ' + ws.cell(column=current_chart_col_number, row=table_start_number).value + line.title = 'Reporting Period Average Load - ' + ws.cell(column=current_chart_col_number, + row=table_start_number).value datas = Reference(ws, min_col=current_chart_col_number, min_row=table_start_number, max_row=table_end_number) line.add_data(datas, titles_from_data=True) @@ -461,7 +462,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_sub_maximums_data_flag: line = LineChart() - line.title = '报告期 最大负荷 - ' + ws.cell(column=current_chart_col_number, row=table_start_number).value + line.title = 'Reporting Period Maximum Load - ' + ws.cell(column=current_chart_col_number, row=table_start_number).value datas = Reference(ws, min_col=current_chart_col_number, min_row=table_start_number, max_row=table_end_number) line.add_data(datas, titles_from_data=True) @@ -562,7 +563,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -618,7 +619,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/tenantsaving.py b/myems-api/excelexporters/tenantsaving.py index 01cbbd13..e903e982 100644 --- a/myems-api/excelexporters/tenantsaving.py +++ b/myems-api/excelexporters/tenantsaving.py @@ -84,7 +84,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -171,7 +171,7 @@ def generate_excel(report, if has_names_data_flag: ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 报告期节约' + ws['B' + str(current_row_number)] = name + ' ' + '' + 'Reporting Period Savings' current_row_number += 1 @@ -190,7 +190,7 @@ def generate_excel(report, ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border ws[col + str(current_row_number)] = \ - reporting_period_data['names'][i] + " (基线-实际) (" + reporting_period_data['units'][i] + ")" + reporting_period_data['names'][i] + " (Baseline - Actual) (" + reporting_period_data['units'][i] + ")" col = chr(ord(col) + 1) @@ -198,7 +198,7 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '吨标准煤 (基线-实际) (TCE)' + ws[col + str(current_row_number)] = 'Ton of Standard Coal (Baseline - Actual) (TCE)' col = chr(ord(col) + 1) @@ -206,7 +206,7 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = '吨二氧化碳排放 (基线-实际) (TCO2E)' + ws[col + str(current_row_number)] = 'Ton of Carbon Dioxide Emissions (Baseline - Actual) (TCO2E)' col = chr(ord(col) + 1) @@ -215,7 +215,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '节约' + ws['B' + str(current_row_number)] = 'Savings' col = 'C' @@ -246,7 +246,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '单位面积值' + ws['B' + str(current_row_number)] = 'Per Unit Area' col = 'C' @@ -278,7 +278,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '环比' + ws['B' + str(current_row_number)] = 'Increment Rate' col = 'C' @@ -313,7 +313,7 @@ def generate_excel(report, current_row_number += 2 ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨标准煤(TCE)占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -327,13 +327,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '节约' + ws['C' + str(current_row_number)] = 'Savings' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '吨标准煤(TCE) 节约占比' + ws['D' + str(current_row_number)] = 'Ton of Standard Coal(TCE) by Energy Category' current_row_number += 1 @@ -367,7 +367,7 @@ def generate_excel(report, current_row_number += 1 pie = PieChart() - pie.title = name + ' 吨标准煤(TCE)占比' + pie.title = name + ' ' + 'Ton of Standard Coal(TCE) by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -382,7 +382,7 @@ def generate_excel(report, ws.add_chart(pie, 'E' + str(chart_start_row_number)) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 吨二氧化碳排放(TCO2E)占比' + ws['B' + str(current_row_number)] = name + ' ' + 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 table_start_row_number = current_row_number @@ -396,13 +396,13 @@ def generate_excel(report, ws['C' + str(current_row_number)].font = name_font ws['C' + str(current_row_number)].alignment = c_c_alignment ws['C' + str(current_row_number)].border = f_border - ws['C' + str(current_row_number)] = '节约' + ws['C' + str(current_row_number)] = 'Savings' ws['D' + str(current_row_number)].fill = table_fill ws['D' + str(current_row_number)].font = name_font ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].border = f_border - ws['D' + str(current_row_number)] = '吨二氧化碳排放(TCO2E) 节约占比' + ws['D' + str(current_row_number)] = 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' current_row_number += 1 @@ -436,7 +436,7 @@ def generate_excel(report, current_row_number += 1 pie = PieChart() - pie.title = name + ' 吨二氧化碳排放(TCO2E)占比' + pie.title = name + ' ' + 'Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) @@ -471,7 +471,7 @@ def generate_excel(report, time = reporting_period_data['timestamps'][0] real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps']) ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = name + ' 详细数据' + ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data' current_row_number += 1 @@ -485,7 +485,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '日期时间' + ws['B' + str(current_row_number)] = 'Datetime' col = 'C' @@ -522,7 +522,7 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].alignment = c_c_alignment ws['B' + str(current_row_number)].border = f_border - ws['B' + str(current_row_number)] = '小计' + ws['B' + str(current_row_number)] = 'Subtotal' col = 'C' @@ -558,7 +558,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = '报告期节约 - ' + \ + line.title = 'Reporting Period Savings - ' + \ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) @@ -666,7 +666,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -722,7 +722,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/tenantstatistics.py b/myems-api/excelexporters/tenantstatistics.py index 22e5c3bb..818015ad 100644 --- a/myems-api/excelexporters/tenantstatistics.py +++ b/myems-api/excelexporters/tenantstatistics.py @@ -83,7 +83,7 @@ def generate_excel(report, # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -151,7 +151,7 @@ def generate_excel(report, return filename #################################################################################################################### - # First: 统计分析 + # First: Statistics # 6: title # 7: table title # 8~ca_len table_data @@ -166,7 +166,7 @@ def generate_excel(report, return filename ws['B6'].font = title_font - ws['B6'] = name + ' 统计分析' + ws['B6'] = name + ' ' + 'Statistics' category = reporting_period_data['names'] @@ -174,37 +174,37 @@ def generate_excel(report, ws['B7'].fill = table_fill ws['B7'].font = title_font ws['B7'].alignment = c_c_alignment - ws['B7'] = '报告期' + ws['B7'] = 'Reporting Period' ws['B7'].border = f_border ws['C7'].font = title_font ws['C7'].alignment = c_c_alignment - ws['C7'] = '算术平均数' + ws['C7'] = 'Arithmetic Mean' ws['C7'].border = f_border ws['D7'].font = title_font ws['D7'].alignment = c_c_alignment - ws['D7'] = '中位数' + ws['D7'] = 'Median (Middle Value)' ws['D7'].border = f_border ws['E7'].font = title_font ws['E7'].alignment = c_c_alignment - ws['E7'] = '最小值' + ws['E7'] = 'Minimum Value' ws['E7'].border = f_border ws['F7'].font = title_font ws['F7'].alignment = c_c_alignment - ws['F7'] = '最大值' + ws['F7'] = 'Maximum Value' ws['F7'].border = f_border ws['G7'].font = title_font ws['G7'].alignment = c_c_alignment - ws['G7'] = '样本标准差' + ws['G7'] = 'Sample Standard Deviation' ws['G7'].border = f_border ws['H7'].font = title_font ws['H7'].alignment = c_c_alignment - ws['H7'] = '样本方差' + ws['H7'] = 'Sample Variance' ws['H7'].border = f_border # table_data @@ -218,7 +218,7 @@ def generate_excel(report, ws['B' + str(row + 1)].font = name_font ws['B' + str(row + 1)].alignment = c_c_alignment - ws['B' + str(row + 1)] = "环比" + ws['B' + str(row + 1)] = 'Increment Rate' ws['B' + str(row + 1)].border = f_border ws['C' + str(row)].font = name_font @@ -299,7 +299,7 @@ def generate_excel(report, if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' ws['H' + str(row + 1)].border = f_border #################################################################################################################### - # Second: 报告期消耗 + # Second: Reporting Period Consumption # 9 + ca_len * 2: title # 10 + ca_len * 2: table title # per_unit_area_start_row_number + 2 ~ per_unit_area_start_row_number + 2 + ca_len : table_data @@ -311,7 +311,7 @@ def generate_excel(report, per_unit_area_start_row_number = 9 + ca_len * 2 ws['B' + str(per_unit_area_start_row_number)].font = title_font - ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['tenant']['area']) + 'M²' + ws['B' + str(per_unit_area_start_row_number)] = name + ' ' + 'Per Unit Area' + str(report['tenant']['area']) + 'M²' category = reporting_period_data['names'] @@ -319,37 +319,37 @@ def generate_excel(report, ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' + ws['B' + str(per_unit_area_start_row_number + 1)] = 'Reporting Period' ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['C' + str(per_unit_area_start_row_number + 1)] = '算术平均数' + ws['C' + str(per_unit_area_start_row_number + 1)] = 'Arithmetic Mean' ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['D' + str(per_unit_area_start_row_number + 1)] = '中位数' + ws['D' + str(per_unit_area_start_row_number + 1)] = 'Median (Middle Value)' ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border ws['E' + str(per_unit_area_start_row_number + 1)].font = title_font ws['E' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['E' + str(per_unit_area_start_row_number + 1)] = '最小值' + ws['E' + str(per_unit_area_start_row_number + 1)] = 'Minimum Value' ws['E' + str(per_unit_area_start_row_number + 1)].border = f_border ws['F' + str(per_unit_area_start_row_number + 1)].font = title_font ws['F' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['F' + str(per_unit_area_start_row_number + 1)] = '最大值' + ws['F' + str(per_unit_area_start_row_number + 1)] = 'Maximum Value' ws['F' + str(per_unit_area_start_row_number + 1)].border = f_border ws['G' + str(per_unit_area_start_row_number + 1)].font = title_font ws['G' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['G' + str(per_unit_area_start_row_number + 1)] = '样本标准差' + ws['G' + str(per_unit_area_start_row_number + 1)] = 'Sample Standard Deviation' ws['G' + str(per_unit_area_start_row_number + 1)].border = f_border ws['H' + str(per_unit_area_start_row_number + 1)].font = title_font ws['H' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['H' + str(per_unit_area_start_row_number + 1)] = '样本方差' + ws['H' + str(per_unit_area_start_row_number + 1)] = 'Sample Variance' ws['H' + str(per_unit_area_start_row_number + 1)].border = f_border # table_data @@ -411,7 +411,7 @@ def generate_excel(report, ws['H' + str(row_data)].number_format = '0.00' #################################################################################################################### - # Third: 详细数据 + # Third: Detailed Data # detailed_start_row_number~ detailed_start_row_number+time_len: line # detailed_start_row_number + 1: table title # i + analysis_end_row_number + 2 + 6 * ca_len~: table_data @@ -435,12 +435,12 @@ def generate_excel(report, detailed_start_row_number = analysis_end_row_number + line_charts_row_number + 1 ws['B' + str(detailed_start_row_number)].font = title_font - ws['B' + str(detailed_start_row_number)] = name + ' 详细数据' + ws['B' + str(detailed_start_row_number)] = name + ' ' + 'Detailed Data' # table_title ws['B' + str(detailed_start_row_number + 1)].fill = table_fill ws['B' + str(detailed_start_row_number + 1)].font = name_font ws['B' + str(detailed_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(detailed_start_row_number + 1)] = "时间" + ws['B' + str(detailed_start_row_number + 1)] = 'Datetime' ws['B' + str(detailed_start_row_number + 1)].border = f_border for i in range(0, ca_len): @@ -468,11 +468,11 @@ def generate_excel(report, ws[col + str(rows)].number_format = '0.00' ws[col + str(rows)].border = f_border - # 小计 + # Subtotal row_subtotals = detailed_start_row_number + 2 + time_len ws['B' + str(row_subtotals)].font = name_font ws['B' + str(row_subtotals)].alignment = c_c_alignment - ws['B' + str(row_subtotals)] = "小计" + ws['B' + str(row_subtotals)] = 'Subtotal' ws['B' + str(row_subtotals)].border = f_border for i in range(0, ca_len): @@ -492,7 +492,7 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = "报告期消耗" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" + line.title = "Reporting Period Consumption" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" line.style = 10 line.x_axis.majorTickMark = 'in' line.y_axis.majorTickMark = 'in' @@ -598,7 +598,7 @@ def generate_excel(report, parameters_ws_current_row_number = 6 parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font - parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' Parameters' + parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters' parameters_ws_current_row_number += 1 @@ -654,7 +654,7 @@ def generate_excel(report, ################################################################################################################ ws['B' + str(current_sheet_parameters_row_number)].font = title_font - ws['B' + str(current_sheet_parameters_row_number)] = name + ' Parameters' + ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + 'Parameters' current_sheet_parameters_row_number += 1 diff --git a/myems-api/excelexporters/virtualmetercost.py b/myems-api/excelexporters/virtualmetercost.py index 833c32bd..3e1acf01 100644 --- a/myems-api/excelexporters/virtualmetercost.py +++ b/myems-api/excelexporters/virtualmetercost.py @@ -76,7 +76,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -157,7 +157,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_cost_data_flag: ws['B6'].font = title_font - ws['B6'] = name + '报告期成本' + ws['B6'] = name + 'Reporting Period Costs' reporting_period_data = report['reporting_period'] category = report['virtual_meter']['energy_category_name'] @@ -169,12 +169,12 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '成本' + ws['B8'] = 'Cost' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '环比' + ws['B9'] = 'Increment Rate' ws['B9'].border = f_border col = 'B' @@ -207,7 +207,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[tce_col + '7'].fill = table_fill ws[tce_col + '7'].font = name_font ws[tce_col + '7'].alignment = c_c_alignment - ws[tce_col + '7'] = "吨标准煤 (TCE)" + ws[tce_col + '7'] = 'Ton of Standard Coal (TCE)' ws[tce_col + '7'].border = f_border ws[tce_col + '8'].font = name_font @@ -226,7 +226,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[tco2e_col + '7'].fill = table_fill ws[tco2e_col + '7'].font = name_font ws[tco2e_col + '7'].alignment = c_c_alignment - ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)" + ws[tco2e_col + '7'] = 'Ton of Carbon Dioxide Emissions (TCO2E)' ws[tco2e_col + '7'].border = f_border ws[tco2e_col + '8'].font = name_font @@ -257,14 +257,14 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_cost_detail_flag: ws['B11'].font = title_font - ws['B11'] = name + '详细数据' + ws['B11'] = name + 'Detailed Data' ws.row_dimensions[18].height = 60 ws['B18'].fill = table_fill ws['B18'].font = title_font ws['B18'].border = f_border ws['B18'].alignment = c_c_alignment - ws['B18'] = '日期时间' + ws['B18'] = 'Datetime' time = times has_data = False max_row = 0 @@ -288,7 +288,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(end_data_row_number + 1)].font = title_font ws['B' + str(end_data_row_number + 1)].alignment = c_c_alignment - ws['B' + str(end_data_row_number + 1)] = '总计' + ws['B' + str(end_data_row_number + 1)] = 'Total' ws['B' + str(end_data_row_number + 1)].border = f_border for i in range(0, ca_len): @@ -327,7 +327,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d line_data.marker.symbol = "circle" line_data.smooth = True line.x_axis.crosses = 'min' - line.title = '报告期成本 - ' + report['virtual_meter']['energy_category_name'] + \ + line.title = 'Reporting Period Costs - ' + report['virtual_meter']['energy_category_name'] + \ " (" + report['virtual_meter']['unit_of_measure'] + ")" line.dLbls = DataLabelList() line.dLbls.dLblPos = 't' diff --git a/myems-api/excelexporters/virtualmeterenergy.py b/myems-api/excelexporters/virtualmeterenergy.py index 08d4535a..25492801 100644 --- a/myems-api/excelexporters/virtualmeterenergy.py +++ b/myems-api/excelexporters/virtualmeterenergy.py @@ -72,7 +72,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Font name_font = Font(name='Constantia', size=15, bold=True) - title_font = Font(name='宋体', size=15, bold=True) + title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') f_border = Border(left=Side(border_style='medium', color='00000000'), @@ -153,7 +153,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_cost_data_flag: ws['B6'].font = title_font - ws['B6'] = name + '报告期消耗' + ws['B6'] = name + 'Reporting Period Consumption' reporting_period_data = report['reporting_period'] category = report['virtual_meter']['energy_category_name'] @@ -165,12 +165,12 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B8'].font = title_font ws['B8'].alignment = c_c_alignment - ws['B8'] = '能耗' + ws['B8'] = 'Consumption' ws['B8'].border = f_border ws['B9'].font = title_font ws['B9'].alignment = c_c_alignment - ws['B9'] = '环比' + ws['B9'] = 'Increment Rate' ws['B9'].border = f_border col = 'B' @@ -203,7 +203,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[tce_col + '7'].fill = table_fill ws[tce_col + '7'].font = name_font ws[tce_col + '7'].alignment = c_c_alignment - ws[tce_col + '7'] = "吨标准煤 (TCE)" + ws[tce_col + '7'] = 'Ton of Standard Coal (TCE)' ws[tce_col + '7'].border = f_border ws[tce_col + '8'].font = name_font @@ -222,7 +222,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws[tco2e_col + '7'].fill = table_fill ws[tco2e_col + '7'].font = name_font ws[tco2e_col + '7'].alignment = c_c_alignment - ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)" + ws[tco2e_col + '7'] = 'Ton of Carbon Dioxide Emissions (TCO2E)' ws[tco2e_col + '7'].border = f_border ws[tco2e_col + '8'].font = name_font @@ -253,14 +253,14 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_cost_detail_flag: ws['B11'].font = title_font - ws['B11'] = name + '详细数据' + ws['B11'] = name + 'Detailed Data' ws.row_dimensions[18].height = 60 ws['B18'].fill = table_fill ws['B18'].font = title_font ws['B18'].border = f_border ws['B18'].alignment = c_c_alignment - ws['B18'] = '日期时间' + ws['B18'] = 'Datetime' time = times has_data = False max_row = 0 @@ -284,7 +284,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws['B' + str(end_data_row_number + 1)].font = title_font ws['B' + str(end_data_row_number + 1)].alignment = c_c_alignment - ws['B' + str(end_data_row_number + 1)] = '总计' + ws['B' + str(end_data_row_number + 1)] = 'Total' ws['B' + str(end_data_row_number + 1)].border = f_border for i in range(0, ca_len): @@ -323,7 +323,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d line_data.marker.symbol = "circle" line_data.smooth = True line.x_axis.crosses = 'min' - line.title = '报告期消耗 - ' + report['virtual_meter']['energy_category_name'] + \ + line.title = 'Reporting Period Consumption - ' + report['virtual_meter']['energy_category_name'] + \ " (" + report['virtual_meter']['unit_of_measure'] + ")" line.dLbls = DataLabelList() line.dLbls.dLblPos = 't' From fc18eeb32ca7c90952de4b4486263c33c7911820 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 24 Sep 2021 13:47:31 +0800 Subject: [PATCH 68/87] fixed PEP8 warnings and update version number to v1.3.0 --- CHANGELOG.md | 41 ++++++++++++++- admin/views/common/footer-login.html | 2 +- admin/views/common/footer.html | 2 +- database/myems_system_db.sql | 2 +- .../{upgrade1.2.4.sql => upgrade1.3.0.sql} | 2 +- myems-api/README.md | 50 +++++++++---------- .../combinedequipmentenergyitem.py | 8 +-- .../excelexporters/combinedequipmentincome.py | 4 +- .../excelexporters/combinedequipmentsaving.py | 4 +- .../excelexporters/equipmentenergyitem.py | 10 ++-- myems-api/excelexporters/equipmentincome.py | 4 +- .../excelexporters/equipmentstatistics.py | 3 +- .../excelexporters/shopfloorenergyitem.py | 10 ++-- myems-api/excelexporters/shopfloorload.py | 3 +- .../excelexporters/shopfloorstatistics.py | 6 ++- myems-api/excelexporters/spacecost.py | 4 +- myems-api/excelexporters/spaceenergyitem.py | 10 ++-- myems-api/excelexporters/spaceincome.py | 4 +- myems-api/excelexporters/spaceload.py | 3 +- myems-api/excelexporters/spacestatistics.py | 3 +- myems-api/excelexporters/storeenergyitem.py | 10 ++-- myems-api/excelexporters/storestatistics.py | 3 +- myems-api/excelexporters/tenantenergyitem.py | 10 ++-- myems-api/excelexporters/tenantload.py | 3 +- myems-api/excelexporters/tenantstatistics.py | 3 +- web/package-lock.json | 4 +- web/package.json | 2 +- 27 files changed, 124 insertions(+), 86 deletions(-) rename database/upgrade/{upgrade1.2.4.sql => upgrade1.3.0.sql} (79%) diff --git a/CHANGELOG.md b/CHANGELOG.md index afa87e06..d4bef48c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,44 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Removed - None. + +## [v1.3.0] - 2021-09-04 +### Added +- added expiration datetimes to User in Admin UI +- added expiration datetimes to user actions in API +- added expiration datetimes to user table in database +- added column ID to StoreBatch Excel Exporter in API +- added meter ID to meterbatch excel exporter in API +- added new datasource protocols to API +- added API error messages to translations.js and i18n.js +- added spinners to Dashboard of Web UI. + +### Changed +- replaced Chinese with English in Excel Exporters of API +- changed start&end datetime formatter for tariff from timestamp to strftime +- changed lease start&end datetime formatter for tenant from timestamp to strftime +- changed last run datetime and next run datetime formatter for rule from timestamp to strftime +- changed last seen datetime formatter for gateway from timestamp to strftime +- changed last seen datetime formatter of datasource from timestamp to strftime +- changed upload datetime formatter of knowledgefile and offlinemeterfile from timestamp to strftime +- changed cost file upload datetime formatter from timestamp to strftime +- updated translation of Admin UI +- updated database README +- updated demo databse for database ingestion service +- updated distibutionssystem point value timeout value to 30 minutes +- updated Admin UI to make error messages more specific +- updated translations of KGCE & KGCO2E in Admin UI +- updated userlogger in API to pass HTTPError to client. + +### Fixed +- fixed PEP8 warnings in API +- fixed typo in contact controller of Admin UI +- added try_files directive to avoid 404 error while refreshing pages in Web UI +- modified API error message for knowledge file cannot be removed from disk. + +### Removed +- removed cookies usages from API + ## [v1.2.3] - 2021-09-04 ### Added - added tbl_reports to myems_reporting_db in database. @@ -423,7 +461,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Removed - None. -[Unreleased]: https://github.com/MyEMS/MyEMS/compare/v1.2.3...HEAD +[Unreleased]: https://github.com/MyEMS/MyEMS/compare/v1.3.0...HEAD +[v1.3.0]: https://github.com/MyEMS/MyEMS/compare/v1.2.3...v1.3.0 [v1.2.3]: https://github.com/MyEMS/MyEMS/compare/v1.2.2...v1.2.3 [v1.2.2]: https://github.com/MyEMS/MyEMS/compare/v1.2.1...v1.2.2 [v1.2.1]: https://github.com/MyEMS/MyEMS/compare/v1.2.0...v1.2.1 diff --git a/admin/views/common/footer-login.html b/admin/views/common/footer-login.html index 1560f91a..a372065a 100644 --- a/admin/views/common/footer-login.html +++ b/admin/views/common/footer-login.html @@ -1,5 +1,5 @@ diff --git a/admin/views/common/footer.html b/admin/views/common/footer.html index 74993997..6efece7e 100644 --- a/admin/views/common/footer.html +++ b/admin/views/common/footer.html @@ -3,6 +3,6 @@ https://myems.io
    - {{'MY_EMS_NAME' | translate}} v1.2.3 + {{'MY_EMS_NAME' | translate}} v1.3.0
    diff --git a/database/myems_system_db.sql b/database/myems_system_db.sql index 136ede93..de3dad2d 100644 --- a/database/myems_system_db.sql +++ b/database/myems_system_db.sql @@ -1243,6 +1243,6 @@ USE `myems_system_db`; INSERT INTO `myems_system_db`.`tbl_versions` (`id`, `version`, `release_date`) VALUES -(1, '1.2.4', '2021-09-11'); +(1, '1.3.0', '2021-09-24'); COMMIT; diff --git a/database/upgrade/upgrade1.2.4.sql b/database/upgrade/upgrade1.3.0.sql similarity index 79% rename from database/upgrade/upgrade1.2.4.sql rename to database/upgrade/upgrade1.3.0.sql index f1f70c5a..df592cb9 100644 --- a/database/upgrade/upgrade1.2.4.sql +++ b/database/upgrade/upgrade1.3.0.sql @@ -6,4 +6,4 @@ ALTER TABLE `myems_user_db`.`tbl_users` ADD `password_expiration_datetime_utc` D ALTER TABLE `myems_user_db`.`tbl_users` ADD `account_expiration_datetime_utc` DATETIME NOT NULL DEFAULT '2099-12-31 16:00:00' AFTER privilege_id; -- UPDATE VERSION NUMBER -UPDATE myems_system_db.tbl_versions SET version='1.2.4', release_date='2021-09-11' WHERE id=1; +UPDATE myems_system_db.tbl_versions SET version='1.3.0', release_date='2021-09-24' WHERE id=1; diff --git a/myems-api/README.md b/myems-api/README.md index f58f38c5..bedde402 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -262,7 +262,7 @@ curl -i -X DELETE {{base_url}}/costcenters/{id}/tariffs/{tid} ``` ### Cost File -* GET an Cost File by ID +* GET a Cost File by ID ```bash curl -i -X GET {{base_url}}/costfiles/{id} @@ -638,7 +638,7 @@ Result ```bash curl -i -X GET {{base_url}}/equipments ``` -* DELETE an Equipment by ID +* DELETE Equipment by ID ```bash curl -i -X DELETE {{base_url}}/equipments/{id} ``` @@ -654,7 +654,7 @@ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Ch ```bash curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{}}' {{base_url}}/equipments/{id} ``` -* GET All Meters of an Equipment by ID +* GET All Meters of Equipment by ID ```bash curl -i -X GET {{base_url}}/equipments/{id}/meters ``` @@ -666,11 +666,11 @@ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' ```bash curl -i -X DELETE {{base_url}}/equipments/{id}/meters/{mid} ``` -* GET All Parameters of an Equipment by ID +* GET All Parameters of Equipment by ID ```bash curl -i -X GET {{base_url}}/equipments/{id}/parameters ``` -* GET a Parameter of an Equipment by ID +* GET a Parameter of Equipment by ID ```bash curl -i -X GET {{base_url}}/equipments/{id}/parameters/{pid} ``` @@ -704,7 +704,7 @@ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test pa ```bash curl -i -X DELETE {{base_url}}/equipments/{id}/parameters/{pid} ``` -* GET All Offline Meters of an Equipment by ID +* GET All Offline Meters of Equipment by ID ```bash curl -i -X GET {{base_url}}/equipments/{id}/offlinemeters ``` @@ -716,11 +716,11 @@ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_ ```bash curl -i -X DELETE {{base_url}}/equipments/{id}/offlinemeters/{mid} ``` -* GET All Virtual Meters of an Equipment by ID +* GET All Virtual Meters of Equipment by ID ```bash curl -i -X GET {{base_url}}/equipments/{id}/virtualmeters ``` -* POST Bind an Virtual Meter to an Equipment +* POST Bind Virtual Meter to an Equipment ```bash curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/equipments/{id}/virtualmeters ``` @@ -844,7 +844,7 @@ curl -i -X DELETE {{base_url}}/combinedequipments/{id}/offlinemeters/{mid} ```bash curl -i -X GET {{base_url}}/combinedequipments/{id}/virtualmeters ``` -* POST Bind an Virtual Meter to a Combined Equipment +* POST Bind Virtual Meter to a Combined Equipment ```bash curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/combinedequipments/{id}/virtualmeters ``` @@ -1321,11 +1321,11 @@ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Sh ```bash curl -i -X GET {{base_url}}/shopfloors/{id}/equipments ``` -* POST Bind an Equipment to a Shopfloor +* POST Bind Equipment to a Shopfloor ```bash curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"equipment_id":1}}' {{base_url}}/shopfloors/{id}/equipments ``` -* DELETE an Equipment from Shopfloor +* DELETE Equipment from Shopfloor ```bash curl -i -X DELETE {{base_url}}/shopfloors/{id}/equipments/{eid} ``` @@ -1381,11 +1381,11 @@ curl -i -X DELETE {{base_url}}/shopfloors/{id}/sensors/{sid} ```bash curl -i -X GET {{base_url}}/shopfloors/{id}/virtualmeters ``` -* POST Bind an Virtual Meter to a Shopfloor +* POST Bind Virtual Meter to a Shopfloor ```bash curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/shopfloors/{id}/virtualmeters ``` -* DELETE an Virtual Meter from Shopfloor +* DELETE Virtual Meter from Shopfloor ```bash curl -i -X DELETE {{base_url}}/shopfloors/{id}/virtualmeters/{mid} ``` @@ -1447,11 +1447,11 @@ curl -i -X DELETE {{base_url}}/spaces/{id}/combinedequipments/{eid} ```bash curl -i -X GET {{base_url}}/spaces/{id}/equipments ``` -* POST Bind an Equipment to a Space +* POST Bind Equipment to a Space ```bash curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"equipment_id":1}}' {{base_url}}/spaces/{id}/equipments ``` -* DELETE an Equipment from Space +* DELETE Equipment from Space ```bash curl -i -X DELETE {{base_url}}/spaces/{id}/equipments/{eid} ``` @@ -1531,11 +1531,11 @@ curl -i -X DELETE {{base_url}}/spaces/{id}/tenants/{tid} ```bash curl -i -X GET {{base_url}}/spaces/{id}/virtualmeters ``` -* POST Bind an Virtual Meter to a Space +* POST Bind Virtual Meter to a Space ```bash curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/spaces/{id}/virtualmeters ``` -* DELETE an Virtual Meter from Space +* DELETE Virtual Meter from Space ```bash curl -i -X DELETE {{base_url}}/spaces/{id}/virtualmeters/{mid} ``` @@ -1634,11 +1634,11 @@ curl -i -X DELETE {{base_url}}/stores/{id}/sensors/{sid} ```bash curl -i -X GET {{base_url}}/stores/{id}/virtualmeters ``` -* POST Bind an Virtual Meter to a Store +* POST Bind Virtual Meter to a Store ```bash curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/stores/{id}/virtualmeters ``` -* DELETE an Virtual Meter from Store +* DELETE Virtual Meter from Store ```bash curl -i -X DELETE {{base_url}}/stores/{id}/virtualmeters/{mid} ``` @@ -1831,7 +1831,7 @@ curl -i -X DELETE {{base_url}}/tenants/{id}/sensors/{sid} ```bash curl -i -X GET {{base_url}}/tenants/{id}/virtualmeters ``` -* POST Bind an Virtual Meter to a Tenant +* POST Bind Virtual Meter to a Tenant ```bash curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/tenants/{id}/virtualmeters ``` @@ -1874,7 +1874,7 @@ curl -i -X DELETE {{base_url}}/tenanttypes/{id} ``` ### Text Message -* GET an Text Message by ID +* GET Text Message by ID Result in JSON @@ -1896,7 +1896,7 @@ curl -i -X GET {{base_url}}/textmessages/{id} ```bash curl -i -X GET {{base_url}}/textmessages/from/{startdate}/to/{enddate} ``` -* DELETE an Text Message by ID +* DELETE Text Message by ID ```bash curl -i -X DELETE {{base_url}}/textmessages/{id} ``` @@ -2035,7 +2035,7 @@ curl -i -X DELETE {{base_url}}/webmessages/{id} ``` ### Wechat Message -* GET an Wechat Message by ID +* GET Wechat Message by ID Result in JSON @@ -2053,11 +2053,11 @@ Result in JSON ```bash curl -i -X GET {{base_url}}/wechatmessages/{id} ``` -* GET a Wechat Messages from Startdate to Enddate +* GET Wechat Messages from Startdate to Enddate ```bash curl -i -X GET {{base_url}}/wechatmessages/from/{startdate}/to/{enddate} ``` -* DELETE a Wechat Message by ID +* DELETE Wechat Message by ID ```bash curl -i -X DELETE {{base_url}}/wechatmessages/{id} ``` diff --git a/myems-api/excelexporters/combinedequipmentenergyitem.py b/myems-api/excelexporters/combinedequipmentenergyitem.py index e81c39b0..f5b11aab 100644 --- a/myems-api/excelexporters/combinedequipmentenergyitem.py +++ b/myems-api/excelexporters/combinedequipmentenergyitem.py @@ -237,8 +237,8 @@ def generate_excel(report, ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)] = \ - name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ - ') by Energy Item' + name + ' ' + category_dict_name + ' ' + \ + '(' + reporting_period_data['units'][category_dict_values[0]] + ') by Energy Item' current_row_number += 1 table_start_row_number = current_row_number @@ -271,8 +271,8 @@ def generate_excel(report, pie = PieChart() pie.title = \ - name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ - ') by Energy Item' + name + ' ' + category_dict_name + ' ' + \ + '(' + reporting_period_data['units'][category_dict_values[0]] + ') by Energy Item' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) diff --git a/myems-api/excelexporters/combinedequipmentincome.py b/myems-api/excelexporters/combinedequipmentincome.py index 3a9bedb0..ff4da4ef 100644 --- a/myems-api/excelexporters/combinedequipmentincome.py +++ b/myems-api/excelexporters/combinedequipmentincome.py @@ -377,8 +377,8 @@ def generate_excel(report, ws[col + row].border = f_border line = LineChart() - line.title = \ - 'Reporting Period Income - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + line.title = 'Reporting Period Income - ' + reporting_period_data['names'][i] + \ + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_row + 1, max_row=max_row) line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) line.add_data(line_data, titles_from_data=True) diff --git a/myems-api/excelexporters/combinedequipmentsaving.py b/myems-api/excelexporters/combinedequipmentsaving.py index 47dbd4f2..90ed72ac 100644 --- a/myems-api/excelexporters/combinedequipmentsaving.py +++ b/myems-api/excelexporters/combinedequipmentsaving.py @@ -189,8 +189,8 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = \ - reporting_period_data['names'][i] + ' ' + '(Baseline - Actual)(' + reporting_period_data['units'][i] + ")" + ws[col + str(current_row_number)] = reporting_period_data['names'][i] + ' ' + \ + '(Baseline - Actual)(' + reporting_period_data['units'][i] + ")" col = chr(ord(col) + 1) diff --git a/myems-api/excelexporters/equipmentenergyitem.py b/myems-api/excelexporters/equipmentenergyitem.py index 7a4c277c..39416dac 100644 --- a/myems-api/excelexporters/equipmentenergyitem.py +++ b/myems-api/excelexporters/equipmentenergyitem.py @@ -234,9 +234,8 @@ def generate_excel(report, for category_dict_name, category_dict_values in category_dict.items(): ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = \ - name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ - ') by Energy Item' + ws['B' + str(current_row_number)] = name + ' ' + category_dict_name + ' ' + \ + '(' + reporting_period_data['units'][category_dict_values[0]] + ') by Energy Item' current_row_number += 1 table_start_row_number = current_row_number @@ -268,9 +267,8 @@ def generate_excel(report, table_end_row_number = current_row_number - 1 pie = PieChart() - pie.title = \ - name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ - ') by Energy Item' + pie.title = name + ' ' + category_dict_name + ' ' + \ + '(' + reporting_period_data['units'][category_dict_values[0]] + ') by Energy Item' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) diff --git a/myems-api/excelexporters/equipmentincome.py b/myems-api/excelexporters/equipmentincome.py index 30553781..421ef0af 100644 --- a/myems-api/excelexporters/equipmentincome.py +++ b/myems-api/excelexporters/equipmentincome.py @@ -375,8 +375,8 @@ def generate_excel(report, ws[col + row].border = f_border line = LineChart() - line.title = \ - 'Reporting Period Income - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + line.title = 'Reporting Period Income - ' + reporting_period_data['names'][i] + \ + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_row + 1, max_row=max_row) line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) line.add_data(line_data, titles_from_data=True) diff --git a/myems-api/excelexporters/equipmentstatistics.py b/myems-api/excelexporters/equipmentstatistics.py index 90b006e2..318158a6 100644 --- a/myems-api/excelexporters/equipmentstatistics.py +++ b/myems-api/excelexporters/equipmentstatistics.py @@ -379,7 +379,8 @@ def generate_excel(report, #################################################################################################################### for i in range(0, ca_len): line = LineChart() - line.title = "Reporting Period Consumption" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" + line.title = "Reporting Period Consumption" + " - " + names[i] + \ + "(" + reporting_period_data['units'][i] + ")" line.style = 10 line.height = 8.40 line.width = 24 diff --git a/myems-api/excelexporters/shopfloorenergyitem.py b/myems-api/excelexporters/shopfloorenergyitem.py index b61a511e..d9ccfbfc 100644 --- a/myems-api/excelexporters/shopfloorenergyitem.py +++ b/myems-api/excelexporters/shopfloorenergyitem.py @@ -252,9 +252,8 @@ def generate_excel(report, for category_dict_name, category_dict_values in category_dict.items(): ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = \ - name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ - ') by Energy Item' + ws['B' + str(current_row_number)] = name + ' ' + category_dict_name + ' ' + \ + '(' + reporting_period_data['units'][category_dict_values[0]] + ') by Energy Item' current_row_number += 1 table_start_row_number = current_row_number @@ -286,9 +285,8 @@ def generate_excel(report, table_end_row_number = current_row_number - 1 pie = PieChart() - pie.title = \ - name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ - ') by Energy Item' + pie.title = name + ' ' + category_dict_name + ' ' + \ + '(' + reporting_period_data['units'][category_dict_values[0]] + ') by Energy Item' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) diff --git a/myems-api/excelexporters/shopfloorload.py b/myems-api/excelexporters/shopfloorload.py index 982ffbd8..525f3643 100644 --- a/myems-api/excelexporters/shopfloorload.py +++ b/myems-api/excelexporters/shopfloorload.py @@ -258,7 +258,8 @@ def generate_excel(report, per_unit_area_start_row_number = 9 + ca_len * 2 ws['B' + str(per_unit_area_start_row_number)].font = title_font - ws['B' + str(per_unit_area_start_row_number)] = name + ' ' + 'Per Unit Area' + str(report['shopfloor']['area']) + 'M²' + ws['B' + str(per_unit_area_start_row_number)] = name + ' ' + 'Per Unit Area' + \ + str(report['shopfloor']['area']) + 'M²' category = reporting_period_data['names'] diff --git a/myems-api/excelexporters/shopfloorstatistics.py b/myems-api/excelexporters/shopfloorstatistics.py index 30587021..2fa13470 100644 --- a/myems-api/excelexporters/shopfloorstatistics.py +++ b/myems-api/excelexporters/shopfloorstatistics.py @@ -310,7 +310,8 @@ def generate_excel(report, per_unit_area_start_row_number = 9 + ca_len * 2 ws['B' + str(per_unit_area_start_row_number)].font = title_font - ws['B' + str(per_unit_area_start_row_number)] = name + ' ' + 'Per Unit Area' + str(report['shopfloor']['area']) + 'M²' + ws['B' + str(per_unit_area_start_row_number)] = name + ' ' + 'Per Unit Area' + str(report['shopfloor']['area']) + \ + 'M²' category = reporting_period_data['names'] @@ -496,7 +497,8 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = "Reporting Period Consumption" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" + line.title = "Reporting Period Consumption" + " - " + names[i] + \ + "(" + reporting_period_data['units'][i] + ")" line.style = 10 line.x_axis.majorTickMark = 'in' line.y_axis.majorTickMark = 'in' diff --git a/myems-api/excelexporters/spacecost.py b/myems-api/excelexporters/spacecost.py index a4d74096..e62d268e 100644 --- a/myems-api/excelexporters/spacecost.py +++ b/myems-api/excelexporters/spacecost.py @@ -465,8 +465,8 @@ def generate_excel(report, ws[col + row].border = f_border line = LineChart() - line.title = \ - 'Reporting Period Costs - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + line.title = 'Reporting Period Costs - ' + reporting_period_data['names'][i] + \ + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_row + 1, max_row=max_row) line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) line.add_data(line_data, titles_from_data=True) diff --git a/myems-api/excelexporters/spaceenergyitem.py b/myems-api/excelexporters/spaceenergyitem.py index 2b9da93f..76940b48 100644 --- a/myems-api/excelexporters/spaceenergyitem.py +++ b/myems-api/excelexporters/spaceenergyitem.py @@ -254,9 +254,8 @@ def generate_excel(report, for category_dict_name, category_dict_values in category_dict.items(): ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = \ - name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ - ') by Energy Item' + ws['B' + str(current_row_number)] = name + ' ' + category_dict_name + ' ' + \ + '(' + reporting_period_data['units'][category_dict_values[0]] + ') by Energy Item' current_row_number += 1 table_start_row_number = current_row_number @@ -288,9 +287,8 @@ def generate_excel(report, table_end_row_number = current_row_number - 1 pie = PieChart() - pie.title = \ - name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ - ') by Energy Item' + pie.title = name + ' ' + category_dict_name + ' ' + \ + '(' + reporting_period_data['units'][category_dict_values[0]] + ') by Energy Item' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) diff --git a/myems-api/excelexporters/spaceincome.py b/myems-api/excelexporters/spaceincome.py index aab8d074..d4f2fac1 100644 --- a/myems-api/excelexporters/spaceincome.py +++ b/myems-api/excelexporters/spaceincome.py @@ -393,8 +393,8 @@ def generate_excel(report, ws[col + row].border = f_border line = LineChart() - line.title = \ - 'Reporting Period Income - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")" + line.title = 'Reporting Period Income - ' + reporting_period_data['names'][i] + \ + " (" + reporting_period_data['units'][i] + ")" labels = Reference(ws, min_col=2, min_row=table_row + 1, max_row=max_row) line_data = Reference(ws, min_col=3 + i, min_row=table_row, max_row=max_row) line.add_data(line_data, titles_from_data=True) diff --git a/myems-api/excelexporters/spaceload.py b/myems-api/excelexporters/spaceload.py index e99e9608..cb9b9111 100644 --- a/myems-api/excelexporters/spaceload.py +++ b/myems-api/excelexporters/spaceload.py @@ -461,7 +461,8 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_sub_maximums_data_flag: line = LineChart() - line.title = 'Reporting Period Maximum Load - ' + ws.cell(column=current_chart_col_number, row=table_start_number).value + line.title = 'Reporting Period Maximum Load - ' + ws.cell(column=current_chart_col_number, + row=table_start_number).value datas = Reference(ws, min_col=current_chart_col_number, min_row=table_start_number, max_row=table_end_number) line.add_data(datas, titles_from_data=True) diff --git a/myems-api/excelexporters/spacestatistics.py b/myems-api/excelexporters/spacestatistics.py index dfb2c32c..5a96e79c 100644 --- a/myems-api/excelexporters/spacestatistics.py +++ b/myems-api/excelexporters/spacestatistics.py @@ -494,7 +494,8 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = "Reporting Period Consumption" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" + line.title = "Reporting Period Consumption" + " - " + names[i] + \ + "(" + reporting_period_data['units'][i] + ")" line.style = 10 line.x_axis.majorTickMark = 'in' line.y_axis.majorTickMark = 'in' diff --git a/myems-api/excelexporters/storeenergyitem.py b/myems-api/excelexporters/storeenergyitem.py index 312e25a0..7264c4a7 100644 --- a/myems-api/excelexporters/storeenergyitem.py +++ b/myems-api/excelexporters/storeenergyitem.py @@ -252,9 +252,8 @@ def generate_excel(report, for category_dict_name, category_dict_values in category_dict.items(): ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = \ - name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ - ') by Energy Item' + ws['B' + str(current_row_number)] = name + ' ' + category_dict_name + ' ' + \ + '(' + reporting_period_data['units'][category_dict_values[0]] + ') by Energy Item' current_row_number += 1 table_start_row_number = current_row_number @@ -286,9 +285,8 @@ def generate_excel(report, table_end_row_number = current_row_number - 1 pie = PieChart() - pie.title = \ - name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ - ') by Energy Item' + pie.title = name + ' ' + category_dict_name + ' ' + \ + '(' + reporting_period_data['units'][category_dict_values[0]] + ') by Energy Item' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) diff --git a/myems-api/excelexporters/storestatistics.py b/myems-api/excelexporters/storestatistics.py index 90266b60..b0c3124b 100644 --- a/myems-api/excelexporters/storestatistics.py +++ b/myems-api/excelexporters/storestatistics.py @@ -497,7 +497,8 @@ def generate_excel(report, #################################################################################################################### for i in range(0, ca_len): line = LineChart() - line.title = "Reporting Period Consumption" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" + line.title = "Reporting Period Consumption" + " - " + names[i] + \ + "(" + reporting_period_data['units'][i] + ")" line.style = 10 line.x_axis.majorTickMark = 'in' line.y_axis.majorTickMark = 'in' diff --git a/myems-api/excelexporters/tenantenergyitem.py b/myems-api/excelexporters/tenantenergyitem.py index 462a6a9e..cf930b38 100644 --- a/myems-api/excelexporters/tenantenergyitem.py +++ b/myems-api/excelexporters/tenantenergyitem.py @@ -253,9 +253,8 @@ def generate_excel(report, for category_dict_name, category_dict_values in category_dict.items(): ws['B' + str(current_row_number)].font = title_font - ws['B' + str(current_row_number)] = \ - name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ - ') by Energy Item' + ws['B' + str(current_row_number)] = name + ' ' + category_dict_name + ' ' + \ + '(' + reporting_period_data['units'][category_dict_values[0]] + ') by Energy Item' current_row_number += 1 table_start_row_number = current_row_number @@ -287,9 +286,8 @@ def generate_excel(report, table_end_row_number = current_row_number - 1 pie = PieChart() - pie.title = \ - name + ' ' + category_dict_name + ' ' + '(' + reporting_period_data['units'][category_dict_values[0]] + \ - ') by Energy Item' + pie.title = name + ' ' + category_dict_name + ' ' + \ + '(' + reporting_period_data['units'][category_dict_values[0]] + ') by Energy Item' labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number) pie.add_data(pie_data, titles_from_data=True) diff --git a/myems-api/excelexporters/tenantload.py b/myems-api/excelexporters/tenantload.py index 717d3996..cfc70d2e 100644 --- a/myems-api/excelexporters/tenantload.py +++ b/myems-api/excelexporters/tenantload.py @@ -462,7 +462,8 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d if has_sub_maximums_data_flag: line = LineChart() - line.title = 'Reporting Period Maximum Load - ' + ws.cell(column=current_chart_col_number, row=table_start_number).value + line.title = 'Reporting Period Maximum Load - ' + ws.cell(column=current_chart_col_number, + row=table_start_number).value datas = Reference(ws, min_col=current_chart_col_number, min_row=table_start_number, max_row=table_end_number) line.add_data(datas, titles_from_data=True) diff --git a/myems-api/excelexporters/tenantstatistics.py b/myems-api/excelexporters/tenantstatistics.py index 818015ad..c77a18de 100644 --- a/myems-api/excelexporters/tenantstatistics.py +++ b/myems-api/excelexporters/tenantstatistics.py @@ -492,7 +492,8 @@ def generate_excel(report, for i in range(0, ca_len): line = LineChart() - line.title = "Reporting Period Consumption" + " - " + names[i] + "(" + reporting_period_data['units'][i] + ")" + line.title = "Reporting Period Consumption" + " - " + names[i] + \ + "(" + reporting_period_data['units'][i] + ")" line.style = 10 line.x_axis.majorTickMark = 'in' line.y_axis.majorTickMark = 'in' diff --git a/web/package-lock.json b/web/package-lock.json index b7fe83ae..0202ee31 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "myems", - "version": "1.2.3", + "version": "1.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "myems", - "version": "1.2.3", + "version": "1.3.0", "dependencies": { "@fortawesome/fontawesome-free": "^5.15.1", "@fortawesome/fontawesome-svg-core": "^1.2.30", diff --git a/web/package.json b/web/package.json index 439b31e3..edda4dcd 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "myems", - "version": "1.2.3", + "version": "1.3.0", "private": true, "dependencies": { "@fortawesome/fontawesome-free": "^5.15.1", From db622eb0c90ce3c5462fbb3a7d405bb4f3164680 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 24 Sep 2021 19:44:29 +0800 Subject: [PATCH 69/87] updated version number to v1.3.0 --- web/src/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/config.js b/web/src/config.js index d31aeab5..62bc51f2 100644 --- a/web/src/config.js +++ b/web/src/config.js @@ -1,4 +1,4 @@ -export const version = '1.2.3'; +export const version = '1.3.0'; export const navbarBreakPoint = 'xl'; // Vertical navbar breakpoint export const topNavbarBreakpoint = 'lg'; //export const APIBaseURL = 'http://127.0.0.1:8000'; From 60d772ee1bbe7a5c5cd47433d83ef0015b7e1f1e Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sat, 25 Sep 2021 22:42:26 +0800 Subject: [PATCH 70/87] changed name font from Constantia to Arial in excel exporters --- myems-api/excelexporters/combinedequipmentbatch.py | 2 +- myems-api/excelexporters/combinedequipmentcost.py | 2 +- myems-api/excelexporters/combinedequipmentefficiency.py | 2 +- myems-api/excelexporters/combinedequipmentenergycategory.py | 2 +- myems-api/excelexporters/combinedequipmentenergyitem.py | 2 +- myems-api/excelexporters/combinedequipmentincome.py | 2 +- myems-api/excelexporters/combinedequipmentload.py | 2 +- myems-api/excelexporters/combinedequipmentoutput.py | 2 +- myems-api/excelexporters/combinedequipmentsaving.py | 2 +- myems-api/excelexporters/combinedequipmentstatistics.py | 2 +- myems-api/excelexporters/equipmentbatch.py | 2 +- myems-api/excelexporters/equipmentcost.py | 2 +- myems-api/excelexporters/equipmentefficiency.py | 2 +- myems-api/excelexporters/equipmentenergycategory.py | 2 +- myems-api/excelexporters/equipmentenergyitem.py | 2 +- myems-api/excelexporters/equipmentincome.py | 2 +- myems-api/excelexporters/equipmentload.py | 2 +- myems-api/excelexporters/equipmentoutput.py | 2 +- myems-api/excelexporters/equipmentsaving.py | 2 +- myems-api/excelexporters/equipmentstatistics.py | 2 +- myems-api/excelexporters/equipmenttracking.py | 2 +- myems-api/excelexporters/meterbatch.py | 2 +- myems-api/excelexporters/metercost.py | 2 +- myems-api/excelexporters/meterenergy.py | 2 +- myems-api/excelexporters/metersubmetersbalance.py | 2 +- myems-api/excelexporters/metertracking.py | 2 +- myems-api/excelexporters/metertrend.py | 2 +- myems-api/excelexporters/offlinemetercost.py | 2 +- myems-api/excelexporters/offlinemeterenergy.py | 2 +- myems-api/excelexporters/shopfloorbatch.py | 2 +- myems-api/excelexporters/shopfloorcost.py | 2 +- myems-api/excelexporters/shopfloorenergycategory.py | 2 +- myems-api/excelexporters/shopfloorenergyitem.py | 2 +- myems-api/excelexporters/shopfloorload.py | 2 +- myems-api/excelexporters/shopfloorsaving.py | 2 +- myems-api/excelexporters/shopfloorstatistics.py | 2 +- myems-api/excelexporters/spacecost.py | 2 +- myems-api/excelexporters/spaceefficiency.py | 2 +- myems-api/excelexporters/spaceenergycategory.py | 2 +- myems-api/excelexporters/spaceenergyitem.py | 2 +- myems-api/excelexporters/spaceincome.py | 2 +- myems-api/excelexporters/spaceload.py | 2 +- myems-api/excelexporters/spaceoutput.py | 2 +- myems-api/excelexporters/spacesaving.py | 2 +- myems-api/excelexporters/spacestatistics.py | 2 +- myems-api/excelexporters/storebatch.py | 2 +- myems-api/excelexporters/storecost.py | 2 +- myems-api/excelexporters/storeenergycategory.py | 2 +- myems-api/excelexporters/storeenergyitem.py | 2 +- myems-api/excelexporters/storeload.py | 2 +- myems-api/excelexporters/storesaving.py | 2 +- myems-api/excelexporters/storestatistics.py | 2 +- myems-api/excelexporters/tenantbatch.py | 2 +- myems-api/excelexporters/tenantbill.py | 2 +- myems-api/excelexporters/tenantcost.py | 2 +- myems-api/excelexporters/tenantenergycategory.py | 2 +- myems-api/excelexporters/tenantenergyitem.py | 2 +- myems-api/excelexporters/tenantload.py | 2 +- myems-api/excelexporters/tenantsaving.py | 2 +- myems-api/excelexporters/tenantstatistics.py | 2 +- myems-api/excelexporters/virtualmetercost.py | 2 +- myems-api/excelexporters/virtualmeterenergy.py | 2 +- 62 files changed, 62 insertions(+), 62 deletions(-) diff --git a/myems-api/excelexporters/combinedequipmentbatch.py b/myems-api/excelexporters/combinedequipmentbatch.py index 8c590a74..3bef8699 100644 --- a/myems-api/excelexporters/combinedequipmentbatch.py +++ b/myems-api/excelexporters/combinedequipmentbatch.py @@ -72,7 +72,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) data_font = Font(name='Franklin Gothic Book', size=11) diff --git a/myems-api/excelexporters/combinedequipmentcost.py b/myems-api/excelexporters/combinedequipmentcost.py index 17ad0e2f..766ac880 100644 --- a/myems-api/excelexporters/combinedequipmentcost.py +++ b/myems-api/excelexporters/combinedequipmentcost.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/combinedequipmentefficiency.py b/myems-api/excelexporters/combinedequipmentefficiency.py index 730dd3bb..44605548 100644 --- a/myems-api/excelexporters/combinedequipmentefficiency.py +++ b/myems-api/excelexporters/combinedequipmentefficiency.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/combinedequipmentenergycategory.py b/myems-api/excelexporters/combinedequipmentenergycategory.py index 0a4d920d..38782cd1 100644 --- a/myems-api/excelexporters/combinedequipmentenergycategory.py +++ b/myems-api/excelexporters/combinedequipmentenergycategory.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/combinedequipmentenergyitem.py b/myems-api/excelexporters/combinedequipmentenergyitem.py index f5b11aab..c6acacba 100644 --- a/myems-api/excelexporters/combinedequipmentenergyitem.py +++ b/myems-api/excelexporters/combinedequipmentenergyitem.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/combinedequipmentincome.py b/myems-api/excelexporters/combinedequipmentincome.py index ff4da4ef..9e956744 100644 --- a/myems-api/excelexporters/combinedequipmentincome.py +++ b/myems-api/excelexporters/combinedequipmentincome.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/combinedequipmentload.py b/myems-api/excelexporters/combinedequipmentload.py index 17185010..d4298fb0 100644 --- a/myems-api/excelexporters/combinedequipmentload.py +++ b/myems-api/excelexporters/combinedequipmentload.py @@ -81,7 +81,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/combinedequipmentoutput.py b/myems-api/excelexporters/combinedequipmentoutput.py index f8584fb3..5939ee47 100644 --- a/myems-api/excelexporters/combinedequipmentoutput.py +++ b/myems-api/excelexporters/combinedequipmentoutput.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/combinedequipmentsaving.py b/myems-api/excelexporters/combinedequipmentsaving.py index 90ed72ac..dd0a14bd 100644 --- a/myems-api/excelexporters/combinedequipmentsaving.py +++ b/myems-api/excelexporters/combinedequipmentsaving.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/combinedequipmentstatistics.py b/myems-api/excelexporters/combinedequipmentstatistics.py index 790ad427..c2cb0bd6 100644 --- a/myems-api/excelexporters/combinedequipmentstatistics.py +++ b/myems-api/excelexporters/combinedequipmentstatistics.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/equipmentbatch.py b/myems-api/excelexporters/equipmentbatch.py index 1f34fb18..8547b4c8 100644 --- a/myems-api/excelexporters/equipmentbatch.py +++ b/myems-api/excelexporters/equipmentbatch.py @@ -72,7 +72,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) data_font = Font(name='Franklin Gothic Book', size=11) diff --git a/myems-api/excelexporters/equipmentcost.py b/myems-api/excelexporters/equipmentcost.py index 6588ecdb..0ad0ef4e 100644 --- a/myems-api/excelexporters/equipmentcost.py +++ b/myems-api/excelexporters/equipmentcost.py @@ -84,7 +84,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/equipmentefficiency.py b/myems-api/excelexporters/equipmentefficiency.py index a38e0bc5..c324724e 100644 --- a/myems-api/excelexporters/equipmentefficiency.py +++ b/myems-api/excelexporters/equipmentefficiency.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/equipmentenergycategory.py b/myems-api/excelexporters/equipmentenergycategory.py index 6b3d41da..c29782dc 100644 --- a/myems-api/excelexporters/equipmentenergycategory.py +++ b/myems-api/excelexporters/equipmentenergycategory.py @@ -84,7 +84,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/equipmentenergyitem.py b/myems-api/excelexporters/equipmentenergyitem.py index 39416dac..882e60de 100644 --- a/myems-api/excelexporters/equipmentenergyitem.py +++ b/myems-api/excelexporters/equipmentenergyitem.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/equipmentincome.py b/myems-api/excelexporters/equipmentincome.py index 421ef0af..9942f3a1 100644 --- a/myems-api/excelexporters/equipmentincome.py +++ b/myems-api/excelexporters/equipmentincome.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/equipmentload.py b/myems-api/excelexporters/equipmentload.py index 772b1c24..c9bcc57d 100644 --- a/myems-api/excelexporters/equipmentload.py +++ b/myems-api/excelexporters/equipmentload.py @@ -81,7 +81,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/equipmentoutput.py b/myems-api/excelexporters/equipmentoutput.py index 898c0466..41af4491 100644 --- a/myems-api/excelexporters/equipmentoutput.py +++ b/myems-api/excelexporters/equipmentoutput.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/equipmentsaving.py b/myems-api/excelexporters/equipmentsaving.py index bcdfab2e..18e4c999 100644 --- a/myems-api/excelexporters/equipmentsaving.py +++ b/myems-api/excelexporters/equipmentsaving.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/equipmentstatistics.py b/myems-api/excelexporters/equipmentstatistics.py index 318158a6..19b74fdf 100644 --- a/myems-api/excelexporters/equipmentstatistics.py +++ b/myems-api/excelexporters/equipmentstatistics.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/equipmenttracking.py b/myems-api/excelexporters/equipmenttracking.py index 5cc0ec3c..d4ed668c 100644 --- a/myems-api/excelexporters/equipmenttracking.py +++ b/myems-api/excelexporters/equipmenttracking.py @@ -61,7 +61,7 @@ def generate_excel(report, space_name): ws.column_dimensions['A'].width = 1 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) f_border = Border(left=Side(border_style='medium', color='00000000'), diff --git a/myems-api/excelexporters/meterbatch.py b/myems-api/excelexporters/meterbatch.py index d2af0c94..b74fc918 100644 --- a/myems-api/excelexporters/meterbatch.py +++ b/myems-api/excelexporters/meterbatch.py @@ -72,7 +72,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) data_font = Font(name='Franklin Gothic Book', size=11) diff --git a/myems-api/excelexporters/metercost.py b/myems-api/excelexporters/metercost.py index caefd564..1f614640 100644 --- a/myems-api/excelexporters/metercost.py +++ b/myems-api/excelexporters/metercost.py @@ -76,7 +76,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/meterenergy.py b/myems-api/excelexporters/meterenergy.py index 79289210..2125b3fb 100644 --- a/myems-api/excelexporters/meterenergy.py +++ b/myems-api/excelexporters/meterenergy.py @@ -73,7 +73,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/metersubmetersbalance.py b/myems-api/excelexporters/metersubmetersbalance.py index 2361a292..08e47c3e 100644 --- a/myems-api/excelexporters/metersubmetersbalance.py +++ b/myems-api/excelexporters/metersubmetersbalance.py @@ -72,7 +72,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/metertracking.py b/myems-api/excelexporters/metertracking.py index 704a3c02..259b110e 100644 --- a/myems-api/excelexporters/metertracking.py +++ b/myems-api/excelexporters/metertracking.py @@ -72,7 +72,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/metertrend.py b/myems-api/excelexporters/metertrend.py index b9b4a113..2100e656 100644 --- a/myems-api/excelexporters/metertrend.py +++ b/myems-api/excelexporters/metertrend.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) data_font = Font(name='Franklin Gothic Book', size=11) diff --git a/myems-api/excelexporters/offlinemetercost.py b/myems-api/excelexporters/offlinemetercost.py index b3d5287e..5bc2d3b0 100644 --- a/myems-api/excelexporters/offlinemetercost.py +++ b/myems-api/excelexporters/offlinemetercost.py @@ -75,7 +75,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/offlinemeterenergy.py b/myems-api/excelexporters/offlinemeterenergy.py index 00894e6b..db40ee02 100644 --- a/myems-api/excelexporters/offlinemeterenergy.py +++ b/myems-api/excelexporters/offlinemeterenergy.py @@ -72,7 +72,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/shopfloorbatch.py b/myems-api/excelexporters/shopfloorbatch.py index 2cbe8c96..7270f820 100644 --- a/myems-api/excelexporters/shopfloorbatch.py +++ b/myems-api/excelexporters/shopfloorbatch.py @@ -72,7 +72,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) data_font = Font(name='Franklin Gothic Book', size=11) diff --git a/myems-api/excelexporters/shopfloorcost.py b/myems-api/excelexporters/shopfloorcost.py index d440c0fd..1e0b931f 100644 --- a/myems-api/excelexporters/shopfloorcost.py +++ b/myems-api/excelexporters/shopfloorcost.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/shopfloorenergycategory.py b/myems-api/excelexporters/shopfloorenergycategory.py index 464b31dd..2e896b96 100644 --- a/myems-api/excelexporters/shopfloorenergycategory.py +++ b/myems-api/excelexporters/shopfloorenergycategory.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/shopfloorenergyitem.py b/myems-api/excelexporters/shopfloorenergyitem.py index d9ccfbfc..04488681 100644 --- a/myems-api/excelexporters/shopfloorenergyitem.py +++ b/myems-api/excelexporters/shopfloorenergyitem.py @@ -81,7 +81,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/shopfloorload.py b/myems-api/excelexporters/shopfloorload.py index 525f3643..b30da3df 100644 --- a/myems-api/excelexporters/shopfloorload.py +++ b/myems-api/excelexporters/shopfloorload.py @@ -81,7 +81,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/shopfloorsaving.py b/myems-api/excelexporters/shopfloorsaving.py index 2bc601e7..8ea07ba4 100644 --- a/myems-api/excelexporters/shopfloorsaving.py +++ b/myems-api/excelexporters/shopfloorsaving.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/shopfloorstatistics.py b/myems-api/excelexporters/shopfloorstatistics.py index 2fa13470..bf354e98 100644 --- a/myems-api/excelexporters/shopfloorstatistics.py +++ b/myems-api/excelexporters/shopfloorstatistics.py @@ -81,7 +81,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/spacecost.py b/myems-api/excelexporters/spacecost.py index e62d268e..0b9b5417 100644 --- a/myems-api/excelexporters/spacecost.py +++ b/myems-api/excelexporters/spacecost.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/spaceefficiency.py b/myems-api/excelexporters/spaceefficiency.py index 75ae3aac..bc52501f 100644 --- a/myems-api/excelexporters/spaceefficiency.py +++ b/myems-api/excelexporters/spaceefficiency.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/spaceenergycategory.py b/myems-api/excelexporters/spaceenergycategory.py index b4c76c02..d5d44aab 100644 --- a/myems-api/excelexporters/spaceenergycategory.py +++ b/myems-api/excelexporters/spaceenergycategory.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/spaceenergyitem.py b/myems-api/excelexporters/spaceenergyitem.py index 76940b48..f7b8d8d2 100644 --- a/myems-api/excelexporters/spaceenergyitem.py +++ b/myems-api/excelexporters/spaceenergyitem.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/spaceincome.py b/myems-api/excelexporters/spaceincome.py index d4f2fac1..f6e239b7 100644 --- a/myems-api/excelexporters/spaceincome.py +++ b/myems-api/excelexporters/spaceincome.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/spaceload.py b/myems-api/excelexporters/spaceload.py index cb9b9111..c696361f 100644 --- a/myems-api/excelexporters/spaceload.py +++ b/myems-api/excelexporters/spaceload.py @@ -79,7 +79,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/spaceoutput.py b/myems-api/excelexporters/spaceoutput.py index 4bf9078d..0cf24eaf 100644 --- a/myems-api/excelexporters/spaceoutput.py +++ b/myems-api/excelexporters/spaceoutput.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/spacesaving.py b/myems-api/excelexporters/spacesaving.py index 7b529734..b335848f 100644 --- a/myems-api/excelexporters/spacesaving.py +++ b/myems-api/excelexporters/spacesaving.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/spacestatistics.py b/myems-api/excelexporters/spacestatistics.py index 5a96e79c..4c18f7b3 100644 --- a/myems-api/excelexporters/spacestatistics.py +++ b/myems-api/excelexporters/spacestatistics.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/storebatch.py b/myems-api/excelexporters/storebatch.py index 67f64931..d43f4f84 100644 --- a/myems-api/excelexporters/storebatch.py +++ b/myems-api/excelexporters/storebatch.py @@ -72,7 +72,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) data_font = Font(name='Franklin Gothic Book', size=11) diff --git a/myems-api/excelexporters/storecost.py b/myems-api/excelexporters/storecost.py index 60d403b4..ec8ecc60 100644 --- a/myems-api/excelexporters/storecost.py +++ b/myems-api/excelexporters/storecost.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/storeenergycategory.py b/myems-api/excelexporters/storeenergycategory.py index 8da548e1..f905774a 100644 --- a/myems-api/excelexporters/storeenergycategory.py +++ b/myems-api/excelexporters/storeenergycategory.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/storeenergyitem.py b/myems-api/excelexporters/storeenergyitem.py index 7264c4a7..3da5e167 100644 --- a/myems-api/excelexporters/storeenergyitem.py +++ b/myems-api/excelexporters/storeenergyitem.py @@ -81,7 +81,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/storeload.py b/myems-api/excelexporters/storeload.py index 3ea1b263..39a8313d 100644 --- a/myems-api/excelexporters/storeload.py +++ b/myems-api/excelexporters/storeload.py @@ -81,7 +81,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/storesaving.py b/myems-api/excelexporters/storesaving.py index 3f9a7359..2b9f43eb 100644 --- a/myems-api/excelexporters/storesaving.py +++ b/myems-api/excelexporters/storesaving.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/storestatistics.py b/myems-api/excelexporters/storestatistics.py index b0c3124b..ab4db0fc 100644 --- a/myems-api/excelexporters/storestatistics.py +++ b/myems-api/excelexporters/storestatistics.py @@ -81,7 +81,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/tenantbatch.py b/myems-api/excelexporters/tenantbatch.py index 032545aa..ccf65b5e 100644 --- a/myems-api/excelexporters/tenantbatch.py +++ b/myems-api/excelexporters/tenantbatch.py @@ -72,7 +72,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) data_font = Font(name='Franklin Gothic Book', size=11) diff --git a/myems-api/excelexporters/tenantbill.py b/myems-api/excelexporters/tenantbill.py index a5a10110..89923223 100644 --- a/myems-api/excelexporters/tenantbill.py +++ b/myems-api/excelexporters/tenantbill.py @@ -100,7 +100,7 @@ def generate_excel(report, # Font notice_font = Font(name='Arial', size=20, bold=True) - name_font = Font(name='Constantia', size=12, bold=True) + name_font = Font(name='Arial', size=12, bold=True) title_font = Font(name='Arial', size=11, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/tenantcost.py b/myems-api/excelexporters/tenantcost.py index a51d3c8a..7512eb30 100644 --- a/myems-api/excelexporters/tenantcost.py +++ b/myems-api/excelexporters/tenantcost.py @@ -84,7 +84,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/tenantenergycategory.py b/myems-api/excelexporters/tenantenergycategory.py index d0135b0d..84a38b6a 100644 --- a/myems-api/excelexporters/tenantenergycategory.py +++ b/myems-api/excelexporters/tenantenergycategory.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/tenantenergyitem.py b/myems-api/excelexporters/tenantenergyitem.py index cf930b38..a3da878c 100644 --- a/myems-api/excelexporters/tenantenergyitem.py +++ b/myems-api/excelexporters/tenantenergyitem.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/tenantload.py b/myems-api/excelexporters/tenantload.py index cfc70d2e..fda33bce 100644 --- a/myems-api/excelexporters/tenantload.py +++ b/myems-api/excelexporters/tenantload.py @@ -79,7 +79,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/tenantsaving.py b/myems-api/excelexporters/tenantsaving.py index e903e982..9626f005 100644 --- a/myems-api/excelexporters/tenantsaving.py +++ b/myems-api/excelexporters/tenantsaving.py @@ -83,7 +83,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/tenantstatistics.py b/myems-api/excelexporters/tenantstatistics.py index c77a18de..bb7a6f23 100644 --- a/myems-api/excelexporters/tenantstatistics.py +++ b/myems-api/excelexporters/tenantstatistics.py @@ -82,7 +82,7 @@ def generate_excel(report, ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/virtualmetercost.py b/myems-api/excelexporters/virtualmetercost.py index 3e1acf01..22601c91 100644 --- a/myems-api/excelexporters/virtualmetercost.py +++ b/myems-api/excelexporters/virtualmetercost.py @@ -75,7 +75,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') diff --git a/myems-api/excelexporters/virtualmeterenergy.py b/myems-api/excelexporters/virtualmeterenergy.py index 25492801..c840d12e 100644 --- a/myems-api/excelexporters/virtualmeterenergy.py +++ b/myems-api/excelexporters/virtualmeterenergy.py @@ -71,7 +71,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.column_dimensions[chr(i)].width = 15.0 # Font - name_font = Font(name='Constantia', size=15, bold=True) + name_font = Font(name='Arial', size=15, bold=True) title_font = Font(name='Arial', size=15, bold=True) table_fill = PatternFill(fill_type='solid', fgColor='1F497D') From e55ea48ef5ba653110d5cbf4b8684d03869fe99c Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 26 Sep 2021 15:40:49 +0800 Subject: [PATCH 71/87] fixed NoneType issues in ExcelExporters --- myems-api/excelexporters/metertrend.py | 7 ++++--- myems-api/excelexporters/spaceenergycategory.py | 15 +++++++++------ myems-api/excelexporters/spaceincome.py | 6 ++++-- myems-api/excelexporters/spaceoutput.py | 3 ++- myems-api/excelexporters/spacesaving.py | 10 +++++++--- 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/myems-api/excelexporters/metertrend.py b/myems-api/excelexporters/metertrend.py index 2100e656..cbeba372 100644 --- a/myems-api/excelexporters/metertrend.py +++ b/myems-api/excelexporters/metertrend.py @@ -199,7 +199,7 @@ def generate_excel(report, max_row = start_detail_data_row_num + len(time) ws['B6'].font = title_font - ws['B6'] = name + ' ' + '趋势' + ws['B6'] = name + ' ' + 'Trend' ws.row_dimensions[start_detail_data_row_num - 1].height = 60 ws['B' + str(start_detail_data_row_num - 1)].fill = table_fill @@ -233,12 +233,13 @@ def generate_excel(report, ws[col + row].alignment = c_c_alignment ws[col + row] = round(reporting_period_data['values'][i][j], 3) if \ len(reporting_period_data['values'][i]) > 0 and \ - reporting_period_data['values'][i][j] is not None else " " + len(reporting_period_data['values'][i]) > j and \ + reporting_period_data['values'][i][j] is not None else '' ws[col + row].border = f_border # line # 39~: line line = LineChart() - line.title = '趋势值 - ' + reporting_period_data['names'][i] + line.title = 'Trend Value - ' + reporting_period_data['names'][i] labels = Reference(ws, min_col=2, min_row=start_detail_data_row_num, max_row=max_row-1) line_data = Reference(ws, min_col=3 + i, min_row=start_detail_data_row_num+1, max_row=max_row-1) line.add_data(line_data, titles_from_data=True) diff --git a/myems-api/excelexporters/spaceenergycategory.py b/myems-api/excelexporters/spaceenergycategory.py index d5d44aab..0c2999f6 100644 --- a/myems-api/excelexporters/spaceenergycategory.py +++ b/myems-api/excelexporters/spaceenergycategory.py @@ -209,13 +209,14 @@ def generate_excel(report, ws[col + '9'].font = name_font ws[col + '9'].alignment = c_c_alignment - ws[col + '9'] = round(reporting_period_data['subtotals_per_unit_area'][i], 2) + ws[col + '9'] = round(reporting_period_data['subtotals_per_unit_area'][i], 2) \ + if reporting_period_data['subtotals_per_unit_area'][i] is not None else '' ws[col + '9'].border = f_border ws[col + '10'].font = name_font ws[col + '10'].alignment = c_c_alignment ws[col + '10'] = str(round(reporting_period_data['increment_rates'][i] * 100, 2)) + "%" \ - if reporting_period_data['increment_rates'][i] is not None else "-" + if reporting_period_data['increment_rates'][i] is not None else '' ws[col + '10'].border = f_border # TCE TCO2E @@ -235,13 +236,14 @@ def generate_excel(report, ws[tce_col + '9'].font = name_font ws[tce_col + '9'].alignment = c_c_alignment - ws[tce_col + '9'] = round(reporting_period_data['total_in_kgce_per_unit_area'] / 1000, 2) + ws[tce_col + '9'] = round(reporting_period_data['total_in_kgce_per_unit_area'] / 1000, 2) \ + if reporting_period_data['total_in_kgce_per_unit_area'] is not None else '' ws[tce_col + '9'].border = f_border ws[tce_col + '10'].font = name_font ws[tce_col + '10'].alignment = c_c_alignment ws[tce_col + '10'] = str(round(reporting_period_data['increment_rate_in_kgce'] * 100, 2)) + "%" \ - if reporting_period_data['increment_rate_in_kgce'] is not None else "-" + if reporting_period_data['increment_rate_in_kgce'] is not None else '' ws[tce_col + '10'].border = f_border # TCO2E @@ -259,13 +261,14 @@ def generate_excel(report, ws[tco2e_col + '9'].font = name_font ws[tco2e_col + '9'].alignment = c_c_alignment - ws[tco2e_col + '9'] = round(reporting_period_data['total_in_kgco2e_per_unit_area'] / 1000, 2) + ws[tco2e_col + '9'] = round(reporting_period_data['total_in_kgco2e_per_unit_area'] / 1000, 2) \ + if reporting_period_data['total_in_kgco2e_per_unit_area'] is not None else '' ws[tco2e_col + '9'].border = f_border ws[tco2e_col + '10'].font = name_font ws[tco2e_col + '10'].alignment = c_c_alignment ws[tco2e_col + '10'] = str(round(reporting_period_data['increment_rate_in_kgco2e'] * 100, 2)) + "%" \ - if reporting_period_data['increment_rate_in_kgco2e'] is not None else "-" + if reporting_period_data['increment_rate_in_kgco2e'] is not None else '' ws[tco2e_col + '10'].border = f_border else: for i in range(6, 10 + 1): diff --git a/myems-api/excelexporters/spaceincome.py b/myems-api/excelexporters/spaceincome.py index f6e239b7..75deb832 100644 --- a/myems-api/excelexporters/spaceincome.py +++ b/myems-api/excelexporters/spaceincome.py @@ -210,7 +210,8 @@ def generate_excel(report, ws[col + '8'].font = name_font ws[col + '8'].alignment = c_c_alignment - ws[col + '8'] = round(reporting_period_data['subtotals_per_unit_area'][i], 2) + ws[col + '8'] = round(reporting_period_data['subtotals_per_unit_area'][i], 2) \ + if reporting_period_data['subtotals_per_unit_area'][i] is not None else '' ws[col + '8'].border = f_border ws[col + '9'].font = name_font @@ -234,7 +235,8 @@ def generate_excel(report, ws[col + '8'].font = name_font ws[col + '8'].alignment = c_c_alignment - ws[col + '8'] = round(reporting_period_data['total_per_unit_area'], 2) + ws[col + '8'] = round(reporting_period_data['total_per_unit_area'], 2) \ + if reporting_period_data['total_per_unit_area'] is not None else '' ws[col + '8'].border = f_border ws[col + '9'].font = name_font diff --git a/myems-api/excelexporters/spaceoutput.py b/myems-api/excelexporters/spaceoutput.py index 0cf24eaf..b4302781 100644 --- a/myems-api/excelexporters/spaceoutput.py +++ b/myems-api/excelexporters/spaceoutput.py @@ -222,7 +222,8 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = round(reporting_period_data['subtotals_per_unit_area'][i], 2) + ws[col + str(current_row_number)] = round(reporting_period_data['subtotals_per_unit_area'][i], 2) \ + if reporting_period_data['subtotals_per_unit_area'][i] is not None else '' col = chr(ord(col) + 1) diff --git a/myems-api/excelexporters/spacesaving.py b/myems-api/excelexporters/spacesaving.py index b335848f..91595b6d 100644 --- a/myems-api/excelexporters/spacesaving.py +++ b/myems-api/excelexporters/spacesaving.py @@ -254,14 +254,17 @@ def generate_excel(report, ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = round(reporting_period_data['subtotals_per_unit_area_saving'][i], 2) + ws[col + str(current_row_number)] = round(reporting_period_data['subtotals_per_unit_area_saving'][i], 2) \ + if reporting_period_data['subtotals_per_unit_area_saving'][i] is not None else '' col = chr(ord(col) + 1) ws[col + str(current_row_number)].font = name_font ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border - ws[col + str(current_row_number)] = round(reporting_period_data['total_in_kgce_per_unit_area_saving'] / 1000, 2) + ws[col + str(current_row_number)] = \ + round(reporting_period_data['total_in_kgce_per_unit_area_saving'] / 1000, 2) \ + if reporting_period_data['total_in_kgce_per_unit_area_saving'] is not None else '' col = chr(ord(col) + 1) @@ -269,7 +272,8 @@ def generate_excel(report, ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].border = f_border ws[col + str(current_row_number)] = \ - round(reporting_period_data['total_in_kgco2e_per_unit_area_saving'] / 1000, 2) + round(reporting_period_data['total_in_kgco2e_per_unit_area_saving'] / 1000, 2) \ + if reporting_period_data['total_in_kgco2e_per_unit_area_saving'] is not None else '' col = chr(ord(col) + 1) From 89f764869df5093035192c7ec77e8a7455bc8299 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Tue, 28 Sep 2021 22:18:31 +0800 Subject: [PATCH 72/87] reformatted excel exporter of spaceenergycategory --- .../excelexporters/spaceenergycategory.py | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/myems-api/excelexporters/spaceenergycategory.py b/myems-api/excelexporters/spaceenergycategory.py index 0c2999f6..3f6a1a84 100644 --- a/myems-api/excelexporters/spaceenergycategory.py +++ b/myems-api/excelexporters/spaceenergycategory.py @@ -117,38 +117,37 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 + img.width = img.width + img.height = img.height # img = Image("myems.png") - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: From 0975db800df61c33c6db9b9fb72d02a7cf45cf30 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Tue, 28 Sep 2021 22:57:52 +0800 Subject: [PATCH 73/87] reformatted excel exporters --- myems-api/excelexporters/combinedequipmentbatch.py | 4 +--- myems-api/excelexporters/combinedequipmentcost.py | 9 ++------- myems-api/excelexporters/combinedequipmentefficiency.py | 8 ++------ .../excelexporters/combinedequipmentenergycategory.py | 9 ++------- myems-api/excelexporters/combinedequipmentenergyitem.py | 8 ++------ myems-api/excelexporters/combinedequipmentincome.py | 8 ++------ myems-api/excelexporters/combinedequipmentload.py | 8 ++------ myems-api/excelexporters/combinedequipmentoutput.py | 8 ++------ myems-api/excelexporters/combinedequipmentsaving.py | 9 ++------- myems-api/excelexporters/combinedequipmentstatistics.py | 8 ++------ myems-api/excelexporters/equipmentbatch.py | 4 +--- myems-api/excelexporters/equipmentcost.py | 8 ++------ myems-api/excelexporters/equipmentefficiency.py | 8 ++------ myems-api/excelexporters/equipmentenergycategory.py | 8 ++------ myems-api/excelexporters/equipmentenergyitem.py | 8 ++------ myems-api/excelexporters/equipmentincome.py | 8 ++------ myems-api/excelexporters/equipmentload.py | 8 ++------ myems-api/excelexporters/equipmentoutput.py | 8 ++------ myems-api/excelexporters/equipmentsaving.py | 8 ++------ myems-api/excelexporters/equipmentstatistics.py | 6 ++---- myems-api/excelexporters/equipmenttracking.py | 4 +--- myems-api/excelexporters/meterbatch.py | 4 +--- myems-api/excelexporters/metercost.py | 8 ++------ myems-api/excelexporters/meterenergy.py | 8 ++------ myems-api/excelexporters/metersubmetersbalance.py | 8 ++------ myems-api/excelexporters/metertracking.py | 4 +--- myems-api/excelexporters/metertrend.py | 8 ++------ myems-api/excelexporters/offlinemetercost.py | 4 +--- myems-api/excelexporters/offlinemeterenergy.py | 4 +--- myems-api/excelexporters/shopfloorbatch.py | 4 +--- myems-api/excelexporters/shopfloorcost.py | 8 ++------ myems-api/excelexporters/shopfloorenergycategory.py | 8 ++------ myems-api/excelexporters/shopfloorenergyitem.py | 8 ++------ myems-api/excelexporters/shopfloorload.py | 8 ++------ myems-api/excelexporters/shopfloorsaving.py | 9 ++------- myems-api/excelexporters/shopfloorstatistics.py | 6 ++---- myems-api/excelexporters/spacecost.py | 8 ++------ myems-api/excelexporters/spaceefficiency.py | 8 ++------ myems-api/excelexporters/spaceenergycategory.py | 8 +------- myems-api/excelexporters/spaceenergyitem.py | 9 ++------- myems-api/excelexporters/spaceincome.py | 8 ++------ myems-api/excelexporters/spaceload.py | 8 ++------ myems-api/excelexporters/spaceoutput.py | 8 ++------ myems-api/excelexporters/spacesaving.py | 8 ++------ myems-api/excelexporters/spacestatistics.py | 6 ++---- myems-api/excelexporters/storebatch.py | 4 +--- myems-api/excelexporters/storecost.py | 6 ++---- myems-api/excelexporters/storeenergycategory.py | 8 ++------ myems-api/excelexporters/storeenergyitem.py | 8 ++------ myems-api/excelexporters/storeload.py | 4 +--- myems-api/excelexporters/storesaving.py | 8 ++------ myems-api/excelexporters/storestatistics.py | 6 ++---- myems-api/excelexporters/tenantbatch.py | 4 +--- myems-api/excelexporters/tenantcost.py | 8 ++------ myems-api/excelexporters/tenantenergycategory.py | 8 ++------ myems-api/excelexporters/tenantenergyitem.py | 8 ++------ myems-api/excelexporters/tenantload.py | 8 ++------ myems-api/excelexporters/tenantsaving.py | 8 ++------ myems-api/excelexporters/tenantstatistics.py | 6 ++---- myems-api/excelexporters/virtualmetercost.py | 4 +--- myems-api/excelexporters/virtualmeterenergy.py | 4 +--- 61 files changed, 108 insertions(+), 321 deletions(-) diff --git a/myems-api/excelexporters/combinedequipmentbatch.py b/myems-api/excelexporters/combinedequipmentbatch.py index 3bef8699..6e858316 100644 --- a/myems-api/excelexporters/combinedequipmentbatch.py +++ b/myems-api/excelexporters/combinedequipmentbatch.py @@ -107,9 +107,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/combinedequipmentcost.py b/myems-api/excelexporters/combinedequipmentcost.py index 766ac880..9367cfa3 100644 --- a/myems-api/excelexporters/combinedequipmentcost.py +++ b/myems-api/excelexporters/combinedequipmentcost.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -686,10 +684,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - # img = Image("myems.png") - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/combinedequipmentefficiency.py b/myems-api/excelexporters/combinedequipmentefficiency.py index 44605548..6273b06a 100644 --- a/myems-api/excelexporters/combinedequipmentefficiency.py +++ b/myems-api/excelexporters/combinedequipmentefficiency.py @@ -115,9 +115,7 @@ def generate_excel(report, indent=0) # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -428,9 +426,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/combinedequipmentenergycategory.py b/myems-api/excelexporters/combinedequipmentenergycategory.py index 38782cd1..e5838c76 100644 --- a/myems-api/excelexporters/combinedequipmentenergycategory.py +++ b/myems-api/excelexporters/combinedequipmentenergycategory.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 1.06 - img.height = img.height * 1.06 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -562,10 +560,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - # img = Image("myems.png") - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/combinedequipmentenergyitem.py b/myems-api/excelexporters/combinedequipmentenergyitem.py index c6acacba..98962cd0 100644 --- a/myems-api/excelexporters/combinedequipmentenergyitem.py +++ b/myems-api/excelexporters/combinedequipmentenergyitem.py @@ -115,9 +115,7 @@ def generate_excel(report, indent=0) # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -528,9 +526,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/combinedequipmentincome.py b/myems-api/excelexporters/combinedequipmentincome.py index 9e956744..1e015a79 100644 --- a/myems-api/excelexporters/combinedequipmentincome.py +++ b/myems-api/excelexporters/combinedequipmentincome.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -567,9 +565,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/combinedequipmentload.py b/myems-api/excelexporters/combinedequipmentload.py index d4298fb0..6b3f6755 100644 --- a/myems-api/excelexporters/combinedequipmentload.py +++ b/myems-api/excelexporters/combinedequipmentload.py @@ -115,9 +115,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws['B3'].font = name_font @@ -479,9 +477,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/combinedequipmentoutput.py b/myems-api/excelexporters/combinedequipmentoutput.py index 5939ee47..872abe09 100644 --- a/myems-api/excelexporters/combinedequipmentoutput.py +++ b/myems-api/excelexporters/combinedequipmentoutput.py @@ -115,9 +115,7 @@ def generate_excel(report, indent=0) # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -467,9 +465,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/combinedequipmentsaving.py b/myems-api/excelexporters/combinedequipmentsaving.py index dd0a14bd..39d89f95 100644 --- a/myems-api/excelexporters/combinedequipmentsaving.py +++ b/myems-api/excelexporters/combinedequipmentsaving.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -656,10 +654,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - # img = Image("myems.png") - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/combinedequipmentstatistics.py b/myems-api/excelexporters/combinedequipmentstatistics.py index c2cb0bd6..18ffb06a 100644 --- a/myems-api/excelexporters/combinedequipmentstatistics.py +++ b/myems-api/excelexporters/combinedequipmentstatistics.py @@ -116,9 +116,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws['B3'].font = name_font @@ -510,9 +508,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/equipmentbatch.py b/myems-api/excelexporters/equipmentbatch.py index 8547b4c8..cc52baa1 100644 --- a/myems-api/excelexporters/equipmentbatch.py +++ b/myems-api/excelexporters/equipmentbatch.py @@ -107,9 +107,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/equipmentcost.py b/myems-api/excelexporters/equipmentcost.py index 0ad0ef4e..c37fb3d2 100644 --- a/myems-api/excelexporters/equipmentcost.py +++ b/myems-api/excelexporters/equipmentcost.py @@ -116,9 +116,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 1.06 - img.height = img.height * 1.06 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -552,9 +550,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/equipmentefficiency.py b/myems-api/excelexporters/equipmentefficiency.py index c324724e..ab5de3e7 100644 --- a/myems-api/excelexporters/equipmentefficiency.py +++ b/myems-api/excelexporters/equipmentefficiency.py @@ -113,9 +113,7 @@ def generate_excel(report, indent=0) # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -426,9 +424,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/equipmentenergycategory.py b/myems-api/excelexporters/equipmentenergycategory.py index c29782dc..217368d2 100644 --- a/myems-api/excelexporters/equipmentenergycategory.py +++ b/myems-api/excelexporters/equipmentenergycategory.py @@ -116,9 +116,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 1.06 - img.height = img.height * 1.06 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -594,9 +592,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/equipmentenergyitem.py b/myems-api/excelexporters/equipmentenergyitem.py index 882e60de..7e9a18fd 100644 --- a/myems-api/excelexporters/equipmentenergyitem.py +++ b/myems-api/excelexporters/equipmentenergyitem.py @@ -113,9 +113,7 @@ def generate_excel(report, indent=0) # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -467,9 +465,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/equipmentincome.py b/myems-api/excelexporters/equipmentincome.py index 9942f3a1..82ce6cb1 100644 --- a/myems-api/excelexporters/equipmentincome.py +++ b/myems-api/excelexporters/equipmentincome.py @@ -114,9 +114,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -490,9 +488,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/equipmentload.py b/myems-api/excelexporters/equipmentload.py index c9bcc57d..59205f4b 100644 --- a/myems-api/excelexporters/equipmentload.py +++ b/myems-api/excelexporters/equipmentload.py @@ -113,9 +113,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 1.06 - img.height = img.height * 1.06 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws['B3'].font = name_font @@ -397,9 +395,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/equipmentoutput.py b/myems-api/excelexporters/equipmentoutput.py index 41af4491..7cdca3b7 100644 --- a/myems-api/excelexporters/equipmentoutput.py +++ b/myems-api/excelexporters/equipmentoutput.py @@ -113,9 +113,7 @@ def generate_excel(report, indent=0) # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -408,9 +406,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/equipmentsaving.py b/myems-api/excelexporters/equipmentsaving.py index 18e4c999..a1ba7e6d 100644 --- a/myems-api/excelexporters/equipmentsaving.py +++ b/myems-api/excelexporters/equipmentsaving.py @@ -115,9 +115,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -596,9 +594,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/equipmentstatistics.py b/myems-api/excelexporters/equipmentstatistics.py index 19b74fdf..3c4ea1d3 100644 --- a/myems-api/excelexporters/equipmentstatistics.py +++ b/myems-api/excelexporters/equipmentstatistics.py @@ -116,7 +116,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws['B3'].font = name_font @@ -449,9 +449,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/equipmenttracking.py b/myems-api/excelexporters/equipmenttracking.py index d4ed668c..03b7dcaa 100644 --- a/myems-api/excelexporters/equipmenttracking.py +++ b/myems-api/excelexporters/equipmenttracking.py @@ -86,10 +86,8 @@ def generate_excel(report, space_name): ws.column_dimensions[chr(i)].width = 30.0 # Img - ws.merge_cells("B1:D1") - ws.merge_cells("B2:E2") img = Image("excelexporters/myems.png") - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws['B3'].border = f_border diff --git a/myems-api/excelexporters/meterbatch.py b/myems-api/excelexporters/meterbatch.py index b74fc918..d1b39257 100644 --- a/myems-api/excelexporters/meterbatch.py +++ b/myems-api/excelexporters/meterbatch.py @@ -107,9 +107,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/metercost.py b/myems-api/excelexporters/metercost.py index 1f614640..d13cadd5 100644 --- a/myems-api/excelexporters/metercost.py +++ b/myems-api/excelexporters/metercost.py @@ -110,9 +110,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -400,9 +398,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/meterenergy.py b/myems-api/excelexporters/meterenergy.py index 2125b3fb..0834eb57 100644 --- a/myems-api/excelexporters/meterenergy.py +++ b/myems-api/excelexporters/meterenergy.py @@ -107,9 +107,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -415,9 +413,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/metersubmetersbalance.py b/myems-api/excelexporters/metersubmetersbalance.py index 08e47c3e..bc82ebd3 100644 --- a/myems-api/excelexporters/metersubmetersbalance.py +++ b/myems-api/excelexporters/metersubmetersbalance.py @@ -106,9 +106,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -365,9 +363,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/metertracking.py b/myems-api/excelexporters/metertracking.py index 259b110e..b5c49833 100644 --- a/myems-api/excelexporters/metertracking.py +++ b/myems-api/excelexporters/metertracking.py @@ -106,9 +106,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/metertrend.py b/myems-api/excelexporters/metertrend.py index cbeba372..dd724964 100644 --- a/myems-api/excelexporters/metertrend.py +++ b/myems-api/excelexporters/metertrend.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -310,9 +308,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/offlinemetercost.py b/myems-api/excelexporters/offlinemetercost.py index 5bc2d3b0..8477e5f4 100644 --- a/myems-api/excelexporters/offlinemetercost.py +++ b/myems-api/excelexporters/offlinemetercost.py @@ -109,9 +109,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/offlinemeterenergy.py b/myems-api/excelexporters/offlinemeterenergy.py index db40ee02..03a1e8d8 100644 --- a/myems-api/excelexporters/offlinemeterenergy.py +++ b/myems-api/excelexporters/offlinemeterenergy.py @@ -106,9 +106,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/shopfloorbatch.py b/myems-api/excelexporters/shopfloorbatch.py index 7270f820..82096371 100644 --- a/myems-api/excelexporters/shopfloorbatch.py +++ b/myems-api/excelexporters/shopfloorbatch.py @@ -107,9 +107,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/shopfloorcost.py b/myems-api/excelexporters/shopfloorcost.py index 1e0b931f..6a27fe9a 100644 --- a/myems-api/excelexporters/shopfloorcost.py +++ b/myems-api/excelexporters/shopfloorcost.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -644,9 +642,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/shopfloorenergycategory.py b/myems-api/excelexporters/shopfloorenergycategory.py index 2e896b96..75d3caf8 100644 --- a/myems-api/excelexporters/shopfloorenergycategory.py +++ b/myems-api/excelexporters/shopfloorenergycategory.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 1.06 - img.height = img.height * 1.06 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -530,9 +528,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/shopfloorenergyitem.py b/myems-api/excelexporters/shopfloorenergyitem.py index 04488681..48f6271b 100644 --- a/myems-api/excelexporters/shopfloorenergyitem.py +++ b/myems-api/excelexporters/shopfloorenergyitem.py @@ -114,9 +114,7 @@ def generate_excel(report, indent=0) # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -491,9 +489,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/shopfloorload.py b/myems-api/excelexporters/shopfloorload.py index b30da3df..4f8c710f 100644 --- a/myems-api/excelexporters/shopfloorload.py +++ b/myems-api/excelexporters/shopfloorload.py @@ -115,9 +115,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws['B3'].font = name_font @@ -467,9 +465,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/shopfloorsaving.py b/myems-api/excelexporters/shopfloorsaving.py index 8ea07ba4..1c481c1b 100644 --- a/myems-api/excelexporters/shopfloorsaving.py +++ b/myems-api/excelexporters/shopfloorsaving.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -637,10 +635,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - # img = Image("myems.png") - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/shopfloorstatistics.py b/myems-api/excelexporters/shopfloorstatistics.py index bf354e98..70b18aa1 100644 --- a/myems-api/excelexporters/shopfloorstatistics.py +++ b/myems-api/excelexporters/shopfloorstatistics.py @@ -115,7 +115,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws['B3'].font = name_font @@ -573,9 +573,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/spacecost.py b/myems-api/excelexporters/spacecost.py index 0b9b5417..9f8ebb0e 100644 --- a/myems-api/excelexporters/spacecost.py +++ b/myems-api/excelexporters/spacecost.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -687,9 +685,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/spaceefficiency.py b/myems-api/excelexporters/spaceefficiency.py index bc52501f..8f2c7223 100644 --- a/myems-api/excelexporters/spaceefficiency.py +++ b/myems-api/excelexporters/spaceefficiency.py @@ -115,9 +115,7 @@ def generate_excel(report, indent=0) # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -430,9 +428,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/spaceenergycategory.py b/myems-api/excelexporters/spaceenergycategory.py index 3f6a1a84..287454f6 100644 --- a/myems-api/excelexporters/spaceenergycategory.py +++ b/myems-api/excelexporters/spaceenergycategory.py @@ -117,9 +117,6 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width - img.height = img.height - # img = Image("myems.png") ws.add_image(img, 'A1') # Title @@ -726,10 +723,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - # img = Image("myems.png") - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/spaceenergyitem.py b/myems-api/excelexporters/spaceenergyitem.py index f7b8d8d2..c9642e82 100644 --- a/myems-api/excelexporters/spaceenergyitem.py +++ b/myems-api/excelexporters/spaceenergyitem.py @@ -115,10 +115,7 @@ def generate_excel(report, indent=0) # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - # img = Image("myems.png") - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -577,9 +574,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/spaceincome.py b/myems-api/excelexporters/spaceincome.py index 75deb832..3a2dc411 100644 --- a/myems-api/excelexporters/spaceincome.py +++ b/myems-api/excelexporters/spaceincome.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -620,9 +618,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/spaceload.py b/myems-api/excelexporters/spaceload.py index c696361f..4b65bcd7 100644 --- a/myems-api/excelexporters/spaceload.py +++ b/myems-api/excelexporters/spaceload.py @@ -113,9 +113,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -527,9 +525,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/spaceoutput.py b/myems-api/excelexporters/spaceoutput.py index b4302781..f272f422 100644 --- a/myems-api/excelexporters/spaceoutput.py +++ b/myems-api/excelexporters/spaceoutput.py @@ -115,9 +115,7 @@ def generate_excel(report, indent=0) # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -515,9 +513,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/spacesaving.py b/myems-api/excelexporters/spacesaving.py index 91595b6d..f05ac145 100644 --- a/myems-api/excelexporters/spacesaving.py +++ b/myems-api/excelexporters/spacesaving.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -727,9 +725,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/spacestatistics.py b/myems-api/excelexporters/spacestatistics.py index 4c18f7b3..072544b5 100644 --- a/myems-api/excelexporters/spacestatistics.py +++ b/myems-api/excelexporters/spacestatistics.py @@ -116,7 +116,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws['B3'].font = name_font @@ -565,9 +565,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/storebatch.py b/myems-api/excelexporters/storebatch.py index d43f4f84..40bf0ed8 100644 --- a/myems-api/excelexporters/storebatch.py +++ b/myems-api/excelexporters/storebatch.py @@ -107,9 +107,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/storecost.py b/myems-api/excelexporters/storecost.py index ec8ecc60..9f0c74b9 100644 --- a/myems-api/excelexporters/storecost.py +++ b/myems-api/excelexporters/storecost.py @@ -116,7 +116,7 @@ def generate_excel(report, indent=0) # Img img = Image("excelexporters/myems.png") - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws['B3'].font = name_font @@ -610,9 +610,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/storeenergycategory.py b/myems-api/excelexporters/storeenergycategory.py index f905774a..007ddbcf 100644 --- a/myems-api/excelexporters/storeenergycategory.py +++ b/myems-api/excelexporters/storeenergycategory.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 1.06 - img.height = img.height * 1.06 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -529,9 +527,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/storeenergyitem.py b/myems-api/excelexporters/storeenergyitem.py index 3da5e167..ac8822c1 100644 --- a/myems-api/excelexporters/storeenergyitem.py +++ b/myems-api/excelexporters/storeenergyitem.py @@ -114,9 +114,7 @@ def generate_excel(report, indent=0) # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -493,9 +491,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/storeload.py b/myems-api/excelexporters/storeload.py index 39a8313d..a8171d81 100644 --- a/myems-api/excelexporters/storeload.py +++ b/myems-api/excelexporters/storeload.py @@ -115,9 +115,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws['B3'].font = name_font diff --git a/myems-api/excelexporters/storesaving.py b/myems-api/excelexporters/storesaving.py index 2b9f43eb..362120ae 100644 --- a/myems-api/excelexporters/storesaving.py +++ b/myems-api/excelexporters/storesaving.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -637,9 +635,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/storestatistics.py b/myems-api/excelexporters/storestatistics.py index ab4db0fc..412fe50a 100644 --- a/myems-api/excelexporters/storestatistics.py +++ b/myems-api/excelexporters/storestatistics.py @@ -115,7 +115,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws['B3'].font = name_font @@ -572,9 +572,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/tenantbatch.py b/myems-api/excelexporters/tenantbatch.py index ccf65b5e..f8eb09ee 100644 --- a/myems-api/excelexporters/tenantbatch.py +++ b/myems-api/excelexporters/tenantbatch.py @@ -107,9 +107,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/tenantcost.py b/myems-api/excelexporters/tenantcost.py index 7512eb30..784c429a 100644 --- a/myems-api/excelexporters/tenantcost.py +++ b/myems-api/excelexporters/tenantcost.py @@ -118,9 +118,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -586,9 +584,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/tenantenergycategory.py b/myems-api/excelexporters/tenantenergycategory.py index 84a38b6a..6149f297 100644 --- a/myems-api/excelexporters/tenantenergycategory.py +++ b/myems-api/excelexporters/tenantenergycategory.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -651,9 +649,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/tenantenergyitem.py b/myems-api/excelexporters/tenantenergyitem.py index a3da878c..285a1890 100644 --- a/myems-api/excelexporters/tenantenergyitem.py +++ b/myems-api/excelexporters/tenantenergyitem.py @@ -115,9 +115,7 @@ def generate_excel(report, indent=0) # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -484,9 +482,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/tenantload.py b/myems-api/excelexporters/tenantload.py index fda33bce..b186fcf8 100644 --- a/myems-api/excelexporters/tenantload.py +++ b/myems-api/excelexporters/tenantload.py @@ -113,9 +113,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -529,9 +527,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/tenantsaving.py b/myems-api/excelexporters/tenantsaving.py index 9626f005..9de657b7 100644 --- a/myems-api/excelexporters/tenantsaving.py +++ b/myems-api/excelexporters/tenantsaving.py @@ -117,9 +117,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 @@ -631,9 +629,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/tenantstatistics.py b/myems-api/excelexporters/tenantstatistics.py index bb7a6f23..92b89d5a 100644 --- a/myems-api/excelexporters/tenantstatistics.py +++ b/myems-api/excelexporters/tenantstatistics.py @@ -116,7 +116,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws['B3'].font = name_font @@ -564,9 +564,7 @@ def generate_excel(report, # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - parameters_ws.add_image(img, 'B1') + parameters_ws.add_image(img, 'A1') # Title parameters_ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/virtualmetercost.py b/myems-api/excelexporters/virtualmetercost.py index 22601c91..92fb44f1 100644 --- a/myems-api/excelexporters/virtualmetercost.py +++ b/myems-api/excelexporters/virtualmetercost.py @@ -109,9 +109,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 diff --git a/myems-api/excelexporters/virtualmeterenergy.py b/myems-api/excelexporters/virtualmeterenergy.py index c840d12e..559aaf94 100644 --- a/myems-api/excelexporters/virtualmeterenergy.py +++ b/myems-api/excelexporters/virtualmeterenergy.py @@ -105,9 +105,7 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d # Img img = Image("excelexporters/myems.png") - img.width = img.width * 0.85 - img.height = img.height * 0.85 - ws.add_image(img, 'B1') + ws.add_image(img, 'A1') # Title ws.row_dimensions[3].height = 60 From d41739b06b0c4b4a0cc4daecb288334f45102ce7 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Wed, 29 Sep 2021 22:42:47 +0800 Subject: [PATCH 74/87] updated format of excel exporters --- myems-api/excelexporters/spacecost.py | 25 ++++++++----------- myems-api/excelexporters/spaceefficiency.py | 25 ++++++++----------- .../excelexporters/spaceenergycategory.py | 2 -- myems-api/excelexporters/spaceenergyitem.py | 23 ++++++++--------- myems-api/excelexporters/spaceincome.py | 23 ++++++++--------- myems-api/excelexporters/spaceload.py | 24 ++++++++---------- myems-api/excelexporters/spaceoutput.py | 23 ++++++++--------- myems-api/excelexporters/spacesaving.py | 25 ++++++++----------- myems-api/excelexporters/spacestatistics.py | 23 ++++++++--------- 9 files changed, 88 insertions(+), 105 deletions(-) diff --git a/myems-api/excelexporters/spacecost.py b/myems-api/excelexporters/spacecost.py index 9f8ebb0e..023468c2 100644 --- a/myems-api/excelexporters/spacecost.py +++ b/myems-api/excelexporters/spacecost.py @@ -120,32 +120,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/spaceefficiency.py b/myems-api/excelexporters/spaceefficiency.py index 8f2c7223..b7c72bbc 100644 --- a/myems-api/excelexporters/spaceefficiency.py +++ b/myems-api/excelexporters/spaceefficiency.py @@ -118,32 +118,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period_efficiency" not in report.keys() or \ "names" not in report['reporting_period_efficiency'].keys() or len( diff --git a/myems-api/excelexporters/spaceenergycategory.py b/myems-api/excelexporters/spaceenergycategory.py index 287454f6..3150d771 100644 --- a/myems-api/excelexporters/spaceenergycategory.py +++ b/myems-api/excelexporters/spaceenergycategory.py @@ -120,8 +120,6 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border diff --git a/myems-api/excelexporters/spaceenergyitem.py b/myems-api/excelexporters/spaceenergyitem.py index c9642e82..3e7abe13 100644 --- a/myems-api/excelexporters/spaceenergyitem.py +++ b/myems-api/excelexporters/spaceenergyitem.py @@ -120,30 +120,29 @@ def generate_excel(report, # Title ws.row_dimensions[3].height = 60 - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/spaceincome.py b/myems-api/excelexporters/spaceincome.py index 3a2dc411..c8c8f597 100644 --- a/myems-api/excelexporters/spaceincome.py +++ b/myems-api/excelexporters/spaceincome.py @@ -122,30 +122,29 @@ def generate_excel(report, # Title ws.row_dimensions[3].height = 60 - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/spaceload.py b/myems-api/excelexporters/spaceload.py index 4b65bcd7..9e5d88ad 100644 --- a/myems-api/excelexporters/spaceload.py +++ b/myems-api/excelexporters/spaceload.py @@ -116,31 +116,29 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "timestamps" not in report['reporting_period'].keys() or len(report['reporting_period']['timestamps']) == 0: diff --git a/myems-api/excelexporters/spaceoutput.py b/myems-api/excelexporters/spaceoutput.py index f272f422..4ae2f770 100644 --- a/myems-api/excelexporters/spaceoutput.py +++ b/myems-api/excelexporters/spaceoutput.py @@ -120,30 +120,29 @@ def generate_excel(report, # Title ws.row_dimensions[3].height = 60 - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/spacesaving.py b/myems-api/excelexporters/spacesaving.py index f05ac145..788c6dd7 100644 --- a/myems-api/excelexporters/spacesaving.py +++ b/myems-api/excelexporters/spacesaving.py @@ -120,32 +120,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/spacestatistics.py b/myems-api/excelexporters/spacestatistics.py index 072544b5..fb863de9 100644 --- a/myems-api/excelexporters/spacestatistics.py +++ b/myems-api/excelexporters/spacestatistics.py @@ -119,30 +119,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: From 2d5810db519a66fd7264b4e4dcfaf372dedaad02 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 30 Sep 2021 22:21:44 +0800 Subject: [PATCH 75/87] updated format of excel exporters --- myems-api/excelexporters/shopfloorbatch.py | 23 ++++++++--------- myems-api/excelexporters/shopfloorcost.py | 24 ++++++++---------- .../excelexporters/shopfloorenergycategory.py | 25 ++++++++----------- .../excelexporters/shopfloorenergyitem.py | 25 ++++++++----------- myems-api/excelexporters/shopfloorload.py | 23 ++++++++--------- myems-api/excelexporters/shopfloorsaving.py | 25 ++++++++----------- .../excelexporters/shopfloorstatistics.py | 23 ++++++++--------- 7 files changed, 77 insertions(+), 91 deletions(-) diff --git a/myems-api/excelexporters/shopfloorbatch.py b/myems-api/excelexporters/shopfloorbatch.py index 82096371..f0b408b3 100644 --- a/myems-api/excelexporters/shopfloorbatch.py +++ b/myems-api/excelexporters/shopfloorbatch.py @@ -110,24 +110,23 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Space:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = space_name - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Datetime:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "~" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['B5'].alignment = b_r_alignment + ws['B5'] = 'Reporting End Datetime:' + ws['C5'].border = b_border + ws['C5'].alignment = b_c_alignment + ws['C5'] = reporting_end_datetime_local # Title ws['B6'].border = f_border diff --git a/myems-api/excelexporters/shopfloorcost.py b/myems-api/excelexporters/shopfloorcost.py index 6a27fe9a..5ab44930 100644 --- a/myems-api/excelexporters/shopfloorcost.py +++ b/myems-api/excelexporters/shopfloorcost.py @@ -120,31 +120,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/shopfloorenergycategory.py b/myems-api/excelexporters/shopfloorenergycategory.py index 75d3caf8..d2a0eb81 100644 --- a/myems-api/excelexporters/shopfloorenergycategory.py +++ b/myems-api/excelexporters/shopfloorenergycategory.py @@ -120,32 +120,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local[:10] + "__" + reporting_end_datetime_local[:10] - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/shopfloorenergyitem.py b/myems-api/excelexporters/shopfloorenergyitem.py index 48f6271b..a9f98b29 100644 --- a/myems-api/excelexporters/shopfloorenergyitem.py +++ b/myems-api/excelexporters/shopfloorenergyitem.py @@ -117,32 +117,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/shopfloorload.py b/myems-api/excelexporters/shopfloorload.py index 4f8c710f..7e36567b 100644 --- a/myems-api/excelexporters/shopfloorload.py +++ b/myems-api/excelexporters/shopfloorload.py @@ -118,30 +118,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/shopfloorsaving.py b/myems-api/excelexporters/shopfloorsaving.py index 1c481c1b..552bccbb 100644 --- a/myems-api/excelexporters/shopfloorsaving.py +++ b/myems-api/excelexporters/shopfloorsaving.py @@ -120,32 +120,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws['G3'].border = b_border - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/shopfloorstatistics.py b/myems-api/excelexporters/shopfloorstatistics.py index 70b18aa1..4694256d 100644 --- a/myems-api/excelexporters/shopfloorstatistics.py +++ b/myems-api/excelexporters/shopfloorstatistics.py @@ -118,30 +118,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: From bfd6d8956abffd494bed6c45496fd8912c21ae3b Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 30 Sep 2021 22:39:29 +0800 Subject: [PATCH 76/87] updated format of excel exporters --- .../excelexporters/combinedequipmentbatch.py | 23 +++++++++---------- myems-api/excelexporters/equipmentbatch.py | 23 +++++++++---------- myems-api/excelexporters/meterbatch.py | 23 +++++++++---------- myems-api/excelexporters/storebatch.py | 23 +++++++++---------- myems-api/excelexporters/tenantbatch.py | 19 ++++++++------- 5 files changed, 55 insertions(+), 56 deletions(-) diff --git a/myems-api/excelexporters/combinedequipmentbatch.py b/myems-api/excelexporters/combinedequipmentbatch.py index 6e858316..d031bf47 100644 --- a/myems-api/excelexporters/combinedequipmentbatch.py +++ b/myems-api/excelexporters/combinedequipmentbatch.py @@ -110,24 +110,23 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Space:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = space_name - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "~" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['B5'].alignment = b_r_alignment + ws['B5'] = 'Reporting End Datetime:' + ws['C5'].border = b_border + ws['C5'].alignment = b_c_alignment + ws['C5'] = reporting_end_datetime_local # Title ws['B6'].border = f_border diff --git a/myems-api/excelexporters/equipmentbatch.py b/myems-api/excelexporters/equipmentbatch.py index cc52baa1..b3df74e7 100644 --- a/myems-api/excelexporters/equipmentbatch.py +++ b/myems-api/excelexporters/equipmentbatch.py @@ -110,24 +110,23 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Space:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = space_name - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Datetime:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "~" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['B5'].alignment = b_r_alignment + ws['B5'] = 'Reporting End Datetime:' + ws['C5'].border = b_border + ws['C5'].alignment = b_c_alignment + ws['C5'] = reporting_end_datetime_local # Title ws['B6'].border = f_border diff --git a/myems-api/excelexporters/meterbatch.py b/myems-api/excelexporters/meterbatch.py index d1b39257..404b5ac4 100644 --- a/myems-api/excelexporters/meterbatch.py +++ b/myems-api/excelexporters/meterbatch.py @@ -110,24 +110,23 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Space:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = space_name - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Datetime:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "~" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['B5'].alignment = b_r_alignment + ws['B5'] = 'Reporting End Datetime:' + ws['C5'].border = b_border + ws['C5'].alignment = b_c_alignment + ws['C5'] = reporting_end_datetime_local # Title ws['B6'].border = f_border diff --git a/myems-api/excelexporters/storebatch.py b/myems-api/excelexporters/storebatch.py index 40bf0ed8..985ebd3e 100644 --- a/myems-api/excelexporters/storebatch.py +++ b/myems-api/excelexporters/storebatch.py @@ -110,24 +110,23 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Space:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = space_name - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Datetime:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "~" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['B5'].alignment = b_r_alignment + ws['B5'] = 'Reporting End Datetime:' + ws['C5'].border = b_border + ws['C5'].alignment = b_c_alignment + ws['C5'] = reporting_end_datetime_local # Title ws['B6'].border = f_border diff --git a/myems-api/excelexporters/tenantbatch.py b/myems-api/excelexporters/tenantbatch.py index f8eb09ee..00ee0027 100644 --- a/myems-api/excelexporters/tenantbatch.py +++ b/myems-api/excelexporters/tenantbatch.py @@ -120,14 +120,17 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['C3'].font = name_font ws['C3'] = space_name - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Datetime:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "~" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['B5'].alignment = b_r_alignment + ws['B5'] = 'Reporting End Datetime:' + ws['C5'].border = b_border + ws['C5'].alignment = b_c_alignment + ws['C5'] = reporting_end_datetime_local # Title ws['B6'].border = f_border From 3d39a37fb4ca59e8a030e25df3a3394c29c46282 Mon Sep 17 00:00:00 2001 From: hyh123a Date: Fri, 1 Oct 2021 11:49:42 +0800 Subject: [PATCH 77/87] modify the README.md --- README.md | 5 +++-- README_DE.md | 4 ++-- README_EN.md | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 926d7307..a2649548 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ sudo nano myems-cleaning/config.py sudo nano myems-modbus-tcp/config.py sudo nano myems-normalization/config.py -# host: '127.0.0.1' => 'host': '192.168.2.2' +# host: '127.0.0.1' 将这行代码修改为: 'host': '192.168.2.2' ``` 修改web和admin文件夹下nginx.conf中的location '/api' @@ -122,9 +122,10 @@ sudo nano myems-normalization/config.py ``` sudo nano admin/nginx.conf sudo nano web/nginx.conf -# proxy_pass http://127.0.0.1:8000/; => proxy_pass http://192.168.2.3:8000/; +# proxy_pass http://127.0.0.1:8000/; 将这行代码修改为: proxy_pass http://192.168.2.3:8000/; ``` + 将Web打包生成产品文件 ``` cd myems/web diff --git a/README_DE.md b/README_DE.md index 51d6e0ac..ff9c647f 100644 --- a/README_DE.md +++ b/README_DE.md @@ -115,7 +115,7 @@ sudo nano myems-cleaning/config.py sudo nano myems-modbus-tcp/config.py sudo nano myems-normalization/config.py -# host: '127.0.0.1' => 'host': '192.168.2.2' +# host: '127.0.0.1' Ändern: 'host': '192.168.2.2' ``` Ändern Sie den location '/api' von nginx.conf in web und admin @@ -123,7 +123,7 @@ Angenommen, die Host-IP lautet 192.168.2.3 ``` sudo nano admin/nginx.conf sudo nano web/nginx.conf -# proxy_pass http://127.0.0.1:8000/; => proxy_pass http://192.168.2.3:8000/; +# proxy_pass http://127.0.0.1:8000/; Ändern: proxy_pass http://192.168.2.3:8000/; ``` Verpacken Sie das web, um Produktdateien zu generieren diff --git a/README_EN.md b/README_EN.md index 5b4aa9d1..79d4f9ad 100644 --- a/README_EN.md +++ b/README_EN.md @@ -114,14 +114,14 @@ sudo nano myems-cleaning/config.py sudo nano myems-modbus-tcp/config.py sudo nano myems-normalization/config.py -# host: '127.0.0.1' => 'host': '192.168.2.2' +# host: '127.0.0.1' modify to:'host': '192.168.2.2' ``` Modify location '/api' in nginx.conf of web and admin Assume the Host IP is 192.168.2.3 ``` sudo nano admin/nginx.conf sudo nano web/nginx.conf -# proxy_pass http://127.0.0.1:8000/; => proxy_pass http://192.168.2.3:8000/; +# proxy_pass http://127.0.0.1:8000/; modify to: proxy_pass http://192.168.2.3:8000/; ``` Build web for production From 48c22cf84b54635e9fb1f431880cf53c423a49b0 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 1 Oct 2021 13:17:36 +0800 Subject: [PATCH 78/87] updated Docker section in README --- README.md | 13 ++++++++----- README_DE.md | 14 +++++++++----- README_EN.md | 15 ++++++++++----- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index a2649548..7a238908 100644 --- a/README.md +++ b/README.md @@ -106,24 +106,27 @@ git clone https://gitee.com/myems/myems.git ``` 修改以下文件中的数据库IP -假定数据库IP为: 192.168.2.2 +假定数据库IP为: 192.168.0.1 ``` sudo nano myems-api/config.py sudo nano myems-aggregation/config.py sudo nano myems-cleaning/config.py sudo nano myems-modbus-tcp/config.py sudo nano myems-normalization/config.py - -# host: '127.0.0.1' 将这行代码修改为: 'host': '192.168.2.2' ``` +~~'host': '127.0.0.1'~~ + +'host': '192.168.0.1' 修改web和admin文件夹下nginx.conf中的location '/api' -假定本机IP为: 192.168.2.3 +假定本机IP为: 192.168.0.2 ``` sudo nano admin/nginx.conf sudo nano web/nginx.conf -# proxy_pass http://127.0.0.1:8000/; 将这行代码修改为: proxy_pass http://192.168.2.3:8000/; ``` +~~proxy_pass http://127.0.0.1:8000/;~~ + +proxy_pass http://192.168.0.2:8000/; 将Web打包生成产品文件 diff --git a/README_DE.md b/README_DE.md index ff9c647f..d7463bc2 100644 --- a/README_DE.md +++ b/README_DE.md @@ -107,24 +107,28 @@ git clone https://gitee.com/myems/myems.git ``` Ändern Sie die Datenbankkonfiguration in den folgenden Dateien -Angenommen, die Datenbank-IP lautet 192.168.2.2 +Angenommen, die Datenbank-IP lautet 192.168.0.1 ``` sudo nano myems-api/config.py sudo nano myems-aggregation/config.py sudo nano myems-cleaning/config.py sudo nano myems-modbus-tcp/config.py sudo nano myems-normalization/config.py - -# host: '127.0.0.1' Ändern: 'host': '192.168.2.2' ``` +~~'host': '127.0.0.1'~~ + +'host': '192.168.0.1' + Ändern Sie den location '/api' von nginx.conf in web und admin -Angenommen, die Host-IP lautet 192.168.2.3 +Angenommen, die Host-IP lautet 192.168.0.2 ``` sudo nano admin/nginx.conf sudo nano web/nginx.conf -# proxy_pass http://127.0.0.1:8000/; Ändern: proxy_pass http://192.168.2.3:8000/; ``` +~~proxy_pass http://127.0.0.1:8000/;~~ + +proxy_pass http://192.168.0.2:8000/; Verpacken Sie das web, um Produktdateien zu generieren ``` diff --git a/README_EN.md b/README_EN.md index 79d4f9ad..97ed3c0e 100644 --- a/README_EN.md +++ b/README_EN.md @@ -106,23 +106,28 @@ git clone https://gitee.com/myems/myems.git ``` Modify Database IP in the following files -Assume the Database IP is 192.168.2.2 +Assume the Database IP is 192.168.0.1 ``` sudo nano myems-api/config.py sudo nano myems-aggregation/config.py sudo nano myems-cleaning/config.py sudo nano myems-modbus-tcp/config.py sudo nano myems-normalization/config.py - -# host: '127.0.0.1' modify to:'host': '192.168.2.2' ``` + +~~'host': '127.0.0.1'~~ + +'host': '192.168.0.1' + Modify location '/api' in nginx.conf of web and admin -Assume the Host IP is 192.168.2.3 +Assume the Host IP is 192.168.0.2 ``` sudo nano admin/nginx.conf sudo nano web/nginx.conf -# proxy_pass http://127.0.0.1:8000/; modify to: proxy_pass http://192.168.2.3:8000/; ``` +~~proxy_pass http://127.0.0.1:8000/;~~ + +proxy_pass http://192.168.0.2:8000/; Build web for production ``` From 5ea4c7a83bb0425ce9beeb1364898e7327024a23 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sat, 2 Oct 2021 22:50:58 +0800 Subject: [PATCH 79/87] updated format of excel exporters --- .../excelexporters/combinedequipmentcost.py | 26 ++++++++--------- .../combinedequipmentefficiency.py | 25 +++++++--------- .../combinedequipmentenergycategory.py | 25 +++++++--------- .../combinedequipmentenergyitem.py | 25 +++++++--------- .../excelexporters/combinedequipmentincome.py | 25 +++++++--------- .../excelexporters/combinedequipmentload.py | 27 +++++++++-------- .../excelexporters/combinedequipmentoutput.py | 25 +++++++--------- .../excelexporters/combinedequipmentsaving.py | 25 +++++++--------- .../combinedequipmentstatistics.py | 29 +++++++++---------- 9 files changed, 105 insertions(+), 127 deletions(-) diff --git a/myems-api/excelexporters/combinedequipmentcost.py b/myems-api/excelexporters/combinedequipmentcost.py index 9367cfa3..f2a3e2cf 100644 --- a/myems-api/excelexporters/combinedequipmentcost.py +++ b/myems-api/excelexporters/combinedequipmentcost.py @@ -119,32 +119,30 @@ def generate_excel(report, img = Image("excelexporters/myems.png") ws.add_image(img, 'A1') - # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font + # Title= ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/combinedequipmentefficiency.py b/myems-api/excelexporters/combinedequipmentefficiency.py index 6273b06a..af058a49 100644 --- a/myems-api/excelexporters/combinedequipmentefficiency.py +++ b/myems-api/excelexporters/combinedequipmentefficiency.py @@ -118,32 +118,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period_efficiency" not in report.keys() or \ "names" not in report['reporting_period_efficiency'].keys() or len( diff --git a/myems-api/excelexporters/combinedequipmentenergycategory.py b/myems-api/excelexporters/combinedequipmentenergycategory.py index e5838c76..8ccd0008 100644 --- a/myems-api/excelexporters/combinedequipmentenergycategory.py +++ b/myems-api/excelexporters/combinedequipmentenergycategory.py @@ -120,32 +120,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local[:10] + "__" + reporting_end_datetime_local[:10] - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/combinedequipmentenergyitem.py b/myems-api/excelexporters/combinedequipmentenergyitem.py index 98962cd0..32ab2068 100644 --- a/myems-api/excelexporters/combinedequipmentenergyitem.py +++ b/myems-api/excelexporters/combinedequipmentenergyitem.py @@ -118,32 +118,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/combinedequipmentincome.py b/myems-api/excelexporters/combinedequipmentincome.py index 1e015a79..b29056fb 100644 --- a/myems-api/excelexporters/combinedequipmentincome.py +++ b/myems-api/excelexporters/combinedequipmentincome.py @@ -120,32 +120,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/combinedequipmentload.py b/myems-api/excelexporters/combinedequipmentload.py index 6b3f6755..6da5eea5 100644 --- a/myems-api/excelexporters/combinedequipmentload.py +++ b/myems-api/excelexporters/combinedequipmentload.py @@ -97,7 +97,7 @@ def generate_excel(report, b_c_alignment = Alignment(vertical='bottom', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) c_c_alignment = Alignment(vertical='center', @@ -109,7 +109,7 @@ def generate_excel(report, b_r_alignment = Alignment(vertical='bottom', horizontal='right', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) @@ -118,30 +118,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/combinedequipmentoutput.py b/myems-api/excelexporters/combinedequipmentoutput.py index 872abe09..eaa3af17 100644 --- a/myems-api/excelexporters/combinedequipmentoutput.py +++ b/myems-api/excelexporters/combinedequipmentoutput.py @@ -118,32 +118,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/combinedequipmentsaving.py b/myems-api/excelexporters/combinedequipmentsaving.py index 39d89f95..4f66bd53 100644 --- a/myems-api/excelexporters/combinedequipmentsaving.py +++ b/myems-api/excelexporters/combinedequipmentsaving.py @@ -120,32 +120,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws['G3'].border = b_border - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/combinedequipmentstatistics.py b/myems-api/excelexporters/combinedequipmentstatistics.py index 18ffb06a..e1d33e0a 100644 --- a/myems-api/excelexporters/combinedequipmentstatistics.py +++ b/myems-api/excelexporters/combinedequipmentstatistics.py @@ -98,19 +98,19 @@ def generate_excel(report, b_c_alignment = Alignment(vertical='bottom', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) c_c_alignment = Alignment(vertical='center', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) b_r_alignment = Alignment(vertical='bottom', horizontal='right', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) @@ -119,30 +119,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: From 00d36b331e44bfe4db57cde1f32c6829eb901783 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 3 Oct 2021 09:55:10 +0800 Subject: [PATCH 80/87] updated format of excel exporters --- myems-api/excelexporters/equipmentcost.py | 25 +++++++--------- .../excelexporters/equipmentefficiency.py | 25 +++++++--------- .../excelexporters/equipmentenergycategory.py | 25 +++++++--------- .../excelexporters/equipmentenergyitem.py | 25 +++++++--------- myems-api/excelexporters/equipmentincome.py | 25 +++++++--------- myems-api/excelexporters/equipmentload.py | 27 +++++++++-------- myems-api/excelexporters/equipmentoutput.py | 25 +++++++--------- myems-api/excelexporters/equipmentsaving.py | 25 +++++++--------- .../excelexporters/equipmentstatistics.py | 29 +++++++++---------- myems-api/excelexporters/equipmenttracking.py | 4 +-- myems-api/excelexporters/meterbatch.py | 2 +- myems-api/excelexporters/metercost.py | 25 +++++++--------- myems-api/excelexporters/meterenergy.py | 25 +++++++--------- .../excelexporters/metersubmetersbalance.py | 24 +++++++-------- myems-api/excelexporters/metertracking.py | 25 ++++++++-------- myems-api/excelexporters/metertrend.py | 23 +++++++-------- myems-api/excelexporters/offlinemetercost.py | 25 +++++++--------- .../excelexporters/offlinemeterenergy.py | 25 +++++++--------- myems-api/excelexporters/spaceincome.py | 2 -- myems-api/excelexporters/spacestatistics.py | 6 ++-- myems-api/excelexporters/storecost.py | 27 ++++++++--------- .../excelexporters/storeenergycategory.py | 25 +++++++--------- myems-api/excelexporters/storeenergyitem.py | 25 +++++++--------- myems-api/excelexporters/storeload.py | 27 +++++++++-------- myems-api/excelexporters/storesaving.py | 25 +++++++--------- myems-api/excelexporters/storestatistics.py | 27 +++++++++-------- myems-api/excelexporters/tenantbatch.py | 4 --- myems-api/excelexporters/tenantbill.py | 8 ++--- myems-api/excelexporters/tenantcost.py | 24 +++++++-------- .../excelexporters/tenantenergycategory.py | 25 +++++++--------- myems-api/excelexporters/tenantenergyitem.py | 25 +++++++--------- myems-api/excelexporters/tenantload.py | 24 +++++++-------- myems-api/excelexporters/tenantsaving.py | 25 +++++++--------- myems-api/excelexporters/tenantstatistics.py | 29 +++++++++---------- myems-api/excelexporters/virtualmetercost.py | 25 +++++++--------- .../excelexporters/virtualmeterenergy.py | 25 +++++++--------- 36 files changed, 354 insertions(+), 433 deletions(-) diff --git a/myems-api/excelexporters/equipmentcost.py b/myems-api/excelexporters/equipmentcost.py index c37fb3d2..6b6a2a2a 100644 --- a/myems-api/excelexporters/equipmentcost.py +++ b/myems-api/excelexporters/equipmentcost.py @@ -119,32 +119,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local[:10] + "__" + reporting_end_datetime_local[:10] - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/equipmentefficiency.py b/myems-api/excelexporters/equipmentefficiency.py index ab5de3e7..cdfa9be7 100644 --- a/myems-api/excelexporters/equipmentefficiency.py +++ b/myems-api/excelexporters/equipmentefficiency.py @@ -116,32 +116,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period_efficiency" not in report.keys() or \ "names" not in report['reporting_period_efficiency'].keys() or len( diff --git a/myems-api/excelexporters/equipmentenergycategory.py b/myems-api/excelexporters/equipmentenergycategory.py index 217368d2..2c3ef490 100644 --- a/myems-api/excelexporters/equipmentenergycategory.py +++ b/myems-api/excelexporters/equipmentenergycategory.py @@ -119,32 +119,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local[:10] + "__" + reporting_end_datetime_local[:10] - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/equipmentenergyitem.py b/myems-api/excelexporters/equipmentenergyitem.py index 7e9a18fd..ca3104c9 100644 --- a/myems-api/excelexporters/equipmentenergyitem.py +++ b/myems-api/excelexporters/equipmentenergyitem.py @@ -116,32 +116,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/equipmentincome.py b/myems-api/excelexporters/equipmentincome.py index 82ce6cb1..bf0815e5 100644 --- a/myems-api/excelexporters/equipmentincome.py +++ b/myems-api/excelexporters/equipmentincome.py @@ -117,32 +117,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/equipmentload.py b/myems-api/excelexporters/equipmentload.py index 59205f4b..d9ff7619 100644 --- a/myems-api/excelexporters/equipmentload.py +++ b/myems-api/excelexporters/equipmentload.py @@ -95,7 +95,7 @@ def generate_excel(report, b_c_alignment = Alignment(vertical='bottom', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) c_c_alignment = Alignment(vertical='center', @@ -107,7 +107,7 @@ def generate_excel(report, b_r_alignment = Alignment(vertical='bottom', horizontal='right', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) @@ -116,30 +116,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local[:10] + "__" + reporting_end_datetime_local[:10] - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/equipmentoutput.py b/myems-api/excelexporters/equipmentoutput.py index 7cdca3b7..95e6382d 100644 --- a/myems-api/excelexporters/equipmentoutput.py +++ b/myems-api/excelexporters/equipmentoutput.py @@ -116,32 +116,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/equipmentsaving.py b/myems-api/excelexporters/equipmentsaving.py index a1ba7e6d..bdd278ce 100644 --- a/myems-api/excelexporters/equipmentsaving.py +++ b/myems-api/excelexporters/equipmentsaving.py @@ -118,32 +118,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws['G3'].border = b_border - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/equipmentstatistics.py b/myems-api/excelexporters/equipmentstatistics.py index 3c4ea1d3..e6d52d1d 100644 --- a/myems-api/excelexporters/equipmentstatistics.py +++ b/myems-api/excelexporters/equipmentstatistics.py @@ -98,19 +98,19 @@ def generate_excel(report, b_c_alignment = Alignment(vertical='bottom', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) c_c_alignment = Alignment(vertical='center', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) b_r_alignment = Alignment(vertical='bottom', horizontal='right', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) @@ -119,30 +119,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/equipmenttracking.py b/myems-api/excelexporters/equipmenttracking.py index 03b7dcaa..3bca11ab 100644 --- a/myems-api/excelexporters/equipmenttracking.py +++ b/myems-api/excelexporters/equipmenttracking.py @@ -73,13 +73,13 @@ def generate_excel(report, space_name): b_c_alignment = Alignment(vertical='bottom', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) c_c_alignment = Alignment(vertical='center', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) for i in range(ord('B'), ord('F')): diff --git a/myems-api/excelexporters/meterbatch.py b/myems-api/excelexporters/meterbatch.py index 404b5ac4..85957491 100644 --- a/myems-api/excelexporters/meterbatch.py +++ b/myems-api/excelexporters/meterbatch.py @@ -128,7 +128,7 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['C5'].alignment = b_c_alignment ws['C5'] = reporting_end_datetime_local - # Title + # Column Title ws['B6'].border = f_border ws['B6'].font = name_font ws['B6'].alignment = c_c_alignment diff --git a/myems-api/excelexporters/metercost.py b/myems-api/excelexporters/metercost.py index d13cadd5..ed24aebc 100644 --- a/myems-api/excelexporters/metercost.py +++ b/myems-api/excelexporters/metercost.py @@ -113,32 +113,29 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "values" not in report['reporting_period'].keys() or len(report['reporting_period']['values']) == 0: diff --git a/myems-api/excelexporters/meterenergy.py b/myems-api/excelexporters/meterenergy.py index 0834eb57..6ec00f95 100644 --- a/myems-api/excelexporters/meterenergy.py +++ b/myems-api/excelexporters/meterenergy.py @@ -110,32 +110,29 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "values" not in report['reporting_period'].keys() or len(report['reporting_period']['values']) == 0: diff --git a/myems-api/excelexporters/metersubmetersbalance.py b/myems-api/excelexporters/metersubmetersbalance.py index bc82ebd3..abd5470c 100644 --- a/myems-api/excelexporters/metersubmetersbalance.py +++ b/myems-api/excelexporters/metersubmetersbalance.py @@ -109,31 +109,29 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "difference_values" not in report['reporting_period'].keys() or \ diff --git a/myems-api/excelexporters/metertracking.py b/myems-api/excelexporters/metertracking.py index b5c49833..923c8e77 100644 --- a/myems-api/excelexporters/metertracking.py +++ b/myems-api/excelexporters/metertracking.py @@ -109,24 +109,23 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment - ws['B3'] = 'Name:' + ws['B3'] = 'Space:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = space_name - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['B5'].alignment = b_r_alignment + ws['B5'] = 'Reporting End Datetime:' + ws['C5'].border = b_border + ws['C5'].alignment = b_c_alignment + ws['C5'] = reporting_end_datetime_local # Title ws['B6'].border = f_border diff --git a/myems-api/excelexporters/metertrend.py b/myems-api/excelexporters/metertrend.py index dd724964..01d4f7ad 100644 --- a/myems-api/excelexporters/metertrend.py +++ b/myems-api/excelexporters/metertrend.py @@ -120,24 +120,23 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['B5'].alignment = b_r_alignment + ws['B5'] = 'Reporting End Datetime:' + ws['C5'].border = b_border + ws['C5'].alignment = b_c_alignment + ws['C5'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: filename = str(uuid.uuid4()) + '.xlsx' diff --git a/myems-api/excelexporters/offlinemetercost.py b/myems-api/excelexporters/offlinemetercost.py index 8477e5f4..fd07203a 100644 --- a/myems-api/excelexporters/offlinemetercost.py +++ b/myems-api/excelexporters/offlinemetercost.py @@ -112,32 +112,29 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "values" not in report['reporting_period'].keys() or len(report['reporting_period']['values']) == 0: diff --git a/myems-api/excelexporters/offlinemeterenergy.py b/myems-api/excelexporters/offlinemeterenergy.py index 03a1e8d8..ecca68df 100644 --- a/myems-api/excelexporters/offlinemeterenergy.py +++ b/myems-api/excelexporters/offlinemeterenergy.py @@ -109,32 +109,29 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "values" not in report['reporting_period'].keys() or len(report['reporting_period']['values']) == 0: diff --git a/myems-api/excelexporters/spaceincome.py b/myems-api/excelexporters/spaceincome.py index c8c8f597..0a19a344 100644 --- a/myems-api/excelexporters/spaceincome.py +++ b/myems-api/excelexporters/spaceincome.py @@ -120,8 +120,6 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border diff --git a/myems-api/excelexporters/spacestatistics.py b/myems-api/excelexporters/spacestatistics.py index fb863de9..d1bdcf01 100644 --- a/myems-api/excelexporters/spacestatistics.py +++ b/myems-api/excelexporters/spacestatistics.py @@ -98,19 +98,19 @@ def generate_excel(report, b_c_alignment = Alignment(vertical='bottom', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) c_c_alignment = Alignment(vertical='center', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) b_r_alignment = Alignment(vertical='bottom', horizontal='right', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) diff --git a/myems-api/excelexporters/storecost.py b/myems-api/excelexporters/storecost.py index 9f0c74b9..41da2261 100644 --- a/myems-api/excelexporters/storecost.py +++ b/myems-api/excelexporters/storecost.py @@ -99,7 +99,7 @@ def generate_excel(report, b_c_alignment = Alignment(vertical='bottom', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) c_c_alignment = Alignment(vertical='center', @@ -111,7 +111,7 @@ def generate_excel(report, b_r_alignment = Alignment(vertical='bottom', horizontal='right', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) # Img @@ -119,32 +119,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws.merge_cells("G3:I3") - for i in range(ord('G'), ord('I') + 1): - ws[chr(i) + '3'].border = b_border + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/storeenergycategory.py b/myems-api/excelexporters/storeenergycategory.py index 007ddbcf..510f617b 100644 --- a/myems-api/excelexporters/storeenergycategory.py +++ b/myems-api/excelexporters/storeenergycategory.py @@ -120,32 +120,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local[:10] + "__" + reporting_end_datetime_local[:10] - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/storeenergyitem.py b/myems-api/excelexporters/storeenergyitem.py index ac8822c1..84c60f8d 100644 --- a/myems-api/excelexporters/storeenergyitem.py +++ b/myems-api/excelexporters/storeenergyitem.py @@ -117,32 +117,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/storeload.py b/myems-api/excelexporters/storeload.py index a8171d81..2bdd67ca 100644 --- a/myems-api/excelexporters/storeload.py +++ b/myems-api/excelexporters/storeload.py @@ -97,7 +97,7 @@ def generate_excel(report, b_c_alignment = Alignment(vertical='bottom', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) c_c_alignment = Alignment(vertical='center', @@ -109,7 +109,7 @@ def generate_excel(report, b_r_alignment = Alignment(vertical='bottom', horizontal='right', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) @@ -118,30 +118,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/storesaving.py b/myems-api/excelexporters/storesaving.py index 362120ae..b78c2294 100644 --- a/myems-api/excelexporters/storesaving.py +++ b/myems-api/excelexporters/storesaving.py @@ -120,32 +120,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws['G3'].border = b_border - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/storestatistics.py b/myems-api/excelexporters/storestatistics.py index 412fe50a..2acb5ded 100644 --- a/myems-api/excelexporters/storestatistics.py +++ b/myems-api/excelexporters/storestatistics.py @@ -97,7 +97,7 @@ def generate_excel(report, b_c_alignment = Alignment(vertical='bottom', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) c_c_alignment = Alignment(vertical='center', @@ -109,7 +109,7 @@ def generate_excel(report, b_r_alignment = Alignment(vertical='bottom', horizontal='right', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) @@ -118,30 +118,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/tenantbatch.py b/myems-api/excelexporters/tenantbatch.py index 00ee0027..5ff1d8ce 100644 --- a/myems-api/excelexporters/tenantbatch.py +++ b/myems-api/excelexporters/tenantbatch.py @@ -110,14 +110,10 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Space:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = space_name ws['B4'].alignment = b_r_alignment diff --git a/myems-api/excelexporters/tenantbill.py b/myems-api/excelexporters/tenantbill.py index 89923223..a71bcfb6 100644 --- a/myems-api/excelexporters/tenantbill.py +++ b/myems-api/excelexporters/tenantbill.py @@ -113,19 +113,19 @@ def generate_excel(report, c_c_alignment = Alignment(vertical='center', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) b_r_alignment = Alignment(vertical='bottom', horizontal='right', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) b_l_alignment = Alignment(vertical='bottom', horizontal='left', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) @@ -150,7 +150,7 @@ def generate_excel(report, if has_lease_number_data_flag: ws['B24'].font = name_font ws['B24'].alignment = b_r_alignment - ws['B24'] = '租赁合同号码:' + ws['B24'] = 'Lease Number:' ws['C24'].alignment = b_l_alignment ws['C24'].font = name_font ws['C24'] = report['tenant']['lease_number'] diff --git a/myems-api/excelexporters/tenantcost.py b/myems-api/excelexporters/tenantcost.py index 784c429a..b5676555 100644 --- a/myems-api/excelexporters/tenantcost.py +++ b/myems-api/excelexporters/tenantcost.py @@ -121,31 +121,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/tenantenergycategory.py b/myems-api/excelexporters/tenantenergycategory.py index 6149f297..d97c0785 100644 --- a/myems-api/excelexporters/tenantenergycategory.py +++ b/myems-api/excelexporters/tenantenergycategory.py @@ -120,32 +120,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/tenantenergyitem.py b/myems-api/excelexporters/tenantenergyitem.py index 285a1890..e3f84349 100644 --- a/myems-api/excelexporters/tenantenergyitem.py +++ b/myems-api/excelexporters/tenantenergyitem.py @@ -118,32 +118,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/tenantload.py b/myems-api/excelexporters/tenantload.py index b186fcf8..c337a02c 100644 --- a/myems-api/excelexporters/tenantload.py +++ b/myems-api/excelexporters/tenantload.py @@ -116,31 +116,29 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "timestamps" not in report['reporting_period'].keys() or len(report['reporting_period']['timestamps']) == 0: diff --git a/myems-api/excelexporters/tenantsaving.py b/myems-api/excelexporters/tenantsaving.py index 9de657b7..0f0f7dab 100644 --- a/myems-api/excelexporters/tenantsaving.py +++ b/myems-api/excelexporters/tenantsaving.py @@ -120,32 +120,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/tenantstatistics.py b/myems-api/excelexporters/tenantstatistics.py index 92b89d5a..2d9ea217 100644 --- a/myems-api/excelexporters/tenantstatistics.py +++ b/myems-api/excelexporters/tenantstatistics.py @@ -98,19 +98,19 @@ def generate_excel(report, b_c_alignment = Alignment(vertical='bottom', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) c_c_alignment = Alignment(vertical='center', horizontal='center', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) b_r_alignment = Alignment(vertical='bottom', horizontal='right', text_rotation=0, - wrap_text=False, + wrap_text=True, shrink_to_fit=False, indent=0) @@ -119,30 +119,29 @@ def generate_excel(report, ws.add_image(img, 'A1') # Title - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: diff --git a/myems-api/excelexporters/virtualmetercost.py b/myems-api/excelexporters/virtualmetercost.py index 92fb44f1..dc5635b4 100644 --- a/myems-api/excelexporters/virtualmetercost.py +++ b/myems-api/excelexporters/virtualmetercost.py @@ -112,32 +112,29 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local - ws.merge_cells("G3:H3") + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "values" not in report['reporting_period'].keys() or len(report['reporting_period']['values']) == 0: diff --git a/myems-api/excelexporters/virtualmeterenergy.py b/myems-api/excelexporters/virtualmeterenergy.py index 559aaf94..35fbd343 100644 --- a/myems-api/excelexporters/virtualmeterenergy.py +++ b/myems-api/excelexporters/virtualmeterenergy.py @@ -108,32 +108,29 @@ def generate_excel(report, name, reporting_start_datetime_local, reporting_end_d ws.add_image(img, 'A1') # Title - ws.row_dimensions[3].height = 60 - - ws['B3'].font = name_font ws['B3'].alignment = b_r_alignment ws['B3'] = 'Name:' ws['C3'].border = b_border ws['C3'].alignment = b_c_alignment - ws['C3'].font = name_font ws['C3'] = name - ws['D3'].font = name_font ws['D3'].alignment = b_r_alignment ws['D3'] = 'Period:' ws['E3'].border = b_border ws['E3'].alignment = b_c_alignment - ws['E3'].font = name_font ws['E3'] = period_type - ws['F3'].font = name_font - ws['F3'].alignment = b_r_alignment - ws['F3'] = 'Date:' - ws.merge_cells("G3:H3") - ws['G3'].border = b_border - ws['G3'].alignment = b_c_alignment - ws['G3'].font = name_font - ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local + ws['B4'].alignment = b_r_alignment + ws['B4'] = 'Reporting Start Datetime:' + ws['C4'].border = b_border + ws['C4'].alignment = b_c_alignment + ws['C4'] = reporting_start_datetime_local + + ws['D4'].alignment = b_r_alignment + ws['D4'] = 'Reporting End Datetime:' + ws['E4'].border = b_border + ws['E4'].alignment = b_c_alignment + ws['E4'] = reporting_end_datetime_local if "reporting_period" not in report.keys() or \ "values" not in report['reporting_period'].keys() or len(report['reporting_period']['values']) == 0: From 0a3d51781574173c4e2f0600bab04f60e1e42690 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 3 Oct 2021 19:13:47 +0800 Subject: [PATCH 81/87] fixed issue for editing user name and password in Admin UI --- admin/views/users/user/user.model.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/admin/views/users/user/user.model.html b/admin/views/users/user/user.model.html index 7a019d23..13239e82 100644 --- a/admin/views/users/user/user.model.html +++ b/admin/views/users/user/user.model.html @@ -6,16 +6,16 @@
    - +
    {{'USER.INPUT_NAME' | translate}}
    -
    -
    +
    +
    - +
    From ca127791cfa25aa69a5819232cc53e487c04d0e2 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Mon, 4 Oct 2021 18:07:16 +0800 Subject: [PATCH 82/87] updated database installation script and README --- database/README.md | 4 +++- database/{ => install}/myems_billing_baseline_db.sql | 0 database/{ => install}/myems_billing_db.sql | 0 database/{ => install}/myems_energy_baseline_db.sql | 0 database/{ => install}/myems_energy_db.sql | 0 database/{ => install}/myems_fdd_db.sql | 0 database/{ => install}/myems_historical_db.sql | 0 database/{ => install}/myems_reporting_db.sql | 0 database/{ => install}/myems_system_db.sql | 0 database/{ => install}/myems_user_db.sql | 0 10 files changed, 3 insertions(+), 1 deletion(-) rename database/{ => install}/myems_billing_baseline_db.sql (100%) rename database/{ => install}/myems_billing_db.sql (100%) rename database/{ => install}/myems_energy_baseline_db.sql (100%) rename database/{ => install}/myems_energy_db.sql (100%) rename database/{ => install}/myems_fdd_db.sql (100%) rename database/{ => install}/myems_historical_db.sql (100%) rename database/{ => install}/myems_reporting_db.sql (100%) rename database/{ => install}/myems_system_db.sql (100%) rename database/{ => install}/myems_user_db.sql (100%) diff --git a/database/README.md b/database/README.md index 2a120a8e..2143a513 100644 --- a/database/README.md +++ b/database/README.md @@ -15,6 +15,7 @@ Providing database schema and scripts for MyEMS. Execute the following scripts in MySQL commandline, or execute in other MySQL client tools such as MySQL Workbench, Navicat, DBaver, phpMyAdmin, etc. ```bash +cd myems/database/install mysql -u root -p < myems_billing_baseline_db.sql mysql -u root -p < myems_billing_db.sql mysql -u root -p < myems_energy_baseline_db.sql @@ -27,7 +28,8 @@ mysql -u root -p < myems_user_db.sql ``` To insert demo data execute the following scripts, ```bash -mysql -u root -p < demo/myems_system_db.sql +cd myems/database/demo +mysql -u root -p < myems_system_db.sql ``` #### Change COLLATE for MySQL server before version 8.0 ```bash diff --git a/database/myems_billing_baseline_db.sql b/database/install/myems_billing_baseline_db.sql similarity index 100% rename from database/myems_billing_baseline_db.sql rename to database/install/myems_billing_baseline_db.sql diff --git a/database/myems_billing_db.sql b/database/install/myems_billing_db.sql similarity index 100% rename from database/myems_billing_db.sql rename to database/install/myems_billing_db.sql diff --git a/database/myems_energy_baseline_db.sql b/database/install/myems_energy_baseline_db.sql similarity index 100% rename from database/myems_energy_baseline_db.sql rename to database/install/myems_energy_baseline_db.sql diff --git a/database/myems_energy_db.sql b/database/install/myems_energy_db.sql similarity index 100% rename from database/myems_energy_db.sql rename to database/install/myems_energy_db.sql diff --git a/database/myems_fdd_db.sql b/database/install/myems_fdd_db.sql similarity index 100% rename from database/myems_fdd_db.sql rename to database/install/myems_fdd_db.sql diff --git a/database/myems_historical_db.sql b/database/install/myems_historical_db.sql similarity index 100% rename from database/myems_historical_db.sql rename to database/install/myems_historical_db.sql diff --git a/database/myems_reporting_db.sql b/database/install/myems_reporting_db.sql similarity index 100% rename from database/myems_reporting_db.sql rename to database/install/myems_reporting_db.sql diff --git a/database/myems_system_db.sql b/database/install/myems_system_db.sql similarity index 100% rename from database/myems_system_db.sql rename to database/install/myems_system_db.sql diff --git a/database/myems_user_db.sql b/database/install/myems_user_db.sql similarity index 100% rename from database/myems_user_db.sql rename to database/install/myems_user_db.sql From f3a36d4a743a39ce15e1fc1bd84aebf65fc66ab3 Mon Sep 17 00:00:00 2001 From: hyh123a Date: Sat, 9 Oct 2021 12:16:03 +0800 Subject: [PATCH 83/87] modfiy the doc for docker-compose --- README.md | 122 +++++++++++++++++++++++++++++++++------- myems-api/test_mysql.py | 28 +++++++++ 2 files changed, 131 insertions(+), 19 deletions(-) create mode 100644 myems-api/test_mysql.py diff --git a/README.md b/README.md index 7a238908..4f33db09 100644 --- a/README.md +++ b/README.md @@ -99,53 +99,137 @@ administrator@myems.io ``` -### Docker Docker-compose 安装 +### Docker-compose 安装 +#### 前提 + +- 主机已安装docker、docker-compose、npm +- MySQL数据库已安装,拥有一个账号为root,密码为!MyEMS1的用户 +- MySQL数据库可正常登陆,可被安装Docker的主机Ping通以及远程访问 + +#### 配置 + +注一:这里的主机指的是**安装Docker的主机**, 这里的IP和账号密码都为假定的,用来展示说明,实际情况中用户需要根据自己的配置改为自己的,具体的修改步骤会在“安装”中讲述。 + +注二:这里如果**安装数据库和安装Docker的主机为同一个主机,那么数据库IP和主机IP修改为一个实际IP**即可,这里是以数据库,和安装Docker的主机不在同一个上举例的。 + +| -- | -- | +| ---------- | ----------- | +| 主机IP | 192.168.0.1 | +| 数据库IP | 192.168.0.2 | +| 数据库账号 | root | +| 数据库密码 | !MyEMS1 | + + + +#### 安装 + +- 1.克隆仓库 ``` git clone https://gitee.com/myems/myems.git ``` -修改以下文件中的数据库IP -假定数据库IP为: 192.168.0.1 +- 2.数据库导入 (否则数据库没有用户信息,网页无法验证登录) + ``` -sudo nano myems-api/config.py -sudo nano myems-aggregation/config.py -sudo nano myems-cleaning/config.py -sudo nano myems-modbus-tcp/config.py -sudo nano myems-normalization/config.py +cd myems/database/install +mysql -u root -p < myems_billing_baseline_db.sql +mysql -u root -p < myems_billing_db.sql +mysql -u root -p < myems_energy_baseline_db.sql +mysql -u root -p < myems_energy_db.sql +mysql -u root -p < myems_fdd_db.sql +mysql -u root -p < myems_historical_db.sql +mysql -u root -p < myems_reporting_db.sql +mysql -u root -p < myems_system_db.sql +mysql -u root -p < myems_user_db.sql ``` -~~'host': '127.0.0.1'~~ +注: 如有问题,详情可查看"database/README.md" -'host': '192.168.0.1' -修改web和admin文件夹下nginx.conf中的location '/api' -假定本机IP为: 192.168.0.2 +- 3.修改配置 + +注:如“配置”所述,这里假定的**主机IP为 192.168.0.1,数据库IP为 192.168.0.2,数据库账号为:root,数据库密码:!MyEMS1,用户应该修改为自己对应的主机IP,数据库IP,数据库账号,数据库密码** + +**3.1** 修改nginx.conf里的API配置 ``` -sudo nano admin/nginx.conf -sudo nano web/nginx.conf +cd myems +sed -i 's/127.0.0.1:8000/192.168.0.1:8000/g' admin/nginx.conf +sed -i 's/127.0.0.1:8000/192.168.0.1:8000/g' web/nginx.conf ``` -~~proxy_pass http://127.0.0.1:8000/;~~ -proxy_pass http://192.168.0.2:8000/; +**3.2** 修改config.py里的数据库IP,账号,密码 +``` +# 这里以修改数据库IP为例,如果数据库账号密码也不同,请根据自己需求替换config.py里的账号密码 +cd myems +sed -i 's/127.0.0.1/192.168.0.2/g' myems-api/config.py +sed -i 's/127.0.0.1/192.168.0.2/g' myems-aggregation/config.py +sed -i 's/127.0.0.1/192.168.0.2/g' myems-cleaning/config.py +sed -i 's/127.0.0.1/192.168.0.2/g' myems-modbus-tcp/config.py +sed -i 's/127.0.0.1/192.168.0.2/g' myems-normalization/config.py +``` + +**3.3** 测试数据库是否可以正确连接 +``` +python3 myems/myems-api/test_mysql.py +``` +注:如果测试通过,继续下一步操作,否则请修改config.py配置,确保数据库可以通过Python3正常连接访问。 -将Web打包生成产品文件 + + +- 4.web打包 (myems/web为React项目,需要打包为产品文件) + ``` cd myems/web npm install npm run build ``` -使用docker-compose安装 + + + + + + + + +- 5.docker-compose一键安装 + ``` cd myems docker-compose up -d ``` + + +- 6.测试 + + +| | 网址 | 结果 | +| ----- | ----------------------- | ---------------- | +| web | 192.168.0.1:80 | 输入账号密码登陆成功 | +| admin | 192.168.0.1:8001 | 输入账号密码登录成功 | +| api | 192.168.0.1:8000/spaces | 返回Json数据无报错 | +注:如果api测试报错,请确认config.py里的数据库IP,数据库账号,数据库密码是否正确,如果不正确,请修改config.py后执行: +``` +docker-compose up --build -d +``` + + +| -- | -- | +| ---------- | ----------- | +| web账号 | administrator@myems.io | +| web密码 | !MyEMS1 | +| admin账号 | administrator | +| admin密码 | !MyEMS1 | + +注:如有问题,欢迎创建Issue + + ## 功能版本对比 | 功能 |社区版 |企业版 | 说明 | | :--- | :----: | :----: | :----: | -| 开源 | ✔️ | ❌ | | +| 开源 | ✔️ | ❌ | | | 价格 | 免费 | 收费 | 标准组件授权费;定制组件开发费; | | 更换品牌名称与标志LOGO | ❌ | ✔️ | | | Modbus TCP 协议 | ✔️ | ✔️ | 采集数据 https://modbus.org/ | diff --git a/myems-api/test_mysql.py b/myems-api/test_mysql.py new file mode 100644 index 00000000..ab6a73a8 --- /dev/null +++ b/myems-api/test_mysql.py @@ -0,0 +1,28 @@ +import mysql.connector +import config + + +def test_connect(): + cursor = None + cnx = None + try: + cnx = mysql.connector.connect(**config.myems_user_db) + cursor = cnx.cursor() + + query = (" SELECT id, name, display_name, email " + " FROM tbl_users " + " ORDER BY id ") + cursor.execute(query) + rows = cursor.fetchall() + print("The config of database is right:", rows) + except Exception as e: + print("The config of database is wrong:", str(e)) + finally: + if cursor: + cursor.close() + if cnx: + cnx.disconnect() + + +if __name__ == "__main__": + test_connect() From 443623424f6e152cc005069b20ba97e1c432aeb3 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sat, 9 Oct 2021 20:54:39 +0800 Subject: [PATCH 84/87] updated README --- README.md | 2 +- {myems-api => database}/test_mysql.py | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename {myems-api => database}/test_mysql.py (100%) diff --git a/README.md b/README.md index 4f33db09..2c9d006e 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,7 @@ sed -i 's/127.0.0.1/192.168.0.2/g' myems-normalization/config.py **3.3** 测试数据库是否可以正确连接 ``` -python3 myems/myems-api/test_mysql.py +python3 myems/database/test_mysql.py ``` 注:如果测试通过,继续下一步操作,否则请修改config.py配置,确保数据库可以通过Python3正常连接访问。 diff --git a/myems-api/test_mysql.py b/database/test_mysql.py similarity index 100% rename from myems-api/test_mysql.py rename to database/test_mysql.py From 2d91cecec9e87c1869a9d8fc263debdd9517ac38 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Tue, 12 Oct 2021 14:27:37 +0800 Subject: [PATCH 85/87] added maximum load data --- myems-api/excelexporters/tenantbatch.py | 54 ++++++++++++------- myems-api/reports/tenantbatch.py | 9 +++- .../components/MyEMS/Tenant/TenantBatch.js | 14 +++-- 3 files changed, 53 insertions(+), 24 deletions(-) diff --git a/myems-api/excelexporters/tenantbatch.py b/myems-api/excelexporters/tenantbatch.py index 5ff1d8ce..f6e8970b 100644 --- a/myems-api/excelexporters/tenantbatch.py +++ b/myems-api/excelexporters/tenantbatch.py @@ -1,8 +1,11 @@ import base64 import uuid import os + + from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image +from openpyxl.utils import column_index_from_string, get_column_letter from openpyxl import Workbook @@ -129,30 +132,38 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ws['C5'] = reporting_end_datetime_local # Title - ws['B6'].border = f_border - ws['B6'].font = name_font - ws['B6'].alignment = c_c_alignment - ws['B6'].fill = table_fill - ws['B6'] = 'Name' + ws['B7'].border = f_border + ws['B7'].font = name_font + ws['B7'].alignment = c_c_alignment + ws['B7'].fill = table_fill + ws['B7'] = 'Name' - ws['C6'].border = f_border - ws['C6'].alignment = c_c_alignment - ws['C6'].font = name_font - ws['C6'].fill = table_fill - ws['C6'] = 'Space' + ws['C7'].border = f_border + ws['C7'].alignment = c_c_alignment + ws['C7'].font = name_font + ws['C7'].fill = table_fill + ws['C7'] = 'Space' ca_len = len(report['energycategories']) for i in range(0, ca_len): - col = chr(ord('D') + i) - ws[col + '6'].fill = table_fill - ws[col + '6'].font = name_font - ws[col + '6'].alignment = c_c_alignment - ws[col + '6'] = report['energycategories'][i]['name'] + \ + col = get_column_letter(column_index_from_string('D') + i * 2) + ws[col + '7'].fill = table_fill + ws[col + '7'].font = name_font + ws[col + '7'].alignment = c_c_alignment + ws[col + '7'] = report['energycategories'][i]['name'] + \ " (" + report['energycategories'][i]['unit_of_measure'] + ")" - ws[col + '6'].border = f_border + ws[col + '7'].border = f_border - current_row_number = 7 + col = get_column_letter(column_index_from_string(col) + 1) + ws[col + '7'].fill = table_fill + ws[col + '7'].font = name_font + ws[col + '7'].alignment = c_c_alignment + ws[col + '7'] = report['energycategories'][i]['name'] + \ + " Maximum Load (" + report['energycategories'][i]['unit_of_measure'] + ")" + ws[col + '7'].border = f_border + + current_row_number = 8 for i in range(0, len(report['tenants'])): ws['B' + str(current_row_number)].font = title_font @@ -167,12 +178,17 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting ca_len = len(report['tenants'][i]['values']) for j in range(0, ca_len): - col = chr(ord('D') + j) - ws[col + str(current_row_number)].font = data_font + col = get_column_letter(column_index_from_string('D') + j * 2) + ws[col + str(current_row_number)].font = title_font ws[col + str(current_row_number)].border = f_border ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)] = report['tenants'][i]['values'][j] + col = get_column_letter(column_index_from_string(col) + 1) + ws[col + str(current_row_number)].font = title_font + ws[col + str(current_row_number)].border = f_border + ws[col + str(current_row_number)].alignment = c_c_alignment + ws[col + str(current_row_number)] = report['tenants'][i]['maximum'][j] current_row_number += 1 filename = str(uuid.uuid4()) + '.xlsx' diff --git a/myems-api/reports/tenantbatch.py b/myems-api/reports/tenantbatch.py index a1ce4384..f11b4c60 100644 --- a/myems-api/reports/tenantbatch.py +++ b/myems-api/reports/tenantbatch.py @@ -137,7 +137,8 @@ class Reporting: "space_name": row['space_name'], "cost_center_name": row['cost_center_name'], "description": row['description'], - "values": list()} + "values": list(), + "maximum": list()} ################################################################################################################ # Step 4: query energy categories @@ -187,7 +188,7 @@ class Reporting: ################################################################################################################ for tenant_id in tenant_dict: - cursor_energy_db.execute(" SELECT energy_category_id, SUM(actual_value) " + cursor_energy_db.execute(" SELECT energy_category_id, SUM(actual_value), max(actual_value)" " FROM tbl_tenant_input_category_hourly " " WHERE tenant_id = %s " " AND start_datetime_utc >= %s " @@ -199,11 +200,14 @@ class Reporting: rows_tenant_energy = cursor_energy_db.fetchall() for energy_category in energy_category_list: subtotal = Decimal(0.0) + maximum = Decimal(0.0) for row_tenant_energy in rows_tenant_energy: if energy_category['id'] == row_tenant_energy[0]: subtotal = row_tenant_energy[1] + maximum = row_tenant_energy[2] break tenant_dict[tenant_id]['values'].append(subtotal) + tenant_dict[tenant_id]['maximum'].append(maximum) if cursor_system_db: cursor_system_db.close() @@ -227,6 +231,7 @@ class Reporting: "cost_center_name": tenant['cost_center_name'], "description": tenant['description'], "values": tenant['values'], + "maximum": tenant['maximum'], }) result = {'tenants': tenant_list, diff --git a/web/src/components/MyEMS/Tenant/TenantBatch.js b/web/src/components/MyEMS/Tenant/TenantBatch.js index 02804c5b..662c4d59 100644 --- a/web/src/components/MyEMS/Tenant/TenantBatch.js +++ b/web/src/components/MyEMS/Tenant/TenantBatch.js @@ -179,7 +179,10 @@ const TenantBatch = ({ setRedirect, setRedirectUrl, t }) => { detailed_value['space'] = currentTenant['space_name']; detailed_value['costcenter'] = currentTenant['cost_center_name']; currentTenant['values'].forEach((currentValue, energyCategoryIndex) => { - detailed_value['a' + energyCategoryIndex] = currentValue.toFixed(2); + detailed_value['a' + 2 * energyCategoryIndex] = currentValue.toFixed(2); + }); + currentTenant['maximum'].forEach((currentValue, energyCategoryIndex) => { + detailed_value['a' + (2 * energyCategoryIndex + 1)] = currentValue.toFixed(2); }); tenants.push(detailed_value); }); @@ -200,13 +203,18 @@ const TenantBatch = ({ setRedirect, setRedirectUrl, t }) => { }); json['energycategories'].forEach((currentValue, index) => { detailed_column_list.push({ - dataField: 'a' + index, + dataField: 'a' + 2 * index, text: currentValue['name'] + ' (' + currentValue['unit_of_measure'] + ')', sort: true + },{ + dataField: 'a' + (2 * index + 1), + text: currentValue['name'] + ' ' + t('Maximum Load') + ' (' + currentValue['unit_of_measure'] + ')', + sort: true }) }); - setDetailedDataTableColumns(detailed_column_list); + setDetailedDataTableColumns(detailed_column_list); + console.log(detailed_column_list); setExcelBytesBase64(json['excel_bytes_base64']); // enable submit button From d78db4c23eaf622af797d6beffea6007df1471a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E7=9C=9F=E7=8F=B2?= <823914102@qq.com> Date: Wed, 13 Oct 2021 05:44:40 +0000 Subject: [PATCH 86/87] update web/README.md. --- web/README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/web/README.md b/web/README.md index d275b7c6..69d4eb29 100644 --- a/web/README.md +++ b/web/README.md @@ -189,3 +189,28 @@ tar xzf myems-web.tar.gz sudo rm -r /var/www/web sudo mv build /var/www/web ``` +* avoid 404 error while refreshing pages +```bash +cd /var/www/web +sudo vi .htaccess +``` + Add a IfModule as below: +```bash +IfModule mod_rewrite.c> + RewriteEngine On + RewriteBase / + RewriteRule ^index\.html$ - [L] + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule . /index.html [L] + +``` + Configure rewrite.load +```bash +cd /etc/apache2/mods-enabled/ +sudo vi rewrite.load +``` + Add content as below +```bash +LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so +``` \ No newline at end of file From 3c3016f8e1cf3948e92eaa28ed7bf7ae4e82f59b Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Wed, 13 Oct 2021 21:58:36 +0800 Subject: [PATCH 87/87] updated maximum load value according to MINUTES_TO_COUNT in tenantbatch report --- myems-api/reports/tenantbatch.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/myems-api/reports/tenantbatch.py b/myems-api/reports/tenantbatch.py index f11b4c60..b2ca8635 100644 --- a/myems-api/reports/tenantbatch.py +++ b/myems-api/reports/tenantbatch.py @@ -187,8 +187,7 @@ class Reporting: # Step 5: query reporting period energy input ################################################################################################################ for tenant_id in tenant_dict: - - cursor_energy_db.execute(" SELECT energy_category_id, SUM(actual_value), max(actual_value)" + cursor_energy_db.execute(" SELECT energy_category_id, SUM(actual_value), MAX(actual_value)" " FROM tbl_tenant_input_category_hourly " " WHERE tenant_id = %s " " AND start_datetime_utc >= %s " @@ -204,7 +203,7 @@ class Reporting: for row_tenant_energy in rows_tenant_energy: if energy_category['id'] == row_tenant_energy[0]: subtotal = row_tenant_energy[1] - maximum = row_tenant_energy[2] + maximum = row_tenant_energy[2] * Decimal(60 / config.minutes_to_count) break tenant_dict[tenant_id]['values'].append(subtotal) tenant_dict[tenant_id]['maximum'].append(maximum)