diff --git a/dcs/dcs.log b/dcs/dcs.log index d33993a..d4d401f 100644 --- a/dcs/dcs.log +++ b/dcs/dcs.log @@ -45056,3 +45056,139 @@ from unknown error: web view not found 2022-07-08 09:29:31.025 | INFO | dcs.tools.database:write_results2database:212 - [DATABASE] writing successful of 4st crawl results! 2022-07-08 09:29:31.626 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.64', 60151): {'crawl_id': 4, 'table_name': 'wfy_crawl_result', 'type': 'response'} 2022-07-08 09:29:31.816 | INFO | dcs.tests.requestHandler:run:27 - [REQUEST] end: communication over from ('192.168.43.64', 60151)! +2022-07-08 09:35:09.696 | INFO | dcs.server:run:25 - [SERVER] connected to client ('192.168.43.64', 60359) +2022-07-08 09:35:09.712 | INFO | dcs.tests.requestHandler:run:30 - [REQUEST] start: communication begin from ('192.168.43.64', 60359)! +2022-07-08 09:35:09.964 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:35:09.964 | INFO | dcs.tests.user_request_handler:login:25 - [REQUEST] login +2022-07-08 09:35:10.296 | INFO | dcs.tests.user_request_handler:login:32 - [RESPONSE] login: 13be690ba51dcc58e328b266d33e4e57f7f43319 +2022-07-08 09:35:10.990 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.64', 60359): {'cookie': '13be690ba51dcc58e328b266d33e4e57f7f43319', 'type': 'login'} +2022-07-08 09:35:11.037 | INFO | dcs.tests.requestHandler:run:27 - [REQUEST] end: communication over from ('192.168.43.64', 60359)! +2022-07-08 09:37:50.159 | INFO | dcs.server:run:25 - [SERVER] connected to client ('192.168.43.64', 60531) +2022-07-08 09:37:50.159 | INFO | dcs.tests.requestHandler:run:30 - [REQUEST] start: communication begin from ('192.168.43.64', 60531)! +2022-07-08 09:37:50.792 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:37:50.792 | INFO | dcs.tests.user_request_handler:login:25 - [REQUEST] login +2022-07-08 09:37:51.346 | INFO | dcs.tests.user_request_handler:login:32 - [RESPONSE] login: bcede44499ad10c3ffb147befd7a27ba7f8cb6c4 +2022-07-08 09:37:51.836 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.64', 60531): {'cookie': 'bcede44499ad10c3ffb147befd7a27ba7f8cb6c4', 'type': 'login'} +2022-07-08 09:37:51.843 | INFO | dcs.tests.requestHandler:run:27 - [REQUEST] end: communication over from ('192.168.43.64', 60531)! +2022-07-08 09:48:30.283 | INFO | __main__::14 - [SERVER] reading config args... +2022-07-08 09:49:43.807 | INFO | dcs.server:run:25 - [SERVER] connected to client ('192.168.43.65', 53222) +2022-07-08 09:49:43.823 | INFO | dcs.server:run:25 - [SERVER] connected to client ('192.168.43.65', 53223) +2022-07-08 09:49:44.060 | INFO | dcs.server:run:25 - [SERVER] connected to client ('192.168.43.65', 53225) +2022-07-08 09:49:44.154 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:49:44.154 | INFO | dcs.tests.user_request_handler:register:35 - [REQUEST] register +2022-07-08 09:49:44.154 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:49:44.154 | INFO | dcs.tests.user_request_handler:register:35 - [REQUEST] register +2022-07-08 09:49:44.248 | INFO | dcs.tests.user_request_handler:register:42 - [RESPONSE] register: 用户名已存在,注册失败 +2022-07-08 09:49:44.248 | INFO | dcs.tests.user_request_handler:register:42 - [RESPONSE] register: 用户名已存在,注册失败 +2022-07-08 09:49:45.165 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:49:45.165 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.65', 53225): {'register': '用户名已存在,注册失败', 'type': 'register'} +2022-07-08 09:49:45.165 | INFO | dcs.tests.user_request_handler:register:35 - [REQUEST] register +2022-07-08 09:49:45.465 | INFO | dcs.tests.user_request_handler:register:42 - [RESPONSE] register: 用户名已存在,注册失败 +2022-07-08 09:49:46.177 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:49:46.177 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.65', 53222): {'register': '用户名已存在,注册失败', 'type': 'register'} +2022-07-08 09:49:46.177 | INFO | dcs.tests.user_request_handler:login:25 - [REQUEST] login +2022-07-08 09:49:46.399 | INFO | dcs.tests.user_request_handler:login:32 - [RESPONSE] login: ba355e3944b3d4ddfe1372e388f768300996f3ff +2022-07-08 09:49:47.189 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.65', 53223): {'register': '用户名已存在,注册失败', 'type': 'register'} +2022-07-08 09:49:47.189 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:49:47.189 | INFO | dcs.tests.user_request_handler:login:25 - [REQUEST] login +2022-07-08 09:49:47.553 | INFO | dcs.tests.user_request_handler:login:32 - [RESPONSE] login: af03d07e4952596a39e850c29c7988fcd1f453ab +2022-07-08 09:49:48.201 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:49:48.201 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.65', 53225): {'cookie': 'ba355e3944b3d4ddfe1372e388f768300996f3ff', 'type': 'login'} +2022-07-08 09:49:48.201 | INFO | dcs.tests.user_request_handler:login:25 - [REQUEST] login +2022-07-08 09:49:48.344 | INFO | dcs.tests.user_request_handler:login:32 - [RESPONSE] login: e94b48b7a8b5dba9a67e6e8413d28848f899f081 +2022-07-08 09:49:49.214 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:49:49.214 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.65', 53222): {'cookie': 'af03d07e4952596a39e850c29c7988fcd1f453ab', 'type': 'login'} +2022-07-08 09:49:49.214 | INFO | dcs.tests.user_request_handler:report_state:16 - [REQUEST] report free +2022-07-08 09:49:49.214 | INFO | dcs.tests.user_request_handler:report_state:22 - [RESPONSE] report free: success marked ba355e3944b3d4ddfe1372e388f768300996f3ff +2022-07-08 09:49:49.214 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.65', 53225): {'report_free': 'success marked ba355e3944b3d4ddfe1372e388f768300996f3ff', 'type': 'report_free'} +2022-07-08 09:49:50.227 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:49:50.227 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.65', 53223): {'cookie': 'e94b48b7a8b5dba9a67e6e8413d28848f899f081', 'type': 'login'} +2022-07-08 09:49:50.227 | INFO | dcs.tests.user_request_handler:report_state:16 - [REQUEST] report free +2022-07-08 09:49:50.227 | INFO | dcs.tests.user_request_handler:report_state:22 - [RESPONSE] report free: success marked af03d07e4952596a39e850c29c7988fcd1f453ab +2022-07-08 09:49:51.238 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:49:51.238 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.65', 53222): {'report_free': 'success marked af03d07e4952596a39e850c29c7988fcd1f453ab', 'type': 'report_free'} +2022-07-08 09:49:51.238 | INFO | dcs.tests.user_request_handler:report_state:16 - [REQUEST] report free +2022-07-08 09:49:51.238 | INFO | dcs.tests.user_request_handler:report_state:22 - [RESPONSE] report free: success marked e94b48b7a8b5dba9a67e6e8413d28848f899f081 +2022-07-08 09:49:52.252 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.65', 53223): {'report_free': 'success marked e94b48b7a8b5dba9a67e6e8413d28848f899f081', 'type': 'report_free'} +2022-07-08 09:55:00.051 | INFO | dcs.server:run:25 - [SERVER] connected to client ('192.168.43.64', 60752) +2022-07-08 09:55:00.064 | INFO | dcs.tests.requestHandler:run:30 - [REQUEST] start: communication begin from ('192.168.43.64', 60752)! +2022-07-08 09:55:00.447 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:55:00.447 | INFO | dcs.tests.user_request_handler:login:25 - [REQUEST] login +2022-07-08 09:55:00.573 | INFO | dcs.tests.user_request_handler:login:32 - [RESPONSE] login: dc11f070bb942ec84be6d96df08d2df81348943b +2022-07-08 09:55:01.458 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.64', 60752): {'cookie': 'dc11f070bb942ec84be6d96df08d2df81348943b', 'type': 'login'} +2022-07-08 09:55:01.458 | INFO | dcs.tests.requestHandler:run:27 - [REQUEST] end: communication over from ('192.168.43.64', 60752)! +2022-07-08 09:55:09.798 | INFO | dcs.server:run:25 - [SERVER] connected to client ('192.168.43.64', 60773) +2022-07-08 09:55:09.798 | INFO | dcs.tests.requestHandler:run:30 - [REQUEST] start: communication begin from ('192.168.43.64', 60773)! +2022-07-08 09:55:09.893 | ERROR | dcs.tools.database:get_last_crawl_id:132 - [ERROR] (1146, "Table 'test.ybb_crawl_result' doesn't exist") +2022-07-08 09:55:10.558 | INFO | dcs.spider:run:25 - [REQUEST HANDLER] processing spider request... +2022-07-08 09:55:10.558 | INFO | dcs.tests.spider_task:distribute_task:104 - [TASK] distributing task: (('192.168.43.64', 60773), {'action': 'crawl zhiwang', 'word': 'computer', 'pages_start': 1, 'pages_end': 3, 'cookie': 'dc11f070bb942ec84be6d96df08d2df81348943b'}) +2022-07-08 09:55:10.558 | INFO | dcs.tests.spider_task:run:146 - [REMOTE] free nodes: [['192.168.43.65', 9002], ['192.168.43.65', 9000], ['192.168.43.65', 9001]] +2022-07-08 09:55:10.558 | INFO | dcs.tests.spider_task:run:155 - [TASK] generating remote task {'action': 'crawl zhiwang', 'word': 'computer', 'pages_start': 1, 'pages_end': 2, 'cookie': 'dc11f070bb942ec84be6d96df08d2df81348943b'} +2022-07-08 09:55:10.558 | INFO | dcs.requester:run:59 - [REQUESTER] sending request {'action': 'crawl zhiwang', 'word': 'computer', 'pages_start': 1, 'pages_end': 2, 'cookie': 'dc11f070bb942ec84be6d96df08d2df81348943b', 'type': 'request'} to client ['192.168.43.65', 9002]... +2022-07-08 09:55:11.570 | INFO | dcs.tests.spider_task:run:155 - [TASK] generating remote task {'action': 'crawl zhiwang', 'word': 'computer', 'pages_start': 2, 'pages_end': 3, 'cookie': 'dc11f070bb942ec84be6d96df08d2df81348943b'} +2022-07-08 09:55:11.570 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.64', 60773): {'crawling state': 'starting, please wait...', 'type': 'crawling state'} +2022-07-08 09:55:11.570 | INFO | dcs.requester:run:59 - [REQUESTER] sending request {'action': 'crawl zhiwang', 'word': 'computer', 'pages_start': 2, 'pages_end': 3, 'cookie': 'dc11f070bb942ec84be6d96df08d2df81348943b', 'type': 'request'} to client ['192.168.43.65', 9000]... +2022-07-08 09:55:17.594 | INFO | dcs.tests.spider_task:run:146 - [REMOTE] free nodes: [['192.168.43.65', 9001]] +2022-07-08 09:55:20.045 | INFO | dcs.requester:run:66 - [REMOTE] receiving remote task result {'0': {'name': '孔珍珍', 'college': '广东省碧桂园学校', 'major': '领域:中等教育', 'title': 'CAIE中Computer Science考试对信息技术纳入高考的启示'}, '1': {'name': '李莉华', 'college': '东华大学', 'major': '领域:外国语言文字、中国语言文字、初等教育', 'title': 'Opening Moves Involved in Text-based Computer-Mediated-Communication (CMC) by Chinese Adults'}, '2': {'name': 'Jianhua Tao', 'college': '中国科学院大学', 'major': '领域:计算机软件及计算机应用、中国语言文字、电信技术', 'title': 'Emotion recognition for human-computer interaction'}, '3': {'name': 'Zhang Lingxin', 'college': '中国地震局工程力学研究所', 'major': '领域:建筑科学与工程', 'title': 'A review of the research and application of deep learning-based computer vision in structural damage detection'}, '4': {'name': 'Shen Junkai', 'college': '中国地震局工程力学研究所', 'major': '领域:建筑科学与工程', 'title': 'A review of the research and application of deep learning-based computer vision in structural damage detection'}, '5': {'name': 'Zhu Baijie', 'college': '中国地震局工程力学研究所', 'major': '领域:建筑科学与工程', 'title': 'A review of the research and application of deep learning-based computer vision in structural damage detection'}, '6': {'name': 'Ren Noguchi', 'college': '高知大学', 'major': '领域:计算机软件及计算机应用、无线电电子学', 'title': 'Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram'}, '7': {'name': 'Kohei Suzuki', 'college': '高知大学', 'major': '领域:计算机软件及计算机应用、无线电电子学', 'title': 'Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram'}, '8': {'name': 'Yoshiki Moriguchi', 'college': '高知大学', 'major': '领域:无线电电子学、计算机软件及计算机应用', 'title': 'Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram'}, '9': {'name': 'Yu Zhang', 'college': '哈尔滨工业大学', 'major': '领域:电信技术、生物学、计算机软件及计算机应用', 'title': 'Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface'}, '10': {'name': 'Huaqing Li', 'college': '哈尔滨工业大学', 'major': '领域:生物学、电信技术、自动化技术', 'title': 'Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface'}, '11': {'name': 'Heng Dong', 'college': '哈尔滨工业大学', 'major': '领域:生物学、电信技术、自动化技术', 'title': 'Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface'}, '12': {'name': 'Liu bo', 'college': '北京市控制工程研究所', 'major': '领域:航空航天科学与工程、动力工程、电信技术', 'title': 'A lightweight data-voting strategy for triple-modular redundant control computers'}, '13': {'name': 'Yang Mengfei', 'college': '中国空间技术研究院', 'major': '领域:航空航天科学与工程、自动化技术', 'title': 'A lightweight data-voting strategy for triple-modular redundant control computers'}, '14': {'name': 'WANG Yong', 'college': '北京市控制工程研究所', 'major': '领域:航空航天科学与工程、数学、自动化技术', 'title': 'A lightweight data-voting strategy for triple-modular redundant control computers'}, '15': {'name': 'Qinjun Qiu', 'college': '中国地质大学(武汉)', 'major': '领域:地质学、计算机软件及计算机应用', 'title': 'Knowledge graph for identifying geological disasters by integrating computer vision with ontology'}, '16': {'name': 'Zhong Xie', 'college': '中国地质大学(武汉)', 'major': '领域:地质学、计算机软件及计算机应用', 'title': 'Knowledge graph for identifying geological disasters by integrating computer vision with ontology'}, '17': {'name': 'Die Zhang', 'college': '武汉大学', 'major': '领域:地质学、计算机软件及计算机应用', 'title': 'Knowledge graph for identifying geological disasters by integrating computer vision with ontology'}, '18': {'name': 'Jingjing WANG', 'college': '中国科学院', 'major': '领域:生物学、燃料化工、石油天然气工业', 'title': 'Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax'}, '19': {'name': 'Wei Zhao', 'college': '中国科学院', 'major': '领域:无线电电子学、生物学、物理学', 'title': 'Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax'}, '20': {'name': 'Kunpeng Song', 'college': '中国科学院', 'major': '领域:燃料化工、石油天然气工业', 'title': 'Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax'}} from ['192.168.43.65', 9002], saving... +2022-07-08 09:55:20.677 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:55:20.677 | INFO | dcs.tests.user_request_handler:report_state:16 - [REQUEST] report free +2022-07-08 09:55:20.679 | INFO | dcs.tests.user_request_handler:report_state:22 - [RESPONSE] report free: success marked ba355e3944b3d4ddfe1372e388f768300996f3ff +2022-07-08 09:55:21.282 | INFO | dcs.requester:run:66 - [REMOTE] receiving remote task result {'0': {'name': 'Chris Palmer', 'college': '', 'major': '领域:生物学、电信技术、生物医学工程', 'title': 'Brain-Computer Interface Speaks Up'}, '1': {'name': '葛阳阳', 'college': '南京大学', 'major': '领域:物理学、计算机硬件技术', 'title': 'Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer'}, '2': {'name': '王治昱', 'college': '南京大学', 'major': '领域:物理学、计算机硬件技术', 'title': 'Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer'}, '3': {'name': '郑文', 'college': '南京大学', 'major': '领域:物理学、电力工业、计算机硬件技术', 'title': 'Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer'}, '4': {'name': 'Haochen HU', 'college': '北京理工大学', 'major': '领域:生物学、电信技术、生物医学工程', 'title': 'Navigation in virtual and real environment using brain computer interface: a progress report'}, '5': {'name': 'Yue Liu', 'college': '北京电影学院', 'major': '领域:计算机软件及计算机应用、自动化技术、临床医学', 'title': 'Navigation in virtual and real environment using brain computer interface: a progress report'}, '6': {'name': 'Kang YUE', 'college': '北京理工大学', 'major': '领域:生物学、电信技术、生物医学工程', 'title': 'Navigation in virtual and real environment using brain computer interface: a progress report'}, '7': {'name': 'Biao WU', 'college': '北京大学', 'major': '领域:物理学、计算机硬件技术', 'title': 'Board games for quantum computers'}, '8': {'name': 'Hanbo CHEN', 'college': '北京大学', 'major': '领域:计算机硬件技术', 'title': 'Board games for quantum computers'}, '9': {'name': 'Zhikang LUO', 'college': '北京大学', 'major': '领域:计算机硬件技术', 'title': 'Board games for quantum computers'}, '10': {'name': 'Rui BIAN', 'college': '华中科技大学', 'major': '领域:生物学、电信技术、生物医学工程', 'title': 'SSVEP-based brain-computer interfaces are vulnerable to square wave attacks'}, '11': {'name': 'Lubin MENG', 'college': '华中科技大学', 'major': '领域:生物学、电信技术、生物医学工程', 'title': 'SSVEP-based brain-computer interfaces are vulnerable to square wave attacks'}, '12': {'name': 'Dongrui Wu', 'college': '之江实验室', 'major': '领域:电信技术、生物医学工程', 'title': 'SSVEP-based brain-computer interfaces are vulnerable to square wave attacks'}, '13': {'name': 'Minpeng XU', 'college': '天津大学', 'major': '领域:生物学、基础医学、电信技术', 'title': 'Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces'}, '14': {'name': 'Feng He', 'college': '天津大学', 'major': '领域:生物学、基础医学、电信技术', 'title': 'Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces'}, '15': {'name': 'Tzyy-Ping Jung', 'college': '加州大学圣迭戈分校', 'major': '领域:生物医学工程、电信技术、神经病学', 'title': 'Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces'}, '16': {'name': 'Chunxia Qiao', 'college': '军事医学科学院毒物药物研究所', 'major': '领域:肿瘤学、基础医学、妇产科学', 'title': 'A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method'}, '17': {'name': 'Ming Lv', 'college': '军事医学科学院', 'major': '领域:肿瘤学、妇产科学、有机化工', 'title': 'A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method'}, '18': {'name': 'Xinying Li', 'college': '军事医学科学院', 'major': '领域:肿瘤学、妇产科学、有机化工', 'title': 'A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method'}} from ['192.168.43.65', 9000], saving... +2022-07-08 09:55:21.689 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.65', 53225): {'report_free': 'success marked ba355e3944b3d4ddfe1372e388f768300996f3ff', 'type': 'report_free'} +2022-07-08 09:55:21.689 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:55:21.689 | INFO | dcs.tests.user_request_handler:report_state:16 - [REQUEST] report free +2022-07-08 09:55:21.689 | INFO | dcs.tests.user_request_handler:report_state:22 - [RESPONSE] report free: success marked e94b48b7a8b5dba9a67e6e8413d28848f899f081 +2022-07-08 09:55:22.606 | INFO | dcs.tests.spider_task:run:146 - [REMOTE] free nodes: [['192.168.43.65', 9002], ['192.168.43.65', 9000], ['192.168.43.65', 9001]] +2022-07-08 09:55:22.606 | INFO | dcs.tests.spider_task:compose_result:124 - [COMPOSE] composing task... +2022-07-08 09:55:22.700 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.65', 53223): {'report_free': 'success marked e94b48b7a8b5dba9a67e6e8413d28848f899f081', 'type': 'report_free'} +2022-07-08 09:55:22.778 | INFO | dcs.tests.spider_task:compose_result:131 - [RESULT] [('孔珍珍', '广东省碧桂园学校', '领域:中等教育', 'CAIE中Computer Science考试对信息技术纳入高考的启示'), ('李莉华', '东华大学', '领域:外国语言文字、中国语言文字、初等教育', 'Opening Moves Involved in Text-based Computer-Mediated-Communication (CMC) by Chinese Adults'), ('Jianhua Tao', '中国科学院大学', '领域:计算机软件及计算机应用、中国语言文字、电信技术', 'Emotion recognition for human-computer interaction'), ('Zhang Lingxin', '中国地震局工程力学研究所', '领域:建筑科学与工程', 'A review of the research and application of deep learning-based computer vision in structural damage detection'), ('Shen Junkai', '中国地震局工程力学研究所', '领域:建筑科学与工程', 'A review of the research and application of deep learning-based computer vision in structural damage detection'), ('Zhu Baijie', '中国地震局工程力学研究所', '领域:建筑科学与工程', 'A review of the research and application of deep learning-based computer vision in structural damage detection'), ('Ren Noguchi', '高知大学', '领域:计算机软件及计算机应用、无线电电子学', 'Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram'), ('Kohei Suzuki', '高知大学', '领域:计算机软件及计算机应用、无线电电子学', 'Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram'), ('Yoshiki Moriguchi', '高知大学', '领域:无线电电子学、计算机软件及计算机应用', 'Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram'), ('Yu Zhang', '哈尔滨工业大学', '领域:电信技术、生物学、计算机软件及计算机应用', 'Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface'), ('Huaqing Li', '哈尔滨工业大学', '领域:生物学、电信技术、自动化技术', 'Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface'), ('Heng Dong', '哈尔滨工业大学', '领域:生物学、电信技术、自动化技术', 'Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface'), ('Liu bo', '北京市控制工程研究所', '领域:航空航天科学与工程、动力工程、电信技术', 'A lightweight data-voting strategy for triple-modular redundant control computers'), ('Yang Mengfei', '中国空间技术研究院', '领域:航空航天科学与工程、自动化技术', 'A lightweight data-voting strategy for triple-modular redundant control computers'), ('WANG Yong', '北京市控制工程研究所', '领域:航空航天科学与工程、数学、自动化技术', 'A lightweight data-voting strategy for triple-modular redundant control computers'), ('Qinjun Qiu', '中国地质大学(武汉)', '领域:地质学、计算机软件及计算机应用', 'Knowledge graph for identifying geological disasters by integrating computer vision with ontology'), ('Zhong Xie', '中国地质大学(武汉)', '领域:地质学、计算机软件及计算机应用', 'Knowledge graph for identifying geological disasters by integrating computer vision with ontology'), ('Die Zhang', '武汉大学', '领域:地质学、计算机软件及计算机应用', 'Knowledge graph for identifying geological disasters by integrating computer vision with ontology'), ('Jingjing WANG', '中国科学院', '领域:生物学、燃料化工、石油天然气工业', 'Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax'), ('Wei Zhao', '中国科学院', '领域:无线电电子学、生物学、物理学', 'Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax'), ('Kunpeng Song', '中国科学院', '领域:燃料化工、石油天然气工业', 'Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax'), ('Chris Palmer', '', '领域:生物学、电信技术、生物医学工程', 'Brain-Computer Interface Speaks Up'), ('葛阳阳', '南京大学', '领域:物理学、计算机硬件技术', 'Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer'), ('王治昱', '南京大学', '领域:物理学、计算机硬件技术', 'Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer'), ('郑文', '南京大学', '领域:物理学、电力工业、计算机硬件技术', 'Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer'), ('Haochen HU', '北京理工大学', '领域:生物学、电信技术、生物医学工程', 'Navigation in virtual and real environment using brain computer interface: a progress report'), ('Yue Liu', '北京电影学院', '领域:计算机软件及计算机应用、自动化技术、临床医学', 'Navigation in virtual and real environment using brain computer interface: a progress report'), ('Kang YUE', '北京理工大学', '领域:生物学、电信技术、生物医学工程', 'Navigation in virtual and real environment using brain computer interface: a progress report'), ('Biao WU', '北京大学', '领域:物理学、计算机硬件技术', 'Board games for quantum computers'), ('Hanbo CHEN', '北京大学', '领域:计算机硬件技术', 'Board games for quantum computers'), ('Zhikang LUO', '北京大学', '领域:计算机硬件技术', 'Board games for quantum computers'), ('Rui BIAN', '华中科技大学', '领域:生物学、电信技术、生物医学工程', 'SSVEP-based brain-computer interfaces are vulnerable to square wave attacks'), ('Lubin MENG', '华中科技大学', '领域:生物学、电信技术、生物医学工程', 'SSVEP-based brain-computer interfaces are vulnerable to square wave attacks'), ('Dongrui Wu', '之江实验室', '领域:电信技术、生物医学工程', 'SSVEP-based brain-computer interfaces are vulnerable to square wave attacks'), ('Minpeng XU', '天津大学', '领域:生物学、基础医学、电信技术', 'Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces'), ('Feng He', '天津大学', '领域:生物学、基础医学、电信技术', 'Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces'), ('Tzyy-Ping Jung', '加州大学圣迭戈分校', '领域:生物医学工程、电信技术、神经病学', 'Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces'), ('Chunxia Qiao', '军事医学科学院毒物药物研究所', '领域:肿瘤学、基础医学、妇产科学', 'A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method'), ('Ming Lv', '军事医学科学院', '领域:肿瘤学、妇产科学、有机化工', 'A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method'), ('Xinying Li', '军事医学科学院', '领域:肿瘤学、妇产科学、有机化工', 'A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method')] +2022-07-08 09:55:22.794 | INFO | dcs.tests.spider_task:compose_result:132 - [DATABASE] writing crawl results to database... +2022-07-08 09:55:22.794 | INFO | dcs.tools.database:write_results2database:203 - [DATABASE] writing 1st crawl results to table ybb_crawl_result in database... +2022-07-08 09:55:23.553 | INFO | dcs.tools.database:write_results2database:212 - [DATABASE] writing successful of 1st crawl results! +2022-07-08 09:55:23.712 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.64', 60773): {'crawl_id': 1, 'table_name': 'ybb_crawl_result', 'type': 'response'} +2022-07-08 09:55:23.794 | INFO | dcs.tests.requestHandler:run:27 - [REQUEST] end: communication over from ('192.168.43.64', 60773)! +2022-07-08 09:59:57.249 | INFO | dcs.server:run:25 - [SERVER] connected to client ('192.168.43.64', 60897) +2022-07-08 09:59:57.249 | INFO | dcs.tests.requestHandler:run:30 - [REQUEST] start: communication begin from ('192.168.43.64', 60897)! +2022-07-08 09:59:57.787 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 09:59:57.787 | INFO | dcs.tests.user_request_handler:register:35 - [REQUEST] register +2022-07-08 09:59:57.960 | INFO | dcs.tests.user_request_handler:register:42 - [RESPONSE] register: 注册成功 +2022-07-08 09:59:58.798 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.64', 60897): {'register': '注册成功', 'type': 'register'} +2022-07-08 10:00:17.260 | INFO | dcs.server:run:25 - [SERVER] connected to client ('192.168.43.64', 60915) +2022-07-08 10:00:17.260 | INFO | dcs.tests.requestHandler:run:30 - [REQUEST] start: communication begin from ('192.168.43.64', 60915)! +2022-07-08 10:00:18.004 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 10:00:18.004 | INFO | dcs.tests.user_request_handler:login:25 - [REQUEST] login +2022-07-08 10:00:18.146 | INFO | dcs.tests.user_request_handler:login:32 - [RESPONSE] login: 2bc5155f19af52b1d14bf9fdd7be45abf6db0887 +2022-07-08 10:00:19.015 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.64', 60915): {'cookie': '2bc5155f19af52b1d14bf9fdd7be45abf6db0887', 'type': 'login'} +2022-07-08 10:00:19.015 | INFO | dcs.tests.requestHandler:run:27 - [REQUEST] end: communication over from ('192.168.43.64', 60915)! +2022-07-08 10:00:42.756 | INFO | dcs.server:run:25 - [SERVER] connected to client ('192.168.43.64', 60930) +2022-07-08 10:00:42.756 | INFO | dcs.tests.requestHandler:run:30 - [REQUEST] start: communication begin from ('192.168.43.64', 60930)! +2022-07-08 10:00:43.277 | INFO | dcs.spider:run:25 - [REQUEST HANDLER] processing spider request... +2022-07-08 10:00:43.277 | INFO | dcs.tests.spider_task:distribute_task:104 - [TASK] distributing task: (('192.168.43.64', 60930), {'action': 'crawl zhiwang', 'word': 'computer', 'pages_start': 1, 'pages_end': 3, 'cookie': '2bc5155f19af52b1d14bf9fdd7be45abf6db0887'}) +2022-07-08 10:00:43.277 | INFO | dcs.tests.spider_task:run:146 - [REMOTE] free nodes: [['192.168.43.65', 9002], ['192.168.43.65', 9000], ['192.168.43.65', 9001]] +2022-07-08 10:00:43.277 | INFO | dcs.tests.spider_task:run:155 - [TASK] generating remote task {'action': 'crawl zhiwang', 'word': 'computer', 'pages_start': 1, 'pages_end': 2, 'cookie': '2bc5155f19af52b1d14bf9fdd7be45abf6db0887'} +2022-07-08 10:00:43.277 | INFO | dcs.requester:run:59 - [REQUESTER] sending request {'action': 'crawl zhiwang', 'word': 'computer', 'pages_start': 1, 'pages_end': 2, 'cookie': '2bc5155f19af52b1d14bf9fdd7be45abf6db0887', 'type': 'request'} to client ['192.168.43.65', 9002]... +2022-07-08 10:00:44.289 | INFO | dcs.tests.spider_task:run:155 - [TASK] generating remote task {'action': 'crawl zhiwang', 'word': 'computer', 'pages_start': 2, 'pages_end': 3, 'cookie': '2bc5155f19af52b1d14bf9fdd7be45abf6db0887'} +2022-07-08 10:00:44.289 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.64', 60930): {'crawling state': 'starting, please wait...', 'type': 'crawling state'} +2022-07-08 10:00:44.289 | INFO | dcs.requester:run:59 - [REQUESTER] sending request {'action': 'crawl zhiwang', 'word': 'computer', 'pages_start': 2, 'pages_end': 3, 'cookie': '2bc5155f19af52b1d14bf9fdd7be45abf6db0887', 'type': 'request'} to client ['192.168.43.65', 9000]... +2022-07-08 10:00:50.301 | INFO | dcs.tests.spider_task:run:146 - [REMOTE] free nodes: [['192.168.43.65', 9001]] +2022-07-08 10:00:52.121 | INFO | dcs.requester:run:66 - [REMOTE] receiving remote task result {'0': {'name': '孔珍珍', 'college': '广东省碧桂园学校', 'major': '领域:中等教育', 'title': 'CAIE中Computer Science考试对信息技术纳入高考的启示'}, '1': {'name': '李莉华', 'college': '东华大学', 'major': '领域:外国语言文字、中国语言文字、初等教育', 'title': 'Opening Moves Involved in Text-based Computer-Mediated-Communication (CMC) by Chinese Adults'}, '2': {'name': 'Jianhua Tao', 'college': '中国科学院大学', 'major': '领域:计算机软件及计算机应用、中国语言文字、电信技术', 'title': 'Emotion recognition for human-computer interaction'}, '3': {'name': 'Zhang Lingxin', 'college': '中国地震局工程力学研究所', 'major': '领域:建筑科学与工程', 'title': 'A review of the research and application of deep learning-based computer vision in structural damage detection'}, '4': {'name': 'Shen Junkai', 'college': '中国地震局工程力学研究所', 'major': '领域:建筑科学与工程', 'title': 'A review of the research and application of deep learning-based computer vision in structural damage detection'}, '5': {'name': 'Zhu Baijie', 'college': '中国地震局工程力学研究所', 'major': '领域:建筑科学与工程', 'title': 'A review of the research and application of deep learning-based computer vision in structural damage detection'}, '6': {'name': 'Liu bo', 'college': '北京市控制工程研究所', 'major': '领域:航空航天科学与工程、动力工程、电信技术', 'title': 'A lightweight data-voting strategy for triple-modular redundant control computers'}, '7': {'name': 'Yang Mengfei', 'college': '中国空间技术研究院', 'major': '领域:航空航天科学与工程、自动化技术', 'title': 'A lightweight data-voting strategy for triple-modular redundant control computers'}, '8': {'name': 'WANG Yong', 'college': '北京市控制工程研究所', 'major': '领域:航空航天科学与工程、数学、自动化技术', 'title': 'A lightweight data-voting strategy for triple-modular redundant control computers'}, '9': {'name': 'Ren Noguchi', 'college': '高知大学', 'major': '领域:计算机软件及计算机应用、无线电电子学', 'title': 'Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram'}, '10': {'name': 'Kohei Suzuki', 'college': '高知大学', 'major': '领域:计算机软件及计算机应用、无线电电子学', 'title': 'Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram'}, '11': {'name': 'Yoshiki Moriguchi', 'college': '高知大学', 'major': '领域:无线电电子学、计算机软件及计算机应用', 'title': 'Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram'}, '12': {'name': 'Yu Zhang', 'college': '哈尔滨工业大学', 'major': '领域:电信技术、生物学、计算机软件及计算机应用', 'title': 'Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface'}, '13': {'name': 'Huaqing Li', 'college': '哈尔滨工业大学', 'major': '领域:生物学、电信技术、自动化技术', 'title': 'Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface'}, '14': {'name': 'Heng Dong', 'college': '哈尔滨工业大学', 'major': '领域:生物学、电信技术、自动化技术', 'title': 'Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface'}, '15': {'name': 'Jingjing WANG', 'college': '中国科学院', 'major': '领域:生物学、燃料化工、石油天然气工业', 'title': 'Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax'}, '16': {'name': 'Wei Zhao', 'college': '中国科学院', 'major': '领域:无线电电子学、生物学、物理学', 'title': 'Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax'}, '17': {'name': 'Kunpeng Song', 'college': '中国科学院', 'major': '领域:燃料化工、石油天然气工业', 'title': 'Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax'}, '18': {'name': 'Qinjun Qiu', 'college': '中国地质大学(武汉)', 'major': '领域:地质学、计算机软件及计算机应用', 'title': 'Knowledge graph for identifying geological disasters by integrating computer vision with ontology'}, '19': {'name': 'Zhong Xie', 'college': '中国地质大学(武汉)', 'major': '领域:地质学、计算机软件及计算机应用', 'title': 'Knowledge graph for identifying geological disasters by integrating computer vision with ontology'}, '20': {'name': 'Die Zhang', 'college': '武汉大学', 'major': '领域:地质学、计算机软件及计算机应用', 'title': 'Knowledge graph for identifying geological disasters by integrating computer vision with ontology'}} from ['192.168.43.65', 9002], saving... +2022-07-08 10:00:52.373 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 10:00:52.373 | INFO | dcs.tests.user_request_handler:report_state:16 - [REQUEST] report free +2022-07-08 10:00:52.373 | INFO | dcs.tests.user_request_handler:report_state:22 - [RESPONSE] report free: success marked ba355e3944b3d4ddfe1372e388f768300996f3ff +2022-07-08 10:00:53.386 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.65', 53225): {'report_free': 'success marked ba355e3944b3d4ddfe1372e388f768300996f3ff', 'type': 'report_free'} +2022-07-08 10:00:53.735 | INFO | dcs.requester:run:66 - [REMOTE] receiving remote task result {'0': {'name': 'Chris Palmer', 'college': '', 'major': '领域:生物学、电信技术、生物医学工程', 'title': 'Brain-Computer Interface Speaks Up'}, '1': {'name': '葛阳阳', 'college': '南京大学', 'major': '领域:物理学、计算机硬件技术', 'title': 'Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer'}, '2': {'name': '王治昱', 'college': '南京大学', 'major': '领域:物理学、计算机硬件技术', 'title': 'Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer'}, '3': {'name': '郑文', 'college': '南京大学', 'major': '领域:物理学、电力工业、计算机硬件技术', 'title': 'Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer'}, '4': {'name': 'Rui BIAN', 'college': '华中科技大学', 'major': '领域:生物学、电信技术、生物医学工程', 'title': 'SSVEP-based brain-computer interfaces are vulnerable to square wave attacks'}, '5': {'name': 'Lubin MENG', 'college': '华中科技大学', 'major': '领域:生物学、电信技术、生物医学工程', 'title': 'SSVEP-based brain-computer interfaces are vulnerable to square wave attacks'}, '6': {'name': 'Dongrui Wu', 'college': '之江实验室', 'major': '领域:电信技术、生物医学工程', 'title': 'SSVEP-based brain-computer interfaces are vulnerable to square wave attacks'}, '7': {'name': 'Haochen HU', 'college': '北京理工大学', 'major': '领域:生物学、电信技术、生物医学工程', 'title': 'Navigation in virtual and real environment using brain computer interface: a progress report'}, '8': {'name': 'Yue Liu', 'college': '北京电影学院', 'major': '领域:计算机软件及计算机应用、自动化技术、临床医学', 'title': 'Navigation in virtual and real environment using brain computer interface: a progress report'}, '9': {'name': 'Kang YUE', 'college': '北京理工大学', 'major': '领域:生物学、电信技术、生物医学工程', 'title': 'Navigation in virtual and real environment using brain computer interface: a progress report'}, '10': {'name': 'Biao WU', 'college': '北京大学', 'major': '领域:物理学、计算机硬件技术', 'title': 'Board games for quantum computers'}, '11': {'name': 'Hanbo CHEN', 'college': '北京大学', 'major': '领域:计算机硬件技术', 'title': 'Board games for quantum computers'}, '12': {'name': 'Zhikang LUO', 'college': '北京大学', 'major': '领域:计算机硬件技术', 'title': 'Board games for quantum computers'}, '13': {'name': 'Minpeng XU', 'college': '天津大学', 'major': '领域:生物学、基础医学、电信技术', 'title': 'Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces'}, '14': {'name': 'Feng He', 'college': '天津大学', 'major': '领域:生物学、基础医学、电信技术', 'title': 'Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces'}, '15': {'name': 'Tzyy-Ping Jung', 'college': '加州大学圣迭戈分校', 'major': '领域:生物医学工程、电信技术、神经病学', 'title': 'Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces'}, '16': {'name': 'Chunxia Qiao', 'college': '军事医学科学院毒物药物研究所', 'major': '领域:肿瘤学、基础医学、妇产科学', 'title': 'A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method'}, '17': {'name': 'Ming Lv', 'college': '军事医学科学院', 'major': '领域:肿瘤学、妇产科学、有机化工', 'title': 'A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method'}, '18': {'name': 'Xinying Li', 'college': '军事医学科学院', 'major': '领域:肿瘤学、妇产科学、有机化工', 'title': 'A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method'}} from ['192.168.43.65', 9000], saving... +2022-07-08 10:00:54.398 | INFO | dcs.user_process:run:20 - [REQUEST HANDLER] processing user request... +2022-07-08 10:00:54.398 | INFO | dcs.tests.user_request_handler:report_state:16 - [REQUEST] report free +2022-07-08 10:00:54.398 | INFO | dcs.tests.user_request_handler:report_state:22 - [RESPONSE] report free: success marked e94b48b7a8b5dba9a67e6e8413d28848f899f081 +2022-07-08 10:00:55.315 | INFO | dcs.tests.spider_task:run:146 - [REMOTE] free nodes: [['192.168.43.65', 9001], ['192.168.43.65', 9002], ['192.168.43.65', 9000]] +2022-07-08 10:00:55.315 | INFO | dcs.tests.spider_task:compose_result:124 - [COMPOSE] composing task... +2022-07-08 10:00:55.410 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.65', 53223): {'report_free': 'success marked e94b48b7a8b5dba9a67e6e8413d28848f899f081', 'type': 'report_free'} +2022-07-08 10:00:55.442 | INFO | dcs.tests.spider_task:compose_result:131 - [RESULT] [('孔珍珍', '广东省碧桂园学校', '领域:中等教育', 'CAIE中Computer Science考试对信息技术纳入高考的启示'), ('李莉华', '东华大学', '领域:外国语言文字、中国语言文字、初等教育', 'Opening Moves Involved in Text-based Computer-Mediated-Communication (CMC) by Chinese Adults'), ('Jianhua Tao', '中国科学院大学', '领域:计算机软件及计算机应用、中国语言文字、电信技术', 'Emotion recognition for human-computer interaction'), ('Zhang Lingxin', '中国地震局工程力学研究所', '领域:建筑科学与工程', 'A review of the research and application of deep learning-based computer vision in structural damage detection'), ('Shen Junkai', '中国地震局工程力学研究所', '领域:建筑科学与工程', 'A review of the research and application of deep learning-based computer vision in structural damage detection'), ('Zhu Baijie', '中国地震局工程力学研究所', '领域:建筑科学与工程', 'A review of the research and application of deep learning-based computer vision in structural damage detection'), ('Liu bo', '北京市控制工程研究所', '领域:航空航天科学与工程、动力工程、电信技术', 'A lightweight data-voting strategy for triple-modular redundant control computers'), ('Yang Mengfei', '中国空间技术研究院', '领域:航空航天科学与工程、自动化技术', 'A lightweight data-voting strategy for triple-modular redundant control computers'), ('WANG Yong', '北京市控制工程研究所', '领域:航空航天科学与工程、数学、自动化技术', 'A lightweight data-voting strategy for triple-modular redundant control computers'), ('Ren Noguchi', '高知大学', '领域:计算机软件及计算机应用、无线电电子学', 'Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram'), ('Kohei Suzuki', '高知大学', '领域:计算机软件及计算机应用、无线电电子学', 'Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram'), ('Yoshiki Moriguchi', '高知大学', '领域:无线电电子学、计算机软件及计算机应用', 'Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram'), ('Yu Zhang', '哈尔滨工业大学', '领域:电信技术、生物学、计算机软件及计算机应用', 'Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface'), ('Huaqing Li', '哈尔滨工业大学', '领域:生物学、电信技术、自动化技术', 'Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface'), ('Heng Dong', '哈尔滨工业大学', '领域:生物学、电信技术、自动化技术', 'Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface'), ('Jingjing WANG', '中国科学院', '领域:生物学、燃料化工、石油天然气工业', 'Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax'), ('Wei Zhao', '中国科学院', '领域:无线电电子学、生物学、物理学', 'Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax'), ('Kunpeng Song', '中国科学院', '领域:燃料化工、石油天然气工业', 'Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax'), ('Qinjun Qiu', '中国地质大学(武汉)', '领域:地质学、计算机软件及计算机应用', 'Knowledge graph for identifying geological disasters by integrating computer vision with ontology'), ('Zhong Xie', '中国地质大学(武汉)', '领域:地质学、计算机软件及计算机应用', 'Knowledge graph for identifying geological disasters by integrating computer vision with ontology'), ('Die Zhang', '武汉大学', '领域:地质学、计算机软件及计算机应用', 'Knowledge graph for identifying geological disasters by integrating computer vision with ontology'), ('Chris Palmer', '', '领域:生物学、电信技术、生物医学工程', 'Brain-Computer Interface Speaks Up'), ('葛阳阳', '南京大学', '领域:物理学、计算机硬件技术', 'Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer'), ('王治昱', '南京大学', '领域:物理学、计算机硬件技术', 'Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer'), ('郑文', '南京大学', '领域:物理学、电力工业、计算机硬件技术', 'Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer'), ('Rui BIAN', '华中科技大学', '领域:生物学、电信技术、生物医学工程', 'SSVEP-based brain-computer interfaces are vulnerable to square wave attacks'), ('Lubin MENG', '华中科技大学', '领域:生物学、电信技术、生物医学工程', 'SSVEP-based brain-computer interfaces are vulnerable to square wave attacks'), ('Dongrui Wu', '之江实验室', '领域:电信技术、生物医学工程', 'SSVEP-based brain-computer interfaces are vulnerable to square wave attacks'), ('Haochen HU', '北京理工大学', '领域:生物学、电信技术、生物医学工程', 'Navigation in virtual and real environment using brain computer interface: a progress report'), ('Yue Liu', '北京电影学院', '领域:计算机软件及计算机应用、自动化技术、临床医学', 'Navigation in virtual and real environment using brain computer interface: a progress report'), ('Kang YUE', '北京理工大学', '领域:生物学、电信技术、生物医学工程', 'Navigation in virtual and real environment using brain computer interface: a progress report'), ('Biao WU', '北京大学', '领域:物理学、计算机硬件技术', 'Board games for quantum computers'), ('Hanbo CHEN', '北京大学', '领域:计算机硬件技术', 'Board games for quantum computers'), ('Zhikang LUO', '北京大学', '领域:计算机硬件技术', 'Board games for quantum computers'), ('Minpeng XU', '天津大学', '领域:生物学、基础医学、电信技术', 'Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces'), ('Feng He', '天津大学', '领域:生物学、基础医学、电信技术', 'Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces'), ('Tzyy-Ping Jung', '加州大学圣迭戈分校', '领域:生物医学工程、电信技术、神经病学', 'Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces'), ('Chunxia Qiao', '军事医学科学院毒物药物研究所', '领域:肿瘤学、基础医学、妇产科学', 'A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method'), ('Ming Lv', '军事医学科学院', '领域:肿瘤学、妇产科学、有机化工', 'A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method'), ('Xinying Li', '军事医学科学院', '领域:肿瘤学、妇产科学、有机化工', 'A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method')] +2022-07-08 10:00:55.458 | INFO | dcs.tests.spider_task:compose_result:132 - [DATABASE] writing crawl results to database... +2022-07-08 10:00:55.458 | INFO | dcs.tools.database:write_results2database:203 - [DATABASE] writing 5st crawl results to table wfy_crawl_result in database... +2022-07-08 10:00:55.915 | INFO | dcs.tools.database:write_results2database:212 - [DATABASE] writing successful of 5st crawl results! +2022-07-08 10:00:56.421 | INFO | dcs.communicate:run:28 - [COMMUNICATE] sending response to ('192.168.43.64', 60930): {'crawl_id': 5, 'table_name': 'wfy_crawl_result', 'type': 'response'} +2022-07-08 10:00:56.453 | INFO | dcs.tests.requestHandler:run:27 - [REQUEST] end: communication over from ('192.168.43.64', 60930)! +2022-07-27 10:29:28.065 | INFO | __main__::14 - [SERVER] reading config args... +2022-07-27 10:29:38.090 | ERROR | dcs.tools.database:mysql_conn:18 - [ERROR] (2003, "Can't connect to MySQL server on '192.168.43.65' (timed out)") +2022-07-27 10:29:38.091 | WARNING | dcs.tools.database:create_table:174 - [DATABASE] 'NoneType' object has no attribute 'cursor' diff --git a/ui/1.jpg b/ui/1.jpg new file mode 100644 index 0000000..5fff31f Binary files /dev/null and b/ui/1.jpg differ diff --git a/ui/2.jpg b/ui/2.jpg new file mode 100644 index 0000000..bcc2980 Binary files /dev/null and b/ui/2.jpg differ diff --git a/ui/3.jpg b/ui/3.jpg new file mode 100644 index 0000000..1cdccf5 Binary files /dev/null and b/ui/3.jpg differ diff --git a/ui/4.jpg b/ui/4.jpg new file mode 100644 index 0000000..5321dc7 Binary files /dev/null and b/ui/4.jpg differ diff --git a/ui/ceshi03.py b/ui/ceshi03.py new file mode 100644 index 0000000..76b178a --- /dev/null +++ b/ui/ceshi03.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +""" +Created on Tue May 24 15:49:30 2022 + +@author: Jation +""" + +import pandas as pd +import numpy as np +import pymysql +from HTMLTable import HTMLTable +import argparse +b = [] +a={"1": {"name": "test", "college": "test", "major": "test", "paper": "test"}, "2": {"name": "test", "college": "test", "major": "test", "paper": "test"}, "3": {"name": "test", "college": "test", "major": "test", "paper": "test"}, "4": {"name": "test", "college": "test", "major": "test", "paper": "test"}, "5": {"name": "test", "college": "test", "major": "test", "paper": "test"}, "6": {"name": "test", "college": "test", "major": "test", "paper": "test"}, "type": "response"} +for i in a: + #print(a[i]) + if(i == 'type'): + continue + d = [] + for c in a[i].values(): + d.append(c) + b.append(d) + # d.append(c) + #b.append(d) +#print(a) +#print(b) +def shu(a): + table = HTMLTable(caption='输出结果') + +# 表头行 + table.append_header_rows(( + ('name', 'test', 'college', 'major'), + )) + + # 合并单元格 + data_1 = a + # 数据行 + table.append_data_rows(( + data_1 + )) + + # 标题样式 + table.caption.set_style({ + 'font-size': '30px', + 'font-weight': 'bold', + 'margin': '10px', + }) + + # 表格样式,即标签样式 + table.set_style({ + 'border-collapse': 'collapse', + 'word-break': 'normal', + 'white-space': 'normal', + 'font-size': '14px', + }) + + # 统一设置所有单元格样式,
+ table.set_cell_style({ + 'border-color': '#000', + 'border-width': '1px', + 'border-style': 'solid', + 'padding': '5px', + }) + + # 表头样式 + table.set_header_row_style({ + 'color': '#fff', + 'background-color': '#48a6fb', + 'font-size': '18px', + }) + + # 覆盖表头单元格字体样式 + table.set_header_cell_style({ + 'padding': '15px', + }) + + # 调小次表头字体大小 + + + # 遍历数据行,如果增长量为负,标红背景颜色 + html = table.to_html() + f = open('C:/Users/Jation/Desktop/应用开发/dcs/ui/comment.html','w',encoding = 'utf-8-sig') + f.write(html) +# 1. 连接数据库, +conn = pymysql.connect( + host='10.129.16.173', + user='root', + password='427318Aa', + db='test', + charset='utf8', + # autocommit=True, # 如果插入数据,, 是否自动提交? 和conn.commit()功能一致。 +) +# ****python, 必须有一个游标对象, 用来给数据库发送sql语句, 并执行的. +# 2. 创建游标对象, +cur = conn.cursor() +# 3. 对于数据库进行增删改查 +parser = argparse.ArgumentParser('Automanager') +parser.add_argument('--id', type = str, required = True) + # 自动发微博 +args = parser.parse_args() +id = args.id +# 4). **************************数据库查询***************************** +sqli = "select name,college,major,paper from "+ id+"_crawl_result;" +print(sqli) +result = cur.execute(sqli) # 默认不返回查询结果集, 返回数据记录数。 +print(result) +'''print(cur.fetchone()) # 1). 获取下一个查询结果集; +print(cur.fetchone()) +print(cur.fetchone()) +print(cur.fetchmany(4))''' # 2). 获取制定个数个查询结果集; +info = cur.fetchall() # 3). 获取所有的查询结果 +print(info) +# 5). 移动游标指针 +path = "C:/Users/Jation/Desktop/应用开发/dcs/ui/comment.csv" +f = open(path,'w') +f.truncate() +shu(info) +# 4. 关闭游标 +cur.close() +# 5. 关闭连接 +conn.close() diff --git a/ui/comment.csv b/ui/comment.csv new file mode 100644 index 0000000..e69de29 diff --git a/ui/comment.html b/ui/comment.html new file mode 100644 index 0000000..5d72d99 --- /dev/null +++ b/ui/comment.html @@ -0,0 +1 @@ +
输出结果
nametestcollegemajor
张鹏南昌大学附属口腔医院医学教育与医学边缘学科;计算机软件及计算机应用;教育理论与教育管理;计算机绘图在口腔解剖生理学教学中的应用
郭菁南昌大学附属口腔医院口腔科学;生物医学工程;内分泌腺及全身性疾病;计算机绘图在口腔解剖生理学教学中的应用
曾永发南昌大学附属口腔医院口腔科学;生物医学工程;医学教育与医学边缘学科;计算机绘图在口腔解剖生理学教学中的应用
胡建宇南昌大学附属口腔医院医学教育与医学边缘学科;计算机软件及计算机应用;教育理论与教育管理;计算机绘图在口腔解剖生理学教学中的应用
郭冬花南昌大学附属口腔医院医学教育与医学边缘学科;计算机软件及计算机应用;教育理论与教育管理;计算机绘图在口腔解剖生理学教学中的应用
张鹏南昌大学附属口腔医院医学教育与医学边缘学科;计算机软件及计算机应用;教育理论与教育管理;计算机绘图在口腔解剖生理学教学中的应用
郭菁南昌大学附属口腔医院口腔科学;生物医学工程;内分泌腺及全身性疾病;计算机绘图在口腔解剖生理学教学中的应用
曾永发南昌大学附属口腔医院口腔科学;生物医学工程;医学教育与医学边缘学科;计算机绘图在口腔解剖生理学教学中的应用
胡建宇南昌大学附属口腔医院医学教育与医学边缘学科;计算机软件及计算机应用;教育理论与教育管理;计算机绘图在口腔解剖生理学教学中的应用
郭冬花南昌大学附属口腔医院医学教育与医学边缘学科;计算机软件及计算机应用;教育理论与教育管理;计算机绘图在口腔解剖生理学教学中的应用
张伟鹏陕西科技大学计算机硬件技术;计算机科学与技术的应用现状与未来趋势
张伟鹏陕西科技大学计算机硬件技术;计算机科学与技术的应用现状与未来趋势
党禄空军军医大学唐都医院口腔科学;外科学;自然科学理论与方法;计算机辅助鼻腔周截骨联合LefortⅠ型截骨和BSSRO矫治高低眼畸形的效果
陈孝强南部战区总医院外科学;生物医学工程;急救医学;计算机辅助鼻腔周截骨联合LefortⅠ型截骨和BSSRO矫治高低眼畸形的效果
李学拥空军军医大学唐都医院外科学;急救医学;生物医学工程;计算机辅助鼻腔周截骨联合LefortⅠ型截骨和BSSRO矫治高低眼畸形的效果
荀文兴空军军医大学唐都医院口腔科学;肿瘤学;精神病学;计算机辅助鼻腔周截骨联合LefortⅠ型截骨和BSSRO矫治高低眼畸形的效果
赵华强空军军医大学唐都医院口腔科学;计算机辅助鼻腔周截骨联合LefortⅠ型截骨和BSSRO矫治高低眼畸形的效果
齐田源空军军医大学唐都医院口腔科学;计算机辅助鼻腔周截骨联合LefortⅠ型截骨和BSSRO矫治高低眼畸形的效果
李金清空军军医大学唐都医院外科学;生物医学工程;口腔科学;计算机辅助鼻腔周截骨联合LefortⅠ型截骨和BSSRO矫治高低眼畸形的效果
党禄空军军医大学唐都医院口腔科学;外科学;自然科学理论与方法;计算机辅助鼻腔周截骨联合LefortⅠ型截骨和BSSRO矫治高低眼畸形的效果
陈孝强南部战区总医院外科学;生物医学工程;急救医学;计算机辅助鼻腔周截骨联合LefortⅠ型截骨和BSSRO矫治高低眼畸形的效果
李学拥空军军医大学唐都医院外科学;急救医学;生物医学工程;计算机辅助鼻腔周截骨联合LefortⅠ型截骨和BSSRO矫治高低眼畸形的效果
荀文兴空军军医大学唐都医院口腔科学;肿瘤学;精神病学;计算机辅助鼻腔周截骨联合LefortⅠ型截骨和BSSRO矫治高低眼畸形的效果
赵华强空军军医大学唐都医院口腔科学;计算机辅助鼻腔周截骨联合LefortⅠ型截骨和BSSRO矫治高低眼畸形的效果
齐田源空军军医大学唐都医院口腔科学;计算机辅助鼻腔周截骨联合LefortⅠ型截骨和BSSRO矫治高低眼畸形的效果
李金清空军军医大学唐都医院外科学;生物医学工程;口腔科学;计算机辅助鼻腔周截骨联合LefortⅠ型截骨和BSSRO矫治高低眼畸形的效果
张家铭北京全路通信信号研究设计院铁路运输;公路与水路运输;城市轨道交通全电子计算机联锁改造工程设计方案
代守双重庆市轨道交通(集团)有限公司铁路运输;城市轨道交通全电子计算机联锁改造工程设计方案
张家铭北京全路通信信号研究设计院铁路运输;公路与水路运输;城市轨道交通全电子计算机联锁改造工程设计方案
代守双重庆市轨道交通(集团)有限公司铁路运输;城市轨道交通全电子计算机联锁改造工程设计方案
钟志锋江苏省溧阳中等专业学校职业教育;计算机硬件技术;美术书法雕塑与摄影;探讨“嵌入科研实践式”模式在中职计算机平面设计专业中的运用
钟志锋江苏省溧阳中等专业学校职业教育;计算机硬件技术;美术书法雕塑与摄影;探讨“嵌入科研实践式”模式在中职计算机平面设计专业中的运用
朱意灏浙江工业大学轻工业手工业;工业通用技术及设备;电力工业;乱针绣风格化生成方法的计算机辅助DIY设计
赵玉浙江工业大学计算机软件及计算机应用;轻工业手工业;中国语言文字;乱针绣风格化生成方法的计算机辅助DIY设计
张玲燕浙江工业大学工业通用技术及设备;计算机软件及计算机应用;轻工业手工业;乱针绣风格化生成方法的计算机辅助DIY设计
刘肖健浙江工业大学轻工业手工业;计算机软件及计算机应用;工业通用技术及设备;乱针绣风格化生成方法的计算机辅助DIY设计
朱意灏浙江工业大学轻工业手工业;工业通用技术及设备;电力工业;乱针绣风格化生成方法的计算机辅助DIY设计
赵玉浙江工业大学计算机软件及计算机应用;轻工业手工业;中国语言文字;乱针绣风格化生成方法的计算机辅助DIY设计
张玲燕浙江工业大学工业通用技术及设备;计算机软件及计算机应用;轻工业手工业;乱针绣风格化生成方法的计算机辅助DIY设计
刘肖健浙江工业大学轻工业手工业;计算机软件及计算机应用;工业通用技术及设备;乱针绣风格化生成方法的计算机辅助DIY设计
万功哲沈阳工业大学高等教育;计算机软件及计算机应用;高校后勤管理工作中计算机信息技术分析
万功哲沈阳工业大学高等教育;计算机软件及计算机应用;高校后勤管理工作中计算机信息技术分析
姚莉南京商业学校职业教育;计算机硬件技术;计算机软件及计算机应用;“计算机应用基础”课程选用案例教学初探
姚莉南京商业学校职业教育;计算机硬件技术;计算机软件及计算机应用;“计算机应用基础”课程选用案例教学初探
苏敏宿迁市宿城中等专业学校职业教育;计算机硬件技术;试论行动导向教学法在中职计算机基础教学中的有效运用
苏敏宿迁市宿城中等专业学校职业教育;计算机硬件技术;试论行动导向教学法在中职计算机基础教学中的有效运用
郭心红晋中师范高等专科学校计算机软件及计算机应用;职业教育;计算机硬件技术;支架式教学方法在计算机教学过程中的运用探究
郭心红晋中师范高等专科学校计算机软件及计算机应用;职业教育;计算机硬件技术;支架式教学方法在计算机教学过程中的运用探究
吴秋瑜北部湾大学计算机软件及计算机应用;自动化技术;计算机硬件技术;基于MOOC的大学计算机基础课程混合式教学改革研究
李秋萍北部湾大学计算机硬件技术;高等教育;基于MOOC的大学计算机基础课程混合式教学改革研究
朱剑锋北部湾大学计算机软件及计算机应用;高等教育;电信技术;基于MOOC的大学计算机基础课程混合式教学改革研究
吴秋瑜北部湾大学计算机软件及计算机应用;自动化技术;计算机硬件技术;基于MOOC的大学计算机基础课程混合式教学改革研究
李秋萍北部湾大学计算机硬件技术;高等教育;基于MOOC的大学计算机基础课程混合式教学改革研究
朱剑锋北部湾大学计算机软件及计算机应用;高等教育;电信技术;基于MOOC的大学计算机基础课程混合式教学改革研究
谢满红甘肃省通渭县职业中等专业学校计算机硬件技术;职业教育;微课在中职计算机教学中的应用探讨
谢满红甘肃省通渭县职业中等专业学校计算机硬件技术;职业教育;微课在中职计算机教学中的应用探讨
郭惠山西旅游职业学院计算机软件及计算机应用;互联网技术;矿业工程;大数据背景下高校计算机专业创新教学思路与方法
郭惠山西旅游职业学院计算机软件及计算机应用;互联网技术;矿业工程;大数据背景下高校计算机专业创新教学思路与方法
倪军南京农业大学材料科学;农业工程;农作物;新农科建设中“计算机程序设计”课程的教学改革
姚立立南京农业大学材料科学;计算机软件及计算机应用;汽车工业;新农科建设中“计算机程序设计”课程的教学改革
蒋小平南京农业大学机械工业;动力工程;计算机软件及计算机应用;新农科建设中“计算机程序设计”课程的教学改革
胡金钊南京农业大学计算机软件及计算机应用;高等教育;新农科建设中“计算机程序设计”课程的教学改革
倪军南京农业大学材料科学;农业工程;农作物;新农科建设中“计算机程序设计”课程的教学改革
姚立立南京农业大学材料科学;计算机软件及计算机应用;汽车工业;新农科建设中“计算机程序设计”课程的教学改革
蒋小平南京农业大学机械工业;动力工程;计算机软件及计算机应用;新农科建设中“计算机程序设计”课程的教学改革
胡金钊南京农业大学计算机软件及计算机应用;高等教育;新农科建设中“计算机程序设计”课程的教学改革
王璞中国航空工业总公司航空计算技术研究所航空航天科学与工程;一种嵌入式飞控计算机产品验收系统设计
阮婷中国航空工业总公司航空计算技术研究所航空航天科学与工程;一种嵌入式飞控计算机产品验收系统设计
马倩中国航空工业总公司航空计算技术研究所航空航天科学与工程;一种嵌入式飞控计算机产品验收系统设计
王璞中国航空工业总公司航空计算技术研究所航空航天科学与工程;一种嵌入式飞控计算机产品验收系统设计
阮婷中国航空工业总公司航空计算技术研究所航空航天科学与工程;一种嵌入式飞控计算机产品验收系统设计
马倩中国航空工业总公司航空计算技术研究所航空航天科学与工程;一种嵌入式飞控计算机产品验收系统设计
任芳北京交大微联科技有限公司铁路运输;基于传统测试经验的计算机联锁自动测试脚本设计研究
任芳北京交大微联科技有限公司铁路运输;基于传统测试经验的计算机联锁自动测试脚本设计研究
李程豪甘肃中医药大学中药学;肿瘤学;基础医学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
张敏甘肃中医药大学中药学;农作物;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
林佳甘肃中医药大学中药学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
张依茜甘肃中医药大学中药学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
刘昊甘肃中医药大学中药学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
王锐峰甘肃中医药大学中药学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
和建政甘肃中医药大学中药学;中医学;精神病学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
李亚玲甘肃中医药大学中药学;医学教育与医学边缘学科;中医学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
靳晓杰甘肃中医药大学中药学;中医学;工业通用技术及设备;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
刘永琦甘肃中医学院中药学;中医学;基础医学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
李程豪甘肃中医药大学中药学;肿瘤学;基础医学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
张敏甘肃中医药大学中药学;农作物;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
林佳甘肃中医药大学中药学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
张依茜甘肃中医药大学中药学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
刘昊甘肃中医药大学中药学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
王锐峰甘肃中医药大学中药学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
和建政甘肃中医药大学中药学;中医学;精神病学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
李亚玲甘肃中医药大学中药学;医学教育与医学边缘学科;中医学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
靳晓杰甘肃中医药大学中药学;中医学;工业通用技术及设备;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
刘永琦甘肃中医学院中药学;中医学;基础医学;敦煌医方大补脾汤对胃癌的体外活性及其配伍规律的计算机辅助药物设计分析
袁炳夏惠州学院计算机软件及计算机应用;互联网技术;自动化技术;深度学习算法下的计算机网络安全性探究
袁炳夏惠州学院计算机软件及计算机应用;互联网技术;自动化技术;深度学习算法下的计算机网络安全性探究
刘仪互联网技术;自动化技术;人工智能时代计算机信息安全与防护研究
刘仪互联网技术;自动化技术;人工智能时代计算机信息安全与防护研究
朱丽敏山西省工业管理学校计算机软件及计算机应用;职业教育;教育理论与教育管理;计算机应用专业平台设计与开发
朱丽敏山西省工业管理学校计算机软件及计算机应用;职业教育;教育理论与教育管理;计算机应用专业平台设计与开发
孙亚康NoneNone基于计算机视觉的预制墙板临时支撑安全合规性检查
郭红领清华大学建筑科学与工程;计算机软件及计算机应用;安全科学与灾害防治;基于计算机视觉的预制墙板临时支撑安全合规性检查
罗柱邦清华大学计算机软件及计算机应用;建筑科学与工程;基础医学;基于计算机视觉的预制墙板临时支撑安全合规性检查
张智慧清华大学环境科学与资源利用;建筑科学与工程;工业经济;基于计算机视觉的预制墙板临时支撑安全合规性检查
孙亚康NoneNone基于计算机视觉的预制墙板临时支撑安全合规性检查
郭红领清华大学建筑科学与工程;计算机软件及计算机应用;安全科学与灾害防治;基于计算机视觉的预制墙板临时支撑安全合规性检查
罗柱邦清华大学计算机软件及计算机应用;建筑科学与工程;基础医学;基于计算机视觉的预制墙板临时支撑安全合规性检查
张智慧清华大学环境科学与资源利用;建筑科学与工程;工业经济;基于计算机视觉的预制墙板临时支撑安全合规性检查
刘思源西南大学计算机硬件技术;高等教育;基于大规模课程大纲数据的中美高校计算机相关课程考核的比较分析
冯蕾霖西南大学计算机硬件技术;基于大规模课程大纲数据的中美高校计算机相关课程考核的比较分析
朱章黔陆军勤务学院数学;计算机硬件技术;计算机软件及计算机应用;基于大规模课程大纲数据的中美高校计算机相关课程考核的比较分析
贾韬西南大学科学研究管理;计算机软件及计算机应用;自动化技术;基于大规模课程大纲数据的中美高校计算机相关课程考核的比较分析
刘思源西南大学计算机硬件技术;高等教育;基于大规模课程大纲数据的中美高校计算机相关课程考核的比较分析
冯蕾霖西南大学计算机硬件技术;基于大规模课程大纲数据的中美高校计算机相关课程考核的比较分析
朱章黔陆军勤务学院数学;计算机硬件技术;计算机软件及计算机应用;基于大规模课程大纲数据的中美高校计算机相关课程考核的比较分析
贾韬西南大学科学研究管理;计算机软件及计算机应用;自动化技术;基于大规模课程大纲数据的中美高校计算机相关课程考核的比较分析
吴迪承德医学院附属医院外科学;临床医学;生物学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
司丽娜承德医学院基础医学;生物学;外科学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
武丽珠承德市中心医院外科学;心血管系统疾病;急救医学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
王建华承德医学院附属医院外科学;计算机软件及计算机应用;基础医学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
罗金伟承德医学院附属医院外科学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
常乾坤承德医学院附属医院外科学;临床医学;基础医学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
吕永明承德医学院附属医院外科学;内分泌腺及全身性疾病;临床医学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
杜元良承德医学院附属医院外科学;内分泌腺及全身性疾病;基础医学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
吴迪承德医学院附属医院外科学;临床医学;生物学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
司丽娜承德医学院基础医学;生物学;外科学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
武丽珠承德市中心医院外科学;心血管系统疾病;急救医学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
王建华承德医学院附属医院外科学;计算机软件及计算机应用;基础医学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
罗金伟承德医学院附属医院外科学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
常乾坤承德医学院附属医院外科学;临床医学;基础医学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
吕永明承德医学院附属医院外科学;内分泌腺及全身性疾病;临床医学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
杜元良承德医学院附属医院外科学;内分泌腺及全身性疾病;基础医学;3D打印技术与计算机辅助设计应用在全膝关节置换治疗重度膝关节骨关节炎中的可行性
康熙中国农业大学计算机软件及计算机应用;农业工程;畜牧与动物医学;基于计算机视觉的奶牛生理参数监测与疾病诊断研究进展及挑战
刘刚中国农业大学计算机软件及计算机应用;自动化技术;农业工程;基于计算机视觉的奶牛生理参数监测与疾病诊断研究进展及挑战
初梦苑河北农业大学计算机软件及计算机应用;畜牧与动物医学;基于计算机视觉的奶牛生理参数监测与疾病诊断研究进展及挑战
李前中国农业大学计算机软件及计算机应用;基于计算机视觉的奶牛生理参数监测与疾病诊断研究进展及挑战
王彦超中国农业大学计算机软件及计算机应用;畜牧与动物医学;基于计算机视觉的奶牛生理参数监测与疾病诊断研究进展及挑战
康熙中国农业大学计算机软件及计算机应用;农业工程;畜牧与动物医学;基于计算机视觉的奶牛生理参数监测与疾病诊断研究进展及挑战
刘刚中国农业大学计算机软件及计算机应用;自动化技术;农业工程;基于计算机视觉的奶牛生理参数监测与疾病诊断研究进展及挑战
初梦苑河北农业大学计算机软件及计算机应用;畜牧与动物医学;基于计算机视觉的奶牛生理参数监测与疾病诊断研究进展及挑战
李前中国农业大学计算机软件及计算机应用;基于计算机视觉的奶牛生理参数监测与疾病诊断研究进展及挑战
王彦超中国农业大学计算机软件及计算机应用;畜牧与动物医学;基于计算机视觉的奶牛生理参数监测与疾病诊断研究进展及挑战
杨骏乐山师范学院计算机软件及计算机应用;自动化技术;电信技术;地方高校计算机专业人才工程能力培养策略
项炜乐山师范学院计算机软件及计算机应用;计算机硬件技术;高等教育;地方高校计算机专业人才工程能力培养策略
敬思远乐山师范学院计算机软件及计算机应用;自动化技术;计算机硬件技术;地方高校计算机专业人才工程能力培养策略
苏炳均乐山师范学院计算机软件及计算机应用;计算机硬件技术;电信技术;地方高校计算机专业人才工程能力培养策略
杨骏乐山师范学院计算机软件及计算机应用;自动化技术;电信技术;地方高校计算机专业人才工程能力培养策略
项炜乐山师范学院计算机软件及计算机应用;计算机硬件技术;高等教育;地方高校计算机专业人才工程能力培养策略
敬思远乐山师范学院计算机软件及计算机应用;自动化技术;计算机硬件技术;地方高校计算机专业人才工程能力培养策略
苏炳均乐山师范学院计算机软件及计算机应用;计算机硬件技术;电信技术;地方高校计算机专业人才工程能力培养策略
张娜娜上海思博职业技术学院计算机软件及计算机应用;轻工业手工业;基于计算机视觉传达的皮革缺陷检测算法研究
张娜娜上海思博职业技术学院计算机软件及计算机应用;轻工业手工业;基于计算机视觉传达的皮革缺陷检测算法研究
李晓辉沈阳农业大学计算机软件及计算机应用;计算机硬件技术;高等教育;新农科背景下大学生计算机应用能力提升教学研究与实践
杨洪伟沈阳农业大学计算机软件及计算机应用;计算机硬件技术;高等教育;新农科背景下大学生计算机应用能力提升教学研究与实践
蒋兰玲辽宁省农业科学院计算机软件及计算机应用;计算机硬件技术;园艺;新农科背景下大学生计算机应用能力提升教学研究与实践
张芳沈阳农业大学计算机软件及计算机应用;计算机硬件技术;高等教育;新农科背景下大学生计算机应用能力提升教学研究与实践
李晓辉沈阳农业大学计算机软件及计算机应用;计算机硬件技术;高等教育;新农科背景下大学生计算机应用能力提升教学研究与实践
杨洪伟沈阳农业大学计算机软件及计算机应用;计算机硬件技术;高等教育;新农科背景下大学生计算机应用能力提升教学研究与实践
蒋兰玲辽宁省农业科学院计算机软件及计算机应用;计算机硬件技术;园艺;新农科背景下大学生计算机应用能力提升教学研究与实践
张芳沈阳农业大学计算机软件及计算机应用;计算机硬件技术;高等教育;新农科背景下大学生计算机应用能力提升教学研究与实践
贾小军嘉兴学院计算机软件及计算机应用;自动化技术;教育理论与教育管理;基于“复盘”模式的计算机通识课程管理研究
张春花嘉兴学院计算机硬件技术;基于“复盘”模式的计算机通识课程管理研究
刘子豪嘉兴学院计算机软件及计算机应用;自动化技术;仪器仪表工业;基于“复盘”模式的计算机通识课程管理研究
贾小军嘉兴学院计算机软件及计算机应用;自动化技术;教育理论与教育管理;基于“复盘”模式的计算机通识课程管理研究
张春花嘉兴学院计算机硬件技术;基于“复盘”模式的计算机通识课程管理研究
刘子豪嘉兴学院计算机软件及计算机应用;自动化技术;仪器仪表工业;基于“复盘”模式的计算机通识课程管理研究
周学勇信阳师范学院数学;高等教育;生物学;一类分数阶计算机病毒模型的稳定性分析
路振国信阳师范学院数学;高等教育;一类分数阶计算机病毒模型的稳定性分析
程晓明信阳师范学院数学;一类分数阶计算机病毒模型的稳定性分析
周学勇信阳师范学院数学;高等教育;生物学;一类分数阶计算机病毒模型的稳定性分析
路振国信阳师范学院数学;高等教育;一类分数阶计算机病毒模型的稳定性分析
程晓明信阳师范学院数学;一类分数阶计算机病毒模型的稳定性分析
李娜中国科学院大学生物学;计算机软件及计算机应用;生物医学工程;计算机辅助血管介入技术进展综述
贺建安东南大学生物学;计算机软件及计算机应用;生物医学工程;计算机辅助血管介入技术进展综述
陈阳东南大学计算机软件及计算机应用;临床医学;计算机硬件技术;计算机辅助血管介入技术进展综述
周寿军中国科学院深圳先进技术研究院计算机软件及计算机应用;生物医学工程;外科学;计算机辅助血管介入技术进展综述
李娜中国科学院大学生物学;计算机软件及计算机应用;生物医学工程;计算机辅助血管介入技术进展综述
贺建安东南大学生物学;计算机软件及计算机应用;生物医学工程;计算机辅助血管介入技术进展综述
陈阳东南大学计算机软件及计算机应用;临床医学;计算机硬件技术;计算机辅助血管介入技术进展综述
周寿军中国科学院深圳先进技术研究院计算机软件及计算机应用;生物医学工程;外科学;计算机辅助血管介入技术进展综述
李正凡云南华能澜沧江水电有限公司水利水电工程;电力工业;自动化技术;基于时间序列的国产化水电站计算机监控系统异常行为报警方法应用
谭良良南京市南瑞继保工程技术有限公司水利水电工程;电力工业;自动化技术;基于时间序列的国产化水电站计算机监控系统异常行为报警方法应用
杨渊西安热工研究院有限公司电力工业;电信技术;水利水电工程;基于时间序列的国产化水电站计算机监控系统异常行为报警方法应用
陈映喜云南华能澜沧江水电有限公司电力工业;水利水电工程;自动化技术;基于时间序列的国产化水电站计算机监控系统异常行为报警方法应用
周喜云南华能澜沧江水电有限公司水利水电工程;电力工业;自动化技术;基于时间序列的国产化水电站计算机监控系统异常行为报警方法应用
杨伟南京市南瑞继保工程技术有限公司水利水电工程;电力工业;自动化技术;基于时间序列的国产化水电站计算机监控系统异常行为报警方法应用
李正凡云南华能澜沧江水电有限公司水利水电工程;电力工业;自动化技术;基于时间序列的国产化水电站计算机监控系统异常行为报警方法应用
谭良良南京市南瑞继保工程技术有限公司水利水电工程;电力工业;自动化技术;基于时间序列的国产化水电站计算机监控系统异常行为报警方法应用
杨渊西安热工研究院有限公司电力工业;电信技术;水利水电工程;基于时间序列的国产化水电站计算机监控系统异常行为报警方法应用
陈映喜云南华能澜沧江水电有限公司电力工业;水利水电工程;自动化技术;基于时间序列的国产化水电站计算机监控系统异常行为报警方法应用
周喜云南华能澜沧江水电有限公司水利水电工程;电力工业;自动化技术;基于时间序列的国产化水电站计算机监控系统异常行为报警方法应用
杨伟南京市南瑞继保工程技术有限公司水利水电工程;电力工业;自动化技术;基于时间序列的国产化水电站计算机监控系统异常行为报警方法应用
刘文上海大学航空航天科学与工程;计算机软件及计算机应用;基于机载计算机的无人机智能巡检方案
陆小锋上海大学计算机软件及计算机应用;临床医学;神经病学;基于机载计算机的无人机智能巡检方案
毛建华上海大学计算机软件及计算机应用;自然地理学和测绘学;自动化技术;基于机载计算机的无人机智能巡检方案
方思凯Shanghai University航空航天科学与工程;计算机软件及计算机应用;基于机载计算机的无人机智能巡检方案
钱国上海宝冶冶金工程有限公司计算机软件及计算机应用;建筑科学与工程;航空航天科学与工程;基于机载计算机的无人机智能巡检方案
刘文上海大学航空航天科学与工程;计算机软件及计算机应用;基于机载计算机的无人机智能巡检方案
陆小锋上海大学计算机软件及计算机应用;临床医学;神经病学;基于机载计算机的无人机智能巡检方案
毛建华上海大学计算机软件及计算机应用;自然地理学和测绘学;自动化技术;基于机载计算机的无人机智能巡检方案
方思凯Shanghai University航空航天科学与工程;计算机软件及计算机应用;基于机载计算机的无人机智能巡检方案
钱国上海宝冶冶金工程有限公司计算机软件及计算机应用;建筑科学与工程;航空航天科学与工程;基于机载计算机的无人机智能巡检方案
黄立鹤同济大学中国语言文字;外国语言文字;高等教育;老年话语的计算机自动文本分析:进展与前景
曲惠宇同济大学中国语言文字;老年话语的计算机自动文本分析:进展与前景
杨晶晶同济大学中国语言文字;精神病学;中国政治与国际政治;老年话语的计算机自动文本分析:进展与前景
黄立鹤同济大学中国语言文字;外国语言文字;高等教育;老年话语的计算机自动文本分析:进展与前景
曲惠宇同济大学中国语言文字;老年话语的计算机自动文本分析:进展与前景
杨晶晶同济大学中国语言文字;精神病学;中国政治与国际政治;老年话语的计算机自动文本分析:进展与前景
杨乐山西工程科技职业大学互联网技术;高等教育;关于高校计算机实验室网络安全管理的研究
杨乐山西工程科技职业大学互联网技术;高等教育;关于高校计算机实验室网络安全管理的研究
孟云飞哈尔滨职业技术学院计算机软件及计算机应用;轻工业手工业;教育理论与教育管理;计算机系统与信息管理融合发展研究
孟云飞哈尔滨职业技术学院计算机软件及计算机应用;轻工业手工业;教育理论与教育管理;计算机系统与信息管理融合发展研究
郝玉成合肥学院化学;无机化工;材料科学;计算机在材料科学中的应用课程改革与应用型人才教学实践研究
张全争合肥学院化学;无机化工;有机化工;计算机在材料科学中的应用课程改革与应用型人才教学实践研究
林文海合肥学院无线电电子学;高等教育;电力工业;计算机在材料科学中的应用课程改革与应用型人才教学实践研究
秦广超合肥学院无机化工;轻工业手工业;化学;计算机在材料科学中的应用课程改革与应用型人才教学实践研究
郝玉成合肥学院化学;无机化工;材料科学;计算机在材料科学中的应用课程改革与应用型人才教学实践研究
张全争合肥学院化学;无机化工;有机化工;计算机在材料科学中的应用课程改革与应用型人才教学实践研究
林文海合肥学院无线电电子学;高等教育;电力工业;计算机在材料科学中的应用课程改革与应用型人才教学实践研究
秦广超合肥学院无机化工;轻工业手工业;化学;计算机在材料科学中的应用课程改革与应用型人才教学实践研究
谭毅飞上海市东亚联合控股(集团)有限公司建筑科学与工程;计算机软件及计算机应用;自动化技术;计算机视觉与传感技术下全新劳务计酬模式探究
谭毅飞上海市东亚联合控股(集团)有限公司建筑科学与工程;计算机软件及计算机应用;自动化技术;计算机视觉与传感技术下全新劳务计酬模式探究
吴涤清徐州医科大学口腔科学;肿瘤学;计算机辅助测量唇腭裂继发颌骨畸形患者手术前后口腔及气道容积的变化
李志萍徐州市中心医院口腔科学;肿瘤学;外科学;计算机辅助测量唇腭裂继发颌骨畸形患者手术前后口腔及气道容积的变化
孟箭徐州市中心医院口腔科学;肿瘤学;临床医学;计算机辅助测量唇腭裂继发颌骨畸形患者手术前后口腔及气道容积的变化
陈彬徐州市中心医院口腔科学;仪器仪表工业;肿瘤学;计算机辅助测量唇腭裂继发颌骨畸形患者手术前后口腔及气道容积的变化
吴涤清徐州医科大学口腔科学;肿瘤学;计算机辅助测量唇腭裂继发颌骨畸形患者手术前后口腔及气道容积的变化
李志萍徐州市中心医院口腔科学;肿瘤学;外科学;计算机辅助测量唇腭裂继发颌骨畸形患者手术前后口腔及气道容积的变化
孟箭徐州市中心医院口腔科学;肿瘤学;临床医学;计算机辅助测量唇腭裂继发颌骨畸形患者手术前后口腔及气道容积的变化
陈彬徐州市中心医院口腔科学;仪器仪表工业;肿瘤学;计算机辅助测量唇腭裂继发颌骨畸形患者手术前后口腔及气道容积的变化
张新星衢州职业技术学院电力工业;机械工业;外科学;计算机辅助骨科手术机器人技术发展及应用综述
赵英杰衢州职业技术学院外科学;自动化技术;生物医学工程;计算机辅助骨科手术机器人技术发展及应用综述
陈超衢州职业技术学院外科学;自动化技术;生物医学工程;计算机辅助骨科手术机器人技术发展及应用综述
张新星衢州职业技术学院电力工业;机械工业;外科学;计算机辅助骨科手术机器人技术发展及应用综述
赵英杰衢州职业技术学院外科学;自动化技术;生物医学工程;计算机辅助骨科手术机器人技术发展及应用综述
陈超衢州职业技术学院外科学;自动化技术;生物医学工程;计算机辅助骨科手术机器人技术发展及应用综述
\ No newline at end of file diff --git a/ui/connect.py b/ui/connect.py index 9c23998..bcc430e 100644 --- a/ui/connect.py +++ b/ui/connect.py @@ -85,7 +85,7 @@ if __name__ == '__main__': args = parser.parse_args() - local_port = 10004 + local_port = 9010 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.connect((args.ip, int(args.port))) @@ -98,7 +98,7 @@ if __name__ == '__main__': elif args.action == 'login' or args.action == 'register': request = {'action': args.action, 'user': args.user, 'password': args.password} response = send_request(request, server_socket) - print(response) + print(response['cookie']) if args.action == 'crawling': receive_response(server_socket) diff --git a/ui/connect1.py b/ui/connect1.py new file mode 100644 index 0000000..97071d1 --- /dev/null +++ b/ui/connect1.py @@ -0,0 +1,198 @@ +import json +import socket +import struct +import argparse +from json import JSONEncoder, JSONDecoder +import pymysql +from HTMLTable import HTMLTable +import pandas as pd +import numpy as np +import json +def parse_request(client_socket: socket.socket): + request_header_size = struct.unpack("!Q", read_bytes(client_socket, 8))[0] + request_map = json.JSONDecoder().decode(read_bytes(client_socket, request_header_size).decode("utf-8")) + return request_map + +def generate_request(request_info) -> 'bytes': + """ + 根据传入的dict生成请求 + 请求包含 8字节头长度+头数据 + :param request_info: dict + :return: bytes 请求数据 + """ + request_bytes = JSONEncoder().encode(request_info).encode("utf-8") + return struct.pack("!Q", len(request_bytes)) + request_bytes + + +def read_bytes(s: 'socket.socket', size: 'int') -> 'bytes': + """ + 从socket读取size个字节 + :param s:套接字 + :param size:要读取的大小 + :return:读取的字节数,在遇到套接字关闭的情况下,返回的数据的长度可能小于 size + """ + data = ''.encode('utf-8') + while len(data) < size: + rsp_data = s.recv(size - len(data)) + data += rsp_data + if len(rsp_data) == 0: + break + return data + +def shu(a): + table = HTMLTable(caption='输出结果') + +# 表头行 + table.append_header_rows(( + ('name', 'college', 'major', 'paper'), + )) + + # 合并单元格 + data_1 = a + # 数据行 + table.append_data_rows(( + data_1 + )) + + # 标题样式 + table.caption.set_style({ + 'font-size': '30px', + 'font-weight': 'bold', + 'margin': '10px', + }) + + # 表格样式,即标签样式 + table.set_style({ + 'border-collapse': 'collapse', + 'word-break': 'normal', + 'white-space': 'normal', + 'font-size': '14px', + }) + + # 统一设置所有单元格样式,
+ table.set_cell_style({ + 'border-color': '#000', + 'border-width': '1px', + 'border-style': 'solid', + 'padding': '5px', + }) + + # 表头样式 + table.set_header_row_style({ + 'color': '#fff', + 'background-color': '#48a6fb', + 'font-size': '18px', + }) + + # 覆盖表头单元格字体样式 + table.set_header_cell_style({ + 'padding': '15px', + }) + + # 调小次表头字体大小 + table[1].set_cell_style({ + 'padding': '8px', + 'font-size': '15px', + }) + + # 遍历数据行,如果增长量为负,标红背景颜色 + html = table.to_html() + f = open('C:/Users/Jation/Desktop/应用开发/dcs/ui/tmmps.html','w',encoding = 'utf-8-sig') + f.write(html) + +def send_request(ip, port, request_info): + with socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) as socket_to_server: + socket_to_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + socket_to_server.bind(('', 9005)) + socket_to_server.connect((ip, int(port))) + + full_request = generate_request(request_info) + + socket_to_server.sendall(full_request) + + responseJson = JSONDecoder().decode( + read_bytes(socket_to_server, struct.unpack('!Q', socket_to_server.recv(8))[0]).decode( + "utf-8")) + + return responseJson + + +def receive_response(): + server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) + server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + server_socket.bind(('', 9005)) + server_socket.listen() + while True: + client_socket, _ = server_socket.accept() + request_map = parse_request(client_socket) + if request_map['type'] == 'response': + print("receiving response:\n" + json.dumps(request_map, ensure_ascii=False)) + a = json.dumps(request_map, ensure_ascii=False) + a = json.loads(a) + b = [] + c ='' + d ='' + for i in a: + #print(a[i]) + if(i == 'type'): + continue + if(i == 'crawl_id'): + c = a[i] + c = str(c) + if(i == 'table_name'): + d = a[i] + '''for c in a[i].values(): + d.append(c)''' + b.append(d) + continue + sqli = "select name,college,major,paper from "+d+" where crawl_id = " +c+";" + result = cur.execute(sqli) + info = cur.fetchall() + shu(info) + break +conn = pymysql.connect( + host='10.129.16.173', + user='root', + password='427318Aa', + db='test', + charset='utf8', + # autocommit=True, # 如果插入数据,, 是否自动提交? 和conn.commit()功能一致。 +) +cur = conn.cursor() + +if __name__ == '__main__': + # 使用方法 python .\connect.py --ip 127.0.0.1 --port 7777 + # crawling --word computer --cookie 95f94e1ab71bdf96b85fef6e8f746c58eeb5f9fa --pages_start 1 --pages_end 10 + parser = argparse.ArgumentParser('connect-manager') + parser.add_argument('--ip', type=str, required=True) + parser.add_argument('--port', type=str, required=True) + subparsers = parser.add_subparsers(help='provide actions including crawling, login, register', + dest='action') # 创建子解析器 + + parser_crawling = subparsers.add_parser('crawling') + parser_crawling.add_argument('--word', type=str, required=True) + parser_crawling.add_argument('--pages_end', type=int, required=True) + parser_crawling.add_argument('--pages_start', type=int, required=True) + parser_crawling.add_argument('--cookie', type=str, required=True) + + parser_login = subparsers.add_parser('login') + parser_login.add_argument('--user', type=str, required=True) + parser_login.add_argument('--password', type=str, required=True) + + parser_register = subparsers.add_parser('register') + parser_register.add_argument('--user', type=str, required=True) + parser_register.add_argument('--password', type=str, required=True) + + args = parser.parse_args() + + request = dict() + + if args.action == 'crawling': + request = {'action': 'crawl zhiwang', 'word': args.word, 'pages_start': args.pages_start, + 'pages_end': args.pages_end, 'cookie': args.cookie} + elif args.action == 'login' or args.action == 'register': + request = {'action': args.action, 'user': args.user, 'password': args.password} + response = send_request(args.ip, args.port, request) + + if args.action == 'crawling': + receive_response() diff --git a/ui/connect2.py b/ui/connect2.py new file mode 100644 index 0000000..e948476 --- /dev/null +++ b/ui/connect2.py @@ -0,0 +1,106 @@ +import json +import socket +import struct +import argparse +from json import JSONEncoder, JSONDecoder + + +def parse_request(client_socket: socket.socket): + request_header_size = struct.unpack("!Q", read_bytes(client_socket, 8))[0] + request_map = json.JSONDecoder().decode(read_bytes(client_socket, request_header_size).decode("utf-8")) + return request_map + +def generate_request(request_info) -> 'bytes': + """ + 根据传入的dict生成请求 + 请求包含 8字节头长度+头数据 + :param request_info: dict + :return: bytes 请求数据 + """ + request_bytes = JSONEncoder().encode(request_info).encode("utf-8") + return struct.pack("!Q", len(request_bytes)) + request_bytes + + +def read_bytes(s: 'socket.socket', size: 'int') -> 'bytes': + """ + 从socket读取size个字节 + :param s:套接字 + :param size:要读取的大小 + :return:读取的字节数,在遇到套接字关闭的情况下,返回的数据的长度可能小于 size + """ + data = ''.encode('utf-8') + while len(data) < size: + rsp_data = s.recv(size - len(data)) + data += rsp_data + if len(rsp_data) == 0: + break + return data + + +def send_request(ip, port, request_info): + with socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) as socket_to_server: + socket_to_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + socket_to_server.bind(('', 9005)) + socket_to_server.connect((ip, int(port))) + + full_request = generate_request(request_info) + + socket_to_server.sendall(full_request) + + responseJson = JSONDecoder().decode( + read_bytes(socket_to_server, struct.unpack('!Q', socket_to_server.recv(8))[0]).decode( + "utf-8")) + + return responseJson + + +def receive_response(): + server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) + server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + server_socket.bind(('', 9005)) + server_socket.listen() + while True: + client_socket, _ = server_socket.accept() + request_map = parse_request(client_socket) + if request_map['type'] == 'response': + print("receiving response:\n" + json.dumps(request_map, ensure_ascii=False)) + break + + +if __name__ == '__main__': + # 使用方法 python .\connect.py --ip 127.0.0.1 --port 7777 + # crawling --word computer --cookie 95f94e1ab71bdf96b85fef6e8f746c58eeb5f9fa --pages_start 1 --pages_end 10 + parser = argparse.ArgumentParser('connect-manager') + parser.add_argument('--ip', type=str, required=True) + parser.add_argument('--port', type=str, required=True) + subparsers = parser.add_subparsers(help='provide actions including crawling, login, register', + dest='action') # 创建子解析器 + + parser_crawling = subparsers.add_parser('crawling') + parser_crawling.add_argument('--word', type=str, required=True) + parser_crawling.add_argument('--pages_end', type=int, required=True) + parser_crawling.add_argument('--pages_start', type=int, required=True) + parser_crawling.add_argument('--cookie', type=str, required=True) + + parser_login = subparsers.add_parser('login') + parser_login.add_argument('--user', type=str, required=True) + parser_login.add_argument('--password', type=str, required=True) + + parser_register = subparsers.add_parser('register') + parser_register.add_argument('--user', type=str, required=True) + parser_register.add_argument('--password', type=str, required=True) + + args = parser.parse_args() + + request = dict() + + if args.action == 'crawling': + request = {'action': 'crawl zhiwang', 'word': args.word, 'pages_start': args.pages_start, + 'pages_end': args.pages_end, 'cookie': args.cookie} + elif args.action == 'login' or args.action == 'register': + request = {'action': args.action, 'user': args.user, 'password': args.password} + response = send_request(args.ip, args.port, request) + print(response['cookie']) + + if args.action == 'crawling': + receive_response() diff --git a/ui/default.css b/ui/default.css new file mode 100644 index 0000000..95ddd8f --- /dev/null +++ b/ui/default.css @@ -0,0 +1,183 @@ +*{ + padding: 0; + margin:0; + box-sizing: border-box; + font-family: 'Poppins',sans-serif; +} + +/* 设置整个表单参数 (父盒子)*/ + +section { + position: relative; + min-height: 100vh; + background-image:url(1.jpg); + display: flex; + justify-content: center; + align-items: center; + padding: 20px; +} + +section .container { + position: relative; + width: 550px; + height: 350px; + background: rgb(17, 168, 168); + box-shadow: 0 15px 50px rgba(0, 0, 0, 0.1); + overflow: hidden; +} + +section .container .user{ + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; +} + +/* 更改图片 (左侧)*/ +section .container .imgBx{ + position: relative; + width: 50%; + height: 100%; + /* background: #fff; */ + transition: .5s; +} + +section .container .user .imgBx img{ + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; +} + +/* 右侧表单盒子 */ + +section .container .user .formBx { + position: relative; + width: 50%; + height: 100%; + background: #fff; + display: flex; + justify-content: center; + align-items: center; + padding: 40px; + transition: .5s; +} + +/* h2 */ + +section .container .user .formBx form h2{ + font-size: 18px; + font-weight: 600; + text-transform: uppercase;/*大小*/ + letter-spacing: 2px;/* 间距*/ + text-align: center; + width: 100%; + margin-bottom: 10px; + color: #555; +} + +/* 表单文字属性 */ + +section .container .user .formBx form input{ + position: relative; + width: 100%; + padding: 10px; + background: #f5f5f5; + color: #333; + border: none; + outline:none; + box-shadow:none; + margin: 8px 0; + font-size: 14px; + letter-spacing:1px; + font-weight: 300; +} + +/* 为登录设置样式 */ + +section .container .user .formBx form input[type="submit"]{ + max-width: 100px; + background: #677eff; + color:#fff; + cursor:pointer; + font-size: 14px; + font-weight: 500; + letter-spacing: 1px; + transition: .5s; +} + +/* 没有账号时 */ + +section .container .user .formBx form .signup{ + position: relative; + margin-top: 20px; + font-size: 12px; + letter-spacing: 1px; + color: #555; + text-transform: uppercase; + font-weight: 300; +} + +section .container .user .formBx form .signup a{ + font-weight: 600; + text-decoration: none; + color: #677eff; +} +section .container .singupBx { + pointer-events: none; +} + +section .container.active .singupBx { + pointer-events: initial; +} + +section .container .singupBx .formBx { + left: 100%; +} + +section .container.active .singupBx .formBx { + left: 0; +} + +section .container .singupBx .imgBx { + left: -100%; +} + +section .container.active .singupBx .imgBx { + left: 0; +} + + +section .container .singinBx .formBx { + left: 0; +} + +section .container.active .singinBx .formBx { + left: 100%; +} + +section .container .singinBx .imgBx { + left: 0; +} + +section .container.active .singinBx .imgBx { + left: 100%; +} + +@media (max-width: 991px) { + section .container { + max-width: 400px; + } + + section .container .imgBx { + display: none; + } + + section .container .user .formBx { + width: none; + } +} diff --git a/ui/login.bat b/ui/login.bat deleted file mode 100644 index 6ad6b23..0000000 --- a/ui/login.bat +++ /dev/null @@ -1 +0,0 @@ -python .\connect.py --ip 127.0.0.1 --port 7777 login --user liuxiaoyu --password 113818 diff --git a/ui/login.html b/ui/login.html new file mode 100644 index 0000000..12ecba7 --- /dev/null +++ b/ui/login.html @@ -0,0 +1,54 @@ + + + + + + 登录 + + + + + +
+ + + +
+
+
+
+
+

登录

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

注册

+ + + + +
+
+
+
+ +
+
+ + + diff --git a/ui/login.js b/ui/login.js index a8df7f0..5f62662 100644 --- a/ui/login.js +++ b/ui/login.js @@ -1,21 +1,48 @@ -var fs = require("fs"); -var bodyParser = require('body-parser'); // 这个模块是获取post请求传过来的数据。 -var multer = require('multer'); //multer - node.js 中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。 -var express=require('express'); -var app=express(); -var mysql=require('mysql'); +var express = require('express') +var path = require("path"); +var mysql = require('mysql') +//var alert = require('alert') +//var router = express.Router() +var app = express() +const {get} = require('http') +const multer = require('multer') +var childProcess = require('child_process') +const bodyParser = require('body-parser') +const fs = require('fs') +//const document = require('document') +var jsdom = require("jsdom"); +const { NULL } = require('mysql/lib/protocol/constants/types'); +var JSDOM = jsdom.JSDOM; +var document = new JSDOM().window.document; var execSync = require("child_process").execSync; -var fs = require("fs"); +var sys = require('sys'); +//var exec = require('child_process').exec +//const cp = require('child_process'); +var session = require("express-session"); +var FileStore = require('session-file-store')(session); +var identityKey = 'skey'; +app.use( + session({ + name: identityKey, + secret: "jhh", + store: new FileStore(), //加密存储 + resave: false, //客户端并行请求是否覆盖 + saveUninitialized: true, //初始化session存储 + cookie: { + maxAge: 1000*60*10 // 这一条 是控制 sessionID 的过期时间的!!! + }, + }) +); +app.use(express.json()) +app.use(express.urlencoded({ extended: true })) +app.use(express.static('./')) /** * 配置MySql */ var connection = mysql.createConnection({ - // host : '192.168.43.64', - // host : '10.129.16.173', - host : '127.0.0.1', + host : '192.168.43.65', user : 'root', - // password : '427318Aa', - password : 'xwdjzwy5252', + password : '427318Aa', database : 'test', port:'3306' }); @@ -24,19 +51,25 @@ app.use('/public', express.static('public')); // 设置静态文件的中间件 app.use(bodyParser.urlencoded({ extended: false })); // 判断请求体是不是json,不是的话把请求体转化为对象 app.use(multer({ dest: 'tmp/' }).array('file'));//multer中间件用于上传表单型数据,基本属性为dest,会添加file对象到request对象中,包含对象表单上传的文件信息 app.get('/',function (req,res) { - res.sendfile(__dirname + "/public/" + "index.html" ); + res.sendfile(__dirname + "/login.html" ); }) - +/*app.get('/',function(req,res){ + res.sendFile(path.join(__dirname,"/login.html")) + //_dirname:当前文件的路径,path.join():合并路径 +}) /** * 实现登录验证功能 */ +var ppcookie = '' +var ppname = '' +var pppwd = '' app.get('/login', function (req, res) { var response = { "name":req.query.name, "password":req.query.pwd, }; /*var selectSQL = "select * from UserInfoTest where User_Name = '" + name + "' and User_Password = '" + password + "'";*/ - var selectSQL = "select User_Name,User_password from UserInfoTest where User_Name = '" + req.query.name + "' and User_Password = '" + req.query.pwd + "'"; + var selectSQL = "select uname,pwd from user where uname = '" + req.query.name + "' and pwd = '" + req.query.pwd + "'"; connection.query(selectSQL, function (err, result) { if (err) { console.log('[login ERROR] - ', err.message); @@ -48,9 +81,44 @@ app.get('/login', function (req, res) { } else { console.log(result); - console.log("OK"); - - res.redirect("/public/" + "ok.html");//重定向到网页 + console.log("OK"+'123'); + ppname = req.query.name + pppwd = req.query.pwd + // res.redirect("/public/" + "ok1.html") + // dummy = childProcess.spawn('python' ,['./tmp.py'] ,{cwd: path.resolve(__dirname, './')}) + const ls = childProcess.spawn('python3' ,['./connect.py', '--ip','192.168.43.241', '--port','7777','login','--user',req.query.name,'--password',req.query.pwd],{cwd: path.resolve(__dirname, './')}) + ls.stdout.on('data', function (data){ + //console.log('sdjfksjdfklajklfdjalkjfklda') + //req.session.cookie = data.toString().trim(); + var sess = req.session; + sess.regenerate(function(err){ //添加session信息 + req.session.name = data.toString().trim(); + req.session.user = req.query.name; + req.session.pwd = req.query.pwd; + }) + var a = data.toString() + a = a.trim() + ppcookie = a + console.log(ppcookie); + var start = new Date(); + setTimeout(function(){ + console.log(req.session.name); + console.log(req.session.user); + console.log(req.session.pwd); + res.redirect("/public/" + "ok1.html") + },2000) + // console.log(a[]); + }) + //execute('python tmp.py') + // execute('python connect.py --ip 10.129.16.173 --port 7777 login --user wufayuan --password 113818'); + /* const ls = childProcess.spawn('python3' ,['connect.py', '--ip','192.168.43.241', '--port','7777','login','--user','wufayuan','--password','113818'],{cwd: path.resolve(__dirname, './') + }) + ls.stdout.on('data', function(data){ + sys.print(data); + }); + ls.stderr.on('data', (data) => { + console.error(`stderr: ${data}`); + });*/ } }); console.log(response); @@ -63,18 +131,18 @@ app.get('/login', function (req, res) { res.sendfile(__dirname + "/public/" + "ok.html" ); }) })**/ - + app.get('/register.html',function (req,res) { - res.sendfile(__dirname+"/public/"+"register.html"); + res.sendfile(__dirname+"/lndex.html"); }) - + /** * 实现注册功能 */ app.get('/register',function (req,res) { var name=req.query.name; var pwd = req.query.pwd; - var selectSQL = "select User_Name,User_password from UserInfoTest where User_Name = '" + req.query.name+"'"; + var selectSQL = "select uname,pwd from user where uname = '" + req.query.name+"'"; connection.query(selectSQL, function (err, result) { if (err) { console.log('[login ERROR] - ', err.message); @@ -84,47 +152,70 @@ app.get('/register',function (req,res) { res.send("The account exist!"); } else { - var user = { User_Name: name, User_Password: pwd }; - connection.query('insert into UserInfoTest set ?', user, function (err, rs) { - if (err) throw err; + var user = { uname: name, pwd: pwd ,finame:NULL,email:NULL,phone:NULL}; + connection.query('insert into user set ?', user, function (err, rs) { + // if (err) throw err; console.log('ok'); - res.redirect("/public/" + "index.html"); + res.redirect('login.html'); + const ls = childProcess.spawn('python3' ,['./connect.py', '--ip','192.168.43.241', '--port','7777','register','--user',name,'--password',pwd],{cwd: path.resolve(__dirname, './') + }) + }) } }) }) -app.get('/ok.html',function (req,res) { - res.redirect("/public/"+"ok.html"); +app.get('/ok1.html',function (req,res) { + res.redirect("/public/"+"ok1.html"); }) -var server=app.listen(3000,function () { +/*var server=app.listen(3300,function () { console.log("start"); -}) +})*/ - // 上传文件api -app.post('/file_upload', function (req, res) { +//const express = require('express'); +const timeout = require('connect-timeout'); +const { createProxyMiddleware } = require('http-proxy-middleware'); + + +// HOST 指目标地址 PORT 服务端口 +const HOST = 'http://192.168.43.64:7777', PORT = '3300'; + +// 超时时间 +const TIME_OUT = 1000 * 1e3; + +// 设置端口 +app.set('port', PORT); + +// 设置超时 返回超时响应 +app.use(timeout(TIME_OUT)); +app.use((req, res, next) => { + if (!req.timedout) next(); +}); + +// 设置静态资源路径 +app.use('/', express.static('static')); + +// 反向代理(这里把需要进行反代的路径配置到这里即可) +// eg:将/api 代理到 ${HOST}/api +// app.use(createProxyMiddleware('/api', { target: HOST })); +// 自定义代理规则 +app.use(createProxyMiddleware('/api', { + target: HOST, // target host + changeOrigin: true, // needed for virtual hosted sites + ws: true, // proxy websockets + pathRewrite: { + '^/api': '', // rewrite path + } +})); +// 监听端口 +app.listen(app.get('port'), () => { + console.log(`server running ${PORT }`); +}); - console.log(req.files[0]); // 上传的文件信息 - var des_file = __dirname + "/0/" + req.files[0].originalname; - fs.readFile( req.files[0].path, function (err, data) { - fs.writeFile(des_file, data, function (err) { - if( err ){ - console.log( err ); - }else{ - response = { - message:'File uploaded successfully', - filename:req.files[0].originalname - }; - } - console.log( response ); - res.end( JSON.stringify( response ) ); - }); - }); -}) function execute(cmd) { //调用cmd命令 execSync(cmd, { cwd: './' }, function (error, stdout, stderr) { @@ -136,17 +227,154 @@ function execute(cmd) { //调用cmd命令 } }) } -app.post('/check', function (req, res) { - execute('python connect.py --ip 127.0.0.1 --port 7777 crawling --word computer --cookie god --pages_start 1 --pages_end 4'); - fs.readFile('./result.json', 'utf-8', function (err, data) { - if (err) { - console.error(err); - } - else { - res.send(data); - } - }); +app.get('/check', function (req, res) { + if(!!req.session.user){ + var logo=req.query.logo; + console.log(logo); + // console.log(ppcookie); + a = ppcookie + console.log(a); + //const ls = childProcess.spawn('python3' ,['./connect.py','--word',logo,'--cookie',a]) + const ls = childProcess.spawn('python3' ,['./tmp.py','--ip','192.168.43.241','--port','7777','crawling','--word',logo,'--pages_start',1,'--pages_end',3,'--cookie',req.session.name]) + ls.stdout.on('data', (data) => { + console.log(`stdout: ${data}`); + }); + ls.stderr.on('data', (data) => { + console.error(`stderr: ${data}`); + }); + + ls.on('close', function(code){ + res.redirect("/tmmps.html") + })} + else{ + res.send('未登录') + } + /*exec('python connect.py --ip 10.129.16.173 --port 7777 crawling --word '+logo +' --pages_start 1 --pages_end 3 --cookie '+a, { + // timeout: 0, // 超时时间 + cwd: path.resolve(__dirname, './'), // 可以改变当前的执行路径 + }, function (err, stdout, stderr) { + res.redirect("/tmmps.html") + return + + // 执行结果 + })*/ + + //execute('python connect.py --ip 192.168.43.64 --port 7777 crawling --word '+logo +' --pages_start 1 --pages_end 5 --cookie '+a); + //execute('python connect.py --ip 192.168.43.65 --port 7777 crawling --word computer --cookie b07f9e6461343a07635438925b0b93f9e0f9f084 --pages_start 1 --pages_end 3'); }) - +app.post('/cook', function (req, res) { + console.log(req.session.user); + res.redirect('/public/ok2.html'); +}) +app.post('/cook2', function (req, res) { + req.session.destroy(function(err) { + res.redirect('/login.html'); + }) + ppname = '0' + pppwd = '0' +}) +app.get('/check1',function (req, res) { + console.log(req.session.user) + if(!!req.session.user){ + const ls = childProcess.spawn('python3' ,['./ceshi03.py','--id',req.session.user],{cwd: path.resolve(__dirname, './') + }) + ls.stdout.on('data', (data) => { + console.log(`stdout: ${data}`); + }); + ls.stderr.on('data', (data) => { + console.error(`stderr: ${data}`); + }); + ls.on('close', function(code){ + res.redirect("/comment.html") + return; + })} + else{ + res.send('未登录') + } +}) +app.get('/std',function (req, res) { + if(!!req.session.user){ + console.log(req.session.user); + var finame=req.query.finame; + var email = req.query.email; + var phone = req.query.phone; + var selectSQL = "select uname,pwd from user where uname = '" + req.session.user + "' and pwd = '" + req.session.pwd + "'" + connection.query(selectSQL, function (err, result) { + console.log(req.session.user); + res.redirect('/public/ok1.html'); + var user = {finame: finame,email:email, phone:phone}; + sql = "update user set ? where uname = '" + req.session.user + "' and pwd = '" + req.session.pwd + "'" + connection.query(sql, user, function (err, rs) { + // if (err) throw err; + console.log('ok'); + }) + })} + else{ + res.send('未登录') + } +}) +app.post('/std1',function (req, res) { + res.redirect('/public/ok3.html') +}) +app.post('/std3',function (req, res) { + console.log('req.session.user'); + var delSql = "DELETE FROM user_info where user_name = "+ req.session.user; + connection.query(delSql,function (err, result) { + if(err){ + console.log('[DELETE ERROR] - ',err.message); + return; + } +}); + var delSql1 = "DELETE FROM user where uname = "+ req.session.user; + connection.query(delSql1,function (err, result) { + if(err){ + console.log('[DELETE ERROR] - ',err.message); + return; + //res.redirect('/login.html') + } + }); + res.redirect('/login.html') +}) +app.get('/std2',function (req, res) { + var pwd1=req.query.pwd1; + var pwd2=req.query.pwd2; + var pwd3=req.query.pwd3; + if(pwd3 != pwd2){ + console.log("error") + res.send("两次输入的密码不一样"); + } + if(pwd3 == pwd2){ + var selectSQL = "select pwd from user where uname = '" + req.session.user + "' and pwd = '" + req.session.pwd + "'" + connection.query(selectSQL, function (err, result) { + if (req.session.pwd != pwd1) { + res.send("当前密码输入错误"); + console.log("error") + } + if(req.session.pwd == pwd1){ + var user = {pwd:pwd2}; + sql = "update user set ? where uname = '" + req.session.user + "' and pwd = '" + req.session.pwd + "'" + connection.query(sql, user, function (err, rs) { + // if (err) throw err; + console.log('ok'); + res.redirect('/public/ok1.html'); + pppwd = pwd2 + + }) + var user1 = {user_password:pwd2} + q = "update user_info set ? where user_name = '" + req.session.user + "' and user_password = '" + req.session.pwd + "'" + connection.query(q, user1, function (err, rs) { + // if (err) throw err; + console.log('ok'); + //res.redirect('/public/ok1.html'); + //pppwd = pwd2 + + }) + } + + }) + + + } +}) diff --git a/ui/login1.js b/ui/login1.js new file mode 100644 index 0000000..92389f8 --- /dev/null +++ b/ui/login1.js @@ -0,0 +1,372 @@ +var express = require('express') +var path = require("path"); +var mysql = require('mysql') +//var alert = require('alert') +//var router = express.Router() +var app = express() +const {get} = require('http') +const multer = require('multer') +var childProcess = require('child_process') +const bodyParser = require('body-parser') +const fs = require('fs') +//const document = require('document') +var jsdom = require("jsdom"); +const { NULL } = require('mysql/lib/protocol/constants/types'); +var JSDOM = jsdom.JSDOM; +var document = new JSDOM().window.document; +var execSync = require("child_process").execSync; +var sys = require('sys'); +//var exec = require('child_process').exec +//const cp = require('child_process'); +var session = require("express-session"); +var FileStore = require('session-file-store')(session); +var identityKey = 'skey'; +app.use( + session({ + name: identityKey, + secret: "jhh", + store: new FileStore(), //加密存储 + resave: false, //客户端并行请求是否覆盖 + saveUninitialized: true, //初始化session存储 + cookie: { + maxAge: 1000*60*10 // 这一条 是控制 sessionID 的过期时间的!!! + }, + }) +); +app.use(express.json()) +app.use(express.urlencoded({ extended: true })) +app.use(express.static('./')) +/** + * 配置MySql + */ +var connection = mysql.createConnection({ + host : '192.168.43.64', + user : 'root', + password : '427318Aa', + database : 'test', + port:'3306' +}); +connection.connect(); +app.use('/public', express.static('public')); // 设置静态文件的中间件 +app.use(bodyParser.urlencoded({ extended: false })); // 判断请求体是不是json,不是的话把请求体转化为对象 +app.use(multer({ dest: 'tmp/' }).array('file'));//multer中间件用于上传表单型数据,基本属性为dest,会添加file对象到request对象中,包含对象表单上传的文件信息 +app.get('/',function (req,res) { + res.sendfile(__dirname + "/login.html" ); +}) +/*app.get('/',function(req,res){ + res.sendFile(path.join(__dirname,"/login.html")) + //_dirname:当前文件的路径,path.join():合并路径 +}) +/** + * 实现登录验证功能 + */ +var ppcookie = '' +var ppname = '' +var pppwd = '' +app.get('/login', function (req, res) { + var response = { + "name":req.query.name, + "password":req.query.pwd, + }; + /*var selectSQL = "select * from UserInfoTest where User_Name = '" + name + "' and User_Password = '" + password + "'";*/ + var selectSQL = "select uname,pwd from user where uname = '" + req.query.name + "' and pwd = '" + req.query.pwd + "'"; + connection.query(selectSQL, function (err, result) { + if (err) { + console.log('[login ERROR] - ', err.message); + return; + } + if (result == '') { + console.log("帐号密码错误"); + res.end("The account does not exist or the password is wrong!"); + } + else { + console.log(result); + console.log("OK"+'123'); + ppname = req.query.name + pppwd = req.query.pwd + // res.redirect("/public/" + "ok1.html") + // dummy = childProcess.spawn('python' ,['./tmp.py'] ,{cwd: path.resolve(__dirname, './')}) + const ls = childProcess.spawn('python3' ,['./connect.py', '--ip','192.168.43.241', '--port','7777','login','--user',req.query.name,'--password',req.query.pwd],{cwd: path.resolve(__dirname, './')}) + ls.stdout.on('data', function (data){ + //console.log('sdjfksjdfklajklfdjalkjfklda') + //req.session.cookie = data.toString().trim(); + var sess = req.session; + sess.regenerate(function(err){ //添加session信息 + req.session.name = data.toString().trim(); + req.session.user = req.query.name; + req.session.pwd = req.query.pwd; + }) + var a = data.toString() + a = a.trim() + ppcookie = a + console.log(ppcookie); + var start = new Date(); + setTimeout(function(){ + console.log(req.session.name); + console.log(req.session.user); + console.log(req.session.pwd); + res.redirect("/public/" + "ok1.html") + },2000) + // console.log(a[]); + }) + //execute('python tmp.py') + // execute('python connect.py --ip 10.129.16.173 --port 7777 login --user wufayuan --password 113818'); + /* const ls = childProcess.spawn('python3' ,['connect.py', '--ip','192.168.43.241', '--port','7777','login','--user','wufayuan','--password','113818'],{cwd: path.resolve(__dirname, './') + }) + ls.stdout.on('data', function(data){ + sys.print(data); + }); + ls.stderr.on('data', (data) => { + console.error(`stderr: ${data}`); + });*/ + } + }); + console.log(response); +}) + + /**connection.query(selectSQL,function (err,rs) { + if (err) throw err; + console.log(rs); + console.log('OK'); + res.sendfile(__dirname + "/public/" + "ok.html" ); + }) +})**/ + +app.get('/register.html',function (req,res) { + res.sendfile(__dirname+"/lndex.html"); +}) + +/** + * 实现注册功能 + */ +app.get('/register',function (req,res) { + var name=req.query.name; + var pwd = req.query.pwd; + var selectSQL = "select uname,pwd from user where uname = '" + req.query.name+"'"; + connection.query(selectSQL, function (err, result) { + if (err) { + console.log('[login ERROR] - ', err.message); + return; + } + if (result.length) { + res.send("The account exist!"); + } + else { + var user = { uname: name, pwd: pwd ,finame:NULL,email:NULL,phone:NULL}; + connection.query('insert into user set ?', user, function (err, rs) { + // if (err) throw err; + console.log('ok'); + res.redirect('login.html'); + const ls = childProcess.spawn('python3' ,['./connect.py', '--ip','192.168.43.241', '--port','7777','register','--user',name,'--password',pwd],{cwd: path.resolve(__dirname, './') + }) + + }) + } + }) +}) + +app.get('/ok1.html',function (req,res) { + res.redirect("/public/"+"ok1.html"); +}) + + + +var server=app.listen(3300,function () { + console.log("start"); +}) + +//const express = require('express'); +/*const timeout = require('connect-timeout'); +const { createProxyMiddleware } = require('http-proxy-middleware'); + + +// HOST 指目标地址 PORT 服务端口 +const HOST = 'http://192.168.43.64:7777', PORT = '3300'; + +// 超时时间 +const TIME_OUT = 1000 * 1e3; + +// 设置端口 +app.set('port', PORT); + +// 设置超时 返回超时响应 +app.use(timeout(TIME_OUT)); +app.use((req, res, next) => { + if (!req.timedout) next(); +}); + +// 设置静态资源路径 +app.use('/', express.static('static')); + +// 反向代理(这里把需要进行反代的路径配置到这里即可) +// eg:将/api 代理到 ${HOST}/api +// app.use(createProxyMiddleware('/api', { target: HOST })); +// 自定义代理规则 +app.use(createProxyMiddleware('/api', { + target: HOST, // target host + changeOrigin: true, // needed for virtual hosted sites + ws: true, // proxy websockets + pathRewrite: { + '^/api': '', // rewrite path + } +})); +// 监听端口 +app.listen(app.get('port'), () => { + console.log(`server running ${PORT }`); +});*/ + + + +function execute(cmd) { //调用cmd命令 + execSync(cmd, { cwd: './' }, function (error, stdout, stderr) { + if (error) { + console.error(error); + } + else { + console.log("executing success!") + } + }) +} +app.get('/check', function (req, res) { + if(!!req.session.user){ + var logo=req.query.logo; + console.log(logo); + // console.log(ppcookie); + a = ppcookie + console.log(a); + //const ls = childProcess.spawn('python3' ,['./connect.py','--word',logo,'--cookie',a]) + const ls = childProcess.spawn('python3' ,['./tmp.py','--ip','192.168.43.241','--port','7777','crawling','--word',logo,'--pages_start',1,'--pages_end',3,'--cookie',req.session.name]) + ls.stdout.on('data', (data) => { + console.log(`stdout: ${data}`); + }); + ls.stderr.on('data', (data) => { + console.error(`stderr: ${data}`); + }); + + ls.on('close', function(code){ + res.redirect("/tmmps.html") + })} + else{ + res.send('未登录') + } + /*exec('python connect.py --ip 10.129.16.173 --port 7777 crawling --word '+logo +' --pages_start 1 --pages_end 3 --cookie '+a, { + // timeout: 0, // 超时时间 + cwd: path.resolve(__dirname, './'), // 可以改变当前的执行路径 + }, function (err, stdout, stderr) { + res.redirect("/tmmps.html") + return + + // 执行结果 + })*/ + + //execute('python connect.py --ip 192.168.43.64 --port 7777 crawling --word '+logo +' --pages_start 1 --pages_end 5 --cookie '+a); + //execute('python connect.py --ip 192.168.43.65 --port 7777 crawling --word computer --cookie b07f9e6461343a07635438925b0b93f9e0f9f084 --pages_start 1 --pages_end 3'); + +}) +app.post('/cook', function (req, res) { + console.log(req.session.user); + res.redirect('/public/ok2.html'); +}) + +app.post('/cook2', function (req, res) { + req.session.destroy(function(err) { + res.redirect('/login.html'); + }) + ppname = '0' + pppwd = '0' +}) +app.get('/check1',function (req, res) { + console.log(req.session.user) + if(!!req.session.user){ + const ls = childProcess.spawn('python3' ,['./ceshi03.py','--id',req.session.user],{cwd: path.resolve(__dirname, './') + }) + ls.stdout.on('data', (data) => { + console.log(`stdout: ${data}`); + }); + ls.stderr.on('data', (data) => { + console.error(`stderr: ${data}`); + }); + ls.on('close', function(code){ + res.redirect("/comment.html") + return; + })} + else{ + res.send('未登录') + } +}) +app.get('/std',function (req, res) { + if(!!req.session.user){ + console.log(req.session.user); + var finame=req.query.finame; + var email = req.query.email; + var phone = req.query.phone; + var selectSQL = "select uname,pwd from user where uname = '" + req.session.user + "' and pwd = '" + req.session.pwd + "'" + connection.query(selectSQL, function (err, result) { + console.log(req.session.user); + res.redirect('/public/ok1.html'); + var user = {finame: finame,email:email, phone:phone}; + sql = "update user set ? where uname = '" + req.session.user + "' and pwd = '" + req.session.pwd + "'" + connection.query(sql, user, function (err, rs) { + // if (err) throw err; + console.log('ok'); + }) + })} + else{ + res.send('未登录') + } +}) +app.post('/std1',function (req, res) { + res.redirect('/public/ok3.html') +}) +app.post('/std3',function (req, res) { + var delSql = "DELETE FROM user_info where user_name = '"+ ppname; + connection.query(delSql,function (err, result) { + if(err){ + console.log('[DELETE ERROR] - ',err.message); + return; + } + +}); + res.redirect('/public/ok3.html') +}) +app.get('/std2',function (req, res) { + var pwd1=req.query.pwd1; + var pwd2=req.query.pwd2; + var pwd3=req.query.pwd3; + if(pwd3 != pwd2){ + console.log("error") + res.send("两次输入的密码不一样"); + } + if(pwd3 == pwd2){ + var selectSQL = "select pwd from user where uname = '" + req.session.user + "' and pwd = '" + req.session.pwd + "'" + connection.query(selectSQL, function (err, result) { + if (req.session.pwd != pwd1) { + res.send("当前密码输入错误"); + console.log("error") + } + if(req.session.pwd == pwd1){ + var user = {pwd:pwd2}; + sql = "update user set ? where uname = '" + req.session.user + "' and pwd = '" + req.session.pwd + "'" + connection.query(sql, user, function (err, rs) { + // if (err) throw err; + console.log('ok'); + res.redirect('/public/ok1.html'); + pppwd = pwd2 + + }) + var user1 = {user_password:pwd2} + q = "update user_info set ? where user_name = '" + req.session.user + "' and user_password = '" + req.session.pwd + "'" + connection.query(q, user1, function (err, rs) { + // if (err) throw err; + console.log('ok'); + //res.redirect('/public/ok1.html'); + //pppwd = pwd2 + + }) + } + + }) + + + } +}) diff --git a/ui/login2.js b/ui/login2.js new file mode 100644 index 0000000..425c5af --- /dev/null +++ b/ui/login2.js @@ -0,0 +1,349 @@ +var express = require('express') +var path = require("path"); +var mysql = require('mysql') +var alert = require('alert') +var router = express.Router() +var app = express() +const {get} = require('http') +const multer = require('multer') +var childProcess = require('child_process') +const bodyParser = require('body-parser') +const fs = require('fs') +app.use(express.static('./')) +//const document = require('document') +var jsdom = require("jsdom"); +const { NULL } = require('mysql/lib/protocol/constants/types'); +var JSDOM = jsdom.JSDOM; +var document = new JSDOM().window.document; +var execSync = require("child_process").execSync; +var sys = require('sys'); +var exec = require('child_process').exec +const cp = require('child_process'); + +/** + * 配置MySql + */ +var connection = mysql.createConnection({ + host : '10.129.16.173', + user : 'root', + password : '427318Aa', + database : 'test', + port:'3306' +}); +connection.connect(); +app.use('/public', express.static('public')); // 设置静态文件的中间件 +app.use(bodyParser.urlencoded({ extended: false })); // 判断请求体是不是json,不是的话把请求体转化为对象 +app.use(multer({ dest: 'tmp/' }).array('file'));//multer中间件用于上传表单型数据,基本属性为dest,会添加file对象到request对象中,包含对象表单上传的文件信息 +app.get('/',function (req,res) { + res.sendfile(__dirname + "/login.html" ); +}) +/*app.get('/',function(req,res){ + res.sendFile(path.join(__dirname,"/login.html")) + //_dirname:当前文件的路径,path.join():合并路径 +}) +/** + * 实现登录验证功能 + */ +var ppcookie = '' +var ppname = '' +var pppwd = '' +app.get('/login', function (req, res) { + var response = { + "name":req.query.name, + "password":req.query.pwd, + }; + /*var selectSQL = "select * from UserInfoTest where User_Name = '" + name + "' and User_Password = '" + password + "'";*/ + var selectSQL = "select uname,pwd from user where uname = '" + req.query.name + "' and pwd = '" + req.query.pwd + "'"; + connection.query(selectSQL, function (err, result) { + if (err) { + console.log('[login ERROR] - ', err.message); + return; + } + if (result == '') { + console.log("帐号密码错误"); + res.end("The account does not exist or the password is wrong!"); + } + else { + console.log(result); + console.log("OK"+'123'); + ppname = req.query.name + pppwd = req.query.pwd + res.redirect("/public/" + "ok1.html");//重定向到网页 + // dummy = childProcess.spawn('python' ,['./tmp.py'] ,{cwd: path.resolve(__dirname, './')}) + const ls = childProcess.spawn('python3' ,['./connect2.py', '--ip','10.129.16.173', '--port','7777','login','--user',req.query.name,'--password',req.query.pwd],{cwd: path.resolve(__dirname, './')}) + ls.stdout.on('data', function (data){ + //console.log('sdjfksjdfklajklfdjalkjfklda') + var a = data.toString() + a = a.trim() + ppcookie = a + console.log(ppcookie); + // console.log(a[]); + }) + //execute('python tmp.py') + // execute('python connect.py --ip 10.129.16.173 --port 7777 login --user wufayuan --password 113818'); + /* const ls = childProcess.spawn('python3' ,['connect.py', '--ip','192.168.43.241', '--port','7777','login','--user','wufayuan','--password','113818'],{cwd: path.resolve(__dirname, './') + }) + ls.stdout.on('data', function(data){ + sys.print(data); + }); + ls.stderr.on('data', (data) => { + console.error(`stderr: ${data}`); + });*/ + } + }); + console.log(response); +}) + + /**connection.query(selectSQL,function (err,rs) { + if (err) throw err; + console.log(rs); + console.log('OK'); + res.sendfile(__dirname + "/public/" + "ok.html" ); + }) +})**/ + +app.get('/register.html',function (req,res) { + res.sendfile(__dirname+"/lndex.html"); +}) + +/** + * 实现注册功能 + */ +app.get('/register',function (req,res) { + var name=req.query.name; + var pwd = req.query.pwd; + var selectSQL = "select uname,pwd from user where uname = '" + req.query.name+"'"; + connection.query(selectSQL, function (err, result) { + if (err) { + console.log('[login ERROR] - ', err.message); + return; + } + if (result.length) { + res.send("The account exist!"); + } + else { + var user = { uname: name, pwd: pwd ,finame:NULL,email:NULL,phone:NULL}; + connection.query('insert into user set ?', user, function (err, rs) { + // if (err) throw err; + console.log('ok'); + res.redirect('login.html'); + const ls = childProcess.spawn('python3' ,['./connect2.py', '--ip','10.129.16.173', '--port','7777','register','--user',name,'--password',pwd],{cwd: path.resolve(__dirname, './') + }) + + }) + } + }) +}) + +app.get('/ok1.html',function (req,res) { + res.redirect("/public/"+"ok1.html"); +}) + + + +var server=app.listen(3300,function () { + console.log("start"); +}) + +//const express = require('express'); +/*const timeout = require('connect-timeout'); +const { createProxyMiddleware } = require('http-proxy-middleware'); + + +// HOST 指目标地址 PORT 服务端口 +const HOST = 'http://10.129.77.113:7777', PORT = '3300'; + +// 超时时间 +const TIME_OUT = 30 * 1e3; + +// 设置端口 +app.set('port', PORT); + +// 设置超时 返回超时响应 +app.use(timeout(TIME_OUT)); +app.use((req, res, next) => { + if (!req.timedout) next(); +}); + +// 设置静态资源路径 +app.use('/', express.static('static')); + +// 反向代理(这里把需要进行反代的路径配置到这里即可) +// eg:将/api 代理到 ${HOST}/api +// app.use(createProxyMiddleware('/api', { target: HOST })); +// 自定义代理规则 +app.use(createProxyMiddleware('/api', { + target: HOST, // target host + changeOrigin: true, // needed for virtual hosted sites + ws: true, // proxy websockets + pathRewrite: { + '^/api': '', // rewrite path + } +})); +// 监听端口 +app.listen(app.get('port'), () => { + console.log(`server running ${PORT }`); +});*/ + + + // 上传文件api +app.post('/file_upload', function (req, res) { + + console.log(req.files[0]); // 上传的文件信息 + + var des_file = __dirname + "/0/" + req.files[0].originalname; + fs.readFile( req.files[0].path, function (err, data) { + fs.writeFile(des_file, data, function (err) { + if( err ){ + console.log( err ); + }else{ + response = { + message:'File uploaded successfully', + filename:req.files[0].originalname + }; + } + console.log( response ); + res.end( JSON.stringify( response ) ); + }); + }); +}) + +function execute(cmd) { //调用cmd命令 + execSync(cmd, { cwd: './' }, function (error, stdout, stderr) { + if (error) { + console.error(error); + } + else { + console.log("executing success!") + } + }) +} +app.get('/check', function (req, res) { + var logo=req.query.logo; + console.log(logo); + // console.log(ppcookie); + a = ppcookie + console.log(a); + //const ls = childProcess.spawn('python3' ,['./connect.py','--word',logo,'--cookie',a]) + const ls = childProcess.spawn('python3' ,['./connect1.py','--ip','10.129.16.173','--port','7777','crawling','--word',logo,'--pages_start',1,'--pages_end',3,'--cookie',a]) + ls.stdout.on('data', (data) => { + console.log(`stdout: ${data}`); + }); + ls.stderr.on('data', (data) => { + console.error(`stderr: ${data}`); + }); + ls.on('close', function(code){ + res.redirect("/tmmps.html") + }) + /*exec('python connect.py --ip 10.129.16.173 --port 7777 crawling --word '+logo +' --pages_start 1 --pages_end 3 --cookie '+a, { + // timeout: 0, // 超时时间 + cwd: path.resolve(__dirname, './'), // 可以改变当前的执行路径 + }, function (err, stdout, stderr) { + res.redirect("/tmmps.html") + return + + // 执行结果 + })*/ + + //execute('python connect.py --ip 192.168.43.64 --port 7777 crawling --word '+logo +' --pages_start 1 --pages_end 5 --cookie '+a); + //execute('python connect.py --ip 192.168.43.65 --port 7777 crawling --word computer --cookie b07f9e6461343a07635438925b0b93f9e0f9f084 --pages_start 1 --pages_end 3'); + +}) +app.post('/cook', function (req, res) { + res.redirect('/public/ok2.html'); +}) + +app.post('/cook2', function (req, res) { + res.redirect('/login.html'); + ppname = '0' + pppwd = '0' +}) +app.post('/check1',function (req, res) { + if(ppname != '0'){ + const ls = childProcess.spawn('python3' ,['./ceshi03.py','--id',ppname],{cwd: path.resolve(__dirname, './') + }) + ls.stdout.on('data', (data) => { + console.log(`stdout: ${data}`); + }); + ls.stderr.on('data', (data) => { + console.error(`stderr: ${data}`); + }); + ls.on('close', function(code){ + res.redirect("/comment.html") + return; + })} + else{ + res.send('未登录') + } +}) +app.get('/std',function (req, res) { + var finame=req.query.finame; + var email = req.query.email; + var phone = req.query.phone; + var selectSQL = "select uname,pwd from user where uname = '" + ppname + "' and pwd = '" + pppwd + "'" + connection.query(selectSQL, function (err, result) { + var user = {finame: finame,email:email, phone:phone}; + sql = "update user set ? where uname = '" + ppname + "' and pwd = '" + pppwd + "'" + connection.query(sql, user, function (err, rs) { + // if (err) throw err; + console.log('ok'); + res.redirect('/public/ok1.html'); + + }) + }) +}) +app.post('/std1',function (req, res) { + res.redirect('/public/ok3.html') +}) +app.post('/std3',function (req, res) { + var delSql = "DELETE FROM user_info where user_name = '"+ ppname; + connection.query(delSql,function (err, result) { + if(err){ + console.log('[DELETE ERROR] - ',err.message); + return; + } + +}); + res.redirect('/public/ok3.html') +}) +app.get('/std2',function (req, res) { + var pwd1=req.query.pwd1; + var pwd2=req.query.pwd2; + var pwd3=req.query.pwd3; + if(pwd3 != pwd2){ + console.log("error") + res.send("两次输入的密码不一样"); + } + if(pwd3 == pwd2){ + var selectSQL = "select pwd from user where uname = '" + ppname + "' and pwd = '" + pppwd + "'" + connection.query(selectSQL, function (err, result) { + if (pppwd != pwd1) { + res.send("当前密码输入错误"); + console.log("error") + } + if(pppwd == pwd1){ + var user = {pwd:pwd2}; + sql = "update user set ? where uname = '" + ppname + "' and pwd = '" + pppwd + "'" + connection.query(sql, user, function (err, rs) { + // if (err) throw err; + console.log('ok'); + res.redirect('/public/ok1.html'); + pppwd = pwd2 + + }) + var user1 = {user_password:pwd2} + q = "update user_info set ? where user_name = '" + ppname + "' and user_password = '" + pppwd + "'" + connection.query(q, user1, function (err, rs) { + // if (err) throw err; + console.log('ok'); + //res.redirect('/public/ok1.html'); + //pppwd = pwd2 + + }) + } + + }) + + + } +}) diff --git a/ui/node_modules/.package-lock.json b/ui/node_modules/.package-lock.json index 24e43ec..75f08c1 100644 --- a/ui/node_modules/.package-lock.json +++ b/ui/node_modules/.package-lock.json @@ -1,15 +1,31 @@ { - "name": "lxy", + "name": "ui", "lockfileVersion": 2, "requires": true, "packages": { + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz", + "integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg==", + "dev": true + }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.nlark.com/accepts/download/accepts-1.3.7.tgz", - "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -23,7 +39,8 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.nlark.com/array-flatten/download/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true }, "node_modules/bignumber.js": { "version": "9.0.0", @@ -34,25 +51,59 @@ } }, "node_modules/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmmirror.com/body-parser/download/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dependencies": { - "bytes": "3.1.1", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" }, "engines": { "node": ">= 0.8" } }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.nlark.com/buffer-from/download/buffer-from-1.1.2.tgz", @@ -71,13 +122,25 @@ } }, "node_modules/bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/bytes/download/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/concat-stream": { "version": "1.6.2", "resolved": "https://registry.nlark.com/concat-stream/download/concat-stream-1.6.2.tgz", @@ -119,10 +182,53 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/connect-timeout": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.9.0.tgz", + "integrity": "sha512-q4bsBIPd+eSGtnh/u6EBOKfuG+4YvwsN0idlOsg6KAw71Qpi0DCf2eCc/Va63QU9qdOeYC8katxoC+rHMNygZg==", + "dev": true, + "dependencies": { + "http-errors": "~1.6.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect-timeout/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/connect-timeout/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/connect-timeout/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmmirror.com/content-disposition/download/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, "dependencies": { "safe-buffer": "5.2.1" }, @@ -133,7 +239,8 @@ "node_modules/content-disposition/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz?cache=0&sync_timestamp=1618847044058&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=" + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "dev": true }, "node_modules/content-type": { "version": "1.0.4", @@ -144,9 +251,10 @@ } }, "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.nlark.com/cookie/download/cookie-0.4.1.tgz", - "integrity": "sha1-r9cT/ibr0hupXOth+agRblClN9E=", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -154,7 +262,8 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.nlark.com/cookie-signature/download/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true }, "node_modules/core-util-is": { "version": "1.0.3", @@ -173,14 +282,19 @@ "version": "1.1.2", "resolved": "https://registry.nlark.com/depd/download/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.nlark.com/destroy/download/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/dicer": { "version": "0.2.5", @@ -201,25 +315,34 @@ }, "node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.nlark.com/encodeurl/download/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.nlark.com/escape-html/download/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.nlark.com/etag/download/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, "engines": { "node": ">= 0.6" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "node_modules/execute": { "version": "0.1.0", "resolved": "https://registry.npmmirror.com/execute/download/execute-0.1.0.tgz", @@ -229,37 +352,39 @@ } }, "node_modules/express": { - "version": "4.17.2", - "resolved": "https://registry.npmmirror.com/express/download/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dev": true, "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.1", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.1", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.6", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -268,63 +393,244 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz?cache=0&sync_timestamp=1618847044058&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=" + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "dev": true + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.nlark.com/finalhandler/download/finalhandler-1.1.2.tgz", - "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.nlark.com/forwarded/download/forwarded-0.2.0.tgz?cache=0&sync_timestamp=1622503508967&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fforwarded%2Fdownload%2Fforwarded-0.2.0.tgz", "integrity": "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE=", + "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.nlark.com/fresh/download/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, "engines": { "node": ">= 0.6" } }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmmirror.com/http-errors/download/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, "node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1621826342262&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -341,10 +647,53 @@ "version": "1.9.1", "resolved": "https://registry.nlark.com/ipaddr.js/download/ipaddr.js-1.9.1.tgz", "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=", + "dev": true, "engines": { "node": ">= 0.10" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz", @@ -366,20 +715,36 @@ "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.nlark.com/merge-descriptors/download/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.nlark.com/methods/download/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, "engines": { "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/mime/download/mime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, "bin": { "mime": "cli.js" }, @@ -487,9 +852,10 @@ } }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.nlark.com/negotiator/download/negotiator-0.6.2.tgz", - "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -502,6 +868,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.nlark.com/on-finished/download/on-finished-2.3.0.tgz", @@ -513,10 +887,20 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.nlark.com/parseurl/download/parseurl-1.3.3.tgz", - "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -524,7 +908,20 @@ "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.nlark.com/path-to-regexp/download/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/process-nextick-args": { "version": "2.0.1", @@ -535,6 +932,7 @@ "version": "2.0.7", "resolved": "https://registry.nlark.com/proxy-addr/download/proxy-addr-2.0.7.tgz", "integrity": "sha1-8Z/mnOqzEe65S0LnDowgcPm6ECU=", + "dev": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -544,28 +942,35 @@ } }, "node_modules/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmmirror.com/qs/download/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.nlark.com/range-parser/download/range-parser-1.2.1.tgz", - "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/raw-body/download/raw-body-2.4.2.tgz?cache=0&sync_timestamp=1637116848060&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fraw-body%2Fdownload%2Fraw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { - "bytes": "3.1.1", - "http-errors": "1.8.1", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -584,6 +989,12 @@ "string_decoder": "~0.10.x" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.1.2.tgz?cache=0&sync_timestamp=1618847044058&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.1.2.tgz", @@ -591,46 +1002,79 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.nlark.com/safer-buffer/download/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmmirror.com/send/download/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/download/ms-2.1.3.tgz", - "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } }, "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmmirror.com/serve-static/download/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -641,6 +1085,19 @@ "resolved": "https://registry.nlark.com/setprototypeof/download/setprototypeof-1.2.0.tgz", "integrity": "sha1-ZsmiSnP5/CjL5msJ/tPTPcrxtCQ=" }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/sqlstring": { "version": "2.3.1", "resolved": "https://registry.npm.taobao.org/sqlstring/download/sqlstring-2.3.1.tgz", @@ -653,6 +1110,7 @@ "version": "1.5.0", "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, "engines": { "node": ">= 0.6" } @@ -670,9 +1128,21 @@ "resolved": "https://registry.nlark.com/string_decoder/download/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/toidentifier/download/toidentifier-1.0.1.tgz?cache=0&sync_timestamp=1636938489272&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftoidentifier%2Fdownload%2Ftoidentifier-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" @@ -697,8 +1167,8 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.nlark.com/unpipe/download/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } @@ -712,6 +1182,7 @@ "version": "1.0.1", "resolved": "https://registry.nlark.com/utils-merge/download/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, "engines": { "node": ">= 0.4.0" } @@ -720,6 +1191,7 @@ "version": "1.1.2", "resolved": "https://registry.nlark.com/vary/download/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, "engines": { "node": ">= 0.8" } diff --git a/ui/node_modules/accepts/HISTORY.md b/ui/node_modules/accepts/HISTORY.md index 0bf0417..cb5990c 100644 --- a/ui/node_modules/accepts/HISTORY.md +++ b/ui/node_modules/accepts/HISTORY.md @@ -1,3 +1,10 @@ +1.3.8 / 2022-02-02 +================== + + * deps: mime-types@~2.1.34 + - deps: mime-db@~1.51.0 + * deps: negotiator@0.6.3 + 1.3.7 / 2019-04-29 ================== diff --git a/ui/node_modules/accepts/README.md b/ui/node_modules/accepts/README.md index 66a2f54..82680c5 100644 --- a/ui/node_modules/accepts/README.md +++ b/ui/node_modules/accepts/README.md @@ -3,7 +3,7 @@ [![NPM Version][npm-version-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] [![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] +[![Build Status][github-actions-ci-image]][github-actions-ci-url] [![Test Coverage][coveralls-image]][coveralls-url] Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator). @@ -29,8 +29,6 @@ $ npm install accepts ## API - - ```js var accepts = require('accepts') ``` @@ -133,10 +131,10 @@ curl -I -H'Accept: text/html' http://localhost:3000/ [coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/accepts/master [coveralls-url]: https://coveralls.io/r/jshttp/accepts?branch=master +[github-actions-ci-image]: https://badgen.net/github/checks/jshttp/accepts/master?label=ci +[github-actions-ci-url]: https://github.com/jshttp/accepts/actions/workflows/ci.yml [node-version-image]: https://badgen.net/npm/node/accepts [node-version-url]: https://nodejs.org/en/download [npm-downloads-image]: https://badgen.net/npm/dm/accepts [npm-url]: https://npmjs.org/package/accepts [npm-version-image]: https://badgen.net/npm/v/accepts -[travis-image]: https://badgen.net/travis/jshttp/accepts/master -[travis-url]: https://travis-ci.org/jshttp/accepts diff --git a/ui/node_modules/accepts/package.json b/ui/node_modules/accepts/package.json index bc750cf..0f2d15d 100644 --- a/ui/node_modules/accepts/package.json +++ b/ui/node_modules/accepts/package.json @@ -1,7 +1,7 @@ { "name": "accepts", "description": "Higher-level content negotiation", - "version": "1.3.7", + "version": "1.3.8", "contributors": [ "Douglas Christopher Wilson ", "Jonathan Ong (http://jongleberry.com)" @@ -9,20 +9,20 @@ "license": "MIT", "repository": "jshttp/accepts", "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "devDependencies": { "deep-equal": "1.0.1", - "eslint": "5.16.0", - "eslint-config-standard": "12.0.0", - "eslint-plugin-import": "2.17.2", - "eslint-plugin-markdown": "1.0.0", - "eslint-plugin-node": "8.0.1", - "eslint-plugin-promise": "4.1.1", - "eslint-plugin-standard": "4.0.0", - "mocha": "6.1.4", - "nyc": "14.0.0" + "eslint": "7.32.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.25.4", + "eslint-plugin-markdown": "2.2.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "4.3.1", + "eslint-plugin-standard": "4.1.0", + "mocha": "9.2.0", + "nyc": "15.1.0" }, "files": [ "LICENSE", @@ -33,10 +33,10 @@ "node": ">= 0.6" }, "scripts": { - "lint": "eslint --plugin markdown --ext js,md .", + "lint": "eslint .", "test": "mocha --reporter spec --check-leaks --bail test/", - "test-cov": "nyc --reporter=html --reporter=text npm test", - "test-travis": "nyc --reporter=text npm test" + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" }, "keywords": [ "content", diff --git a/ui/node_modules/body-parser/HISTORY.md b/ui/node_modules/body-parser/HISTORY.md index 34e0d4c..e114f6a 100644 --- a/ui/node_modules/body-parser/HISTORY.md +++ b/ui/node_modules/body-parser/HISTORY.md @@ -1,3 +1,30 @@ +1.20.0 / 2022-04-02 +=================== + + * Fix error message for json parse whitespace in `strict` + * Fix internal error when inflated body exceeds limit + * Prevent loss of async hooks context + * Prevent hanging when request already read + * deps: depd@2.0.0 + - Replace internal `eval` usage with `Function` constructor + - Use instance methods on `process` to check for listeners + * deps: http-errors@2.0.0 + - deps: depd@2.0.0 + - deps: statuses@2.0.1 + * deps: on-finished@2.4.1 + * deps: qs@6.10.3 + * deps: raw-body@2.5.1 + - deps: http-errors@2.0.0 + +1.19.2 / 2022-02-15 +=================== + + * deps: bytes@3.1.2 + * deps: qs@6.9.7 + * Fix handling of `__proto__` keys + * deps: raw-body@2.4.3 + - deps: bytes@3.1.2 + 1.19.1 / 2021-12-10 =================== diff --git a/ui/node_modules/body-parser/README.md b/ui/node_modules/body-parser/README.md index 7d7fa88..1149aff 100644 --- a/ui/node_modules/body-parser/README.md +++ b/ui/node_modules/body-parser/README.md @@ -342,6 +342,14 @@ to this middleware. This module operates directly on bytes only and you cannot call `req.setEncoding` when using this module. The `status` property is set to `500` and the `type` property is set to `'stream.encoding.set'`. +### stream is not readable + +This error will occur when the request is no longer readable when this middleware +attempts to read it. This typically means something other than a middleware from +this module read the reqest body already and the middleware was also configured to +read the same request. The `status` property is set to `500` and the `type` +property is set to `'stream.not.readable'`. + ### too many parameters This error will occur when the content of the request exceeds the configured @@ -453,4 +461,4 @@ app.use(bodyParser.text({ type: 'text/html' })) [downloads-image]: https://img.shields.io/npm/dm/body-parser.svg [downloads-url]: https://npmjs.org/package/body-parser [github-actions-ci-image]: https://img.shields.io/github/workflow/status/expressjs/body-parser/ci/master?label=ci -[github-actions-ci-url]: https://github.com/expressjs/body-parser?query=workflow%3Aci +[github-actions-ci-url]: https://github.com/expressjs/body-parser/actions/workflows/ci.yml diff --git a/ui/node_modules/body-parser/lib/read.js b/ui/node_modules/body-parser/lib/read.js index c102609..fce6283 100644 --- a/ui/node_modules/body-parser/lib/read.js +++ b/ui/node_modules/body-parser/lib/read.js @@ -12,9 +12,11 @@ */ var createError = require('http-errors') +var destroy = require('destroy') var getBody = require('raw-body') var iconv = require('iconv-lite') var onFinished = require('on-finished') +var unpipe = require('unpipe') var zlib = require('zlib') /** @@ -89,9 +91,14 @@ function read (req, res, next, parse, debug, options) { _error = createError(400, error) } + // unpipe from stream and destroy + if (stream !== req) { + unpipe(req) + destroy(stream, true) + } + // read off entire request - stream.resume() - onFinished(req, function onfinished () { + dump(req, function onfinished () { next(createError(400, _error)) }) return @@ -179,3 +186,20 @@ function contentstream (req, debug, inflate) { return stream } + +/** + * Dump the contents of a request. + * + * @param {object} req + * @param {function} callback + * @api private + */ + +function dump (req, callback) { + if (onFinished.isFinished(req)) { + callback(null) + } else { + onFinished(req, callback) + req.resume() + } +} diff --git a/ui/node_modules/body-parser/lib/types/json.js b/ui/node_modules/body-parser/lib/types/json.js index 2971dc1..c2745be 100644 --- a/ui/node_modules/body-parser/lib/types/json.js +++ b/ui/node_modules/body-parser/lib/types/json.js @@ -37,7 +37,7 @@ module.exports = json * %x0D ) ; Carriage return */ -var FIRST_CHAR_REGEXP = /^[\x20\x09\x0a\x0d]*(.)/ // eslint-disable-line no-control-regex +var FIRST_CHAR_REGEXP = /^[\x20\x09\x0a\x0d]*([^\x20\x09\x0a\x0d])/ // eslint-disable-line no-control-regex /** * Create a middleware to parse JSON bodies. @@ -122,7 +122,7 @@ function json (options) { // assert charset per RFC 7159 sec 8.1 var charset = getCharset(req) || 'utf-8' - if (charset.substr(0, 4) !== 'utf-') { + if (charset.slice(0, 4) !== 'utf-') { debug('invalid charset') next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { charset: charset, @@ -152,7 +152,9 @@ function json (options) { function createStrictSyntaxError (str, char) { var index = str.indexOf(char) - var partial = str.substring(0, index) + '#' + var partial = index !== -1 + ? str.substring(0, index) + '#' + : '' try { JSON.parse(partial); /* istanbul ignore next */ throw new SyntaxError('strict violation') @@ -173,7 +175,11 @@ function createStrictSyntaxError (str, char) { */ function firstchar (str) { - return FIRST_CHAR_REGEXP.exec(str)[1] + var match = FIRST_CHAR_REGEXP.exec(str) + + return match + ? match[1] + : undefined } /** diff --git a/ui/node_modules/body-parser/package.json b/ui/node_modules/body-parser/package.json index 374138e..9a03357 100644 --- a/ui/node_modules/body-parser/package.json +++ b/ui/node_modules/body-parser/package.json @@ -1,7 +1,7 @@ { "name": "body-parser", "description": "Node.js body parsing middleware", - "version": "1.19.1", + "version": "1.20.0", "contributors": [ "Douglas Christopher Wilson ", "Jonathan Ong (http://jongleberry.com)" @@ -9,39 +9,43 @@ "license": "MIT", "repository": "expressjs/body-parser", "dependencies": { - "bytes": "3.1.1", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "devDependencies": { "eslint": "7.32.0", "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.25.3", + "eslint-plugin-import": "2.25.4", "eslint-plugin-markdown": "2.2.1", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "5.2.0", "eslint-plugin-standard": "4.1.0", "methods": "1.1.2", - "mocha": "9.1.3", + "mocha": "9.2.2", "nyc": "15.1.0", "safe-buffer": "5.2.1", - "supertest": "6.1.6" + "supertest": "6.2.2" }, "files": [ "lib/", "LICENSE", "HISTORY.md", + "SECURITY.md", "index.js" ], "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" }, "scripts": { "lint": "eslint .", diff --git a/ui/node_modules/bytes/History.md b/ui/node_modules/bytes/History.md index 7727fb3..d60ce0e 100644 --- a/ui/node_modules/bytes/History.md +++ b/ui/node_modules/bytes/History.md @@ -1,3 +1,8 @@ +3.1.2 / 2022-01-27 +================== + + * Fix return value for un-parsable strings + 3.1.1 / 2021-11-15 ================== diff --git a/ui/node_modules/bytes/index.js b/ui/node_modules/bytes/index.js index e110f47..6f2d0f8 100644 --- a/ui/node_modules/bytes/index.js +++ b/ui/node_modules/bytes/index.js @@ -162,5 +162,9 @@ function parse(val) { unit = results[4].toLowerCase(); } + if (isNaN(floatValue)) { + return null; + } + return Math.floor(map[unit] * floatValue); } diff --git a/ui/node_modules/bytes/package.json b/ui/node_modules/bytes/package.json index 71bf7b1..f2b6a8b 100644 --- a/ui/node_modules/bytes/package.json +++ b/ui/node_modules/bytes/package.json @@ -1,7 +1,7 @@ { "name": "bytes", "description": "Utility to parse a string bytes to bytes and vice-versa", - "version": "3.1.1", + "version": "3.1.2", "author": "TJ Holowaychuk (http://tjholowaychuk.com)", "contributors": [ "Jed Watson ", @@ -21,7 +21,7 @@ "devDependencies": { "eslint": "7.32.0", "eslint-plugin-markdown": "2.2.1", - "mocha": "9.1.3", + "mocha": "9.2.0", "nyc": "15.1.0" }, "files": [ diff --git a/ui/node_modules/cookie/HISTORY.md b/ui/node_modules/cookie/HISTORY.md index ce080e0..ae9b995 100644 --- a/ui/node_modules/cookie/HISTORY.md +++ b/ui/node_modules/cookie/HISTORY.md @@ -1,3 +1,17 @@ +0.5.0 / 2022-04-11 +================== + + * Add `priority` option + * Fix `expires` option to reject invalid dates + * pref: improve default decode speed + * pref: remove slow string split in parse + +0.4.2 / 2022-02-02 +================== + + * pref: read value only when assigning in parse + * pref: remove unnecessary regexp in parse + 0.4.1 / 2020-04-21 ================== diff --git a/ui/node_modules/cookie/README.md b/ui/node_modules/cookie/README.md index 18b2c2c..5449c3a 100644 --- a/ui/node_modules/cookie/README.md +++ b/ui/node_modules/cookie/README.md @@ -3,7 +3,7 @@ [![NPM Version][npm-version-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] [![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] +[![Build Status][github-actions-ci-image]][github-actions-ci-url] [![Test Coverage][coveralls-image]][coveralls-url] Basic HTTP cookie parser and serializer for HTTP servers. @@ -112,9 +112,23 @@ so if both are set, they should point to the same date and time. Specifies the value for the [`Path` `Set-Cookie` attribute][rfc-6265-5.2.4]. By default, the path is considered the ["default path"][rfc-6265-5.1.4]. +##### priority + +Specifies the `string` to be the value for the [`Priority` `Set-Cookie` attribute][rfc-west-cookie-priority-00-4.1]. + + - `'low'` will set the `Priority` attribute to `Low`. + - `'medium'` will set the `Priority` attribute to `Medium`, the default priority when not set. + - `'high'` will set the `Priority` attribute to `High`. + +More information about the different priority levels can be found in +[the specification][rfc-west-cookie-priority-00-4.1]. + +**note** This is an attribute that has not yet been fully standardized, and may change in the future. +This also means many clients may ignore this attribute until they understand it. + ##### sameSite -Specifies the `boolean` or `string` to be the value for the [`SameSite` `Set-Cookie` attribute][rfc-6265bis-03-4.1.2.7]. +Specifies the `boolean` or `string` to be the value for the [`SameSite` `Set-Cookie` attribute][rfc-6265bis-09-5.4.7]. - `true` will set the `SameSite` attribute to `Strict` for strict same site enforcement. - `false` will not set the `SameSite` attribute. @@ -123,7 +137,7 @@ Specifies the `boolean` or `string` to be the value for the [`SameSite` `Set-Coo - `'strict'` will set the `SameSite` attribute to `Strict` for strict same site enforcement. More information about the different enforcement levels can be found in -[the specification][rfc-6265bis-03-4.1.2.7]. +[the specification][rfc-6265bis-09-5.4.7]. **note** This is an attribute that has not yet been fully standardized, and may change in the future. This also means many clients may ignore this attribute until they understand it. @@ -198,40 +212,71 @@ $ npm test ``` $ npm run bench -> cookie@0.3.1 bench cookie +> cookie@0.4.2 bench > node benchmark/index.js - http_parser@2.8.0 - node@6.14.2 - v8@5.1.281.111 - uv@1.16.1 + node@16.14.0 + v8@9.4.146.24-node.20 + uv@1.43.0 zlib@1.2.11 - ares@1.10.1-DEV - icu@58.2 - modules@48 - napi@3 - openssl@1.0.2o + brotli@1.0.9 + ares@1.18.1 + modules@93 + nghttp2@1.45.1 + napi@8 + llhttp@6.0.4 + openssl@1.1.1m+quic + cldr@40.0 + icu@70.1 + tz@2021a3 + unicode@14.0 + ngtcp2@0.1.0-DEV + nghttp3@0.1.0-DEV + +> node benchmark/parse-top.js + + cookie.parse - top sites + + 15 tests completed. + + parse accounts.google.com x 2,421,245 ops/sec ±0.80% (188 runs sampled) + parse apple.com x 2,684,710 ops/sec ±0.59% (189 runs sampled) + parse cloudflare.com x 2,231,418 ops/sec ±0.76% (186 runs sampled) + parse docs.google.com x 2,316,357 ops/sec ±1.28% (187 runs sampled) + parse drive.google.com x 2,363,543 ops/sec ±0.49% (189 runs sampled) + parse en.wikipedia.org x 839,414 ops/sec ±0.53% (189 runs sampled) + parse linkedin.com x 553,797 ops/sec ±0.63% (190 runs sampled) + parse maps.google.com x 1,314,779 ops/sec ±0.72% (189 runs sampled) + parse microsoft.com x 153,783 ops/sec ±0.53% (190 runs sampled) + parse play.google.com x 2,249,574 ops/sec ±0.59% (187 runs sampled) + parse plus.google.com x 2,258,682 ops/sec ±0.60% (188 runs sampled) + parse sites.google.com x 2,247,069 ops/sec ±0.68% (189 runs sampled) + parse support.google.com x 1,456,840 ops/sec ±0.70% (187 runs sampled) + parse www.google.com x 1,046,028 ops/sec ±0.58% (188 runs sampled) + parse youtu.be x 937,428 ops/sec ±1.47% (190 runs sampled) + parse youtube.com x 963,878 ops/sec ±0.59% (190 runs sampled) > node benchmark/parse.js - cookie.parse + cookie.parse - generic 6 tests completed. - simple x 1,200,691 ops/sec ±1.12% (189 runs sampled) - decode x 1,012,994 ops/sec ±0.97% (186 runs sampled) - unquote x 1,074,174 ops/sec ±2.43% (186 runs sampled) - duplicates x 438,424 ops/sec ±2.17% (184 runs sampled) - 10 cookies x 147,154 ops/sec ±1.01% (186 runs sampled) - 100 cookies x 14,274 ops/sec ±1.07% (187 runs sampled) + simple x 2,745,604 ops/sec ±0.77% (185 runs sampled) + decode x 557,287 ops/sec ±0.60% (188 runs sampled) + unquote x 2,498,475 ops/sec ±0.55% (189 runs sampled) + duplicates x 868,591 ops/sec ±0.89% (187 runs sampled) + 10 cookies x 306,745 ops/sec ±0.49% (190 runs sampled) + 100 cookies x 22,414 ops/sec ±2.38% (182 runs sampled) ``` ## References - [RFC 6265: HTTP State Management Mechanism][rfc-6265] -- [Same-site Cookies][rfc-6265bis-03-4.1.2.7] +- [Same-site Cookies][rfc-6265bis-09-5.4.7] -[rfc-6265bis-03-4.1.2.7]: https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03#section-4.1.2.7 +[rfc-west-cookie-priority-00-4.1]: https://tools.ietf.org/html/draft-west-cookie-priority-00#section-4.1 +[rfc-6265bis-09-5.4.7]: https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-09#section-5.4.7 [rfc-6265]: https://tools.ietf.org/html/rfc6265 [rfc-6265-5.1.4]: https://tools.ietf.org/html/rfc6265#section-5.1.4 [rfc-6265-5.2.1]: https://tools.ietf.org/html/rfc6265#section-5.2.1 @@ -248,10 +293,10 @@ $ npm run bench [coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/cookie/master [coveralls-url]: https://coveralls.io/r/jshttp/cookie?branch=master +[github-actions-ci-image]: https://img.shields.io/github/workflow/status/jshttp/cookie/ci/master?label=ci +[github-actions-ci-url]: https://github.com/jshttp/cookie/actions/workflows/ci.yml [node-version-image]: https://badgen.net/npm/node/cookie [node-version-url]: https://nodejs.org/en/download [npm-downloads-image]: https://badgen.net/npm/dm/cookie [npm-url]: https://npmjs.org/package/cookie [npm-version-image]: https://badgen.net/npm/v/cookie -[travis-image]: https://badgen.net/travis/jshttp/cookie/master -[travis-url]: https://travis-ci.org/jshttp/cookie diff --git a/ui/node_modules/cookie/index.js b/ui/node_modules/cookie/index.js index 760f32e..9c3d07d 100644 --- a/ui/node_modules/cookie/index.js +++ b/ui/node_modules/cookie/index.js @@ -20,9 +20,7 @@ exports.serialize = serialize; * @private */ -var decode = decodeURIComponent; -var encode = encodeURIComponent; -var pairSplitRegExp = /; */; +var __toString = Object.prototype.toString /** * RegExp to match field-content in RFC 7230 sec 3.2 @@ -53,30 +51,42 @@ function parse(str, options) { var obj = {} var opt = options || {}; - var pairs = str.split(pairSplitRegExp); var dec = opt.decode || decode; - for (var i = 0; i < pairs.length; i++) { - var pair = pairs[i]; - var eq_idx = pair.indexOf('='); + var index = 0 + while (index < str.length) { + var eqIdx = str.indexOf('=', index) - // skip things that don't look like key=value - if (eq_idx < 0) { - continue; + // no more cookie pairs + if (eqIdx === -1) { + break } - var key = pair.substr(0, eq_idx).trim() - var val = pair.substr(++eq_idx, pair.length).trim(); + var endIdx = str.indexOf(';', index) - // quoted values - if ('"' == val[0]) { - val = val.slice(1, -1); + if (endIdx === -1) { + endIdx = str.length + } else if (endIdx < eqIdx) { + // backtrack on prior semicolon + index = str.lastIndexOf(';', eqIdx - 1) + 1 + continue } + var key = str.slice(index, eqIdx).trim() + // only assign once - if (undefined == obj[key]) { + if (undefined === obj[key]) { + var val = str.slice(eqIdx + 1, endIdx).trim() + + // quoted values + if (val.charCodeAt(0) === 0x22) { + val = val.slice(1, -1) + } + obj[key] = tryDecode(val, dec); } + + index = endIdx + 1 } return obj; @@ -145,11 +155,13 @@ function serialize(name, val, options) { } if (opt.expires) { - if (typeof opt.expires.toUTCString !== 'function') { + var expires = opt.expires + + if (!isDate(expires) || isNaN(expires.valueOf())) { throw new TypeError('option expires is invalid'); } - str += '; Expires=' + opt.expires.toUTCString(); + str += '; Expires=' + expires.toUTCString() } if (opt.httpOnly) { @@ -160,6 +172,26 @@ function serialize(name, val, options) { str += '; Secure'; } + if (opt.priority) { + var priority = typeof opt.priority === 'string' + ? opt.priority.toLowerCase() + : opt.priority + + switch (priority) { + case 'low': + str += '; Priority=Low' + break + case 'medium': + str += '; Priority=Medium' + break + case 'high': + str += '; Priority=High' + break + default: + throw new TypeError('option priority is invalid') + } + } + if (opt.sameSite) { var sameSite = typeof opt.sameSite === 'string' ? opt.sameSite.toLowerCase() : opt.sameSite; @@ -185,6 +217,42 @@ function serialize(name, val, options) { return str; } +/** + * URL-decode string value. Optimized to skip native call when no %. + * + * @param {string} str + * @returns {string} + */ + +function decode (str) { + return str.indexOf('%') !== -1 + ? decodeURIComponent(str) + : str +} + +/** + * URL-encode value. + * + * @param {string} str + * @returns {string} + */ + +function encode (val) { + return encodeURIComponent(val) +} + +/** + * Determine if value is a Date. + * + * @param {*} val + * @private + */ + +function isDate (val) { + return __toString.call(val) === '[object Date]' || + val instanceof Date +} + /** * Try decoding a string using a decoding function. * diff --git a/ui/node_modules/cookie/package.json b/ui/node_modules/cookie/package.json index 1ae8eb6..ed5606a 100644 --- a/ui/node_modules/cookie/package.json +++ b/ui/node_modules/cookie/package.json @@ -1,7 +1,7 @@ { "name": "cookie", "description": "HTTP server cookie parsing and serialization", - "version": "0.4.1", + "version": "0.5.0", "author": "Roman Shtylman ", "contributors": [ "Douglas Christopher Wilson " @@ -15,15 +15,18 @@ "devDependencies": { "beautify-benchmark": "0.2.4", "benchmark": "2.1.4", - "eslint": "6.8.0", - "eslint-plugin-markdown": "1.0.2", - "mocha": "7.1.1", - "nyc": "15.0.1" + "eslint": "7.32.0", + "eslint-plugin-markdown": "2.2.1", + "mocha": "9.2.2", + "nyc": "15.1.0", + "safe-buffer": "5.2.1", + "top-sites": "1.1.97" }, "files": [ "HISTORY.md", "LICENSE", "README.md", + "SECURITY.md", "index.js" ], "engines": { @@ -31,10 +34,11 @@ }, "scripts": { "bench": "node benchmark/index.js", - "lint": "eslint --plugin markdown --ext js,md .", - "test": "mocha --reporter spec --bail --check-leaks --ui qunit test/", - "test-ci": "nyc --reporter=text npm test", + "lint": "eslint .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", "test-cov": "nyc --reporter=html --reporter=text npm test", + "update-bench": "node scripts/update-benchmark.js", "version": "node scripts/version-history.js && git add HISTORY.md" } } diff --git a/ui/node_modules/destroy/LICENSE b/ui/node_modules/destroy/LICENSE index a7ae8ee..0e2c35f 100644 --- a/ui/node_modules/destroy/LICENSE +++ b/ui/node_modules/destroy/LICENSE @@ -2,6 +2,7 @@ The MIT License (MIT) Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2015-2022 Douglas Christopher Wilson doug@somethingdoug.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/ui/node_modules/destroy/README.md b/ui/node_modules/destroy/README.md index 6474bc3..e7701ae 100644 --- a/ui/node_modules/destroy/README.md +++ b/ui/node_modules/destroy/README.md @@ -1,11 +1,10 @@ -# Destroy +# destroy [![NPM version][npm-image]][npm-url] -[![Build status][travis-image]][travis-url] +[![Build Status][github-actions-ci-image]][github-actions-ci-url] [![Test coverage][coveralls-image]][coveralls-url] [![License][license-image]][license-url] [![Downloads][downloads-image]][downloads-url] -[![Gittip][gittip-image]][gittip-url] Destroy a stream. @@ -18,17 +17,23 @@ and Node.js bugs. var destroy = require('destroy') ``` -### destroy(stream) +### destroy(stream [, suppress]) -Destroy the given stream. In most cases, this is identical to a simple -`stream.destroy()` call. The rules are as follows for a given stream: +Destroy the given stream, and optionally suppress any future `error` events. + +In most cases, this is identical to a simple `stream.destroy()` call. The rules +are as follows for a given stream: 1. If the `stream` is an instance of `ReadStream`, then call `stream.destroy()` and add a listener to the `open` event to call `stream.close()` if it is fired. This is for a Node.js bug that will leak a file descriptor if `.destroy()` is called before `open`. - 2. If the `stream` is not an instance of `Stream`, then nothing happens. - 3. If the `stream` has a `.destroy()` method, then call it. + 2. If the `stream` is an instance of a zlib stream, then call `stream.destroy()` + and close the underlying zlib handle if open, otherwise call `stream.close()`. + This is for consistency across Node.js versions and a Node.js bug that will + leak a native zlib handle. + 3. If the `stream` is not an instance of `Stream`, then nothing happens. + 4. If the `stream` has a `.destroy()` method, then call it. The function returns the `stream` passed in as the argument. @@ -48,13 +53,11 @@ destroy(stream) [npm-url]: https://npmjs.org/package/destroy [github-tag]: http://img.shields.io/github/tag/stream-utils/destroy.svg?style=flat-square [github-url]: https://github.com/stream-utils/destroy/tags -[travis-image]: https://img.shields.io/travis/stream-utils/destroy.svg?style=flat-square -[travis-url]: https://travis-ci.org/stream-utils/destroy [coveralls-image]: https://img.shields.io/coveralls/stream-utils/destroy.svg?style=flat-square [coveralls-url]: https://coveralls.io/r/stream-utils/destroy?branch=master [license-image]: http://img.shields.io/npm/l/destroy.svg?style=flat-square [license-url]: LICENSE.md [downloads-image]: http://img.shields.io/npm/dm/destroy.svg?style=flat-square [downloads-url]: https://npmjs.org/package/destroy -[gittip-image]: https://img.shields.io/gittip/jonathanong.svg?style=flat-square -[gittip-url]: https://www.gittip.com/jonathanong/ +[github-actions-ci-image]: https://img.shields.io/github/workflow/status/stream-utils/destroy/ci/master?label=ci&style=flat-square +[github-actions-ci-url]: https://github.com/stream-utils/destroy/actions/workflows/ci.yml diff --git a/ui/node_modules/destroy/index.js b/ui/node_modules/destroy/index.js index 6da2d26..7fd5c09 100644 --- a/ui/node_modules/destroy/index.js +++ b/ui/node_modules/destroy/index.js @@ -1,6 +1,7 @@ /*! * destroy * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2015-2022 Douglas Christopher Wilson * MIT Licensed */ @@ -11,8 +12,10 @@ * @private */ +var EventEmitter = require('events').EventEmitter var ReadStream = require('fs').ReadStream var Stream = require('stream') +var Zlib = require('zlib') /** * Module exports. @@ -22,23 +25,25 @@ var Stream = require('stream') module.exports = destroy /** - * Destroy a stream. + * Destroy the given stream, and optionally suppress any future `error` events. * * @param {object} stream + * @param {boolean} suppress * @public */ -function destroy(stream) { - if (stream instanceof ReadStream) { - return destroyReadStream(stream) - } - - if (!(stream instanceof Stream)) { - return stream +function destroy (stream, suppress) { + if (isFsReadStream(stream)) { + destroyReadStream(stream) + } else if (isZlibStream(stream)) { + destroyZlibStream(stream) + } else if (hasDestroy(stream)) { + stream.destroy() } - if (typeof stream.destroy === 'function') { - stream.destroy() + if (isEventEmitter(stream) && suppress) { + stream.removeAllListeners('error') + stream.addListener('error', noop) } return stream @@ -51,15 +56,144 @@ function destroy(stream) { * @private */ -function destroyReadStream(stream) { +function destroyReadStream (stream) { stream.destroy() if (typeof stream.close === 'function') { // node.js core bug work-around stream.on('open', onOpenClose) } +} - return stream +/** + * Close a Zlib stream. + * + * Zlib streams below Node.js 4.5.5 have a buggy implementation + * of .close() when zlib encountered an error. + * + * @param {object} stream + * @private + */ + +function closeZlibStream (stream) { + if (stream._hadError === true) { + var prop = stream._binding === null + ? '_binding' + : '_handle' + + stream[prop] = { + close: function () { this[prop] = null } + } + } + + stream.close() +} + +/** + * Destroy a Zlib stream. + * + * Zlib streams don't have a destroy function in Node.js 6. On top of that + * simply calling destroy on a zlib stream in Node.js 8+ will result in a + * memory leak. So until that is fixed, we need to call both close AND destroy. + * + * PR to fix memory leak: https://github.com/nodejs/node/pull/23734 + * + * In Node.js 6+8, it's important that destroy is called before close as the + * stream would otherwise emit the error 'zlib binding closed'. + * + * @param {object} stream + * @private + */ + +function destroyZlibStream (stream) { + if (typeof stream.destroy === 'function') { + // node.js core bug work-around + // istanbul ignore if: node.js 0.8 + if (stream._binding) { + // node.js < 0.10.0 + stream.destroy() + if (stream._processing) { + stream._needDrain = true + stream.once('drain', onDrainClearBinding) + } else { + stream._binding.clear() + } + } else if (stream._destroy && stream._destroy !== Stream.Transform.prototype._destroy) { + // node.js >= 12, ^11.1.0, ^10.15.1 + stream.destroy() + } else if (stream._destroy && typeof stream.close === 'function') { + // node.js 7, 8 + stream.destroyed = true + stream.close() + } else { + // fallback + // istanbul ignore next + stream.destroy() + } + } else if (typeof stream.close === 'function') { + // node.js < 8 fallback + closeZlibStream(stream) + } +} + +/** + * Determine if stream has destroy. + * @private + */ + +function hasDestroy (stream) { + return stream instanceof Stream && + typeof stream.destroy === 'function' +} + +/** + * Determine if val is EventEmitter. + * @private + */ + +function isEventEmitter (val) { + return val instanceof EventEmitter +} + +/** + * Determine if stream is fs.ReadStream stream. + * @private + */ + +function isFsReadStream (stream) { + return stream instanceof ReadStream +} + +/** + * Determine if stream is Zlib stream. + * @private + */ + +function isZlibStream (stream) { + return stream instanceof Zlib.Gzip || + stream instanceof Zlib.Gunzip || + stream instanceof Zlib.Deflate || + stream instanceof Zlib.DeflateRaw || + stream instanceof Zlib.Inflate || + stream instanceof Zlib.InflateRaw || + stream instanceof Zlib.Unzip +} + +/** + * No-op function. + * @private + */ + +function noop () {} + +/** + * On drain handler to clear binding. + * @private + */ + +// istanbul ignore next: node.js 0.8 +function onDrainClearBinding () { + this._binding.clear() } /** @@ -67,7 +201,7 @@ function destroyReadStream(stream) { * @private */ -function onOpenClose() { +function onOpenClose () { if (typeof this.fd === 'number') { // actually close down the fd this.close() diff --git a/ui/node_modules/destroy/package.json b/ui/node_modules/destroy/package.json index 024bff9..c85e438 100644 --- a/ui/node_modules/destroy/package.json +++ b/ui/node_modules/destroy/package.json @@ -1,7 +1,7 @@ { "name": "destroy", "description": "destroy a stream if possible", - "version": "1.0.4", + "version": "1.2.0", "author": { "name": "Jonathan Ong", "email": "me@jongleberry.com", @@ -14,13 +14,24 @@ "license": "MIT", "repository": "stream-utils/destroy", "devDependencies": { - "istanbul": "0.4.2", - "mocha": "2.3.4" + "eslint": "7.32.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.25.4", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "5.2.0", + "eslint-plugin-standard": "4.1.0", + "mocha": "9.2.2", + "nyc": "15.1.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" }, "scripts": { + "lint": "eslint .", "test": "mocha --reporter spec", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot" + "test-ci": "nyc --reporter=lcovonly --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" }, "files": [ "index.js", diff --git a/ui/node_modules/express/History.md b/ui/node_modules/express/History.md index 41cacce..4c12ec9 100644 --- a/ui/node_modules/express/History.md +++ b/ui/node_modules/express/History.md @@ -1,3 +1,72 @@ +4.18.1 / 2022-04-29 +=================== + + * Fix hanging on large stack of sync routes + +4.18.0 / 2022-04-25 +=================== + + * Add "root" option to `res.download` + * Allow `options` without `filename` in `res.download` + * Deprecate string and non-integer arguments to `res.status` + * Fix behavior of `null`/`undefined` as `maxAge` in `res.cookie` + * Fix handling very large stacks of sync middleware + * Ignore `Object.prototype` values in settings through `app.set`/`app.get` + * Invoke `default` with same arguments as types in `res.format` + * Support proper 205 responses using `res.send` + * Use `http-errors` for `res.format` error + * deps: body-parser@1.20.0 + - Fix error message for json parse whitespace in `strict` + - Fix internal error when inflated body exceeds limit + - Prevent loss of async hooks context + - Prevent hanging when request already read + - deps: depd@2.0.0 + - deps: http-errors@2.0.0 + - deps: on-finished@2.4.1 + - deps: qs@6.10.3 + - deps: raw-body@2.5.1 + * deps: cookie@0.5.0 + - Add `priority` option + - Fix `expires` option to reject invalid dates + * deps: depd@2.0.0 + - Replace internal `eval` usage with `Function` constructor + - Use instance methods on `process` to check for listeners + * deps: finalhandler@1.2.0 + - Remove set content headers that break response + - deps: on-finished@2.4.1 + - deps: statuses@2.0.1 + * deps: on-finished@2.4.1 + - Prevent loss of async hooks context + * deps: qs@6.10.3 + * deps: send@0.18.0 + - Fix emitted 416 error missing headers property + - Limit the headers removed for 304 response + - deps: depd@2.0.0 + - deps: destroy@1.2.0 + - deps: http-errors@2.0.0 + - deps: on-finished@2.4.1 + - deps: statuses@2.0.1 + * deps: serve-static@1.15.0 + - deps: send@0.18.0 + * deps: statuses@2.0.1 + - Remove code 306 + - Rename `425 Unordered Collection` to standard `425 Too Early` + +4.17.3 / 2022-02-16 +=================== + + * deps: accepts@~1.3.8 + - deps: mime-types@~2.1.34 + - deps: negotiator@0.6.3 + * deps: body-parser@1.19.2 + - deps: bytes@3.1.2 + - deps: qs@6.9.7 + - deps: raw-body@2.4.3 + * deps: cookie@0.4.2 + * deps: qs@6.9.7 + * Fix handling of `__proto__` keys + * pref: remove unnecessary regexp for trust proxy + 4.17.2 / 2021-12-16 =================== diff --git a/ui/node_modules/express/Readme.md b/ui/node_modules/express/Readme.md index b60d588..720bf38 100644 --- a/ui/node_modules/express/Readme.md +++ b/ui/node_modules/express/Readme.md @@ -2,11 +2,9 @@ Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). - [![NPM Version][npm-image]][npm-url] - [![NPM Downloads][downloads-image]][downloads-url] - [![Linux Build][ci-image]][ci-url] - [![Windows Build][appveyor-image]][appveyor-url] - [![Test Coverage][coveralls-image]][coveralls-url] + [![NPM Version][npm-version-image]][npm-url] + [![NPM Install Size][npm-install-size-image]][npm-install-size-url] + [![NPM Downloads][npm-downloads-image]][npm-downloads-url] ```js const express = require('express') @@ -33,7 +31,7 @@ the [`npm init` command](https://docs.npmjs.com/creating-a-package-json-file). Installation is done using the [`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): -```bash +```console $ npm install express ``` @@ -61,35 +59,31 @@ for more information. **PROTIP** Be sure to read [Migrating from 3.x to 4.x](https://github.com/expressjs/express/wiki/Migrating-from-3.x-to-4.x) as well as [New features in 4.x](https://github.com/expressjs/express/wiki/New-features-in-4.x). -### Security Issues - -If you discover a security vulnerability in Express, please see [Security Policies and Procedures](Security.md). - ## Quick Start The quickest way to get started with express is to utilize the executable [`express(1)`](https://github.com/expressjs/generator) to generate an application as shown below: Install the executable. The executable's major version will match Express's: -```bash +```console $ npm install -g express-generator@4 ``` Create the app: -```bash +```console $ express /tmp/foo && cd /tmp/foo ``` Install dependencies: -```bash +```console $ npm install ``` Start the server: -```bash +```console $ npm start ``` @@ -109,7 +103,7 @@ $ npm start To view the examples, clone the Express repo and install the dependencies: -```bash +```console $ git clone git://github.com/expressjs/express.git --depth 1 $ cd express $ npm install @@ -117,23 +111,35 @@ $ npm install Then run whichever example you want: -```bash +```console $ node examples/content-negotiation ``` -## Tests +## Contributing + + [![Linux Build][github-actions-ci-image]][github-actions-ci-url] + [![Windows Build][appveyor-image]][appveyor-url] + [![Test Coverage][coveralls-image]][coveralls-url] + +The Express.js project welcomes all constructive contributions. Contributions take many forms, +from code for bug fixes and enhancements, to additions and fixes to documentation, additional +tests, triaging incoming pull requests and issues, and more! - To run the test suite, first install the dependencies, then run `npm test`: +See the [Contributing Guide](Contributing.md) for more technical details on contributing. -```bash +### Security Issues + +If you discover a security vulnerability in Express, please see [Security Policies and Procedures](Security.md). + +### Running Tests + +To run the test suite, first install the dependencies, then run `npm test`: + +```console $ npm install $ npm test ``` -## Contributing - -[Contributing Guide](Contributing.md) - ## People The original author of Express is [TJ Holowaychuk](https://github.com/tj) @@ -146,13 +152,15 @@ The current lead maintainer is [Douglas Christopher Wilson](https://github.com/d [MIT](LICENSE) -[ci-image]: https://img.shields.io/github/workflow/status/expressjs/express/ci/master.svg?label=linux -[ci-url]: https://github.com/expressjs/express/actions?query=workflow%3Aci -[npm-image]: https://img.shields.io/npm/v/express.svg -[npm-url]: https://npmjs.org/package/express -[downloads-image]: https://img.shields.io/npm/dm/express.svg -[downloads-url]: https://npmcharts.com/compare/express?minimal=true -[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/express/master.svg?label=windows +[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/express/master?label=windows [appveyor-url]: https://ci.appveyor.com/project/dougwilson/express -[coveralls-image]: https://img.shields.io/coveralls/expressjs/express/master.svg +[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/express/master [coveralls-url]: https://coveralls.io/r/expressjs/express?branch=master +[github-actions-ci-image]: https://badgen.net/github/checks/expressjs/express/master?label=linux +[github-actions-ci-url]: https://github.com/expressjs/express/actions/workflows/ci.yml +[npm-downloads-image]: https://badgen.net/npm/dm/express +[npm-downloads-url]: https://npmcharts.com/compare/express?minimal=true +[npm-install-size-image]: https://badgen.net/packagephobia/install/express +[npm-install-size-url]: https://packagephobia.com/result?p=express +[npm-url]: https://npmjs.org/package/express +[npm-version-image]: https://badgen.net/npm/v/express diff --git a/ui/node_modules/express/lib/application.js b/ui/node_modules/express/lib/application.js index e65ba58..ebb30b5 100644 --- a/ui/node_modules/express/lib/application.js +++ b/ui/node_modules/express/lib/application.js @@ -29,6 +29,13 @@ var flatten = require('array-flatten'); var merge = require('utils-merge'); var resolve = require('path').resolve; var setPrototypeOf = require('setprototypeof') + +/** + * Module variables. + * @private + */ + +var hasOwnProperty = Object.prototype.hasOwnProperty var slice = Array.prototype.slice; /** @@ -352,7 +359,17 @@ app.param = function param(name, fn) { app.set = function set(setting, val) { if (arguments.length === 1) { // app.get(setting) - return this.settings[setting]; + var settings = this.settings + + while (settings && settings !== Object.prototype) { + if (hasOwnProperty.call(settings, setting)) { + return settings[setting] + } + + settings = Object.getPrototypeOf(settings) + } + + return undefined } debug('set "%s" to %o', setting, val); diff --git a/ui/node_modules/express/lib/response.js b/ui/node_modules/express/lib/response.js index 48239a4..fede486 100644 --- a/ui/node_modules/express/lib/response.js +++ b/ui/node_modules/express/lib/response.js @@ -14,6 +14,7 @@ var Buffer = require('safe-buffer').Buffer var contentDisposition = require('content-disposition'); +var createError = require('http-errors') var deprecate = require('depd')('express'); var encodeUrl = require('encodeurl'); var escapeHtml = require('escape-html'); @@ -64,6 +65,9 @@ var charsetRegExp = /;\s*charset\s*=/; */ res.status = function status(code) { + if ((typeof code === 'string' || Math.floor(code) !== code) && code > 99 && code < 1000) { + deprecate('res.status(' + JSON.stringify(code) + '): use res.status(' + Math.floor(code) + ') instead') + } this.statusCode = code; return this; }; @@ -135,7 +139,7 @@ res.send = function send(body) { deprecate('res.send(status): Use res.sendStatus(status) instead'); this.statusCode = chunk; - chunk = statuses[chunk] + chunk = statuses.message[chunk] } switch (typeof chunk) { @@ -213,6 +217,13 @@ res.send = function send(body) { chunk = ''; } + // alter headers for 205 + if (this.statusCode === 205) { + this.set('Content-Length', '0') + this.removeHeader('Transfer-Encoding') + chunk = '' + } + if (req.method === 'HEAD') { // skip body for HEAD this.end(); @@ -356,7 +367,7 @@ res.jsonp = function jsonp(obj) { */ res.sendStatus = function sendStatus(statusCode) { - var body = statuses[statusCode] || String(statusCode) + var body = statuses.message[statusCode] || String(statusCode) this.statusCode = statusCode; this.type('txt'); @@ -524,7 +535,7 @@ res.sendfile = deprecate.function(res.sendfile, * Optionally providing an alternate attachment `filename`, * and optional callback `callback(err)`. The callback is invoked * when the data transfer is complete, or when an error has - * ocurred. Be sure to check `res.headersSent` if you plan to respond. + * occurred. Be sure to check `res.headersSent` if you plan to respond. * * Optionally providing an `options` object to use with `res.sendFile()`. * This function will set the `Content-Disposition` header, overriding @@ -551,6 +562,13 @@ res.download = function download (path, filename, options, callback) { opts = null } + // support optional filename, where options may be in it's place + if (typeof filename === 'object' && + (typeof options === 'function' || options === undefined)) { + name = null + opts = filename + } + // set Content-Disposition when file is sent var headers = { 'Content-Disposition': contentDisposition(name || path) @@ -572,7 +590,9 @@ res.download = function download (path, filename, options, callback) { opts.headers = headers // Resolve the full path for sendFile - var fullPath = resolve(path); + var fullPath = !opts.root + ? resolve(path) + : path // send file return this.sendFile(fullPath, opts, done) @@ -665,9 +685,8 @@ res.format = function(obj){ var req = this.req; var next = req.next; - var fn = obj.default; - if (fn) delete obj.default; - var keys = Object.keys(obj); + var keys = Object.keys(obj) + .filter(function (v) { return v !== 'default' }) var key = keys.length > 0 ? req.accepts(keys) @@ -678,13 +697,12 @@ res.format = function(obj){ if (key) { this.set('Content-Type', normalizeType(key).value); obj[key](req, this, next); - } else if (fn) { - fn(); + } else if (obj.default) { + obj.default(req, this, next) } else { - var err = new Error('Not Acceptable'); - err.status = err.statusCode = 406; - err.types = normalizeTypes(keys).map(function(o){ return o.value }); - next(err); + next(createError(406, { + types: normalizeTypes(keys).map(function (o) { return o.value }) + })) } return this; @@ -850,9 +868,13 @@ res.cookie = function (name, value, options) { val = 's:' + sign(val, secret); } - if ('maxAge' in opts) { - opts.expires = new Date(Date.now() + opts.maxAge); - opts.maxAge /= 1000; + if (opts.maxAge != null) { + var maxAge = opts.maxAge - 0 + + if (!isNaN(maxAge)) { + opts.expires = new Date(Date.now() + maxAge) + opts.maxAge = Math.floor(maxAge / 1000) + } } if (opts.path == null) { @@ -933,12 +955,12 @@ res.redirect = function redirect(url) { // Support text/{plain,html} by default this.format({ text: function(){ - body = statuses[status] + '. Redirecting to ' + address + body = statuses.message[status] + '. Redirecting to ' + address }, html: function(){ var u = escapeHtml(address); - body = '

' + statuses[status] + '. Redirecting to ' + u + '

' + body = '

' + statuses.message[status] + '. Redirecting to ' + u + '

' }, default: function(){ @@ -1113,7 +1135,7 @@ function sendfile(res, file, options, callback) { * ability to escape characters that can trigger HTML sniffing. * * @param {*} value - * @param {function} replaces + * @param {function} replacer * @param {number} spaces * @param {boolean} escape * @returns {string} diff --git a/ui/node_modules/express/lib/router/index.js b/ui/node_modules/express/lib/router/index.js index fbe94ac..5174c34 100644 --- a/ui/node_modules/express/lib/router/index.js +++ b/ui/node_modules/express/lib/router/index.js @@ -108,8 +108,8 @@ proto.param = function param(name, fn) { var ret; if (name[0] === ':') { - deprecate('router.param(' + JSON.stringify(name) + ', fn): Use router.param(' + JSON.stringify(name.substr(1)) + ', fn) instead'); - name = name.substr(1); + deprecate('router.param(' + JSON.stringify(name) + ', fn): Use router.param(' + JSON.stringify(name.slice(1)) + ', fn) instead') + name = name.slice(1) } for (var i = 0; i < len; ++i) { @@ -142,6 +142,7 @@ proto.handle = function handle(req, res, out) { var protohost = getProtohost(req.url) || '' var removed = ''; var slashAdded = false; + var sync = 0 var paramcalled = {}; // store options for OPTIONS request @@ -180,14 +181,14 @@ proto.handle = function handle(req, res, out) { // remove added slash if (slashAdded) { - req.url = req.url.substr(1); + req.url = req.url.slice(1) slashAdded = false; } // restore altered req.url if (removed.length !== 0) { req.baseUrl = parentUrl; - req.url = protohost + removed + req.url.substr(protohost.length); + req.url = protohost + removed + req.url.slice(protohost.length) removed = ''; } @@ -203,6 +204,11 @@ proto.handle = function handle(req, res, out) { return; } + // max sync stack + if (++sync > 100) { + return setImmediate(next, err) + } + // get pathname of request var path = getPathname(req); @@ -251,7 +257,6 @@ proto.handle = function handle(req, res, out) { // don't even bother matching route if (!has_method && method !== 'HEAD') { match = false; - continue; } } @@ -274,21 +279,21 @@ proto.handle = function handle(req, res, out) { // this should be done for the layer self.process_params(layer, paramcalled, req, res, function (err) { if (err) { - return next(layerError || err); - } - - if (route) { - return layer.handle_request(req, res, next); + next(layerError || err) + } else if (route) { + layer.handle_request(req, res, next) + } else { + trim_prefix(layer, layerError, layerPath, path) } - trim_prefix(layer, layerError, layerPath, path); + sync = 0 }); } function trim_prefix(layer, layerError, layerPath, path) { if (layerPath.length !== 0) { // Validate path is a prefix match - if (layerPath !== path.substr(0, layerPath.length)) { + if (layerPath !== path.slice(0, layerPath.length)) { next(layerError) return } @@ -301,7 +306,7 @@ proto.handle = function handle(req, res, out) { // middleware (.use stuff) needs to have the path stripped debug('trim prefix (%s) from url %s', layerPath, req.url); removed = layerPath; - req.url = protohost + req.url.substr(protohost.length + removed.length); + req.url = protohost + req.url.slice(protohost.length + removed.length) // Ensure leading slash if (!protohost && req.url[0] !== '/') { @@ -547,10 +552,10 @@ function getProtohost(url) { var pathLength = searchIndex !== -1 ? searchIndex : url.length - var fqdnIndex = url.substr(0, pathLength).indexOf('://') + var fqdnIndex = url.slice(0, pathLength).indexOf('://') return fqdnIndex !== -1 - ? url.substr(0, url.indexOf('/', 3 + fqdnIndex)) + ? url.substring(0, url.indexOf('/', 3 + fqdnIndex)) : undefined } diff --git a/ui/node_modules/express/lib/router/route.js b/ui/node_modules/express/lib/router/route.js index 178df0d..5adaa12 100644 --- a/ui/node_modules/express/lib/router/route.js +++ b/ui/node_modules/express/lib/router/route.js @@ -98,6 +98,8 @@ Route.prototype._options = function _options() { Route.prototype.dispatch = function dispatch(req, res, done) { var idx = 0; var stack = this.stack; + var sync = 0 + if (stack.length === 0) { return done(); } @@ -127,6 +129,11 @@ Route.prototype.dispatch = function dispatch(req, res, done) { return done(err); } + // max sync stack + if (++sync > 100) { + return setImmediate(next, err) + } + if (layer.method && layer.method !== method) { return next(err); } @@ -136,6 +143,8 @@ Route.prototype.dispatch = function dispatch(req, res, done) { } else { layer.handle_request(req, res, next); } + + sync = 0 } }; diff --git a/ui/node_modules/express/lib/utils.js b/ui/node_modules/express/lib/utils.js index a9ef259..799a6a2 100644 --- a/ui/node_modules/express/lib/utils.js +++ b/ui/node_modules/express/lib/utils.js @@ -120,6 +120,7 @@ exports.contentDisposition = deprecate.function(contentDisposition, * also includes `.originalIndex` for stable sorting * * @param {String} str + * @param {Number} index * @return {Object} * @api private */ @@ -228,7 +229,8 @@ exports.compileTrust = function(val) { if (typeof val === 'string') { // Support comma-separated values - val = val.split(/ *, */); + val = val.split(',') + .map(function (v) { return v.trim() }) } return proxyaddr.compile(val || []); diff --git a/ui/node_modules/express/lib/view.js b/ui/node_modules/express/lib/view.js index cf101ca..c08ab4d 100644 --- a/ui/node_modules/express/lib/view.js +++ b/ui/node_modules/express/lib/view.js @@ -74,7 +74,7 @@ function View(name, options) { if (!opts.engines[this.ext]) { // load engine - var mod = this.ext.substr(1) + var mod = this.ext.slice(1) debug('require "%s"', mod) // default engine export diff --git a/ui/node_modules/express/package.json b/ui/node_modules/express/package.json index b5db814..f5872a5 100644 --- a/ui/node_modules/express/package.json +++ b/ui/node_modules/express/package.json @@ -1,7 +1,7 @@ { "name": "express", "description": "Fast, unopinionated, minimalist web framework", - "version": "4.17.2", + "version": "4.18.1", "author": "TJ Holowaychuk ", "contributors": [ "Aaron Heckmann ", @@ -28,33 +28,34 @@ "api" ], "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.1", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.1", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.6", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -64,19 +65,18 @@ "connect-redis": "3.4.2", "cookie-parser": "1.4.6", "cookie-session": "2.0.0", - "ejs": "3.1.6", + "ejs": "3.1.7", "eslint": "7.32.0", "express-session": "1.17.2", "hbs": "4.2.0", - "istanbul": "0.4.5", "marked": "0.7.0", "method-override": "3.0.0", - "mocha": "9.1.3", + "mocha": "9.2.2", "morgan": "1.10.0", - "multiparty": "4.2.2", + "multiparty": "4.2.3", + "nyc": "15.1.0", "pbkdf2-password": "1.2.1", - "should": "13.2.3", - "supertest": "6.1.6", + "supertest": "6.2.3", "vhost": "~3.0.2" }, "engines": { @@ -92,8 +92,8 @@ "scripts": { "lint": "eslint .", "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/", - "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/", + "test-ci": "nyc --reporter=lcovonly --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test", "test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/" } } diff --git a/ui/node_modules/finalhandler/HISTORY.md b/ui/node_modules/finalhandler/HISTORY.md index 920c35e..ec2d38b 100644 --- a/ui/node_modules/finalhandler/HISTORY.md +++ b/ui/node_modules/finalhandler/HISTORY.md @@ -1,3 +1,11 @@ +1.2.0 / 2022-03-22 +================== + + * Remove set content headers that break response + * deps: on-finished@2.4.1 + * deps: statuses@2.0.1 + - Rename `425 Unordered Collection` to standard `425 Too Early` + 1.1.2 / 2019-05-09 ================== diff --git a/ui/node_modules/finalhandler/LICENSE b/ui/node_modules/finalhandler/LICENSE index fb30982..6022106 100644 --- a/ui/node_modules/finalhandler/LICENSE +++ b/ui/node_modules/finalhandler/LICENSE @@ -1,6 +1,6 @@ (The MIT License) -Copyright (c) 2014-2017 Douglas Christopher Wilson +Copyright (c) 2014-2022 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/ui/node_modules/finalhandler/README.md b/ui/node_modules/finalhandler/README.md index 96327f0..81f10ef 100644 --- a/ui/node_modules/finalhandler/README.md +++ b/ui/node_modules/finalhandler/README.md @@ -3,7 +3,7 @@ [![NPM Version][npm-image]][npm-url] [![NPM Downloads][downloads-image]][downloads-url] [![Node.js Version][node-image]][node-url] -[![Build Status][travis-image]][travis-url] +[![Build Status][github-actions-ci-image]][github-actions-ci-url] [![Test Coverage][coveralls-image]][coveralls-url] Node.js function to invoke as the final step to respond to HTTP request. @@ -20,8 +20,6 @@ $ npm install finalhandler ## API - - ```js var finalhandler = require('finalhandler') ``` @@ -31,7 +29,8 @@ var finalhandler = require('finalhandler') Returns function to be invoked as the final step for the given `req` and `res`. This function is to be invoked as `fn(err)`. If `err` is falsy, the handler will write out a 404 response to the `res`. If it is truthy, an error response will -be written out to the `res`. +be written out to the `res` or `res` will be terminated if a response has already +started. When an error is written, the following information is added to the response: @@ -140,9 +139,9 @@ function logerror (err) { [npm-url]: https://npmjs.org/package/finalhandler [node-image]: https://img.shields.io/node/v/finalhandler.svg [node-url]: https://nodejs.org/en/download -[travis-image]: https://img.shields.io/travis/pillarjs/finalhandler.svg -[travis-url]: https://travis-ci.org/pillarjs/finalhandler [coveralls-image]: https://img.shields.io/coveralls/pillarjs/finalhandler.svg [coveralls-url]: https://coveralls.io/r/pillarjs/finalhandler?branch=master [downloads-image]: https://img.shields.io/npm/dm/finalhandler.svg [downloads-url]: https://npmjs.org/package/finalhandler +[github-actions-ci-image]: https://img.shields.io/github/workflow/status/pillarjs/finalhandler/ci/master?label=ci +[github-actions-ci-url]: https://github.com/jshttp/pillarjs/finalhandler?query=workflow%3Aci diff --git a/ui/node_modules/finalhandler/index.js b/ui/node_modules/finalhandler/index.js index 5673507..f628e42 100644 --- a/ui/node_modules/finalhandler/index.js +++ b/ui/node_modules/finalhandler/index.js @@ -1,6 +1,6 @@ /*! * finalhandler - * Copyright(c) 2014-2017 Douglas Christopher Wilson + * Copyright(c) 2014-2022 Douglas Christopher Wilson * MIT Licensed */ @@ -181,7 +181,7 @@ function getErrorMessage (err, status, env) { } } - return msg || statuses[status] + return msg || statuses.message[status] } /** @@ -276,7 +276,12 @@ function send (req, res, status, headers, message) { // response status res.statusCode = status - res.statusMessage = statuses[status] + res.statusMessage = statuses.message[status] + + // remove any content headers + res.removeHeader('Content-Encoding') + res.removeHeader('Content-Language') + res.removeHeader('Content-Range') // response headers setHeaders(res, headers) diff --git a/ui/node_modules/finalhandler/package.json b/ui/node_modules/finalhandler/package.json index 79c8f3e..16bf11e 100644 --- a/ui/node_modules/finalhandler/package.json +++ b/ui/node_modules/finalhandler/package.json @@ -1,7 +1,7 @@ { "name": "finalhandler", "description": "Node.js final http responder", - "version": "1.1.2", + "version": "1.2.0", "author": "Douglas Christopher Wilson ", "license": "MIT", "repository": "pillarjs/finalhandler", @@ -9,37 +9,38 @@ "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "devDependencies": { - "eslint": "5.16.0", - "eslint-config-standard": "12.0.0", - "eslint-plugin-import": "2.17.2", - "eslint-plugin-markdown": "1.0.0", - "eslint-plugin-node": "8.0.1", - "eslint-plugin-promise": "4.1.1", - "eslint-plugin-standard": "4.0.0", - "istanbul": "0.4.5", - "mocha": "6.1.4", + "eslint": "7.32.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.25.4", + "eslint-plugin-markdown": "2.2.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "5.2.0", + "eslint-plugin-standard": "4.1.0", + "mocha": "9.2.2", + "nyc": "15.1.0", "readable-stream": "2.3.6", - "safe-buffer": "5.1.2", - "supertest": "4.0.2" + "safe-buffer": "5.2.1", + "supertest": "6.2.2" }, "files": [ "LICENSE", "HISTORY.md", + "SECURITY.md", "index.js" ], "engines": { "node": ">= 0.8" }, "scripts": { - "lint": "eslint --plugin markdown --ext js,md .", + "lint": "eslint .", "test": "mocha --reporter spec --bail --check-leaks test/", - "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/" + "test-ci": "nyc --reporter=lcovonly --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" } } diff --git a/ui/node_modules/http-errors/HISTORY.md b/ui/node_modules/http-errors/HISTORY.md index fd802a5..7228684 100644 --- a/ui/node_modules/http-errors/HISTORY.md +++ b/ui/node_modules/http-errors/HISTORY.md @@ -1,3 +1,18 @@ +2.0.0 / 2021-12-17 +================== + + * Drop support for Node.js 0.6 + * Remove `I'mateapot` export; use `ImATeapot` instead + * Remove support for status being non-first argument + * Rename `UnorderedCollection` constructor to `TooEarly` + * deps: depd@2.0.0 + - Replace internal `eval` usage with `Function` constructor + - Use instance methods on `process` to check for listeners + * deps: statuses@2.0.1 + - Fix messaging casing of `418 I'm a Teapot` + - Remove code 306 + - Rename `425 Unordered Collection` to standard `425 Too Early` + 2021-11-14 / 1.8.1 ================== diff --git a/ui/node_modules/http-errors/README.md b/ui/node_modules/http-errors/README.md index 42251a3..a8b7330 100644 --- a/ui/node_modules/http-errors/README.md +++ b/ui/node_modules/http-errors/README.md @@ -14,7 +14,7 @@ This is a [Node.js](https://nodejs.org/en/) module available through the [npm registry](https://www.npmjs.com/). Installation is done using the [`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): -```bash +```console $ npm install http-errors ``` @@ -133,7 +133,7 @@ var err = new createError.NotFound() |422 |UnprocessableEntity | |423 |Locked | |424 |FailedDependency | -|425 |UnorderedCollection | +|425 |TooEarly | |426 |UpgradeRequired | |428 |PreconditionRequired | |429 |TooManyRequests | diff --git a/ui/node_modules/http-errors/index.js b/ui/node_modules/http-errors/index.js index 1a88029..c425f1e 100644 --- a/ui/node_modules/http-errors/index.js +++ b/ui/node_modules/http-errors/index.js @@ -54,24 +54,18 @@ function createError () { var props = {} for (var i = 0; i < arguments.length; i++) { var arg = arguments[i] - if (arg instanceof Error) { + var type = typeof arg + if (type === 'object' && arg instanceof Error) { err = arg status = err.status || err.statusCode || status - continue - } - switch (typeof arg) { - case 'string': - msg = arg - break - case 'number': - status = arg - if (i !== 0) { - deprecate('non-first-argument status code; replace with createError(' + arg + ', ...)') - } - break - case 'object': - props = arg - break + } else if (type === 'number' && i === 0) { + status = arg + } else if (type === 'string') { + msg = arg + } else if (type === 'object') { + props = arg + } else { + throw new TypeError('argument #' + (i + 1) + ' unsupported type ' + type) } } @@ -80,7 +74,7 @@ function createError () { } if (typeof status !== 'number' || - (!statuses[status] && (status < 400 || status >= 600))) { + (!statuses.message[status] && (status < 400 || status >= 600))) { status = 500 } @@ -91,7 +85,7 @@ function createError () { // create error err = HttpError ? new HttpError(msg) - : new Error(msg || statuses[status]) + : new Error(msg || statuses.message[status]) Error.captureStackTrace(err, createError) } @@ -135,7 +129,7 @@ function createClientErrorConstructor (HttpError, name, code) { function ClientError (message) { // create the error object - var msg = message != null ? message : statuses[code] + var msg = message != null ? message : statuses.message[code] var err = new Error(msg) // capture a stack trace to the construction point @@ -204,7 +198,7 @@ function createServerErrorConstructor (HttpError, name, code) { function ServerError (message) { // create the error object - var msg = message != null ? message : statuses[code] + var msg = message != null ? message : statuses.message[code] var err = new Error(msg) // capture a stack trace to the construction point @@ -264,7 +258,7 @@ function nameFunc (func, name) { function populateConstructorExports (exports, codes, HttpError) { codes.forEach(function forEachCode (code) { var CodeError - var name = toIdentifier(statuses[code]) + var name = toIdentifier(statuses.message[code]) switch (codeClass(code)) { case 400: @@ -281,10 +275,6 @@ function populateConstructorExports (exports, codes, HttpError) { exports[name] = CodeError } }) - - // backwards-compatibility - exports["I'mateapot"] = deprecate.function(exports.ImATeapot, - '"I\'mateapot"; use "ImATeapot" instead') } /** diff --git a/ui/node_modules/http-errors/package.json b/ui/node_modules/http-errors/package.json index df52507..4cb6d7e 100644 --- a/ui/node_modules/http-errors/package.json +++ b/ui/node_modules/http-errors/package.json @@ -1,7 +1,7 @@ { "name": "http-errors", "description": "Create HTTP error objects", - "version": "1.8.1", + "version": "2.0.0", "author": "Jonathan Ong (http://jongleberry.com)", "contributors": [ "Alan Plum ", @@ -10,10 +10,10 @@ "license": "MIT", "repository": "jshttp/http-errors", "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "devDependencies": { @@ -22,19 +22,20 @@ "eslint-plugin-import": "2.25.3", "eslint-plugin-markdown": "2.2.1", "eslint-plugin-node": "11.1.0", - "eslint-plugin-promise": "5.1.1", + "eslint-plugin-promise": "5.2.0", "eslint-plugin-standard": "4.1.0", "mocha": "9.1.3", "nyc": "15.1.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" }, "scripts": { "lint": "eslint . && node ./scripts/lint-readme-list.js", "test": "mocha --reporter spec --bail", "test-ci": "nyc --reporter=lcov --reporter=text npm test", - "test-cov": "nyc --reporter=html --reporter=text npm test" + "test-cov": "nyc --reporter=html --reporter=text npm test", + "version": "node scripts/version-history.js && git add HISTORY.md" }, "keywords": [ "http", diff --git a/ui/node_modules/negotiator/HISTORY.md b/ui/node_modules/negotiator/HISTORY.md index 6d06c76..a9a5449 100644 --- a/ui/node_modules/negotiator/HISTORY.md +++ b/ui/node_modules/negotiator/HISTORY.md @@ -1,3 +1,8 @@ +0.6.3 / 2022-01-22 +================== + + * Revert "Lazy-load modules from main entry point" + 0.6.2 / 2019-04-29 ================== diff --git a/ui/node_modules/negotiator/README.md b/ui/node_modules/negotiator/README.md index 04a67ff..82915e5 100644 --- a/ui/node_modules/negotiator/README.md +++ b/ui/node_modules/negotiator/README.md @@ -3,7 +3,7 @@ [![NPM Version][npm-image]][npm-url] [![NPM Downloads][downloads-image]][downloads-url] [![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] +[![Build Status][github-actions-ci-image]][github-actions-ci-url] [![Test Coverage][coveralls-image]][coveralls-url] An HTTP content negotiator for Node.js @@ -195,9 +195,9 @@ and more. [npm-url]: https://npmjs.org/package/negotiator [node-version-image]: https://img.shields.io/node/v/negotiator.svg [node-version-url]: https://nodejs.org/en/download/ -[travis-image]: https://img.shields.io/travis/jshttp/negotiator/master.svg -[travis-url]: https://travis-ci.org/jshttp/negotiator [coveralls-image]: https://img.shields.io/coveralls/jshttp/negotiator/master.svg [coveralls-url]: https://coveralls.io/r/jshttp/negotiator?branch=master [downloads-image]: https://img.shields.io/npm/dm/negotiator.svg [downloads-url]: https://npmjs.org/package/negotiator +[github-actions-ci-image]: https://img.shields.io/github/workflow/status/jshttp/negotiator/ci/master?label=ci +[github-actions-ci-url]: https://github.com/jshttp/negotiator/actions/workflows/ci.yml diff --git a/ui/node_modules/negotiator/index.js b/ui/node_modules/negotiator/index.js index 8d4f6a2..4788264 100644 --- a/ui/node_modules/negotiator/index.js +++ b/ui/node_modules/negotiator/index.js @@ -8,12 +8,10 @@ 'use strict'; -/** - * Cached loaded submodules. - * @private - */ - -var modules = Object.create(null); +var preferredCharsets = require('./lib/charset') +var preferredEncodings = require('./lib/encoding') +var preferredLanguages = require('./lib/language') +var preferredMediaTypes = require('./lib/mediaType') /** * Module exports. @@ -43,7 +41,6 @@ Negotiator.prototype.charset = function charset(available) { }; Negotiator.prototype.charsets = function charsets(available) { - var preferredCharsets = loadModule('charset').preferredCharsets; return preferredCharsets(this.request.headers['accept-charset'], available); }; @@ -53,7 +50,6 @@ Negotiator.prototype.encoding = function encoding(available) { }; Negotiator.prototype.encodings = function encodings(available) { - var preferredEncodings = loadModule('encoding').preferredEncodings; return preferredEncodings(this.request.headers['accept-encoding'], available); }; @@ -63,7 +59,6 @@ Negotiator.prototype.language = function language(available) { }; Negotiator.prototype.languages = function languages(available) { - var preferredLanguages = loadModule('language').preferredLanguages; return preferredLanguages(this.request.headers['accept-language'], available); }; @@ -73,7 +68,6 @@ Negotiator.prototype.mediaType = function mediaType(available) { }; Negotiator.prototype.mediaTypes = function mediaTypes(available) { - var preferredMediaTypes = loadModule('mediaType').preferredMediaTypes; return preferredMediaTypes(this.request.headers.accept, available); }; @@ -86,39 +80,3 @@ Negotiator.prototype.preferredLanguage = Negotiator.prototype.language; Negotiator.prototype.preferredLanguages = Negotiator.prototype.languages; Negotiator.prototype.preferredMediaType = Negotiator.prototype.mediaType; Negotiator.prototype.preferredMediaTypes = Negotiator.prototype.mediaTypes; - -/** - * Load the given module. - * @private - */ - -function loadModule(moduleName) { - var module = modules[moduleName]; - - if (module !== undefined) { - return module; - } - - // This uses a switch for static require analysis - switch (moduleName) { - case 'charset': - module = require('./lib/charset'); - break; - case 'encoding': - module = require('./lib/encoding'); - break; - case 'language': - module = require('./lib/language'); - break; - case 'mediaType': - module = require('./lib/mediaType'); - break; - default: - throw new Error('Cannot find module \'' + moduleName + '\''); - } - - // Store to prevent invoking require() - modules[moduleName] = module; - - return module; -} diff --git a/ui/node_modules/negotiator/lib/language.js b/ui/node_modules/negotiator/lib/language.js index 62f737f..a231672 100644 --- a/ui/node_modules/negotiator/lib/language.js +++ b/ui/node_modules/negotiator/lib/language.js @@ -54,9 +54,9 @@ function parseLanguage(str, i) { var match = simpleLanguageRegExp.exec(str); if (!match) return null; - var prefix = match[1], - suffix = match[2], - full = prefix; + var prefix = match[1] + var suffix = match[2] + var full = prefix if (suffix) full += "-" + suffix; diff --git a/ui/node_modules/negotiator/package.json b/ui/node_modules/negotiator/package.json index 0c7ff3c..297635f 100644 --- a/ui/node_modules/negotiator/package.json +++ b/ui/node_modules/negotiator/package.json @@ -1,7 +1,7 @@ { "name": "negotiator", "description": "HTTP content negotiation", - "version": "0.6.2", + "version": "0.6.3", "contributors": [ "Douglas Christopher Wilson ", "Federico Romero ", @@ -18,10 +18,10 @@ ], "repository": "jshttp/negotiator", "devDependencies": { - "eslint": "5.16.0", - "eslint-plugin-markdown": "1.0.0", - "mocha": "6.1.4", - "nyc": "14.0.0" + "eslint": "7.32.0", + "eslint-plugin-markdown": "2.2.1", + "mocha": "9.1.3", + "nyc": "15.1.0" }, "files": [ "lib/", @@ -34,9 +34,9 @@ "node": ">= 0.6" }, "scripts": { - "lint": "eslint --plugin markdown --ext js,md .", + "lint": "eslint .", "test": "mocha --reporter spec --check-leaks --bail test/", - "test-cov": "nyc --reporter=html --reporter=text npm test", - "test-travis": "nyc --reporter=text npm test" + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" } } diff --git a/ui/node_modules/qs/.editorconfig b/ui/node_modules/qs/.editorconfig index 91040dd..0ea91d9 100644 --- a/ui/node_modules/qs/.editorconfig +++ b/ui/node_modules/qs/.editorconfig @@ -8,6 +8,7 @@ charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true max_line_length = 160 +quote_type = single [test/*] max_line_length = off diff --git a/ui/node_modules/qs/.eslintignore b/ui/node_modules/qs/.eslintignore deleted file mode 100644 index a60030e..0000000 --- a/ui/node_modules/qs/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist/ -coverage/ diff --git a/ui/node_modules/qs/.eslintrc b/ui/node_modules/qs/.eslintrc index e448a2f..6884760 100644 --- a/ui/node_modules/qs/.eslintrc +++ b/ui/node_modules/qs/.eslintrc @@ -3,20 +3,23 @@ "extends": "@ljharb", + "ignorePatterns": [ + "dist/", + ], + "rules": { "complexity": 0, "consistent-return": 1, - "func-name-matching": 0, + "func-name-matching": 0, "id-length": [2, { "min": 1, "max": 25, "properties": "never" }], "indent": [2, 4], "max-lines-per-function": [2, { "max": 150 }], - "max-params": [2, 14], + "max-params": [2, 15], "max-statements": [2, 52], "multiline-comment-style": 0, "no-continue": 1, "no-magic-numbers": 0, "no-restricted-syntax": [2, "BreakStatement", "DebuggerStatement", "ForInStatement", "LabeledStatement", "WithStatement"], - "operator-linebreak": [2, "before"], }, "overrides": [ diff --git a/ui/node_modules/qs/CHANGELOG.md b/ui/node_modules/qs/CHANGELOG.md index d43209c..c6b2915 100644 --- a/ui/node_modules/qs/CHANGELOG.md +++ b/ui/node_modules/qs/CHANGELOG.md @@ -1,3 +1,32 @@ +## **6.10.3** +- [Fix] `parse`: ignore `__proto__` keys (#428) +- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) +- [actions] reuse common workflows +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `object-inspect`, `tape` + +## **6.10.2** +- [Fix] `stringify`: actually fix cyclic references (#426) +- [Fix] `stringify`: avoid encoding arrayformat comma when `encodeValuesOnly = true` (#424) +- [readme] remove travis badge; add github actions/codecov badges; update URLs +- [Docs] add note and links for coercing primitive values (#408) +- [actions] update codecov uploader +- [actions] update workflows +- [Tests] clean up stringify tests slightly +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `object-inspect`, `safe-publish-latest`, `tape` + +## **6.10.1** +- [Fix] `stringify`: avoid exception on repeated object values (#402) + +## **6.10.0** +- [New] `stringify`: throw on cycles, instead of an infinite loop (#395, #394, #393) +- [New] `parse`: add `allowSparse` option for collapsing arrays with missing indices (#312) +- [meta] fix README.md (#399) +- [meta] only run `npm run dist` in publish, not install +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `has-symbols`, `tape` +- [Tests] fix tests on node v0.6 +- [Tests] use `ljharb/actions/node/install` instead of `ljharb/actions/node/run` +- [Tests] Revert "[meta] ignore eclint transitive audit warning" + ## **6.9.6** - [Fix] restore `dist` dir; mistakenly removed in d4f6c32 diff --git a/ui/node_modules/qs/README.md b/ui/node_modules/qs/README.md index 84f2534..0126380 100644 --- a/ui/node_modules/qs/README.md +++ b/ui/node_modules/qs/README.md @@ -1,12 +1,13 @@ # qs [![Version Badge][2]][1] -[![Build Status][3]][4] -[![dependency status][5]][6] -[![dev dependency status][7]][8] +[![github actions][actions-image]][actions-url] +[![coverage][codecov-image]][codecov-url] +[![dependency status][deps-svg]][deps-url] +[![dev dependency status][dev-deps-svg]][dev-deps-url] [![License][license-image]][license-url] [![Downloads][downloads-image]][downloads-url] -[![npm badge][11]][1] +[![npm badge][npm-badge-png]][package-url] A querystring parsing and stringifying library with some added security. @@ -227,6 +228,13 @@ var noSparse = qs.parse('a[1]=b&a[15]=c'); assert.deepEqual(noSparse, { a: ['b', 'c'] }); ``` +You may also use `allowSparse` option to parse sparse arrays: + +```javascript +var sparseArray = qs.parse('a[1]=2&a[3]=5', { allowSparse: true }); +assert.deepEqual(sparseArray, { a: [, '2', , '5'] }); +``` + Note that an empty string is also a value, and will be preserved: ```javascript @@ -280,6 +288,17 @@ assert.deepEqual(arraysOfObjects, { a: ['b', 'c'] }) ``` (_this cannot convert nested objects, such as `a={b:1},{c:d}`_) +### Parsing primitive/scalar values (numbers, booleans, null, etc) + +By default, all values are parsed as strings. This behavior will not change and is explained in [issue #91](https://github.com/ljharb/qs/issues/91). + +```javascript +var primitiveValues = qs.parse('a=15&b=true&c=null'); +assert.deepEqual(primitiveValues, { a: '15', b: 'true', c: 'null' }); +``` + +If you wish to auto-convert values which look like numbers, booleans, and other values into their primitive counterparts, you can use the [query-types Express JS middleware](https://github.com/xpepermint/query-types) which will auto-convert all request query parameters. + ### Stringifying [](#preventEval) @@ -345,7 +364,7 @@ var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultE The type argument is also provided to the decoder: ```javascript -var decoded = qs.parse('x=z', { decoder: function (str, defaultEncoder, charset, type) { +var decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) { if (type === 'key') { return // Decoded key } else if (type === 'value') { @@ -587,18 +606,18 @@ Available as part of the Tidelift Subscription The maintainers of qs and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) -[1]: https://npmjs.org/package/qs -[2]: http://versionbadg.es/ljharb/qs.svg -[3]: https://api.travis-ci.org/ljharb/qs.svg -[4]: https://travis-ci.org/ljharb/qs -[5]: https://david-dm.org/ljharb/qs.svg -[6]: https://david-dm.org/ljharb/qs -[7]: https://david-dm.org/ljharb/qs/dev-status.svg -[8]: https://david-dm.org/ljharb/qs?type=dev -[9]: https://ci.testling.com/ljharb/qs.png -[10]: https://ci.testling.com/ljharb/qs -[11]: https://nodei.co/npm/qs.png?downloads=true&stars=true -[license-image]: http://img.shields.io/npm/l/qs.svg +[package-url]: https://npmjs.org/package/qs +[npm-version-svg]: https://versionbadg.es/ljharb/qs.svg +[deps-svg]: https://david-dm.org/ljharb/qs.svg +[deps-url]: https://david-dm.org/ljharb/qs +[dev-deps-svg]: https://david-dm.org/ljharb/qs/dev-status.svg +[dev-deps-url]: https://david-dm.org/ljharb/qs#info=devDependencies +[npm-badge-png]: https://nodei.co/npm/qs.png?downloads=true&stars=true +[license-image]: https://img.shields.io/npm/l/qs.svg [license-url]: LICENSE -[downloads-image]: http://img.shields.io/npm/dm/qs.svg -[downloads-url]: http://npm-stat.com/charts.html?package=qs +[downloads-image]: https://img.shields.io/npm/dm/qs.svg +[downloads-url]: https://npm-stat.com/charts.html?package=qs +[codecov-image]: https://codecov.io/gh/ljharb/qs/branch/main/graphs/badge.svg +[codecov-url]: https://app.codecov.io/gh/ljharb/qs/ +[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/qs +[actions-url]: https://github.com/ljharb/qs/actions diff --git a/ui/node_modules/qs/dist/qs.js b/ui/node_modules/qs/dist/qs.js index 861a6f1..94baf8f 100644 --- a/ui/node_modules/qs/dist/qs.js +++ b/ui/node_modules/qs/dist/qs.js @@ -47,6 +47,7 @@ var isArray = Array.isArray; var defaults = { allowDots: false, allowPrototypes: false, + allowSparse: false, arrayLimit: 20, charset: 'utf-8', charsetSentinel: false, @@ -174,7 +175,7 @@ var parseObject = function (chain, val, options, valuesParsed) { ) { obj = []; obj[index] = leaf; - } else { + } else if (cleanRoot !== '__proto__') { obj[cleanRoot] = leaf; } } @@ -256,6 +257,7 @@ var normalizeParseOptions = function normalizeParseOptions(opts) { return { allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, + allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse, arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, charset: charset, charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, @@ -292,12 +294,17 @@ module.exports = function (str, opts) { obj = utils.merge(obj, newObj, options); } + if (options.allowSparse === true) { + return obj; + } + return utils.compact(obj); }; },{"./utils":5}],4:[function(require,module,exports){ 'use strict'; +var getSideChannel = require('side-channel'); var utils = require('./utils'); var formats = require('./formats'); var has = Object.prototype.hasOwnProperty; @@ -316,6 +323,7 @@ var arrayPrefixGenerators = { }; var isArray = Array.isArray; +var split = String.prototype.split; var push = Array.prototype.push; var pushToArray = function (arr, valueOrArray) { push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); @@ -352,6 +360,8 @@ var isNonNullishPrimitive = function isNonNullishPrimitive(v) { || typeof v === 'bigint'; }; +var sentinel = {}; + var stringify = function stringify( object, prefix, @@ -366,9 +376,30 @@ var stringify = function stringify( format, formatter, encodeValuesOnly, - charset + charset, + sideChannel ) { var obj = object; + + var tmpSc = sideChannel; + var step = 0; + var findFlag = false; + while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) { + // Where object last appeared in the ref tree + var pos = tmpSc.get(object); + step += 1; + if (typeof pos !== 'undefined') { + if (pos === step) { + throw new RangeError('Cyclic object value'); + } else { + findFlag = true; // Break while + } + } + if (typeof tmpSc.get(sentinel) === 'undefined') { + step = 0; + } + } + if (typeof filter === 'function') { obj = filter(prefix, obj); } else if (obj instanceof Date) { @@ -393,6 +424,14 @@ var stringify = function stringify( if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) { if (encoder) { var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format); + if (generateArrayPrefix === 'comma' && encodeValuesOnly) { + var valuesArray = split.call(String(obj), ','); + var valuesJoined = ''; + for (var i = 0; i < valuesArray.length; ++i) { + valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format)); + } + return [formatter(keyValue) + '=' + valuesJoined]; + } return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))]; } return [formatter(prefix) + '=' + formatter(String(obj))]; @@ -407,7 +446,7 @@ var stringify = function stringify( var objKeys; if (generateArrayPrefix === 'comma' && isArray(obj)) { // we need to join elements in - objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : undefined }]; + objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }]; } else if (isArray(filter)) { objKeys = filter; } else { @@ -415,9 +454,9 @@ var stringify = function stringify( objKeys = sort ? keys.sort(sort) : keys; } - for (var i = 0; i < objKeys.length; ++i) { - var key = objKeys[i]; - var value = typeof key === 'object' && key.value !== undefined ? key.value : obj[key]; + for (var j = 0; j < objKeys.length; ++j) { + var key = objKeys[j]; + var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key]; if (skipNulls && value === null) { continue; @@ -427,6 +466,9 @@ var stringify = function stringify( ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix : prefix + (allowDots ? '.' + key : '[' + key + ']'); + sideChannel.set(object, step); + var valueSideChannel = getSideChannel(); + valueSideChannel.set(sentinel, sideChannel); pushToArray(values, stringify( value, keyPrefix, @@ -441,7 +483,8 @@ var stringify = function stringify( format, formatter, encodeValuesOnly, - charset + charset, + valueSideChannel )); } @@ -453,7 +496,7 @@ var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { return defaults; } - if (opts.encoder !== null && opts.encoder !== undefined && typeof opts.encoder !== 'function') { + if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') { throw new TypeError('Encoder has to be a function.'); } @@ -535,6 +578,7 @@ module.exports = function (object, opts) { objKeys.sort(options.sort); } + var sideChannel = getSideChannel(); for (var i = 0; i < objKeys.length; ++i) { var key = objKeys[i]; @@ -555,7 +599,8 @@ module.exports = function (object, opts) { options.format, options.formatter, options.encodeValuesOnly, - options.charset + options.charset, + sideChannel )); } @@ -575,7 +620,7 @@ module.exports = function (object, opts) { return joined.length > 0 ? prefix + joined : ''; }; -},{"./formats":1,"./utils":5}],5:[function(require,module,exports){ +},{"./formats":1,"./utils":5,"side-channel":16}],5:[function(require,module,exports){ 'use strict'; var formats = require('./formats'); @@ -755,6 +800,7 @@ var encode = function encode(str, defaultEncoder, charset, kind, format) { i += 1; c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); + /* eslint operator-linebreak: [2, "before"] */ out += hexTable[0xF0 | (c >> 18)] + hexTable[0x80 | ((c >> 12) & 0x3F)] + hexTable[0x80 | ((c >> 6) & 0x3F)] @@ -828,5 +874,1171 @@ module.exports = { merge: merge }; -},{"./formats":1}]},{},[2])(2) +},{"./formats":1}],6:[function(require,module,exports){ + +},{}],7:[function(require,module,exports){ +'use strict'; + +var GetIntrinsic = require('get-intrinsic'); + +var callBind = require('./'); + +var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf')); + +module.exports = function callBoundIntrinsic(name, allowMissing) { + var intrinsic = GetIntrinsic(name, !!allowMissing); + if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) { + return callBind(intrinsic); + } + return intrinsic; +}; + +},{"./":8,"get-intrinsic":11}],8:[function(require,module,exports){ +'use strict'; + +var bind = require('function-bind'); +var GetIntrinsic = require('get-intrinsic'); + +var $apply = GetIntrinsic('%Function.prototype.apply%'); +var $call = GetIntrinsic('%Function.prototype.call%'); +var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply); + +var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true); +var $defineProperty = GetIntrinsic('%Object.defineProperty%', true); +var $max = GetIntrinsic('%Math.max%'); + +if ($defineProperty) { + try { + $defineProperty({}, 'a', { value: 1 }); + } catch (e) { + // IE 8 has a broken defineProperty + $defineProperty = null; + } +} + +module.exports = function callBind(originalFunction) { + var func = $reflectApply(bind, $call, arguments); + if ($gOPD && $defineProperty) { + var desc = $gOPD(func, 'length'); + if (desc.configurable) { + // original length, plus the receiver, minus any additional arguments (after the receiver) + $defineProperty( + func, + 'length', + { value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) } + ); + } + } + return func; +}; + +var applyBind = function applyBind() { + return $reflectApply(bind, $apply, arguments); +}; + +if ($defineProperty) { + $defineProperty(module.exports, 'apply', { value: applyBind }); +} else { + module.exports.apply = applyBind; +} + +},{"function-bind":10,"get-intrinsic":11}],9:[function(require,module,exports){ +'use strict'; + +/* eslint no-invalid-this: 1 */ + +var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; +var slice = Array.prototype.slice; +var toStr = Object.prototype.toString; +var funcType = '[object Function]'; + +module.exports = function bind(that) { + var target = this; + if (typeof target !== 'function' || toStr.call(target) !== funcType) { + throw new TypeError(ERROR_MESSAGE + target); + } + var args = slice.call(arguments, 1); + + var bound; + var binder = function () { + if (this instanceof bound) { + var result = target.apply( + this, + args.concat(slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return this; + } else { + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + } + }; + + var boundLength = Math.max(0, target.length - args.length); + var boundArgs = []; + for (var i = 0; i < boundLength; i++) { + boundArgs.push('$' + i); + } + + bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder); + + if (target.prototype) { + var Empty = function Empty() {}; + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + + return bound; +}; + +},{}],10:[function(require,module,exports){ +'use strict'; + +var implementation = require('./implementation'); + +module.exports = Function.prototype.bind || implementation; + +},{"./implementation":9}],11:[function(require,module,exports){ +'use strict'; + +var undefined; + +var $SyntaxError = SyntaxError; +var $Function = Function; +var $TypeError = TypeError; + +// eslint-disable-next-line consistent-return +var getEvalledConstructor = function (expressionSyntax) { + try { + return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')(); + } catch (e) {} +}; + +var $gOPD = Object.getOwnPropertyDescriptor; +if ($gOPD) { + try { + $gOPD({}, ''); + } catch (e) { + $gOPD = null; // this is IE 8, which has a broken gOPD + } +} + +var throwTypeError = function () { + throw new $TypeError(); +}; +var ThrowTypeError = $gOPD + ? (function () { + try { + // eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties + arguments.callee; // IE 8 does not throw here + return throwTypeError; + } catch (calleeThrows) { + try { + // IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '') + return $gOPD(arguments, 'callee').get; + } catch (gOPDthrows) { + return throwTypeError; + } + } + }()) + : throwTypeError; + +var hasSymbols = require('has-symbols')(); + +var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto + +var needsEval = {}; + +var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array); + +var INTRINSICS = { + '%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError, + '%Array%': Array, + '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer, + '%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined, + '%AsyncFromSyncIteratorPrototype%': undefined, + '%AsyncFunction%': needsEval, + '%AsyncGenerator%': needsEval, + '%AsyncGeneratorFunction%': needsEval, + '%AsyncIteratorPrototype%': needsEval, + '%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics, + '%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt, + '%Boolean%': Boolean, + '%DataView%': typeof DataView === 'undefined' ? undefined : DataView, + '%Date%': Date, + '%decodeURI%': decodeURI, + '%decodeURIComponent%': decodeURIComponent, + '%encodeURI%': encodeURI, + '%encodeURIComponent%': encodeURIComponent, + '%Error%': Error, + '%eval%': eval, // eslint-disable-line no-eval + '%EvalError%': EvalError, + '%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array, + '%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array, + '%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry, + '%Function%': $Function, + '%GeneratorFunction%': needsEval, + '%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array, + '%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array, + '%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array, + '%isFinite%': isFinite, + '%isNaN%': isNaN, + '%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined, + '%JSON%': typeof JSON === 'object' ? JSON : undefined, + '%Map%': typeof Map === 'undefined' ? undefined : Map, + '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()), + '%Math%': Math, + '%Number%': Number, + '%Object%': Object, + '%parseFloat%': parseFloat, + '%parseInt%': parseInt, + '%Promise%': typeof Promise === 'undefined' ? undefined : Promise, + '%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy, + '%RangeError%': RangeError, + '%ReferenceError%': ReferenceError, + '%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect, + '%RegExp%': RegExp, + '%Set%': typeof Set === 'undefined' ? undefined : Set, + '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()), + '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer, + '%String%': String, + '%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined, + '%Symbol%': hasSymbols ? Symbol : undefined, + '%SyntaxError%': $SyntaxError, + '%ThrowTypeError%': ThrowTypeError, + '%TypedArray%': TypedArray, + '%TypeError%': $TypeError, + '%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array, + '%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray, + '%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array, + '%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array, + '%URIError%': URIError, + '%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap, + '%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef, + '%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet +}; + +var doEval = function doEval(name) { + var value; + if (name === '%AsyncFunction%') { + value = getEvalledConstructor('async function () {}'); + } else if (name === '%GeneratorFunction%') { + value = getEvalledConstructor('function* () {}'); + } else if (name === '%AsyncGeneratorFunction%') { + value = getEvalledConstructor('async function* () {}'); + } else if (name === '%AsyncGenerator%') { + var fn = doEval('%AsyncGeneratorFunction%'); + if (fn) { + value = fn.prototype; + } + } else if (name === '%AsyncIteratorPrototype%') { + var gen = doEval('%AsyncGenerator%'); + if (gen) { + value = getProto(gen.prototype); + } + } + + INTRINSICS[name] = value; + + return value; +}; + +var LEGACY_ALIASES = { + '%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'], + '%ArrayPrototype%': ['Array', 'prototype'], + '%ArrayProto_entries%': ['Array', 'prototype', 'entries'], + '%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'], + '%ArrayProto_keys%': ['Array', 'prototype', 'keys'], + '%ArrayProto_values%': ['Array', 'prototype', 'values'], + '%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'], + '%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'], + '%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'], + '%BooleanPrototype%': ['Boolean', 'prototype'], + '%DataViewPrototype%': ['DataView', 'prototype'], + '%DatePrototype%': ['Date', 'prototype'], + '%ErrorPrototype%': ['Error', 'prototype'], + '%EvalErrorPrototype%': ['EvalError', 'prototype'], + '%Float32ArrayPrototype%': ['Float32Array', 'prototype'], + '%Float64ArrayPrototype%': ['Float64Array', 'prototype'], + '%FunctionPrototype%': ['Function', 'prototype'], + '%Generator%': ['GeneratorFunction', 'prototype'], + '%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'], + '%Int8ArrayPrototype%': ['Int8Array', 'prototype'], + '%Int16ArrayPrototype%': ['Int16Array', 'prototype'], + '%Int32ArrayPrototype%': ['Int32Array', 'prototype'], + '%JSONParse%': ['JSON', 'parse'], + '%JSONStringify%': ['JSON', 'stringify'], + '%MapPrototype%': ['Map', 'prototype'], + '%NumberPrototype%': ['Number', 'prototype'], + '%ObjectPrototype%': ['Object', 'prototype'], + '%ObjProto_toString%': ['Object', 'prototype', 'toString'], + '%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'], + '%PromisePrototype%': ['Promise', 'prototype'], + '%PromiseProto_then%': ['Promise', 'prototype', 'then'], + '%Promise_all%': ['Promise', 'all'], + '%Promise_reject%': ['Promise', 'reject'], + '%Promise_resolve%': ['Promise', 'resolve'], + '%RangeErrorPrototype%': ['RangeError', 'prototype'], + '%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'], + '%RegExpPrototype%': ['RegExp', 'prototype'], + '%SetPrototype%': ['Set', 'prototype'], + '%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'], + '%StringPrototype%': ['String', 'prototype'], + '%SymbolPrototype%': ['Symbol', 'prototype'], + '%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'], + '%TypedArrayPrototype%': ['TypedArray', 'prototype'], + '%TypeErrorPrototype%': ['TypeError', 'prototype'], + '%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'], + '%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'], + '%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'], + '%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'], + '%URIErrorPrototype%': ['URIError', 'prototype'], + '%WeakMapPrototype%': ['WeakMap', 'prototype'], + '%WeakSetPrototype%': ['WeakSet', 'prototype'] +}; + +var bind = require('function-bind'); +var hasOwn = require('has'); +var $concat = bind.call(Function.call, Array.prototype.concat); +var $spliceApply = bind.call(Function.apply, Array.prototype.splice); +var $replace = bind.call(Function.call, String.prototype.replace); +var $strSlice = bind.call(Function.call, String.prototype.slice); + +/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */ +var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; +var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */ +var stringToPath = function stringToPath(string) { + var first = $strSlice(string, 0, 1); + var last = $strSlice(string, -1); + if (first === '%' && last !== '%') { + throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`'); + } else if (last === '%' && first !== '%') { + throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`'); + } + var result = []; + $replace(string, rePropName, function (match, number, quote, subString) { + result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match; + }); + return result; +}; +/* end adaptation */ + +var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) { + var intrinsicName = name; + var alias; + if (hasOwn(LEGACY_ALIASES, intrinsicName)) { + alias = LEGACY_ALIASES[intrinsicName]; + intrinsicName = '%' + alias[0] + '%'; + } + + if (hasOwn(INTRINSICS, intrinsicName)) { + var value = INTRINSICS[intrinsicName]; + if (value === needsEval) { + value = doEval(intrinsicName); + } + if (typeof value === 'undefined' && !allowMissing) { + throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!'); + } + + return { + alias: alias, + name: intrinsicName, + value: value + }; + } + + throw new $SyntaxError('intrinsic ' + name + ' does not exist!'); +}; + +module.exports = function GetIntrinsic(name, allowMissing) { + if (typeof name !== 'string' || name.length === 0) { + throw new $TypeError('intrinsic name must be a non-empty string'); + } + if (arguments.length > 1 && typeof allowMissing !== 'boolean') { + throw new $TypeError('"allowMissing" argument must be a boolean'); + } + + var parts = stringToPath(name); + var intrinsicBaseName = parts.length > 0 ? parts[0] : ''; + + var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing); + var intrinsicRealName = intrinsic.name; + var value = intrinsic.value; + var skipFurtherCaching = false; + + var alias = intrinsic.alias; + if (alias) { + intrinsicBaseName = alias[0]; + $spliceApply(parts, $concat([0, 1], alias)); + } + + for (var i = 1, isOwn = true; i < parts.length; i += 1) { + var part = parts[i]; + var first = $strSlice(part, 0, 1); + var last = $strSlice(part, -1); + if ( + ( + (first === '"' || first === "'" || first === '`') + || (last === '"' || last === "'" || last === '`') + ) + && first !== last + ) { + throw new $SyntaxError('property names with quotes must have matching quotes'); + } + if (part === 'constructor' || !isOwn) { + skipFurtherCaching = true; + } + + intrinsicBaseName += '.' + part; + intrinsicRealName = '%' + intrinsicBaseName + '%'; + + if (hasOwn(INTRINSICS, intrinsicRealName)) { + value = INTRINSICS[intrinsicRealName]; + } else if (value != null) { + if (!(part in value)) { + if (!allowMissing) { + throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.'); + } + return void undefined; + } + if ($gOPD && (i + 1) >= parts.length) { + var desc = $gOPD(value, part); + isOwn = !!desc; + + // By convention, when a data property is converted to an accessor + // property to emulate a data property that does not suffer from + // the override mistake, that accessor's getter is marked with + // an `originalValue` property. Here, when we detect this, we + // uphold the illusion by pretending to see that original data + // property, i.e., returning the value rather than the getter + // itself. + if (isOwn && 'get' in desc && !('originalValue' in desc.get)) { + value = desc.get; + } else { + value = value[part]; + } + } else { + isOwn = hasOwn(value, part); + value = value[part]; + } + + if (isOwn && !skipFurtherCaching) { + INTRINSICS[intrinsicRealName] = value; + } + } + } + return value; +}; + +},{"function-bind":10,"has":14,"has-symbols":12}],12:[function(require,module,exports){ +'use strict'; + +var origSymbol = typeof Symbol !== 'undefined' && Symbol; +var hasSymbolSham = require('./shams'); + +module.exports = function hasNativeSymbols() { + if (typeof origSymbol !== 'function') { return false; } + if (typeof Symbol !== 'function') { return false; } + if (typeof origSymbol('foo') !== 'symbol') { return false; } + if (typeof Symbol('bar') !== 'symbol') { return false; } + + return hasSymbolSham(); +}; + +},{"./shams":13}],13:[function(require,module,exports){ +'use strict'; + +/* eslint complexity: [2, 18], max-statements: [2, 33] */ +module.exports = function hasSymbols() { + if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; } + if (typeof Symbol.iterator === 'symbol') { return true; } + + var obj = {}; + var sym = Symbol('test'); + var symObj = Object(sym); + if (typeof sym === 'string') { return false; } + + if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; } + if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; } + + // temp disabled per https://github.com/ljharb/object.assign/issues/17 + // if (sym instanceof Symbol) { return false; } + // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4 + // if (!(symObj instanceof Symbol)) { return false; } + + // if (typeof Symbol.prototype.toString !== 'function') { return false; } + // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; } + + var symVal = 42; + obj[sym] = symVal; + for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop + if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; } + + if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; } + + var syms = Object.getOwnPropertySymbols(obj); + if (syms.length !== 1 || syms[0] !== sym) { return false; } + + if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; } + + if (typeof Object.getOwnPropertyDescriptor === 'function') { + var descriptor = Object.getOwnPropertyDescriptor(obj, sym); + if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; } + } + + return true; +}; + +},{}],14:[function(require,module,exports){ +'use strict'; + +var bind = require('function-bind'); + +module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty); + +},{"function-bind":10}],15:[function(require,module,exports){ +var hasMap = typeof Map === 'function' && Map.prototype; +var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null; +var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null; +var mapForEach = hasMap && Map.prototype.forEach; +var hasSet = typeof Set === 'function' && Set.prototype; +var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null; +var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null; +var setForEach = hasSet && Set.prototype.forEach; +var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype; +var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null; +var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype; +var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null; +var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype; +var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null; +var booleanValueOf = Boolean.prototype.valueOf; +var objectToString = Object.prototype.toString; +var functionToString = Function.prototype.toString; +var $match = String.prototype.match; +var $slice = String.prototype.slice; +var $replace = String.prototype.replace; +var $toUpperCase = String.prototype.toUpperCase; +var $toLowerCase = String.prototype.toLowerCase; +var $test = RegExp.prototype.test; +var $concat = Array.prototype.concat; +var $join = Array.prototype.join; +var $arrSlice = Array.prototype.slice; +var $floor = Math.floor; +var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null; +var gOPS = Object.getOwnPropertySymbols; +var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null; +var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object'; +// ie, `has-tostringtag/shams +var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol') + ? Symbol.toStringTag + : null; +var isEnumerable = Object.prototype.propertyIsEnumerable; + +var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || ( + [].__proto__ === Array.prototype // eslint-disable-line no-proto + ? function (O) { + return O.__proto__; // eslint-disable-line no-proto + } + : null +); + +function addNumericSeparator(num, str) { + if ( + num === Infinity + || num === -Infinity + || num !== num + || (num && num > -1000 && num < 1000) + || $test.call(/e/, str) + ) { + return str; + } + var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g; + if (typeof num === 'number') { + var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num) + if (int !== num) { + var intStr = String(int); + var dec = $slice.call(str, intStr.length + 1); + return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, ''); + } + } + return $replace.call(str, sepRegex, '$&_'); +} + +var inspectCustom = require('./util.inspect').custom; +var inspectSymbol = inspectCustom && isSymbol(inspectCustom) ? inspectCustom : null; + +module.exports = function inspect_(obj, options, depth, seen) { + var opts = options || {}; + + if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) { + throw new TypeError('option "quoteStyle" must be "single" or "double"'); + } + if ( + has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number' + ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity + : opts.maxStringLength !== null + ) + ) { + throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`'); + } + var customInspect = has(opts, 'customInspect') ? opts.customInspect : true; + if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') { + throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`'); + } + + if ( + has(opts, 'indent') + && opts.indent !== null + && opts.indent !== '\t' + && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0) + ) { + throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`'); + } + if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') { + throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`'); + } + var numericSeparator = opts.numericSeparator; + + if (typeof obj === 'undefined') { + return 'undefined'; + } + if (obj === null) { + return 'null'; + } + if (typeof obj === 'boolean') { + return obj ? 'true' : 'false'; + } + + if (typeof obj === 'string') { + return inspectString(obj, opts); + } + if (typeof obj === 'number') { + if (obj === 0) { + return Infinity / obj > 0 ? '0' : '-0'; + } + var str = String(obj); + return numericSeparator ? addNumericSeparator(obj, str) : str; + } + if (typeof obj === 'bigint') { + var bigIntStr = String(obj) + 'n'; + return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr; + } + + var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth; + if (typeof depth === 'undefined') { depth = 0; } + if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') { + return isArray(obj) ? '[Array]' : '[Object]'; + } + + var indent = getIndent(opts, depth); + + if (typeof seen === 'undefined') { + seen = []; + } else if (indexOf(seen, obj) >= 0) { + return '[Circular]'; + } + + function inspect(value, from, noIndent) { + if (from) { + seen = $arrSlice.call(seen); + seen.push(from); + } + if (noIndent) { + var newOpts = { + depth: opts.depth + }; + if (has(opts, 'quoteStyle')) { + newOpts.quoteStyle = opts.quoteStyle; + } + return inspect_(value, newOpts, depth + 1, seen); + } + return inspect_(value, opts, depth + 1, seen); + } + + if (typeof obj === 'function') { + var name = nameOf(obj); + var keys = arrObjKeys(obj, inspect); + return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : ''); + } + if (isSymbol(obj)) { + var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj); + return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString; + } + if (isElement(obj)) { + var s = '<' + $toLowerCase.call(String(obj.nodeName)); + var attrs = obj.attributes || []; + for (var i = 0; i < attrs.length; i++) { + s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts); + } + s += '>'; + if (obj.childNodes && obj.childNodes.length) { s += '...'; } + s += ''; + return s; + } + if (isArray(obj)) { + if (obj.length === 0) { return '[]'; } + var xs = arrObjKeys(obj, inspect); + if (indent && !singleLineValues(xs)) { + return '[' + indentedJoin(xs, indent) + ']'; + } + return '[ ' + $join.call(xs, ', ') + ' ]'; + } + if (isError(obj)) { + var parts = arrObjKeys(obj, inspect); + if ('cause' in obj && !isEnumerable.call(obj, 'cause')) { + return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }'; + } + if (parts.length === 0) { return '[' + String(obj) + ']'; } + return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }'; + } + if (typeof obj === 'object' && customInspect) { + if (inspectSymbol && typeof obj[inspectSymbol] === 'function') { + return obj[inspectSymbol](); + } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') { + return obj.inspect(); + } + } + if (isMap(obj)) { + var mapParts = []; + mapForEach.call(obj, function (value, key) { + mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj)); + }); + return collectionOf('Map', mapSize.call(obj), mapParts, indent); + } + if (isSet(obj)) { + var setParts = []; + setForEach.call(obj, function (value) { + setParts.push(inspect(value, obj)); + }); + return collectionOf('Set', setSize.call(obj), setParts, indent); + } + if (isWeakMap(obj)) { + return weakCollectionOf('WeakMap'); + } + if (isWeakSet(obj)) { + return weakCollectionOf('WeakSet'); + } + if (isWeakRef(obj)) { + return weakCollectionOf('WeakRef'); + } + if (isNumber(obj)) { + return markBoxed(inspect(Number(obj))); + } + if (isBigInt(obj)) { + return markBoxed(inspect(bigIntValueOf.call(obj))); + } + if (isBoolean(obj)) { + return markBoxed(booleanValueOf.call(obj)); + } + if (isString(obj)) { + return markBoxed(inspect(String(obj))); + } + if (!isDate(obj) && !isRegExp(obj)) { + var ys = arrObjKeys(obj, inspect); + var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object; + var protoTag = obj instanceof Object ? '' : 'null prototype'; + var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : ''; + var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : ''; + var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : ''); + if (ys.length === 0) { return tag + '{}'; } + if (indent) { + return tag + '{' + indentedJoin(ys, indent) + '}'; + } + return tag + '{ ' + $join.call(ys, ', ') + ' }'; + } + return String(obj); +}; + +function wrapQuotes(s, defaultStyle, opts) { + var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'"; + return quoteChar + s + quoteChar; +} + +function quote(s) { + return $replace.call(String(s), /"/g, '"'); +} + +function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } + +// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives +function isSymbol(obj) { + if (hasShammedSymbols) { + return obj && typeof obj === 'object' && obj instanceof Symbol; + } + if (typeof obj === 'symbol') { + return true; + } + if (!obj || typeof obj !== 'object' || !symToString) { + return false; + } + try { + symToString.call(obj); + return true; + } catch (e) {} + return false; +} + +function isBigInt(obj) { + if (!obj || typeof obj !== 'object' || !bigIntValueOf) { + return false; + } + try { + bigIntValueOf.call(obj); + return true; + } catch (e) {} + return false; +} + +var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; }; +function has(obj, key) { + return hasOwn.call(obj, key); +} + +function toStr(obj) { + return objectToString.call(obj); +} + +function nameOf(f) { + if (f.name) { return f.name; } + var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/); + if (m) { return m[1]; } + return null; +} + +function indexOf(xs, x) { + if (xs.indexOf) { return xs.indexOf(x); } + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) { return i; } + } + return -1; +} + +function isMap(x) { + if (!mapSize || !x || typeof x !== 'object') { + return false; + } + try { + mapSize.call(x); + try { + setSize.call(x); + } catch (s) { + return true; + } + return x instanceof Map; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isWeakMap(x) { + if (!weakMapHas || !x || typeof x !== 'object') { + return false; + } + try { + weakMapHas.call(x, weakMapHas); + try { + weakSetHas.call(x, weakSetHas); + } catch (s) { + return true; + } + return x instanceof WeakMap; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isWeakRef(x) { + if (!weakRefDeref || !x || typeof x !== 'object') { + return false; + } + try { + weakRefDeref.call(x); + return true; + } catch (e) {} + return false; +} + +function isSet(x) { + if (!setSize || !x || typeof x !== 'object') { + return false; + } + try { + setSize.call(x); + try { + mapSize.call(x); + } catch (m) { + return true; + } + return x instanceof Set; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isWeakSet(x) { + if (!weakSetHas || !x || typeof x !== 'object') { + return false; + } + try { + weakSetHas.call(x, weakSetHas); + try { + weakMapHas.call(x, weakMapHas); + } catch (s) { + return true; + } + return x instanceof WeakSet; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isElement(x) { + if (!x || typeof x !== 'object') { return false; } + if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) { + return true; + } + return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function'; +} + +function inspectString(str, opts) { + if (str.length > opts.maxStringLength) { + var remaining = str.length - opts.maxStringLength; + var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : ''); + return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer; + } + // eslint-disable-next-line no-control-regex + var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte); + return wrapQuotes(s, 'single', opts); +} + +function lowbyte(c) { + var n = c.charCodeAt(0); + var x = { + 8: 'b', + 9: 't', + 10: 'n', + 12: 'f', + 13: 'r' + }[n]; + if (x) { return '\\' + x; } + return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16)); +} + +function markBoxed(str) { + return 'Object(' + str + ')'; +} + +function weakCollectionOf(type) { + return type + ' { ? }'; +} + +function collectionOf(type, size, entries, indent) { + var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', '); + return type + ' (' + size + ') {' + joinedEntries + '}'; +} + +function singleLineValues(xs) { + for (var i = 0; i < xs.length; i++) { + if (indexOf(xs[i], '\n') >= 0) { + return false; + } + } + return true; +} + +function getIndent(opts, depth) { + var baseIndent; + if (opts.indent === '\t') { + baseIndent = '\t'; + } else if (typeof opts.indent === 'number' && opts.indent > 0) { + baseIndent = $join.call(Array(opts.indent + 1), ' '); + } else { + return null; + } + return { + base: baseIndent, + prev: $join.call(Array(depth + 1), baseIndent) + }; +} + +function indentedJoin(xs, indent) { + if (xs.length === 0) { return ''; } + var lineJoiner = '\n' + indent.prev + indent.base; + return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev; +} + +function arrObjKeys(obj, inspect) { + var isArr = isArray(obj); + var xs = []; + if (isArr) { + xs.length = obj.length; + for (var i = 0; i < obj.length; i++) { + xs[i] = has(obj, i) ? inspect(obj[i], obj) : ''; + } + } + var syms = typeof gOPS === 'function' ? gOPS(obj) : []; + var symMap; + if (hasShammedSymbols) { + symMap = {}; + for (var k = 0; k < syms.length; k++) { + symMap['$' + syms[k]] = syms[k]; + } + } + + for (var key in obj) { // eslint-disable-line no-restricted-syntax + if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue + if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue + if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) { + // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section + continue; // eslint-disable-line no-restricted-syntax, no-continue + } else if ($test.call(/[^\w$]/, key)) { + xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj)); + } else { + xs.push(key + ': ' + inspect(obj[key], obj)); + } + } + if (typeof gOPS === 'function') { + for (var j = 0; j < syms.length; j++) { + if (isEnumerable.call(obj, syms[j])) { + xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj)); + } + } + } + return xs; +} + +},{"./util.inspect":6}],16:[function(require,module,exports){ +'use strict'; + +var GetIntrinsic = require('get-intrinsic'); +var callBound = require('call-bind/callBound'); +var inspect = require('object-inspect'); + +var $TypeError = GetIntrinsic('%TypeError%'); +var $WeakMap = GetIntrinsic('%WeakMap%', true); +var $Map = GetIntrinsic('%Map%', true); + +var $weakMapGet = callBound('WeakMap.prototype.get', true); +var $weakMapSet = callBound('WeakMap.prototype.set', true); +var $weakMapHas = callBound('WeakMap.prototype.has', true); +var $mapGet = callBound('Map.prototype.get', true); +var $mapSet = callBound('Map.prototype.set', true); +var $mapHas = callBound('Map.prototype.has', true); + +/* + * This function traverses the list returning the node corresponding to the + * given key. + * + * That node is also moved to the head of the list, so that if it's accessed + * again we don't need to traverse the whole list. By doing so, all the recently + * used nodes can be accessed relatively quickly. + */ +var listGetNode = function (list, key) { // eslint-disable-line consistent-return + for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) { + if (curr.key === key) { + prev.next = curr.next; + curr.next = list.next; + list.next = curr; // eslint-disable-line no-param-reassign + return curr; + } + } +}; + +var listGet = function (objects, key) { + var node = listGetNode(objects, key); + return node && node.value; +}; +var listSet = function (objects, key, value) { + var node = listGetNode(objects, key); + if (node) { + node.value = value; + } else { + // Prepend the new node to the beginning of the list + objects.next = { // eslint-disable-line no-param-reassign + key: key, + next: objects.next, + value: value + }; + } +}; +var listHas = function (objects, key) { + return !!listGetNode(objects, key); +}; + +module.exports = function getSideChannel() { + var $wm; + var $m; + var $o; + var channel = { + assert: function (key) { + if (!channel.has(key)) { + throw new $TypeError('Side channel does not contain ' + inspect(key)); + } + }, + get: function (key) { // eslint-disable-line consistent-return + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if ($wm) { + return $weakMapGet($wm, key); + } + } else if ($Map) { + if ($m) { + return $mapGet($m, key); + } + } else { + if ($o) { // eslint-disable-line no-lonely-if + return listGet($o, key); + } + } + }, + has: function (key) { + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if ($wm) { + return $weakMapHas($wm, key); + } + } else if ($Map) { + if ($m) { + return $mapHas($m, key); + } + } else { + if ($o) { // eslint-disable-line no-lonely-if + return listHas($o, key); + } + } + return false; + }, + set: function (key, value) { + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if (!$wm) { + $wm = new $WeakMap(); + } + $weakMapSet($wm, key, value); + } else if ($Map) { + if (!$m) { + $m = new $Map(); + } + $mapSet($m, key, value); + } else { + if (!$o) { + /* + * Initialize the linked list as an empty node, so that we don't have + * to special-case handling of the first node: we can always refer to + * it as (previous node).next, instead of something like (list).head + */ + $o = { key: {}, next: null }; + } + listSet($o, key, value); + } + } + }; + return channel; +}; + +},{"call-bind/callBound":7,"get-intrinsic":11,"object-inspect":15}]},{},[2])(2) }); diff --git a/ui/node_modules/qs/lib/parse.js b/ui/node_modules/qs/lib/parse.js index 553498b..a4ac4fa 100644 --- a/ui/node_modules/qs/lib/parse.js +++ b/ui/node_modules/qs/lib/parse.js @@ -8,6 +8,7 @@ var isArray = Array.isArray; var defaults = { allowDots: false, allowPrototypes: false, + allowSparse: false, arrayLimit: 20, charset: 'utf-8', charsetSentinel: false, @@ -135,7 +136,7 @@ var parseObject = function (chain, val, options, valuesParsed) { ) { obj = []; obj[index] = leaf; - } else { + } else if (cleanRoot !== '__proto__') { obj[cleanRoot] = leaf; } } @@ -217,6 +218,7 @@ var normalizeParseOptions = function normalizeParseOptions(opts) { return { allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, + allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse, arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, charset: charset, charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, @@ -253,5 +255,9 @@ module.exports = function (str, opts) { obj = utils.merge(obj, newObj, options); } + if (options.allowSparse === true) { + return obj; + } + return utils.compact(obj); }; diff --git a/ui/node_modules/qs/lib/stringify.js b/ui/node_modules/qs/lib/stringify.js index f46bb0e..47ea4b1 100644 --- a/ui/node_modules/qs/lib/stringify.js +++ b/ui/node_modules/qs/lib/stringify.js @@ -1,5 +1,6 @@ 'use strict'; +var getSideChannel = require('side-channel'); var utils = require('./utils'); var formats = require('./formats'); var has = Object.prototype.hasOwnProperty; @@ -18,6 +19,7 @@ var arrayPrefixGenerators = { }; var isArray = Array.isArray; +var split = String.prototype.split; var push = Array.prototype.push; var pushToArray = function (arr, valueOrArray) { push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); @@ -54,6 +56,8 @@ var isNonNullishPrimitive = function isNonNullishPrimitive(v) { || typeof v === 'bigint'; }; +var sentinel = {}; + var stringify = function stringify( object, prefix, @@ -68,9 +72,30 @@ var stringify = function stringify( format, formatter, encodeValuesOnly, - charset + charset, + sideChannel ) { var obj = object; + + var tmpSc = sideChannel; + var step = 0; + var findFlag = false; + while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) { + // Where object last appeared in the ref tree + var pos = tmpSc.get(object); + step += 1; + if (typeof pos !== 'undefined') { + if (pos === step) { + throw new RangeError('Cyclic object value'); + } else { + findFlag = true; // Break while + } + } + if (typeof tmpSc.get(sentinel) === 'undefined') { + step = 0; + } + } + if (typeof filter === 'function') { obj = filter(prefix, obj); } else if (obj instanceof Date) { @@ -95,6 +120,14 @@ var stringify = function stringify( if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) { if (encoder) { var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format); + if (generateArrayPrefix === 'comma' && encodeValuesOnly) { + var valuesArray = split.call(String(obj), ','); + var valuesJoined = ''; + for (var i = 0; i < valuesArray.length; ++i) { + valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format)); + } + return [formatter(keyValue) + '=' + valuesJoined]; + } return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))]; } return [formatter(prefix) + '=' + formatter(String(obj))]; @@ -109,7 +142,7 @@ var stringify = function stringify( var objKeys; if (generateArrayPrefix === 'comma' && isArray(obj)) { // we need to join elements in - objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : undefined }]; + objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }]; } else if (isArray(filter)) { objKeys = filter; } else { @@ -117,9 +150,9 @@ var stringify = function stringify( objKeys = sort ? keys.sort(sort) : keys; } - for (var i = 0; i < objKeys.length; ++i) { - var key = objKeys[i]; - var value = typeof key === 'object' && key.value !== undefined ? key.value : obj[key]; + for (var j = 0; j < objKeys.length; ++j) { + var key = objKeys[j]; + var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key]; if (skipNulls && value === null) { continue; @@ -129,6 +162,9 @@ var stringify = function stringify( ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix : prefix + (allowDots ? '.' + key : '[' + key + ']'); + sideChannel.set(object, step); + var valueSideChannel = getSideChannel(); + valueSideChannel.set(sentinel, sideChannel); pushToArray(values, stringify( value, keyPrefix, @@ -143,7 +179,8 @@ var stringify = function stringify( format, formatter, encodeValuesOnly, - charset + charset, + valueSideChannel )); } @@ -155,7 +192,7 @@ var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { return defaults; } - if (opts.encoder !== null && opts.encoder !== undefined && typeof opts.encoder !== 'function') { + if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') { throw new TypeError('Encoder has to be a function.'); } @@ -237,6 +274,7 @@ module.exports = function (object, opts) { objKeys.sort(options.sort); } + var sideChannel = getSideChannel(); for (var i = 0; i < objKeys.length; ++i) { var key = objKeys[i]; @@ -257,7 +295,8 @@ module.exports = function (object, opts) { options.format, options.formatter, options.encodeValuesOnly, - options.charset + options.charset, + sideChannel )); } diff --git a/ui/node_modules/qs/lib/utils.js b/ui/node_modules/qs/lib/utils.js index 4ad6ea2..1e54538 100644 --- a/ui/node_modules/qs/lib/utils.js +++ b/ui/node_modules/qs/lib/utils.js @@ -177,6 +177,7 @@ var encode = function encode(str, defaultEncoder, charset, kind, format) { i += 1; c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); + /* eslint operator-linebreak: [2, "before"] */ out += hexTable[0xF0 | (c >> 18)] + hexTable[0x80 | ((c >> 12) & 0x3F)] + hexTable[0x80 | ((c >> 6) & 0x3F)] diff --git a/ui/node_modules/qs/package.json b/ui/node_modules/qs/package.json index 5e6b8ef..845e20a 100644 --- a/ui/node_modules/qs/package.json +++ b/ui/node_modules/qs/package.json @@ -2,7 +2,7 @@ "name": "qs", "description": "A querystring parser that supports nesting and arrays, with a depth limit", "homepage": "https://github.com/ljharb/qs", - "version": "6.9.6", + "version": "6.10.3", "repository": { "type": "git", "url": "https://github.com/ljharb/qs.git" @@ -29,34 +29,38 @@ "engines": { "node": ">=0.6" }, - "dependencies": {}, + "dependencies": { + "side-channel": "^1.0.4" + }, "devDependencies": { - "@ljharb/eslint-config": "^17.3.0", - "aud": "^1.1.3", + "@ljharb/eslint-config": "^20.1.0", + "aud": "^1.1.5", "browserify": "^16.5.2", "eclint": "^2.8.1", - "eslint": "^7.17.0", + "eslint": "^8.6.0", "evalmd": "^0.0.19", "for-each": "^0.3.3", - "has-symbols": "^1.0.1", + "has-symbols": "^1.0.2", "iconv-lite": "^0.5.1", + "in-publish": "^2.0.1", "mkdirp": "^0.5.5", "nyc": "^10.3.2", - "object-inspect": "^1.9.0", + "object-inspect": "^1.12.0", "qs-iconv": "^1.0.4", - "safe-publish-latest": "^1.1.4", + "safe-publish-latest": "^2.0.0", "safer-buffer": "^2.1.2", - "tape": "^5.1.1" + "tape": "^5.4.0" }, "scripts": { - "prepublish": "safe-publish-latest && npm run dist", + "prepublishOnly": "safe-publish-latest && npm run dist", + "prepublish": "not-in-publish || npm run prepublishOnly", "pretest": "npm run --silent readme && npm run --silent lint", "test": "npm run tests-only", "tests-only": "nyc tape 'test/**/*.js'", "posttest": "aud --production", "readme": "evalmd README.md", - "postlint": "eclint check * lib/* test/*", - "lint": "eslint lib/*.js test/*.js", + "postlint": "eclint check * lib/* test/* !dist/*", + "lint": "eslint .", "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js" }, "license": "BSD-3-Clause", diff --git a/ui/node_modules/qs/test/parse.js b/ui/node_modules/qs/test/parse.js index b6ec1b7..7d61023 100644 --- a/ui/node_modules/qs/test/parse.js +++ b/ui/node_modules/qs/test/parse.js @@ -269,6 +269,15 @@ test('parse()', function (t) { st.end(); }); + t.test('parses sparse arrays', function (st) { + /* eslint no-sparse-arrays: 0 */ + st.deepEqual(qs.parse('a[4]=1&a[1]=2', { allowSparse: true }), { a: [, '2', , , '1'] }); + st.deepEqual(qs.parse('a[1][b][2][c]=1', { allowSparse: true }), { a: [, { b: [, , { c: '1' }] }] }); + st.deepEqual(qs.parse('a[1][2][3][c]=1', { allowSparse: true }), { a: [, [, , [, , , { c: '1' }]]] }); + st.deepEqual(qs.parse('a[1][2][3][c][1]=1', { allowSparse: true }), { a: [, [, , [, , , { c: [, '1'] }]]] }); + st.end(); + }); + t.test('parses semi-parsed strings', function (st) { st.deepEqual(qs.parse({ 'a[b]': 'c' }), { a: { b: 'c' } }); st.deepEqual(qs.parse({ 'a[b]': 'c', 'a[d]': 'e' }), { a: { b: 'c', d: 'e' } }); @@ -620,6 +629,66 @@ test('parse()', function (t) { st.end(); }); + t.test('dunder proto is ignored', function (st) { + var payload = 'categories[__proto__]=login&categories[__proto__]&categories[length]=42'; + var result = qs.parse(payload, { allowPrototypes: true }); + + st.deepEqual( + result, + { + categories: { + length: '42' + } + }, + 'silent [[Prototype]] payload' + ); + + var plainResult = qs.parse(payload, { allowPrototypes: true, plainObjects: true }); + + st.deepEqual( + plainResult, + { + __proto__: null, + categories: { + __proto__: null, + length: '42' + } + }, + 'silent [[Prototype]] payload: plain objects' + ); + + var query = qs.parse('categories[__proto__]=cats&categories[__proto__]=dogs&categories[some][json]=toInject', { allowPrototypes: true }); + + st.notOk(Array.isArray(query.categories), 'is not an array'); + st.notOk(query.categories instanceof Array, 'is not instanceof an array'); + st.deepEqual(query.categories, { some: { json: 'toInject' } }); + st.equal(JSON.stringify(query.categories), '{"some":{"json":"toInject"}}', 'stringifies as a non-array'); + + st.deepEqual( + qs.parse('foo[__proto__][hidden]=value&foo[bar]=stuffs', { allowPrototypes: true }), + { + foo: { + bar: 'stuffs' + } + }, + 'hidden values' + ); + + st.deepEqual( + qs.parse('foo[__proto__][hidden]=value&foo[bar]=stuffs', { allowPrototypes: true, plainObjects: true }), + { + __proto__: null, + foo: { + __proto__: null, + bar: 'stuffs' + } + }, + 'hidden values: plain objects' + ); + + st.end(); + }); + t.test('can return null objects', { skip: !Object.create }, function (st) { var expected = Object.create(null); expected.a = Object.create(null); diff --git a/ui/node_modules/qs/test/stringify.js b/ui/node_modules/qs/test/stringify.js index 7f0ec70..a3800aa 100644 --- a/ui/node_modules/qs/test/stringify.js +++ b/ui/node_modules/qs/test/stringify.js @@ -132,10 +132,10 @@ test('stringify()', function (t) { }); t.test('stringifies a nested array value', function (st) { - st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'indices' }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); - st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'brackets' }), 'a%5Bb%5D%5B%5D=c&a%5Bb%5D%5B%5D=d'); - st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'comma' }), 'a%5Bb%5D=c%2Cd'); // a[b]=c,d - st.equal(qs.stringify({ a: { b: ['c', 'd'] } }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true, arrayFormat: 'indices' }), 'a[b][0]=c&a[b][1]=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), 'a[b][]=c&a[b][]=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true, arrayFormat: 'comma' }), 'a[b]=c,d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true }), 'a[b][0]=c&a[b][1]=d'); st.end(); }); @@ -143,7 +143,7 @@ test('stringify()', function (t) { st.equal( qs.stringify( { a: { b: ['c', 'd'] } }, - { allowDots: true, encode: false, arrayFormat: 'indices' } + { allowDots: true, encodeValuesOnly: true, arrayFormat: 'indices' } ), 'a.b[0]=c&a.b[1]=d', 'indices: stringifies with dots + indices' @@ -151,7 +151,7 @@ test('stringify()', function (t) { st.equal( qs.stringify( { a: { b: ['c', 'd'] } }, - { allowDots: true, encode: false, arrayFormat: 'brackets' } + { allowDots: true, encodeValuesOnly: true, arrayFormat: 'brackets' } ), 'a.b[]=c&a.b[]=d', 'brackets: stringifies with dots + brackets' @@ -159,7 +159,7 @@ test('stringify()', function (t) { st.equal( qs.stringify( { a: { b: ['c', 'd'] } }, - { allowDots: true, encode: false, arrayFormat: 'comma' } + { allowDots: true, encodeValuesOnly: true, arrayFormat: 'comma' } ), 'a.b=c,d', 'comma: stringifies with dots + comma' @@ -167,7 +167,7 @@ test('stringify()', function (t) { st.equal( qs.stringify( { a: { b: ['c', 'd'] } }, - { allowDots: true, encode: false } + { allowDots: true, encodeValuesOnly: true } ), 'a.b[0]=c&a.b[1]=d', 'default: stringifies with dots + indices' @@ -215,17 +215,23 @@ test('stringify()', function (t) { t.test('stringifies an array with mixed objects and primitives', function (st) { st.equal( - qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'indices' }), + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encodeValuesOnly: true, arrayFormat: 'indices' }), 'a[0][b]=1&a[1]=2&a[2]=3', 'indices => indices' ); st.equal( - qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'brackets' }), + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), 'a[][b]=1&a[]=2&a[]=3', 'brackets => brackets' ); st.equal( - qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false }), + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encodeValuesOnly: true, arrayFormat: 'comma' }), + '???', + 'brackets => brackets', + { skip: 'TODO: figure out what this should do' } + ); + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encodeValuesOnly: true }), 'a[0][b]=1&a[1]=2&a[2]=3', 'default => indices' ); @@ -433,7 +439,7 @@ test('stringify()', function (t) { st.end(); }); - t.test('doesn\'t blow up when Buffer global is missing', function (st) { + t.test('does not blow up when Buffer global is missing', function (st) { var tempBuffer = global.Buffer; delete global.Buffer; var result = qs.stringify({ a: 'b', c: 'd' }); @@ -442,6 +448,57 @@ test('stringify()', function (t) { st.end(); }); + t.test('does not crash when parsing circular references', function (st) { + var a = {}; + a.b = a; + + st['throws']( + function () { qs.stringify({ 'foo[bar]': 'baz', 'foo[baz]': a }); }, + /RangeError: Cyclic object value/, + 'cyclic values throw' + ); + + var circular = { + a: 'value' + }; + circular.a = circular; + st['throws']( + function () { qs.stringify(circular); }, + /RangeError: Cyclic object value/, + 'cyclic values throw' + ); + + var arr = ['a']; + st.doesNotThrow( + function () { qs.stringify({ x: arr, y: arr }); }, + 'non-cyclic values do not throw' + ); + + st.end(); + }); + + t.test('non-circular duplicated references can still work', function (st) { + var hourOfDay = { + 'function': 'hour_of_day' + }; + + var p1 = { + 'function': 'gte', + arguments: [hourOfDay, 0] + }; + var p2 = { + 'function': 'lte', + arguments: [hourOfDay, 23] + }; + + st.equal( + qs.stringify({ filters: { $and: [p1, p2] } }, { encodeValuesOnly: true }), + 'filters[$and][0][function]=gte&filters[$and][0][arguments][0][function]=hour_of_day&filters[$and][0][arguments][1]=0&filters[$and][1][function]=lte&filters[$and][1][arguments][0][function]=hour_of_day&filters[$and][1][arguments][1]=23' + ); + + st.end(); + }); + t.test('selects properties when filter=array', function (st) { st.equal(qs.stringify({ a: 'b' }, { filter: ['a'] }), 'a=b'); st.equal(qs.stringify({ a: 1 }, { filter: [] }), ''); @@ -784,7 +841,22 @@ test('stringify()', function (t) { st.equal(qs.stringify(withArray, { encode: false }), 'a[b][0][c]=d&a[b][0][e]=f', 'array, no arrayFormat'); st.equal(qs.stringify(withArray, { encode: false, arrayFormat: 'bracket' }), 'a[b][0][c]=d&a[b][0][e]=f', 'array, bracket'); st.equal(qs.stringify(withArray, { encode: false, arrayFormat: 'indices' }), 'a[b][0][c]=d&a[b][0][e]=f', 'array, indices'); - st.equal(qs.stringify(obj, { encode: false, arrayFormat: 'comma' }), '???', 'array, comma (pending issue #378)', { skip: true }); + st.equal( + qs.stringify(withArray, { encode: false, arrayFormat: 'comma' }), + '???', + 'array, comma', + { skip: 'TODO: figure out what this should do' } + ); + + st.end(); + }); + + t.test('stringifies sparse arrays', function (st) { + /* eslint no-sparse-arrays: 0 */ + st.equal(qs.stringify({ a: [, '2', , , '1'] }, { encodeValuesOnly: true }), 'a[1]=2&a[4]=1'); + st.equal(qs.stringify({ a: [, { b: [, , { c: '1' }] }] }, { encodeValuesOnly: true }), 'a[1][b][2][c]=1'); + st.equal(qs.stringify({ a: [, [, , [, , , { c: '1' }]]] }, { encodeValuesOnly: true }), 'a[1][2][3][c]=1'); + st.equal(qs.stringify({ a: [, [, , [, , , { c: [, '1'] }]]] }, { encodeValuesOnly: true }), 'a[1][2][3][c][1]=1'); st.end(); }); diff --git a/ui/node_modules/raw-body/HISTORY.md b/ui/node_modules/raw-body/HISTORY.md index 4bac5e8..0b6b837 100644 --- a/ui/node_modules/raw-body/HISTORY.md +++ b/ui/node_modules/raw-body/HISTORY.md @@ -1,3 +1,22 @@ +2.5.1 / 2022-02-28 +================== + + * Fix error on early async hooks implementations + +2.5.0 / 2022-02-21 +================== + + * Prevent loss of async hooks context + * Prevent hanging when stream is not readable + * deps: http-errors@2.0.0 + - deps: depd@2.0.0 + - deps: statuses@2.0.1 + +2.4.3 / 2022-02-14 +================== + + * deps: bytes@3.1.2 + 2.4.2 / 2021-11-16 ================== diff --git a/ui/node_modules/raw-body/LICENSE b/ui/node_modules/raw-body/LICENSE index d695c8f..1029a7a 100644 --- a/ui/node_modules/raw-body/LICENSE +++ b/ui/node_modules/raw-body/LICENSE @@ -1,7 +1,7 @@ The MIT License (MIT) Copyright (c) 2013-2014 Jonathan Ong -Copyright (c) 2014-2015 Douglas Christopher Wilson +Copyright (c) 2014-2022 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/ui/node_modules/raw-body/README.md b/ui/node_modules/raw-body/README.md index e5d2936..695c660 100644 --- a/ui/node_modules/raw-body/README.md +++ b/ui/node_modules/raw-body/README.md @@ -61,8 +61,10 @@ You can also pass a string in place of options to just specify the encoding. If an error occurs, the stream will be paused, everything unpiped, and you are responsible for correctly disposing the stream. -For HTTP requests, no handling is required if you send a response. -For streams that use file descriptors, you should `stream.destroy()` or `stream.close()` to prevent leaks. +For HTTP requests, you may need to finish consuming the stream if +you want to keep the socket open for future requests. For streams +that use file descriptors, you should `stream.destroy()` or +`stream.close()` to prevent leaks. ## Errors @@ -79,7 +81,7 @@ otherwise an error created by this module, which has the following attributes: ### Types -The errors from this module have a `type` property which allows for the progamatic +The errors from this module have a `type` property which allows for the programmatic determination of the type of error returned. #### encoding.unsupported @@ -109,6 +111,10 @@ This error will occur when the given stream has an encoding set on it, making it a decoded stream. The stream should not have an encoding set and is expected to emit `Buffer` objects. +#### stream.not.readable + +This error will occur when the given stream is not readable. + ## Examples ### Simple Express example diff --git a/ui/node_modules/raw-body/index.js b/ui/node_modules/raw-body/index.js index 7fe8186..a8f537f 100644 --- a/ui/node_modules/raw-body/index.js +++ b/ui/node_modules/raw-body/index.js @@ -1,7 +1,7 @@ /*! * raw-body * Copyright(c) 2013-2014 Jonathan Ong - * Copyright(c) 2014-2015 Douglas Christopher Wilson + * Copyright(c) 2014-2022 Douglas Christopher Wilson * MIT Licensed */ @@ -12,6 +12,7 @@ * @private */ +var asyncHooks = tryRequireAsyncHooks() var bytes = require('bytes') var createError = require('http-errors') var iconv = require('iconv-lite') @@ -105,7 +106,7 @@ function getRawBody (stream, options, callback) { if (done) { // classic callback style - return readStream(stream, encoding, length, limit, done) + return readStream(stream, encoding, length, limit, wrap(done)) } return new Promise(function executor (resolve, reject) { @@ -173,6 +174,12 @@ function readStream (stream, encoding, length, limit, callback) { })) } + if (typeof stream.readable !== 'undefined' && !stream.readable) { + return done(createError(500, 'stream is not readable', { + type: 'stream.not.readable' + })) + } + var received = 0 var decoder @@ -284,3 +291,39 @@ function readStream (stream, encoding, length, limit, callback) { stream.removeListener('close', cleanup) } } + +/** + * Try to require async_hooks + * @private + */ + +function tryRequireAsyncHooks () { + try { + return require('async_hooks') + } catch (e) { + return {} + } +} + +/** + * Wrap function with async resource, if possible. + * AsyncResource.bind static method backported. + * @private + */ + +function wrap (fn) { + var res + + // create anonymous resource + if (asyncHooks.AsyncResource) { + res = new asyncHooks.AsyncResource(fn.name || 'bound-anonymous-fn') + } + + // incompatible node.js + if (!res || !res.runInAsyncScope) { + return fn + } + + // return bound function + return res.runInAsyncScope.bind(res, fn, null) +} diff --git a/ui/node_modules/raw-body/package.json b/ui/node_modules/raw-body/package.json index 924f9a0..50fc90a 100644 --- a/ui/node_modules/raw-body/package.json +++ b/ui/node_modules/raw-body/package.json @@ -1,7 +1,7 @@ { "name": "raw-body", "description": "Get and validate the raw body of a readable stream.", - "version": "2.4.2", + "version": "2.5.1", "author": "Jonathan Ong (http://jongleberry.com)", "contributors": [ "Douglas Christopher Wilson ", @@ -10,8 +10,8 @@ "license": "MIT", "repository": "stream-utils/raw-body", "dependencies": { - "bytes": "3.1.1", - "http-errors": "1.8.1", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -19,12 +19,12 @@ "bluebird": "3.7.2", "eslint": "7.32.0", "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.25.3", + "eslint-plugin-import": "2.25.4", "eslint-plugin-markdown": "2.2.1", "eslint-plugin-node": "11.1.0", - "eslint-plugin-promise": "5.1.1", + "eslint-plugin-promise": "5.2.0", "eslint-plugin-standard": "4.1.0", - "mocha": "9.1.3", + "mocha": "9.2.1", "nyc": "15.1.0", "readable-stream": "2.3.7", "safe-buffer": "5.2.1" @@ -36,13 +36,14 @@ "HISTORY.md", "LICENSE", "README.md", + "SECURITY.md", "index.d.ts", "index.js" ], "scripts": { "lint": "eslint .", "test": "mocha --trace-deprecation --reporter spec --bail --check-leaks test/", - "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-ci": "nyc --reporter=lcovonly --reporter=text npm test", "test-cov": "nyc --reporter=html --reporter=text npm test" } } diff --git a/ui/node_modules/send/HISTORY.md b/ui/node_modules/send/HISTORY.md index 8aa3ab3..a739774 100644 --- a/ui/node_modules/send/HISTORY.md +++ b/ui/node_modules/send/HISTORY.md @@ -1,3 +1,18 @@ +0.18.0 / 2022-03-23 +=================== + + * Fix emitted 416 error missing headers property + * Limit the headers removed for 304 response + * deps: depd@2.0.0 + - Replace internal `eval` usage with `Function` constructor + - Use instance methods on `process` to check for listeners + * deps: destroy@1.2.0 + * deps: http-errors@2.0.0 + - deps: depd@2.0.0 + - deps: statuses@2.0.1 + * deps: on-finished@2.4.1 + * deps: statuses@2.0.1 + 0.17.2 / 2021-12-11 =================== diff --git a/ui/node_modules/send/LICENSE b/ui/node_modules/send/LICENSE index 4aa69e8..b6ea1c1 100644 --- a/ui/node_modules/send/LICENSE +++ b/ui/node_modules/send/LICENSE @@ -1,7 +1,7 @@ (The MIT License) Copyright (c) 2012 TJ Holowaychuk -Copyright (c) 2014-2016 Douglas Christopher Wilson +Copyright (c) 2014-2022 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/ui/node_modules/send/README.md b/ui/node_modules/send/README.md index fc1d3a1..fadf838 100644 --- a/ui/node_modules/send/README.md +++ b/ui/node_modules/send/README.md @@ -318,8 +318,8 @@ server.listen(3000) [appveyor-url]: https://ci.appveyor.com/project/dougwilson/send [coveralls-image]: https://badgen.net/coveralls/c/github/pillarjs/send/master [coveralls-url]: https://coveralls.io/r/pillarjs/send?branch=master -[github-actions-ci-image]: https://badgen.net/github/checks/pillarjs/send/master?label=ci -[github-actions-ci-url]: https://github.com/pillarjs/send/actions?query=workflow%3Aci +[github-actions-ci-image]: https://badgen.net/github/checks/pillarjs/send/master?label=linux +[github-actions-ci-url]: https://github.com/pillarjs/send/actions/workflows/ci.yml [node-image]: https://badgen.net/npm/node/send [node-url]: https://nodejs.org/en/download/ [npm-downloads-image]: https://badgen.net/npm/dm/send diff --git a/ui/node_modules/send/index.js b/ui/node_modules/send/index.js index 06d7507..89afd7e 100644 --- a/ui/node_modules/send/index.js +++ b/ui/node_modules/send/index.js @@ -1,7 +1,7 @@ /*! * send * Copyright(c) 2012 TJ Holowaychuk - * Copyright(c) 2014-2016 Douglas Christopher Wilson + * Copyright(c) 2014-2022 Douglas Christopher Wilson * MIT Licensed */ @@ -267,13 +267,11 @@ SendStream.prototype.maxage = deprecate.function(function maxage (maxAge) { SendStream.prototype.error = function error (status, err) { // emit if listeners instead of responding if (hasListeners(this, 'error')) { - return this.emit('error', createError(status, err, { - expose: false - })) + return this.emit('error', createHttpError(status, err)) } var res = this.res - var msg = statuses[status] || String(status) + var msg = statuses.message[status] || String(status) var doc = createHtmlDocument('Error', escapeHtml(msg)) // clear existing headers @@ -349,21 +347,19 @@ SendStream.prototype.isPreconditionFailure = function isPreconditionFailure () { } /** - * Strip content-* header fields. + * Strip various content header fields for a change in entity. * * @private */ SendStream.prototype.removeContentHeaderFields = function removeContentHeaderFields () { var res = this.res - var headers = getHeaderNames(res) - for (var i = 0; i < headers.length; i++) { - var header = headers[i] - if (header.substr(0, 8) === 'content-' && header !== 'content-location') { - res.removeHeader(header) - } - } + res.removeHeader('Content-Encoding') + res.removeHeader('Content-Language') + res.removeHeader('Content-Length') + res.removeHeader('Content-Range') + res.removeHeader('Content-Type') } /** @@ -787,8 +783,6 @@ SendStream.prototype.sendIndex = function sendIndex (path) { */ SendStream.prototype.stream = function stream (path, options) { - // TODO: this is all lame, refactor meeee - var finished = false var self = this var res = this.res @@ -797,20 +791,18 @@ SendStream.prototype.stream = function stream (path, options) { this.emit('stream', stream) stream.pipe(res) - // response finished, done with the fd - onFinished(res, function onfinished () { - finished = true - destroy(stream) - }) + // cleanup + function cleanup () { + destroy(stream, true) + } - // error handling code-smell - stream.on('error', function onerror (err) { - // request already finished - if (finished) return + // response finished, cleanup + onFinished(res, cleanup) - // clean up stream - finished = true - destroy(stream) + // error handling + stream.on('error', function onerror (err) { + // clean up stream early + cleanup() // error self.onStatError(err) @@ -974,6 +966,24 @@ function createHtmlDocument (title, body) { '\n' } +/** + * Create a HttpError object from simple arguments. + * + * @param {number} status + * @param {Error|object} err + * @private + */ + +function createHttpError (status, err) { + if (!err) { + return createError(status) + } + + return err instanceof Error + ? createError(status, err, { expose: false }) + : createError(status, err) +} + /** * decodeURIComponent. * diff --git a/ui/node_modules/send/package.json b/ui/node_modules/send/package.json index f58140c..7f269d5 100644 --- a/ui/node_modules/send/package.json +++ b/ui/node_modules/send/package.json @@ -1,7 +1,7 @@ { "name": "send", "description": "Better streaming static file server with Range and conditional-GET support", - "version": "0.17.2", + "version": "0.18.0", "author": "TJ Holowaychuk ", "contributors": [ "Douglas Christopher Wilson ", @@ -17,36 +17,37 @@ ], "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "devDependencies": { "after": "0.8.2", "eslint": "7.32.0", "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.25.3", + "eslint-plugin-import": "2.25.4", "eslint-plugin-markdown": "2.2.1", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "5.2.0", "eslint-plugin-standard": "4.1.0", - "mocha": "9.1.3", + "mocha": "9.2.2", "nyc": "15.1.0", - "supertest": "6.1.6" + "supertest": "6.2.2" }, "files": [ "HISTORY.md", "LICENSE", "README.md", + "SECURITY.md", "index.js" ], "engines": { diff --git a/ui/node_modules/serve-static/HISTORY.md b/ui/node_modules/serve-static/HISTORY.md index eafa750..6b58456 100644 --- a/ui/node_modules/serve-static/HISTORY.md +++ b/ui/node_modules/serve-static/HISTORY.md @@ -1,3 +1,15 @@ +1.15.0 / 2022-03-24 +=================== + + * deps: send@0.18.0 + - Fix emitted 416 error missing headers property + - Limit the headers removed for 304 response + - deps: depd@2.0.0 + - deps: destroy@1.2.0 + - deps: http-errors@2.0.0 + - deps: on-finished@2.4.1 + - deps: statuses@2.0.1 + 1.14.2 / 2021-12-15 =================== diff --git a/ui/node_modules/serve-static/README.md b/ui/node_modules/serve-static/README.md index aa94341..262d944 100644 --- a/ui/node_modules/serve-static/README.md +++ b/ui/node_modules/serve-static/README.md @@ -249,7 +249,7 @@ function setCustomCacheControl (res, path) { [coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/serve-static/master [coveralls-url]: https://coveralls.io/r/expressjs/serve-static?branch=master [github-actions-ci-image]: https://badgen.net/github/checks/expressjs/serve-static/master?label=linux -[github-actions-ci-url]: https://github.com/expressjs/serve-static/actions?query=workflow%3Aci +[github-actions-ci-url]: https://github.com/expressjs/serve-static/actions/workflows/ci.yml [node-image]: https://badgen.net/npm/node/serve-static [node-url]: https://nodejs.org/en/download/ [npm-downloads-image]: https://badgen.net/npm/dm/serve-static diff --git a/ui/node_modules/serve-static/package.json b/ui/node_modules/serve-static/package.json index e223bef..9d935f5 100644 --- a/ui/node_modules/serve-static/package.json +++ b/ui/node_modules/serve-static/package.json @@ -1,7 +1,7 @@ { "name": "serve-static", "description": "Serve static files", - "version": "1.14.2", + "version": "1.15.0", "author": "Douglas Christopher Wilson ", "license": "MIT", "repository": "expressjs/serve-static", @@ -9,20 +9,20 @@ "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" }, "devDependencies": { "eslint": "7.32.0", "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.25.3", + "eslint-plugin-import": "2.25.4", "eslint-plugin-markdown": "2.2.1", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "5.2.0", "eslint-plugin-standard": "4.1.0", - "mocha": "9.1.3", + "mocha": "9.2.2", "nyc": "15.1.0", "safe-buffer": "5.2.1", - "supertest": "6.1.6" + "supertest": "6.2.2" }, "files": [ "LICENSE", diff --git a/ui/package-lock.json b/ui/package-lock.json index 0dad7a0..0e9eb02 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,5 +1,5 @@ { - "name": "lxy", + "name": "ui", "lockfileVersion": 2, "requires": true, "packages": { @@ -7,18 +7,38 @@ "dependencies": { "body-parser": "^1.19.1", "execute": "^0.1.0", - "express": "^4.17.2", "multer": "^1.4.4", "mysql": "^2.18.1" + }, + "devDependencies": { + "connect-timeout": "^1.9.0", + "express": "^4.18.1", + "http-proxy-middleware": "^2.0.6" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "dependencies": { + "@types/node": "*" } }, + "node_modules/@types/node": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz", + "integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg==", + "dev": true + }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.nlark.com/accepts/download/accepts-1.3.7.tgz", - "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -32,7 +52,8 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.nlark.com/array-flatten/download/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true }, "node_modules/bignumber.js": { "version": "9.0.0", @@ -43,25 +64,59 @@ } }, "node_modules/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmmirror.com/body-parser/download/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dependencies": { - "bytes": "3.1.1", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" }, "engines": { "node": ">= 0.8" } }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.nlark.com/buffer-from/download/buffer-from-1.1.2.tgz", @@ -80,13 +135,25 @@ } }, "node_modules/bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/bytes/download/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/concat-stream": { "version": "1.6.2", "resolved": "https://registry.nlark.com/concat-stream/download/concat-stream-1.6.2.tgz", @@ -128,10 +195,53 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/connect-timeout": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.9.0.tgz", + "integrity": "sha512-q4bsBIPd+eSGtnh/u6EBOKfuG+4YvwsN0idlOsg6KAw71Qpi0DCf2eCc/Va63QU9qdOeYC8katxoC+rHMNygZg==", + "dev": true, + "dependencies": { + "http-errors": "~1.6.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect-timeout/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/connect-timeout/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/connect-timeout/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmmirror.com/content-disposition/download/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, "dependencies": { "safe-buffer": "5.2.1" }, @@ -142,7 +252,8 @@ "node_modules/content-disposition/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz?cache=0&sync_timestamp=1618847044058&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=" + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "dev": true }, "node_modules/content-type": { "version": "1.0.4", @@ -153,9 +264,10 @@ } }, "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.nlark.com/cookie/download/cookie-0.4.1.tgz", - "integrity": "sha1-r9cT/ibr0hupXOth+agRblClN9E=", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -163,7 +275,8 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.nlark.com/cookie-signature/download/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true }, "node_modules/core-util-is": { "version": "1.0.3", @@ -182,14 +295,19 @@ "version": "1.1.2", "resolved": "https://registry.nlark.com/depd/download/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.nlark.com/destroy/download/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/dicer": { "version": "0.2.5", @@ -210,25 +328,34 @@ }, "node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.nlark.com/encodeurl/download/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.nlark.com/escape-html/download/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.nlark.com/etag/download/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, "engines": { "node": ">= 0.6" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "node_modules/execute": { "version": "0.1.0", "resolved": "https://registry.npmmirror.com/execute/download/execute-0.1.0.tgz", @@ -238,37 +365,39 @@ } }, "node_modules/express": { - "version": "4.17.2", - "resolved": "https://registry.npmmirror.com/express/download/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dev": true, "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.1", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.1", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.6", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -277,63 +406,244 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz?cache=0&sync_timestamp=1618847044058&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=" + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "dev": true + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.nlark.com/finalhandler/download/finalhandler-1.1.2.tgz", - "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.nlark.com/forwarded/download/forwarded-0.2.0.tgz?cache=0&sync_timestamp=1622503508967&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fforwarded%2Fdownload%2Fforwarded-0.2.0.tgz", "integrity": "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE=", + "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.nlark.com/fresh/download/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, "engines": { "node": ">= 0.6" } }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmmirror.com/http-errors/download/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, "node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1621826342262&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -350,10 +660,53 @@ "version": "1.9.1", "resolved": "https://registry.nlark.com/ipaddr.js/download/ipaddr.js-1.9.1.tgz", "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=", + "dev": true, "engines": { "node": ">= 0.10" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz", @@ -375,20 +728,36 @@ "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.nlark.com/merge-descriptors/download/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.nlark.com/methods/download/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, "engines": { "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/mime/download/mime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, "bin": { "mime": "cli.js" }, @@ -496,9 +865,10 @@ } }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.nlark.com/negotiator/download/negotiator-0.6.2.tgz", - "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -511,6 +881,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.nlark.com/on-finished/download/on-finished-2.3.0.tgz", @@ -522,10 +900,20 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.nlark.com/parseurl/download/parseurl-1.3.3.tgz", - "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -533,7 +921,20 @@ "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.nlark.com/path-to-regexp/download/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/process-nextick-args": { "version": "2.0.1", @@ -544,6 +945,7 @@ "version": "2.0.7", "resolved": "https://registry.nlark.com/proxy-addr/download/proxy-addr-2.0.7.tgz", "integrity": "sha1-8Z/mnOqzEe65S0LnDowgcPm6ECU=", + "dev": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -553,28 +955,35 @@ } }, "node_modules/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmmirror.com/qs/download/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.nlark.com/range-parser/download/range-parser-1.2.1.tgz", - "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/raw-body/download/raw-body-2.4.2.tgz?cache=0&sync_timestamp=1637116848060&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fraw-body%2Fdownload%2Fraw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { - "bytes": "3.1.1", - "http-errors": "1.8.1", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -593,6 +1002,12 @@ "string_decoder": "~0.10.x" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.1.2.tgz?cache=0&sync_timestamp=1618847044058&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.1.2.tgz", @@ -600,46 +1015,79 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.nlark.com/safer-buffer/download/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmmirror.com/send/download/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/download/ms-2.1.3.tgz", - "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } }, "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmmirror.com/serve-static/download/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -650,6 +1098,19 @@ "resolved": "https://registry.nlark.com/setprototypeof/download/setprototypeof-1.2.0.tgz", "integrity": "sha1-ZsmiSnP5/CjL5msJ/tPTPcrxtCQ=" }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/sqlstring": { "version": "2.3.1", "resolved": "https://registry.npm.taobao.org/sqlstring/download/sqlstring-2.3.1.tgz", @@ -662,6 +1123,7 @@ "version": "1.5.0", "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, "engines": { "node": ">= 0.6" } @@ -679,9 +1141,21 @@ "resolved": "https://registry.nlark.com/string_decoder/download/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/toidentifier/download/toidentifier-1.0.1.tgz?cache=0&sync_timestamp=1636938489272&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftoidentifier%2Fdownload%2Ftoidentifier-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" @@ -706,8 +1180,8 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.nlark.com/unpipe/download/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } @@ -721,6 +1195,7 @@ "version": "1.0.1", "resolved": "https://registry.nlark.com/utils-merge/download/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, "engines": { "node": ">= 0.4.0" } @@ -729,6 +1204,7 @@ "version": "1.1.2", "resolved": "https://registry.nlark.com/vary/download/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, "engines": { "node": ">= 0.8" } @@ -743,13 +1219,29 @@ } }, "dependencies": { + "@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz", + "integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg==", + "dev": true + }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.nlark.com/accepts/download/accepts-1.3.7.tgz", - "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "append-field": { @@ -760,7 +1252,8 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.nlark.com/array-flatten/download/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true }, "bignumber.js": { "version": "9.0.0", @@ -768,20 +1261,46 @@ "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" }, "body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmmirror.com/body-parser/download/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "requires": { - "bytes": "3.1.1", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + } + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" } }, "buffer-from": { @@ -799,9 +1318,18 @@ } }, "bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/bytes/download/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } }, "concat-stream": { "version": "1.6.2", @@ -843,10 +1371,49 @@ } } }, + "connect-timeout": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.9.0.tgz", + "integrity": "sha512-q4bsBIPd+eSGtnh/u6EBOKfuG+4YvwsN0idlOsg6KAw71Qpi0DCf2eCc/Va63QU9qdOeYC8katxoC+rHMNygZg==", + "dev": true, + "requires": { + "http-errors": "~1.6.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmmirror.com/content-disposition/download/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, "requires": { "safe-buffer": "5.2.1" }, @@ -854,7 +1421,8 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz?cache=0&sync_timestamp=1618847044058&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=" + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "dev": true } } }, @@ -864,14 +1432,16 @@ "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" }, "cookie": { - "version": "0.4.1", - "resolved": "https://registry.nlark.com/cookie/download/cookie-0.4.1.tgz", - "integrity": "sha1-r9cT/ibr0hupXOth+agRblClN9E=" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.nlark.com/cookie-signature/download/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true }, "core-util-is": { "version": "1.0.3", @@ -889,12 +1459,13 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.nlark.com/depd/download/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.nlark.com/destroy/download/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "dicer": { "version": "0.2.5", @@ -912,18 +1483,27 @@ }, "encodeurl": { "version": "1.0.2", - "resolved": "https://registry.nlark.com/encodeurl/download/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true }, "escape-html": { "version": "1.0.3", - "resolved": "https://registry.nlark.com/escape-html/download/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true }, "etag": { "version": "1.8.1", - "resolved": "https://registry.nlark.com/etag/download/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true }, "execute": { "version": "0.1.0", @@ -934,89 +1514,212 @@ } }, "express": { - "version": "4.17.2", - "resolved": "https://registry.npmmirror.com/express/download/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dev": true, "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.1", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.1", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.6", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz?cache=0&sync_timestamp=1618847044058&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=" + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true } } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.nlark.com/finalhandler/download/finalhandler-1.1.2.tgz", - "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" + }, + "dependencies": { + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } } }, + "follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "dev": true + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.nlark.com/forwarded/download/forwarded-0.2.0.tgz?cache=0&sync_timestamp=1622503508967&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fforwarded%2Fdownload%2Fforwarded-0.2.0.tgz", - "integrity": "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE=" + "integrity": "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE=", + "dev": true }, "fresh": { "version": "0.5.2", - "resolved": "https://registry.nlark.com/fresh/download/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmmirror.com/http-errors/download/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" } }, "iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1621826342262&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -1029,7 +1732,35 @@ "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.nlark.com/ipaddr.js/download/ipaddr.js-1.9.1.tgz", - "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=" + "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true }, "isarray": { "version": "0.0.1", @@ -1049,17 +1780,30 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.nlark.com/merge-descriptors/download/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true }, "methods": { "version": "1.1.2", "resolved": "https://registry.nlark.com/methods/download/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } }, "mime": { "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/mime/download/mime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true }, "mime-db": { "version": "1.51.0", @@ -1148,15 +1892,21 @@ } }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.nlark.com/negotiator/download/negotiator-0.6.2.tgz", - "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/object-assign/download/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.nlark.com/on-finished/download/on-finished-2.3.0.tgz", @@ -1165,15 +1915,29 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, "parseurl": { "version": "1.3.3", - "resolved": "https://registry.nlark.com/parseurl/download/parseurl-1.3.3.tgz", - "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.nlark.com/path-to-regexp/download/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true }, "process-nextick-args": { "version": "2.0.1", @@ -1184,28 +1948,33 @@ "version": "2.0.7", "resolved": "https://registry.nlark.com/proxy-addr/download/proxy-addr-2.0.7.tgz", "integrity": "sha1-8Z/mnOqzEe65S0LnDowgcPm6ECU=", + "dev": true, "requires": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmmirror.com/qs/download/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } }, "range-parser": { "version": "1.2.1", - "resolved": "https://registry.nlark.com/range-parser/download/range-parser-1.2.1.tgz", - "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true }, "raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/raw-body/download/raw-body-2.4.2.tgz?cache=0&sync_timestamp=1637116848060&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fraw-body%2Fdownload%2Fraw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { - "bytes": "3.1.1", - "http-errors": "1.8.1", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -1221,6 +1990,12 @@ "string_decoder": "~0.10.x" } }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.1.2.tgz?cache=0&sync_timestamp=1618847044058&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.1.2.tgz", @@ -1228,45 +2003,69 @@ }, "safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.nlark.com/safer-buffer/download/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "send": { - "version": "0.17.2", - "resolved": "https://registry.npmmirror.com/send/download/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, "ms": { "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/download/ms-2.1.3.tgz", - "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true } } }, "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmmirror.com/serve-static/download/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" } }, "setprototypeof": { @@ -1274,6 +2073,16 @@ "resolved": "https://registry.nlark.com/setprototypeof/download/setprototypeof-1.2.0.tgz", "integrity": "sha1-ZsmiSnP5/CjL5msJ/tPTPcrxtCQ=" }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "sqlstring": { "version": "2.3.1", "resolved": "https://registry.npm.taobao.org/sqlstring/download/sqlstring-2.3.1.tgz", @@ -1282,7 +2091,8 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true }, "streamsearch": { "version": "0.1.2", @@ -1294,9 +2104,18 @@ "resolved": "https://registry.nlark.com/string_decoder/download/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/toidentifier/download/toidentifier-1.0.1.tgz?cache=0&sync_timestamp=1636938489272&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftoidentifier%2Fdownload%2Ftoidentifier-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "type-is": { @@ -1315,8 +2134,8 @@ }, "unpipe": { "version": "1.0.0", - "resolved": "https://registry.nlark.com/unpipe/download/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "util-deprecate": { "version": "1.0.2", @@ -1326,12 +2145,14 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.nlark.com/utils-merge/download/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true }, "vary": { "version": "1.1.2", "resolved": "https://registry.nlark.com/vary/download/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true }, "xtend": { "version": "4.0.2", diff --git a/ui/package.json b/ui/package.json index 5b131b4..ae7a027 100644 --- a/ui/package.json +++ b/ui/package.json @@ -2,8 +2,12 @@ "dependencies": { "body-parser": "^1.19.1", "execute": "^0.1.0", - "express": "^4.17.2", "multer": "^1.4.4", "mysql": "^2.18.1" + }, + "devDependencies": { + "connect-timeout": "^1.9.0", + "express": "^4.18.1", + "http-proxy-middleware": "^2.0.6" } } diff --git a/ui/public/1.jpg b/ui/public/1.jpg new file mode 100644 index 0000000..5fff31f Binary files /dev/null and b/ui/public/1.jpg differ diff --git a/ui/public/4.jpg b/ui/public/4.jpg new file mode 100644 index 0000000..5321dc7 Binary files /dev/null and b/ui/public/4.jpg differ diff --git a/ui/public/ok.html b/ui/public/ok.html index 1493a2f..4f7c4d6 100644 --- a/ui/public/ok.html +++ b/ui/public/ok.html @@ -6,7 +6,7 @@
-
+
diff --git a/ui/public/ok1.html b/ui/public/ok1.html new file mode 100644 index 0000000..f57f7b8 --- /dev/null +++ b/ui/public/ok1.html @@ -0,0 +1,383 @@ + + + + + + + + + + + + +
+
+
+

开始分布式爬虫测试

+
+ +
+ +
+
+
+ +
+
+ + +
+
+ +
+
+ + + diff --git a/ui/public/ok2.html b/ui/public/ok2.html new file mode 100644 index 0000000..ace3628 --- /dev/null +++ b/ui/public/ok2.html @@ -0,0 +1,146 @@ + + + + + UserInfo + + + + +
+
+

个人信息

+ 请在文本框中完善您的个人信息: +

+

+ +
+ + + + + +
+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/ui/public/ok3.html b/ui/public/ok3.html new file mode 100644 index 0000000..26fe9f3 --- /dev/null +++ b/ui/public/ok3.html @@ -0,0 +1,135 @@ + + + + + UserInfo + + + + +
+
+

个人信息

+ 请在文本框中完善您的个人信息: +

+

+ +
+ + + + +
+
+ + \ No newline at end of file diff --git a/ui/result.json b/ui/result.json deleted file mode 100644 index 670a013..0000000 --- a/ui/result.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "crawl_id": 76, - "table_name": "god_crawl_result", - "type": "response" -} \ No newline at end of file diff --git a/ui/sessions/0ykoMmlz0dryv01o67d_GiiAiwOq04G1.json b/ui/sessions/0ykoMmlz0dryv01o67d_GiiAiwOq04G1.json new file mode 100644 index 0000000..9e3e219 --- /dev/null +++ b/ui/sessions/0ykoMmlz0dryv01o67d_GiiAiwOq04G1.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:21:08.727Z","httpOnly":true,"path":"/"},"user":"ybb","__lastAccess":1657070438728} \ No newline at end of file diff --git a/ui/sessions/2XtGkkObB5PBrRRNcKY4MU0H_PoDoSer.json b/ui/sessions/2XtGkkObB5PBrRRNcKY4MU0H_PoDoSer.json new file mode 100644 index 0000000..fc7fb39 --- /dev/null +++ b/ui/sessions/2XtGkkObB5PBrRRNcKY4MU0H_PoDoSer.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:14:19.696Z","httpOnly":true,"path":"/"},"__lastAccess":1657070029697} \ No newline at end of file diff --git a/ui/sessions/7CEOg20meIQLW2kDuVx-lPv7GfPOE1ki.json b/ui/sessions/7CEOg20meIQLW2kDuVx-lPv7GfPOE1ki.json new file mode 100644 index 0000000..1ef7957 --- /dev/null +++ b/ui/sessions/7CEOg20meIQLW2kDuVx-lPv7GfPOE1ki.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:15:41.720Z","httpOnly":true,"path":"/"},"__lastAccess":1657070111721} \ No newline at end of file diff --git a/ui/sessions/841d59--KSvzVwtC8zjayDrMU9Wre9z4.json b/ui/sessions/841d59--KSvzVwtC8zjayDrMU9Wre9z4.json new file mode 100644 index 0000000..a107f5f --- /dev/null +++ b/ui/sessions/841d59--KSvzVwtC8zjayDrMU9Wre9z4.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:34:47.377Z","httpOnly":true,"path":"/"},"user":"ybb","__lastAccess":1657071257379} \ No newline at end of file diff --git a/ui/sessions/HMzYHl7YrOr5Odb1bts1pJS08mfpeYWE.json b/ui/sessions/HMzYHl7YrOr5Odb1bts1pJS08mfpeYWE.json new file mode 100644 index 0000000..656f242 --- /dev/null +++ b/ui/sessions/HMzYHl7YrOr5Odb1bts1pJS08mfpeYWE.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:59:16.846Z","httpOnly":true,"path":"/"},"__lastAccess":1657072726848} \ No newline at end of file diff --git a/ui/sessions/HfY0z2paV11IWHHglC58z2J3tGVZRzK5.json b/ui/sessions/HfY0z2paV11IWHHglC58z2J3tGVZRzK5.json new file mode 100644 index 0000000..60f92c9 --- /dev/null +++ b/ui/sessions/HfY0z2paV11IWHHglC58z2J3tGVZRzK5.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:25:40.091Z","httpOnly":true,"path":"/"},"__lastAccess":1657070710092} \ No newline at end of file diff --git a/ui/sessions/OmL5rrli274mO31xaXjw37CoWjZKa2YE.json b/ui/sessions/OmL5rrli274mO31xaXjw37CoWjZKa2YE.json new file mode 100644 index 0000000..bce25a7 --- /dev/null +++ b/ui/sessions/OmL5rrli274mO31xaXjw37CoWjZKa2YE.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:59:27.725Z","httpOnly":true,"path":"/"},"__lastAccess":1657072737727} \ No newline at end of file diff --git a/ui/sessions/QXuSa0ozgbK8_2iPvYgKAxwssRfghOq0.json b/ui/sessions/QXuSa0ozgbK8_2iPvYgKAxwssRfghOq0.json new file mode 100644 index 0000000..523e667 --- /dev/null +++ b/ui/sessions/QXuSa0ozgbK8_2iPvYgKAxwssRfghOq0.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:55:12.786Z","httpOnly":true,"path":"/"},"__lastAccess":1657072482787} \ No newline at end of file diff --git a/ui/sessions/STltIMCtC9CqhvgewLJ_1k3ERKjjH4uw.json b/ui/sessions/STltIMCtC9CqhvgewLJ_1k3ERKjjH4uw.json new file mode 100644 index 0000000..a2a7fad --- /dev/null +++ b/ui/sessions/STltIMCtC9CqhvgewLJ_1k3ERKjjH4uw.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:22:58.455Z","httpOnly":true,"path":"/"},"user":"ybb","__lastAccess":1657070548456} \ No newline at end of file diff --git a/ui/sessions/TdAzjB0QSREYXzHpIdYcpROmlJoPie6s.json b/ui/sessions/TdAzjB0QSREYXzHpIdYcpROmlJoPie6s.json new file mode 100644 index 0000000..90701c8 --- /dev/null +++ b/ui/sessions/TdAzjB0QSREYXzHpIdYcpROmlJoPie6s.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:35:54.591Z","httpOnly":true,"path":"/"},"__lastAccess":1657071324592} \ No newline at end of file diff --git a/ui/sessions/UKqalUHJxGCLUQeCThBgFtC4ts2etOuF.json b/ui/sessions/UKqalUHJxGCLUQeCThBgFtC4ts2etOuF.json new file mode 100644 index 0000000..5853d02 --- /dev/null +++ b/ui/sessions/UKqalUHJxGCLUQeCThBgFtC4ts2etOuF.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:42:10.584Z","httpOnly":true,"path":"/"},"__lastAccess":1657071700587} \ No newline at end of file diff --git a/ui/sessions/a_dqIHkGSgqjNj5c9qjNbqiDpFkyoqxO.json b/ui/sessions/a_dqIHkGSgqjNj5c9qjNbqiDpFkyoqxO.json new file mode 100644 index 0000000..869caca --- /dev/null +++ b/ui/sessions/a_dqIHkGSgqjNj5c9qjNbqiDpFkyoqxO.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:27:26.968Z","httpOnly":true,"path":"/"},"user":"ybb","__lastAccess":1657070816969} \ No newline at end of file diff --git a/ui/sessions/czBzDKcKd5JcbeHbOboPPttXUSFkKD-V.json b/ui/sessions/czBzDKcKd5JcbeHbOboPPttXUSFkKD-V.json new file mode 100644 index 0000000..b89b839 --- /dev/null +++ b/ui/sessions/czBzDKcKd5JcbeHbOboPPttXUSFkKD-V.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:28:47.132Z","httpOnly":true,"path":"/"},"user":"ybb","__lastAccess":1657070897133} \ No newline at end of file diff --git a/ui/sessions/d9CVfBXO3CYaM7d-f8I1iiAdaUcrrUvx.json b/ui/sessions/d9CVfBXO3CYaM7d-f8I1iiAdaUcrrUvx.json new file mode 100644 index 0000000..1eb5df7 --- /dev/null +++ b/ui/sessions/d9CVfBXO3CYaM7d-f8I1iiAdaUcrrUvx.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T02:00:43.579Z","httpOnly":true,"path":"/"},"__lastAccess":1657072813580} \ No newline at end of file diff --git a/ui/sessions/dI1eonis2BEwPwn94_LhOxKgQsBXNzjH.json b/ui/sessions/dI1eonis2BEwPwn94_LhOxKgQsBXNzjH.json new file mode 100644 index 0000000..b54322c --- /dev/null +++ b/ui/sessions/dI1eonis2BEwPwn94_LhOxKgQsBXNzjH.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:19:34.922Z","httpOnly":true,"path":"/"},"__lastAccess":1657070344922} \ No newline at end of file diff --git a/ui/sessions/h79k-n0NdEoI1-VFDBP_VS42lZtralBD.json b/ui/sessions/h79k-n0NdEoI1-VFDBP_VS42lZtralBD.json new file mode 100644 index 0000000..654be96 --- /dev/null +++ b/ui/sessions/h79k-n0NdEoI1-VFDBP_VS42lZtralBD.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":600000,"expires":"2022-07-08T01:47:56.468Z","httpOnly":true,"path":"/"},"name":"bcede44499ad10c3ffb147befd7a27ba7f8cb6c4","user":"ybb","pwd":"ybb","__lastAccess":1657244276469} \ No newline at end of file diff --git a/ui/sessions/ibK49Pl4Pjg9SHmIwpieVnAyM3kMPoy2.json b/ui/sessions/ibK49Pl4Pjg9SHmIwpieVnAyM3kMPoy2.json new file mode 100644 index 0000000..623767e --- /dev/null +++ b/ui/sessions/ibK49Pl4Pjg9SHmIwpieVnAyM3kMPoy2.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":600000,"expires":"2022-07-07T15:42:13.473Z","httpOnly":true,"path":"/"},"name":"388a45e7c77babfc70c66ae6ba4f198a223229cc","user":"tzl","pwd":"tzl","__lastAccess":1657207933474} \ No newline at end of file diff --git a/ui/sessions/lK75ZJO5j_6L6FThixCetLyhwgYnFpHA.json b/ui/sessions/lK75ZJO5j_6L6FThixCetLyhwgYnFpHA.json new file mode 100644 index 0000000..678f6ae --- /dev/null +++ b/ui/sessions/lK75ZJO5j_6L6FThixCetLyhwgYnFpHA.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:17:29.988Z","httpOnly":true,"path":"/"},"__lastAccess":1657070219988} \ No newline at end of file diff --git a/ui/sessions/oYg6J5Ju7s1Ihufvm3eFoKTySy-nWDLp.json b/ui/sessions/oYg6J5Ju7s1Ihufvm3eFoKTySy-nWDLp.json new file mode 100644 index 0000000..3cc3bdc --- /dev/null +++ b/ui/sessions/oYg6J5Ju7s1Ihufvm3eFoKTySy-nWDLp.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:32:27.585Z","httpOnly":true,"path":"/"},"__lastAccess":1657071117586} \ No newline at end of file diff --git a/ui/sessions/pdz6dhbjvuJgjef-XzNQYzfdqxCAePqL.json b/ui/sessions/pdz6dhbjvuJgjef-XzNQYzfdqxCAePqL.json new file mode 100644 index 0000000..6511758 --- /dev/null +++ b/ui/sessions/pdz6dhbjvuJgjef-XzNQYzfdqxCAePqL.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":600000,"expires":"2022-07-07T15:15:26.752Z","httpOnly":true,"path":"/"},"user":"tzl","pwd":"tzl","__lastAccess":1657206326755} \ No newline at end of file diff --git a/ui/sessions/uZ1zi8HRE6aGz8IeqmNwpkOI6sGu3Cdl.json b/ui/sessions/uZ1zi8HRE6aGz8IeqmNwpkOI6sGu3Cdl.json new file mode 100644 index 0000000..0a2eb82 --- /dev/null +++ b/ui/sessions/uZ1zi8HRE6aGz8IeqmNwpkOI6sGu3Cdl.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":600000,"expires":"2022-07-08T02:10:57.580Z","httpOnly":true,"path":"/"},"name":"2bc5155f19af52b1d14bf9fdd7be45abf6db0887","user":"wfy","pwd":"wfy1","__lastAccess":1657245657583} \ No newline at end of file diff --git a/ui/sessions/vrEHBS9aA5vDU9EnbRwsP5Dc-_lGw8L_.json b/ui/sessions/vrEHBS9aA5vDU9EnbRwsP5Dc-_lGw8L_.json new file mode 100644 index 0000000..4aa5bb2 --- /dev/null +++ b/ui/sessions/vrEHBS9aA5vDU9EnbRwsP5Dc-_lGw8L_.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":30000,"expires":"2022-07-06T01:13:43.164Z","httpOnly":true,"path":"/"},"user":"ybb","__lastAccess":1657069993164} \ No newline at end of file diff --git a/ui/sessions/xHjhvhMrhFZuEgrsQ7HZVCkMO6AP3-r8.json b/ui/sessions/xHjhvhMrhFZuEgrsQ7HZVCkMO6AP3-r8.json new file mode 100644 index 0000000..119d7da --- /dev/null +++ b/ui/sessions/xHjhvhMrhFZuEgrsQ7HZVCkMO6AP3-r8.json @@ -0,0 +1 @@ +{"cookie":{"originalMaxAge":600000,"expires":"2022-07-08T01:41:58.251Z","httpOnly":true,"path":"/"},"name":"539e1a005fd291e79c85d2698ce4314960c562bb","user":"wfy","pwd":"wfy","__lastAccess":1657243918252} \ No newline at end of file diff --git a/ui/tmmps.csv b/ui/tmmps.csv new file mode 100644 index 0000000..55acacf --- /dev/null +++ b/ui/tmmps.csv @@ -0,0 +1 @@ +gghjghjgcfghvhjjsdf \ No newline at end of file diff --git a/ui/tmmps.html b/ui/tmmps.html new file mode 100644 index 0000000..0ab553f --- /dev/null +++ b/ui/tmmps.html @@ -0,0 +1 @@ +
输出结果
namecollegemajorpaper
孔珍珍广东省碧桂园学校领域:中等教育CAIE中Computer Science考试对信息技术纳入高考的启示
李莉华东华大学领域:外国语言文字、中国语言文字、初等教育Opening Moves Involved in Text-based Computer-Mediated-Communication (CMC) by Chinese Adults
Jianhua Tao中国科学院大学领域:计算机软件及计算机应用、中国语言文字、电信技术Emotion recognition for human-computer interaction
Zhang Lingxin中国地震局工程力学研究所领域:建筑科学与工程A review of the research and application of deep learning-based computer vision in structural damage detection
Shen Junkai中国地震局工程力学研究所领域:建筑科学与工程A review of the research and application of deep learning-based computer vision in structural damage detection
Zhu Baijie中国地震局工程力学研究所领域:建筑科学与工程A review of the research and application of deep learning-based computer vision in structural damage detection
Liu bo北京市控制工程研究所领域:航空航天科学与工程、动力工程、电信技术A lightweight data-voting strategy for triple-modular redundant control computers
Yang Mengfei中国空间技术研究院领域:航空航天科学与工程、自动化技术A lightweight data-voting strategy for triple-modular redundant control computers
WANG Yong北京市控制工程研究所领域:航空航天科学与工程、数学、自动化技术A lightweight data-voting strategy for triple-modular redundant control computers
Ren Noguchi高知大学领域:计算机软件及计算机应用、无线电电子学Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram
Kohei Suzuki高知大学领域:计算机软件及计算机应用、无线电电子学Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram
Yoshiki Moriguchi高知大学领域:无线电电子学、计算机软件及计算机应用Real-time gradation-expressible amplitude-modulationtype electroholography based on binary-weighted computer-generated hologram
Yu Zhang哈尔滨工业大学领域:电信技术、生物学、计算机软件及计算机应用Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface
Huaqing Li哈尔滨工业大学领域:生物学、电信技术、自动化技术Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface
Heng Dong哈尔滨工业大学领域:生物学、电信技术、自动化技术Transfer Learning Algorithm Design for Feature Transfer Problem in Motor Imagery Brain-computer Interface
Jingjing WANG中国科学院领域:生物学、燃料化工、石油天然气工业Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax
Wei Zhao中国科学院领域:无线电电子学、生物学、物理学Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax
Kunpeng Song中国科学院领域:燃料化工、石油天然气工业Computer generation of detailed reaction networks in hydrocracking of Fischer-Tropsch wax
Qinjun Qiu中国地质大学(武汉)领域:地质学、计算机软件及计算机应用Knowledge graph for identifying geological disasters by integrating computer vision with ontology
Zhong Xie中国地质大学(武汉)领域:地质学、计算机软件及计算机应用Knowledge graph for identifying geological disasters by integrating computer vision with ontology
Die Zhang武汉大学领域:地质学、计算机软件及计算机应用Knowledge graph for identifying geological disasters by integrating computer vision with ontology
Chris Palmer领域:生物学、电信技术、生物医学工程Brain-Computer Interface Speaks Up
葛阳阳南京大学领域:物理学、计算机硬件技术Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer
王治昱南京大学领域:物理学、计算机硬件技术Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer
郑文南京大学领域:物理学、电力工业、计算机硬件技术Optimized quantum singular value thresholding algorithm based on a hybrid quantum computer
Rui BIAN华中科技大学领域:生物学、电信技术、生物医学工程SSVEP-based brain-computer interfaces are vulnerable to square wave attacks
Lubin MENG华中科技大学领域:生物学、电信技术、生物医学工程SSVEP-based brain-computer interfaces are vulnerable to square wave attacks
Dongrui Wu之江实验室领域:电信技术、生物医学工程SSVEP-based brain-computer interfaces are vulnerable to square wave attacks
Haochen HU北京理工大学领域:生物学、电信技术、生物医学工程Navigation in virtual and real environment using brain computer interface: a progress report
Yue Liu北京电影学院领域:计算机软件及计算机应用、自动化技术、临床医学Navigation in virtual and real environment using brain computer interface: a progress report
Kang YUE北京理工大学领域:生物学、电信技术、生物医学工程Navigation in virtual and real environment using brain computer interface: a progress report
Biao WU北京大学领域:物理学、计算机硬件技术Board games for quantum computers
Hanbo CHEN北京大学领域:计算机硬件技术Board games for quantum computers
Zhikang LUO北京大学领域:计算机硬件技术Board games for quantum computers
Minpeng XU天津大学领域:生物学、基础医学、电信技术Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces
Feng He天津大学领域:生物学、基础医学、电信技术Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces
Tzyy-Ping Jung加州大学圣迭戈分校领域:生物医学工程、电信技术、神经病学Current Challenges for the Practical Application of Electroencephalography-Based Brain-Computer Interfaces
Chunxia Qiao军事医学科学院毒物药物研究所领域:肿瘤学、基础医学、妇产科学A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method
Ming Lv军事医学科学院领域:肿瘤学、妇产科学、有机化工A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method
Xinying Li军事医学科学院领域:肿瘤学、妇产科学、有机化工A Novel Human Antibody, HF, against HER2/erb-B2 Obtained by a Computer-Aided Antibody Design Method
\ No newline at end of file diff --git a/ui/tmp.py b/ui/tmp.py new file mode 100644 index 0000000..005c402 --- /dev/null +++ b/ui/tmp.py @@ -0,0 +1,199 @@ +import json +import socket +import struct +import argparse +from json import JSONEncoder, JSONDecoder +import pymysql +from HTMLTable import HTMLTable +import pandas as pd +import numpy as np +import json + +def parse_request(client_socket: socket.socket): + request_header_size = struct.unpack("!Q", read_bytes(client_socket, 8))[0] + request_map = json.JSONDecoder().decode(read_bytes(client_socket, request_header_size).decode("utf-8")) + return request_map + +def shu(a): + table = HTMLTable(caption='输出结果') + +# 表头行 + table.append_header_rows(( + ('name', 'college', 'major', 'paper'), + )) + + # 合并单元格 + data_1 = a + # 数据行 + table.append_data_rows(( + data_1 + )) + + # 标题样式 + table.caption.set_style({ + 'font-size': '30px', + 'font-weight': 'bold', + 'margin': '10px', + }) + + # 表格样式,即标签样式 + table.set_style({ + 'border-collapse': 'collapse', + 'word-break': 'normal', + 'white-space': 'normal', + 'font-size': '14px', + }) + + # 统一设置所有单元格样式,
+ table.set_cell_style({ + 'border-color': '#000', + 'border-width': '1px', + 'border-style': 'solid', + 'padding': '5px', + }) + + # 表头样式 + table.set_header_row_style({ + 'color': '#fff', + 'background-color': '#48a6fb', + 'font-size': '18px', + }) + + # 覆盖表头单元格字体样式 + table.set_header_cell_style({ + 'padding': '15px', + }) + + # 调小次表头字体大小 + table[1].set_cell_style({ + 'padding': '8px', + 'font-size': '15px', + }) + + # 遍历数据行,如果增长量为负,标红背景颜色 + html = table.to_html() + f = open('C:/Users/Jation/Desktop/应用开发/dcs/ui/tmmps.html','w',encoding = 'utf-8-sig') + f.write(html) +def generate_request(request_info) -> 'bytes': + """ + 根据传入的dict生成请求 + 请求包含 8字节头长度+头数据 + :param request_info: dict + :return: bytes 请求数据 + """ + request_bytes = JSONEncoder().encode(request_info).encode("utf-8") + return struct.pack("!Q", len(request_bytes)) + request_bytes + + +def read_bytes(s: 'socket.socket', size: 'int') -> 'bytes': + """ + 从socket读取size个字节 + :param s:套接字 + :param size:要读取的大小 + :return:读取的字节数,在遇到套接字关闭的情况下,返回的数据的长度可能小于 size + """ + data = ''.encode('utf-8') + while len(data) < size: + rsp_data = s.recv(size - len(data)) + data += rsp_data + if len(rsp_data) == 0: + break + return data + + +def send_request(request_info, socket_to_server): + full_request = generate_request(request_info) + + socket_to_server.sendall(full_request) + + if request_info['action'] == 'end' or request_info['action'] == 'start': + return + + responseJson = JSONDecoder().decode( + read_bytes(socket_to_server, struct.unpack('!Q', socket_to_server.recv(8))[0]).decode( + "utf-8")) + + return responseJson + + +def receive_response(server_socket): + request_map = parse_request(server_socket) + print("receiving response:\n" + json.dumps(request_map, ensure_ascii=False)) + a = json.dumps(request_map, ensure_ascii=False) + a = json.loads(a) + b = [] + c ='' + d ='' + for i in a: + #print(a[i]) + if(i == 'type'): + continue + if(i == 'crawl_id'): + c = a[i] + c = str(c) + if(i == 'table_name'): + d = a[i] + b.append(d) + continue + sqli = "select name,college,major,paper from "+d+" where crawl_id = " +c+";" + result = cur.execute(sqli) + info = cur.fetchall() + shu(info) + #with open('result.json', 'w', encoding='utf-8') as f: + #json.dump(request_map, f, ensure_ascii=False, indent=4) + +conn = pymysql.connect( + host='192.168.43.65', + user='root', + password='427318Aa', + db='test', + charset='utf8', + # autocommit=True, # 如果插入数据,, 是否自动提交? 和conn.commit()功能一致。 +) +cur = conn.cursor() +if __name__ == '__main__': + # 使用方法 python .\connect.py --ip 127.0.0.1 --port 7777 + # crawling --word computer --cookie 95f94e1ab71bdf96b85fef6e8f746c58eeb5f9fa --pages_start 1 --pages_end 10 + parser = argparse.ArgumentParser('connect-manager') + parser.add_argument('--ip', type=str, required=True) + parser.add_argument('--port', type=str, required=True) + subparsers = parser.add_subparsers(help='provide actions including crawling, login, register', + dest='action') # 创建子解析器 + + parser_crawling = subparsers.add_parser('crawling') + parser_crawling.add_argument('--word', type=str, required=True) + parser_crawling.add_argument('--pages_end', type=int, required=True) + parser_crawling.add_argument('--pages_start', type=int, required=True) + parser_crawling.add_argument('--cookie', type=str, required=True) + + parser_login = subparsers.add_parser('login') + parser_login.add_argument('--user', type=str, required=True) + parser_login.add_argument('--password', type=str, required=True) + + parser_register = subparsers.add_parser('register') + parser_register.add_argument('--user', type=str, required=True) + parser_register.add_argument('--password', type=str, required=True) + + args = parser.parse_args() + + local_port = 10004 + server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) + server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + server_socket.connect((args.ip, int(args.port))) + request = {'action': 'start'} + send_request(request, server_socket) + + if args.action == 'crawling': + request = {'action': 'crawl zhiwang', 'word': args.word, 'pages_start': args.pages_start, + 'pages_end': args.pages_end, 'cookie': args.cookie} + elif args.action == 'login' or args.action == 'register': + request = {'action': args.action, 'user': args.user, 'password': args.password} + response = send_request(request, server_socket) + #print(response['cookie']) + + if args.action == 'crawling': + receive_response(server_socket) + + request = {'action': 'end'} + send_request(request, server_socket) + server_socket.close()