yjryu / KERIS star
류윤주 2023-10-24
231024 류윤주 front-end 사용자단 커밋
@33f982c13cd8ed33aa8776e76a8a73d9dc3a21e6
 
.gitignore (added)
+++ .gitignore
@@ -0,0 +1,3 @@
+client/build/
+server/logs/
+node_modules
 
Global.js (added)
+++ Global.js
@@ -0,0 +1,17 @@
+const PROJECT_NAME = 'NodeJS Web Server Framework(Vue)';
+const PROJECT_VERSION = '1.0';
+const BASE_DIR = __dirname;
+const LOG_BASE_DIR = `${__dirname}/server/logs`;
+const SERVICE_STATUS = process.env.NODE_ENV;//development, production
+const PORT = 80;
+const API_SERVER_HOST = "localhost:8080";
+
+module.exports = {
+    PROJECT_NAME,
+    PROJECT_VERSION,
+    BASE_DIR,
+    LOG_BASE_DIR,
+    SERVICE_STATUS,
+    PORT,
+    API_SERVER_HOST
+}(파일 끝에 줄바꿈 문자 없음)
 
client/resources/css/Data.css (added)
+++ client/resources/css/Data.css
@@ -0,0 +1,209 @@
+@charset "utf-8";
+.data-main {
+  width: 100%;
+}
+
+.data-b {
+  width: 100%;
+}
+.data-b-b {
+  width: 100%;
+  padding: 6rem;
+  font-size: 3rem;
+  font-family: SBaggroM;
+}
+
+.data-text p {
+  position: relative;
+}
+.data-text p::before {
+  content: "";
+  position: absolute;
+  top: -30px;
+  background-size: 60px 30px;
+  background-image: url("../jpg/data-img-text.png");
+  width: 60px;
+  height: 30px;
+}
+
+.data-b-main {
+  width: 100%;
+}
+
+.data-b-grid {
+  width: 100%;
+  padding: 3rem;
+  display: grid;
+  grid-template-columns: 1fr 1fr 1fr;
+}
+
+.data-table {
+  width: 100%;
+}
+.da1 {
+  width: 80%;
+  height: 40rem;
+  background-color: #007aff;
+  margin: 0 auto;
+}
+.data-select {
+  width: 50%;
+  float: right;
+  display: flex;
+  justify-content: flex-end;
+  padding: 3rem 6rem;
+}
+
+#data-table-sild {
+  padding: 0.5rem;
+  margin-right: 1rem;
+  border-radius: 0.7rem;
+}
+
+.data-table-tr {
+  padding: 6rem;
+}
+.data-table-tr th {
+  font-size: 1.5rem;
+  background-color: #007aff;
+  color: white;
+  padding: 1.1rem;
+  font-family: "Pretendard-Regular";
+}
+.data-table-tr td {
+  padding: 2rem;
+  border-top: 1px solid rgb(187, 187, 187);
+  text-align: center;
+  font-size: 2rem;
+  font-family: "Pretendard-Regular";
+}
+
+.data-b-1 {
+  background: url(../jpg/data-img.png) no-repeat center center;
+  background-size: contain;
+  position: relative;
+  text-align: center;
+}
+.data-b-1 p {
+  font-size: 2rem;
+  padding: 3rem;
+  padding-top: 5rem;
+  width: 100%;
+  font-family: SBaggroM;
+  text-align: left;
+  color: #014099;
+  cursor: pointer;
+}
+
+.data-b-1 p span {
+  font-size: 3.5rem;
+}
+.data-b-1::after {
+  position: absolute;
+  content: "";
+  width: 90px;
+  height: 90px;
+  right: -90px;
+  top: 40%;
+
+  background-color: #e2ecfc;
+  border-radius: 45px;
+  transform: translateX(-50%);
+  z-index: -1;
+}
+.data-b-2 {
+  background: url(../jpg/data-img3.png) no-repeat center center;
+  background-size: contain;
+  position: relative;
+  text-align: center;
+  cursor: pointer;
+}
+.data-b-2 p {
+  font-size: 2rem;
+  padding: 3rem;
+
+  padding-top: 5rem;
+  font-family: SBaggroM;
+  text-align: center;
+  color: #1a8445;
+}
+.data-b-2 p span {
+  font-size: 3.5rem;
+  color: #0e5e2e;
+}
+
+.data-b-3 {
+  background: url(../jpg/data-img2.png) no-repeat center center;
+  background-size: contain;
+  position: relative;
+  text-align: center;
+  cursor: pointer;
+
+  /* border: 1px solid red; */
+}
+.data-b-3::after {
+  position: absolute;
+  content: "";
+  width: 90px;
+  height: 90px;
+  left: 0px;
+  top: 40%;
+
+  background-color: #f8e7cd;
+  border-radius: 45px;
+  transform: translateX(-50%);
+  z-index: -1;
+}
+.data-b-3 p {
+  font-size: 2rem;
+  padding: 3rem;
+  padding-top: 5rem;
+  width: 100%;
+
+  font-family: SBaggroM;
+  text-align: right;
+  color: #e07e27;
+}
+.data-b-3 p span {
+  font-size: 3.5rem;
+  color: #c26400;
+}
+
+/* 버튼 서치 */
+.input-group {
+  display: flex;
+  align-items: center;
+}
+
+.input {
+  min-height: 4rem;
+  max-width: 200px;
+  padding: 0.5em 1rem;
+  color: #000000;
+  font-size: 1.5rem;
+  border: 1px solid #007aff;
+  border-radius: 6px 0 0 6px;
+  background-color: transparent;
+}
+
+.button--submit {
+  min-height: 4rem;
+  padding: 0.5em 1em;
+  border: none;
+  border-radius: 0 6px 6px 0;
+  background-color: #007aff;
+  color: #fff;
+  font-size: 15px;
+  cursor: pointer;
+  transition: background-color 0.3s ease-in-out;
+}
+
+.button--submit:hover {
+  background-color: #007aff;
+}
+
+.input:focus,
+.input:focus-visible {
+  border-color: #3898ec;
+  outline: none;
+}
 
client/resources/css/Main.css (added)
+++ client/resources/css/Main.css
@@ -0,0 +1,410 @@
+@charset "utf-8";
+
+table {
+  width: 100%;
+  border-collapse: collapse;
+  padding: 0;
+  border: 0;
+  border-spacing: 0px;
+}
+
+.w1400 {
+  max-width: 1300px;
+  margin: 0 auto;
+  /* overflow-x: hidden */
+  position: relative;
+  clear: both;
+  min-height: inherit;
+}
+
+/* 메뉴 */
+.sub-nav,
+.toggle {
+  opacity: 0;
+}
+.header-wrap {
+  display: flex;
+  justify-content: space-between;
+  box-shadow: 2px 2px 2px #33333300;
+
+  align-items: center;
+  position: relative;
+  flex-wrap: wrap;
+}
+
+.sub-menu {
+  flex: 0 0 72%;
+}
+
+.sub-menu ul {
+  display: flex;
+  justify-content: end;
+}
+.sub-menu ul li a {
+  display: block;
+  color: #2c407f;
+  line-height: 40px;
+  margin-left: 50px;
+  font-size: 1.5rem;
+  text-align: right;
+  font-weight: 600;
+}
+
+/* 메인 */
+.m-b {
+  width: 100%;
+  background: linear-gradient(#425fed, #5dadf6);
+}
+.m-b-b {
+  padding-top: 108px;
+  padding-bottom: 90px;
+  display: flex;
+}
+.m-text {
+  flex: 0 0 39.5%;
+  color: white;
+}
+.m-text p {
+  width: 45rem;
+  margin-top: 15%;
+  font-family: SBaggroM;
+  font-weight: 300 !important;
+  text-shadow: 2px 2px 2px #33333382;
+  font-size: 3rem;
+}
+.m-text span {
+  font-size: 60px;
+  font-weight: 300 !important;
+  text-shadow: 2px 2px 2px #33333382;
+}
+.m-benner {
+  flex: 0 0 60%;
+  height: 365px;
+  background: url(../jpg/main.png) no-repeat;
+  background-size: cover;
+  box-shadow: 2px 2px 4px #33333382;
+}
+
+/* 퍼즐 */
+.m-p {
+  width: 100%;
+  height: 100%;
+  padding: 60px;
+}
+.m-p-container {
+  margin: 0 auto;
+  display: grid;
+  overflow: visible;
+  grid-template-columns: 1fr 1fr 1fr;
+}
+.m-p-container > div:nth-child(4) {
+  position: relative;
+}
+.m-p-container > div:nth-child(4)::after {
+  position: absolute;
+  content: "";
+  width: 90px;
+  height: 90px;
+  bottom: -45px;
+  left: 50%;
+  background-color: #009d46;
+  border-radius: 45px;
+  transform: translateX(-50%);
+  z-index: -1;
+}
+.m-p-name {
+  width: 100%;
+  height: 7rem;
+  display: flex;
+  font-family: SBaggroM;
+  background: url(../jpg/notice-banner.png) no-repeat center center;
+  background-size: cover;
+  position: relative;
+}
+.m-p-name::after {
+  position: absolute;
+  content: "";
+  width: 90px;
+  height: 90px;
+  top: -45px;
+  left: 50%;
+  background-color: #3f87f7;
+  border-radius: 45px;
+  transform: translateX(-50%);
+}
+
+.m-p-name h3 {
+  width: 100%;
+  height: 7rem;
+  padding-left: 1rem;
+  line-height: 7rem;
+  font-size: 2.4rem;
+  color: white;
+  background-size: cover;
+  position: relative;
+}
+
+.m-p-name input {
+  border: 0;
+  padding: 1rem;
+  font-family: "Pretendard-Regular";
+  font-size: 1.3rem;
+  font-weight: 800;
+  text-shadow: 2px 2px 2px #33333382;
+  color: white;
+  background-color: #009d4700;
+}
+
+.m-p-table tr {
+  width: 100%;
+  height: 10%;
+  border-top: 1px solid #333;
+}
+
+.m-p-table {
+  overflow: hidden;
+}
+.m-p-table td {
+  padding: 1rem;
+  font-size: 1.5rem;
+  color: #333;
+  font-family: "Pretendard-Regular";
+  font-weight: 700;
+}
+.m-p-table td p {
+  font-size: 1.3rem;
+  padding-top: 1rem;
+  font-family: "Pretendard-Regular";
+  font-weight: 500;
+}
+
+.m-p-c-1 {
+  grid-row: 1 / span 3;
+  border: 1px solid #3f87f7;
+}
+
+.m-p-c-2 {
+  background: url(../jpg/m-2.png) no-repeat;
+  background-size: cover;
+
+  z-index: 1;
+}
+
+.m-p-c-2 div,
+.m-p-c-3 div,
+.m-p-c-4 div,
+.m-p-c-5 div {
+  width: 100%;
+  height: 100%;
+
+  background-size: 123px 123px;
+  margin: 0 auto;
+}
+.m-p-c-2 input,
+.m-p-c-3 input,
+.m-p-c-4 input,
+.m-p-c-5 input {
+  border: 0;
+  font-size: 2.5rem;
+  font-weight: 300;
+  color: white;
+  font-family: SBaggroM;
+  cursor: pointer;
+  text-shadow: 2px 2px 2px #3333335b;
+  background-color: #33333300;
+  text-align: center;
+  width: 100%;
+  padding-bottom: 2.8rem;
+}
+.m-p-c-3 div img {
+  width: 150px !important;
+  text-align: center;
+  margin: 0 auto;
+  padding-top: 5rem;
+  padding-bottom: 2.5rem;
+}
+
+.m-p-c-2 div img,
+.m-p-c-4 div img,
+.m-p-c-5 div img {
+  width: 60px !important;
+  text-align: center;
+  margin: 0 auto;
+  padding-top: 5rem;
+  padding-bottom: 2.5rem;
+}
+
+.m-p-c-3 {
+  background: url(../jpg/m3.png) no-repeat center right;
+  background-size: cover;
+}
+.m-p-c-4 {
+  background: url(../jpg/m4.png) no-repeat;
+}
+.m-p-c-5 {
+  background: url(../jpg/ki.jpg) no-repeat center center;
+  background-size: cover;
+}
+
+/* 메인 홍보/뉴스 */
+
+.m-n {
+  width: 100%;
+  padding: 1rem;
+  background: url(../jpg/123.png) no-repeat center center;
+  background-size: cover;
+}
+.m-n-n {
+  width: 100%;
+  height: 100%;
+  padding: 30px;
+}
+.m-n-hidden {
+  width: 100%;
+  margin: 0 auto;
+}
+.m-n-n h3 {
+  width: 100%;
+  padding: 30px;
+  font-size: 2rem;
+  color: white;
+}
+
+/* 히스토리 */
+.m-h {
+  width: 100%;
+  padding: 3rem;
+  background-color: #ededed;
+}
+.m-h-h {
+  text-align: center;
+}
+.m-h-h h3,
+.m-h-h h1 {
+  text-align: center;
+  font-size: 3rem;
+  padding: 1rem;
+  font-family: SBaggroM;
+}
+.m-h-h h1 {
+  color: #3f87f7;
+}
+
+.m-h-g {
+  width: 100%;
+  display: grid;
+  grid-template-columns: 1fr 1fr 1fr;
+}
+.m-h-g div {
+  height: 300px;
+}
+
+.m-h-g-1,
+.m-h-g-2,
+.m-h-g-3 {
+  width: 100%;
+  display: flex;
+  flex-wrap: wrap;
+  padding: 6rem;
+  justify-content: center;
+}
+.m-h-g-1 div,
+.m-h-g-2 div,
+.m-h-g-3 div {
+  width: 100%;
+  height: 100%;
+}
+.m-h-g-1 div span,
+.m-h-g-2 div span,
+.m-h-g-3 div span {
+  font-size: 1.8rem;
+  font-family: "Pretendard-Regular";
+}
+.m-h-g-1 p:nth-child(2),
+.m-h-g-2 p:nth-child(2),
+.m-h-g-3 p:nth-child(2) {
+  width: 10rem;
+  margin: 0 auto;
+  justify-content: center;
+
+  background: url(../jpg/m-h-g-1.png) no-repeat;
+  height: 10rem;
+  background-size: contain;
+}
+.m-h-g-1 h3,
+.m-h-g-2 h3,
+.m-h-g-3 h3 {
+  padding: 1rem;
+  font-size: 20px;
+  font-family: "Pretendard-Regular";
+}
+
+.m-h-g-1 p:nth-child(3),
+.m-h-g-2 p:nth-child(3),
+.m-h-g-3 p:nth-child(3) {
+  padding: 1rem;
+  font-size: 3rem;
+  font-family: SBaggroM;
+  color: #09365e;
+}
+
+/* 파트너사 */
+.m-partner {
+  width: 100%;
+  height: 100%;
+}
+.m-pa {
+  width: 100%;
+  padding-top: 60px;
+  margin: 0 auto;
+  text-align: center;
+}
+.m-pa h3,
+.m-pa h1 {
+  text-align: center;
+  font-size: 3rem;
+}
+.m-pa h1 {
+  font-family: SBaggroM;
+
+  color: #3f87f7;
+}
+.m-pa-pa {
+  width: 100%;
+  display: flex;
+  flex-wrap: nowrap;
+  justify-content: space-between;
+}
+.m-pa-logo {
+  width: 20%;
+  height: 16rem;
+  padding: 1.5rem;
+}
+.lo1 {
+  background: url(../jpg/logo/ko-w.png) no-repeat;
+  background-position: center;
+  background-size: 40%;
+}
+.lo2 {
+  background: url(../jpg/logo/keris.gif) no-repeat;
+  background-position: center;
+  background-size: 40%;
+}
+.lo3 {
+  background: url(../jpg/logo/kefa.png) no-repeat;
+  background-position: center;
+  background-size: 40%;
+}
+.lo4 {
+  background: url(../jpg/logo/ko-go.png) no-repeat;
+  background-position: center;
+  background-size: 40%;
+}
+.lo5 {
+  background: url(../jpg/logo/edutech.png) no-repeat;
+  background-position: center;
+  background-size: 40%;
+}
+/* 스와이퍼--------------------------------------- */
+
+/*--------------------------------------- */
 
client/resources/css/common.css (added)
+++ client/resources/css/common.css
@@ -0,0 +1,45 @@
+@charset "utf-8";
+.flex {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.pad-10 {
+  padding: 10px;
+}
+
+.pad-20 {
+  padding: 20px;
+}
+.pad-30 {
+  padding: 30px;
+}
+
+/* 박스공통 */
+.border-r {
+  border-radius: 2.5rem;
+  box-shadow: 2px 2px 5px #33333333;
+}
+
+.main-content {
+  padding: 60px 0;
+}
+
+/* 자료실 해시태그 */
+.mat-span span {
+  background-color: #d4d4d4;
+  color: rgb(90, 90, 90);
+  padding: 1rem 2rem 1rem 2rem;
+  margin: 0.2rem;
+  border-radius: 0.5rem;
+  font-size: 1.3rem;
+  font-weight: 600;
+  font-family: "Pretendard-Regular";
+}
+
+.mat-span {
+  width: 100%;
+  padding-top: 1rem;
+  box-shadow: 2px 2px 2px #33333300 !important;
+}
 
client/resources/css/header.css (added)
+++ client/resources/css/header.css
@@ -0,0 +1,68 @@
+@charset "utf-8";
+
+/* 헤더 */
+.header {
+  width: 100%;
+  /* height: 4.8rem; */
+  float: right;
+
+  background-color: #063a6d;
+}
+.b1400 {
+  width: 1300px;
+  display: flex;
+  margin: 0 auto;
+  /* border: 1px solid red; */
+  justify-content: flex-end;
+  /* padding-right: 30px 0; */
+}
+
+#input {
+  /* border: 0; */
+  border: 1px solid red;
+  font-size: 1rem;
+  /* background-color: rgba(25, 25, 25, 0); */
+  cursor: pointer;
+  font-family: "Pretendard-Regular";
+
+  color: white;
+}
+.sub-menu ul li span {
+  font-family: "Pretendard-Regular";
+}
+
+.logo {
+  flex: 0 0 25%;
+  font-family: "Pretendard-Regular";
+  transform: translateY(20px);
+  font-size: 2rem;
+  font-weight: 900;
+  /* border: 1px solid red; */
+}
+.logo span {
+  color: #2c407f;
+}
+.login,
+.join {
+  width: 7rem;
+  height: 3rem;
+  /* font-size: 0.5rem; */
+  line-height: 3rem;
+  text-align: right;
+  /* border: 1px solid red; */
+}
+.login i,
+.join i {
+  font-size: 1rem;
+  /* height: 3rem; */
+  /* border: 1px solid red; */
+  margin-right: 0.5rem;
+}
+
+.login::after {
+  content: "";
+  width: 1px;
+  border-right: 1px solid white;
+  margin-left: 10px;
+  /* border: 1px solid #ffffff; */
+}
 
client/resources/css/matching.css (added)
+++ client/resources/css/matching.css
@@ -0,0 +1,168 @@
+.mat-b {
+  width: 100%;
+  background: linear-gradient(#5dadf6, #2e87da, #5dadf6);
+}
+.mat-b-b {
+  padding: 30px 30px;
+  display: flex;
+  align-items: flex-end;
+}
+.mat-b-b div {
+  width: 40%;
+}
+.mat-text {
+  margin: 0 auto;
+  text-align: center;
+  font-size: 5rem;
+  padding-bottom: 50px;
+  font-family: SBaggroM;
+  color: white;
+}
+
+.mat-b-1 {
+  width: 100%;
+  height: 100%;
+  padding: 3rem;
+  margin: 0 auto;
+  text-align: center;
+  color: #3f87f7;
+  background-color: #e2e2e2;
+}
+
+.mat-b-grid > h3 {
+  font-size: 2.6rem;
+  padding: 3rem;
+  font-family: SBaggroM;
+}
+.mat-b-g-g {
+  width: 100%;
+  place-items: center;
+  margin: 0 auto;
+  display: grid;
+  grid-template-columns: 1fr 1fr 1fr;
+}
+.g1 {
+  width: 90%;
+  padding: 2rem;
+}
+.g1 h3 {
+  padding: 1rem;
+  font-size: 2rem;
+  color: #3f87f7;
+  font-family: "Pretendard-Regular";
+}
+.g1 img {
+  /* padding: 2rem; */
+  height: 119px;
+  width: 80%;
+  margin: 0 auto;
+  object-fit: contain;
+}
+.g1 p:nth-child(3) {
+  text-align: left;
+  color: #333;
+  font-size: 1.5rem;
+  padding: 1rem;
+}
+.g1 p:nth-child(4) {
+  text-align: right;
+  font-size: 1.5rem;
+  color: #333;
+
+  padding: 1rem;
+}
+.g1 div {
+  padding: 1rem;
+  background-color: #ffffff;
+  box-shadow: 2px 2px 2px #33333332;
+  position: relative;
+}
+.g1 div:nth-child(1):before {
+  position: absolute;
+  content: "AA등급";
+  line-height: 40px;
+  color: white;
+  font-size: 1.5rem;
+  font-weight: 800;
+  width: 90px;
+  height: 40px;
+  top: -25px;
+  right: -5%;
+  background-color: #3f87f7;
+  border-radius: 45px;
+  transform: translateX(-50%);
+}
+.g1-1 {
+  display: flex;
+  box-shadow: 0px 0px 0px white !important;
+  flex-direction: row;
+  justify-content: flex-end;
+}
+.g1-1 p {
+  text-align: right;
+  font-size: 1.5rem;
+  padding: 1rem;
+  color: rgb(6, 6, 6);
+}
+.g-2 {
+  text-align: right;
+  font-size: 1.3rem;
+  padding: 1rem;
+  font-weight: 700;
+  color: rgb(6, 6, 6);
+}
+.g-2 span {
+  font-weight: 400;
+}
+.mat-sec-a {
+  width: 100%;
+  margin: 0 auto;
+}
+.mat-sec-a-1 {
+  width: 100%;
+  display: grid;
+  grid-template-columns: 1fr 1fr 1fr;
+  margin: 0 auto;
+  place-items: center;
+
+  padding: 3rem;
+}
+
+.mat-sec-b {
+  padding: 2rem;
+  margin: 1rem;
+  background-color: #f9f9f9;
+  box-shadow: 2px 2px 5px #33333332;
+}
+
+.mat-sec-b div {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.mat-sec-b h5 {
+  width: 100%;
+  font-size: 1.5rem;
+  font-family: "Pretendard-Regular";
+}
+
+.mat-sec-b p {
+  width: 100%;
+  font-size: 1.5rem;
+  text-align: right;
+  justify-content: right;
+  font-family: "Pretendard-Regular";
+}
+
+.mat-2 {
+  width: 100%;
+
+  display: flex;
+  padding: 1.5rem 0px;
+  flex-wrap: nowrap;
+  justify-content: flex-end;
+  flex-direction: row !important;
+}
+.mat-2 p {
+  width: 25%;
+}
 
client/resources/css/reset.css (added)
+++ client/resources/css/reset.css
@@ -0,0 +1,66 @@
+@charset "utf-8";
+
+@font-face {
+  font-family: "SBAggroB";
+  src: url("https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2108@1.1/SBAggroB.woff")
+    format("woff");
+  /* font-weight: normal; */
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "Pretendard-Regular";
+  src: url("https://cdn.jsdelivr.net/gh/Project-Noonnu/noonfonts_2107@1.1/Pretendard-Regular.woff")
+    format("woff");
+  font-weight: 400;
+  font-style: normal;
+}
+@font-face {
+  font-family: SBaggroM;
+  src: url(../font/SBaggroM.ttf);
+}
+@font-face {
+  font-family: SBaggrol;
+  src: url(../font/SBaggroL.ttf);
+}
+
+* {
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+}
+
+html {
+  font-size: 10px;
+  width: 100%;
+  height: 100%;
+  font-family: "Pretendard-Regular";
+
+  overflow-x: hidden;
+  overflow-y: scroll;
+}
+
+body {
+  width: 100%;
+  height: 100%;
+}
+
+ul,
+ol,
+li {
+  list-style: none;
+}
+
+a {
+  color: #333;
+  text-decoration: none;
+}
+
+button {
+  border: none;
+}
+
+img {
+  display: block;
+  width: 100%;
+}
 
client/resources/css/responsive.css (added)
+++ client/resources/css/responsive.css
@@ -0,0 +1,720 @@
+@media all and (min-width: 1023px) and (max-width: 1268px){
+  .data-b-1 p span,.data-b-3 p span{
+    font-size: 2.5rem;
+  }
+  .data-b-1 p span,.data-b-3 p span,.data-b-2 p span{
+    border: 1px solid red;
+    padding: 2rem;
+  }
+  .m-benner{
+    flex: 0 0 52%;
+
+  }
+  .m-text p{
+    padding: 2rem;
+  }
+  .logo span{
+    padding: 2rem;
+  }
+  .b1400 {
+    width: 85%;
+    padding: 1rem;
+  }
+ 
+}
+
+
+/* 테블릿 세로*/
+@media all and (min-width: 768px) and (max-width: 1023px) {
+ 
+  html {
+    font-size: 8px;
+    overflow-x: hidden;
+  }
+
+  .w1400 {
+    max-width: 100%;
+  }
+  .sub-nav,
+  .toggle {
+    opacity: 1;
+  }
+
+  .b1400 {
+    width: 85%;
+    padding: 1rem;
+  }
+  #input {
+    font-size: 1.5rem;
+  }
+  .login,
+  .join {
+    width: 11rem;
+    margin-right: 1rem;
+  }
+  .login i,
+  .join i {
+    font-size: 13px !important;
+  }
+  .logo {
+    flex: 0 0 80%;
+    /* padding: 3rem; */
+    transform: translateY(0px);
+  }
+  .logo span {
+    margin-left: 2rem;
+    font-size: 3rem;
+  }
+  .fa-solid {
+    font-size: 3rem !important;
+  }
+  /* 햄버거 */
+  .mobile1 {
+    flex: 0 0 10%;
+    text-align: center;
+    font-size: 3rem;
+    color: #2c407f;
+  }
+  .sub-nav {
+    height: 100%;
+    opacity: 1;
+  }
+  .header-wrap {
+    padding: 3rem;
+    justify-content: center;
+  }
+  .logo {
+    flex: 0 0 90%;
+  }
+  .logo span {
+    font-family: "Pretendard-Regular";
+    width: 100%;
+    text-align: center;
+    font-size: 3rem;
+    flex: 0 0 90%;
+  }
+  .logo-toggle {
+    width: 100%;
+    display: flex;
+  }
+  .toggle {
+    flex: 0 0 6%;
+    display: block;
+  }
+  .data-b-1 p span{
+    font-size: 2.5rem;
+  }
+
+  .main-menu-1 {
+    display: none !important;
+  }
+  .main-sub-menu {
+    /* width: 100%; */
+    flex: 0 0 100% !important;
+    flex-direction: column;
+    justify-content: end;
+    list-style: none;
+    padding: 5rem;
+    display: none;
+  }
+  .main-sub-menu.open {
+    display: block;
+  }
+  .main-sub-menu li {
+    padding: 1rem;
+  }
+  .accordion-header {
+    cursor: pointer;
+    padding: 10px;
+    text-align: center;
+    font-size: 2rem;
+    font-family: "Pretendard-Regular";
+    font-weight: 700;
+    color: #2c407f;
+  }
+  .accordion-header li {
+    padding: 1rem;
+  }
+
+  .accordion-header.active {
+    padding: 1rem;
+    background-color: #ffffff;
+  }
+
+  .main-sub-menu-sb {
+    list-style: none;
+    padding: 1rem;
+    margin: 0;
+    text-align: center;
+    font-size: 1.5rem;
+    font-family: "Pretendard-Regular";
+  }
+  .main-sub-menu-sb li {
+    padding: 1rem;
+    color: #2c407f;
+  }
+
+  .router-link {
+    text-decoration: none;
+    color: #333;
+    display: block;
+    padding: 10px;
+    transition: background-color 0.3s;
+  }
+
+  .router-link:hover {
+    background-color: #e0e0e0;
+  }
+  /* 햄버거 끝! */
+  .m-b {
+    height: auto;
+  }
+  .m-b-b {
+    flex-direction: column;
+    padding-top: 0;
+    height: 40rem;
+    padding: 2rem;
+  }
+  .m-benner {
+    flex: 100%;
+  }
+  ul.main-menu > li > a {
+    padding: 21px;
+  }
+  .main-content {
+    padding: 40px 0;
+  }
+
+  .m-text {
+    flex: 100%;
+    height: 20rem;
+  }
+  .m-b-b {
+    flex-direction: column;
+    padding-top: 5rem;
+    height: 60rem;
+  }
+  .m-text p {
+    width: 100%;
+    padding-top: 5rem;
+    margin-top: 0;
+  }
+  .m-text p span {
+    text-align: center;
+    font-size: 5rem;
+  }
+  .m-benner {
+    height: 50px;
+    padding: 16rem;
+    background-size: contain;
+    box-shadow: 0 0 0;
+  }
+  .m-p-container {
+    grid-template-columns: 1fr;
+  }
+  .m-p-c-3 {
+    background: url(../jpg/m3-1.png) no-repeat;
+    background-size: cover;
+  }
+  .m-n-hidden {
+    width: 100%;
+  }
+  .swiper {
+    width: 100%;
+  }
+  .swiper-slide {
+    width: 1000px;
+  }
+
+  /* 매칭서비스 */
+  .mat-b-g-g {
+    width: 100%;
+    grid-template-columns: 1fr 1fr;
+  }
+  .mat-sec-a-1 {
+    grid-template-columns: 1fr 1fr;
+  }
+  .mat-sec-b {
+    width: 90%;
+  }
+  /* 자료집 */
+  .data-b-1 p,
+  .data-b-2 p,
+  .data-b-3 p {
+    margin-top: 5rem;
+  }
+  .data-b-1 p span,
+  .data-b-2 p span,
+  .data-b-3 p span {
+    font-size: 2.5rem;
+  }
+  .data-b-1::after,
+  .data-b-3::after {
+    width: 60px;
+    height: 60px;
+  }
+  .data-b-1::after {
+    right: -60px;
+  }
+  .data-b-1 p span {
+    font-size: 2.5rem;
+  }
+  .mat-text {
+    font-size: 3rem;
+  }
+}
+/* 모바일 가로, 테블릿 세로 */
+@media all and (min-width: 480px) and (max-width: 767px) {
+  .w1400 {
+    max-width: 100%;
+    overflow-x: hidden;
+  }
+  .sub-nav,
+  .toggle {
+    opacity: 1;
+  }
+  .b1400 {
+    width: 90%;
+    padding: 1rem;
+  }
+  .da1 {
+    width: 100%;
+    margin-top: 20px;
+  }
+  /* 햄버거 */
+  .header-wrap {
+    padding: 3rem;
+    justify-content: center;
+  }
+  .sub-nav {
+    height: 100%;
+    opacity: 1;
+  }
+  .logo {
+    flex: 0 0 90%;
+    transform: translateY(0px);
+  }
+  .logo span {
+    font-family: "Pretendard-Regular";
+    width: 100%;
+    text-align: center;
+    font-size: 2rem;
+    flex: 0 0 90%;
+  }
+  .logo-toggle {
+    width: 100%;
+    display: flex;
+  }
+  .toggle {
+    flex: 0 0 6%;
+    display: block;
+  }
+
+  .main-menu-1 {
+    display: none !important;
+  }
+  .main-sub-menu {
+    flex: 0 0 100% !important;
+    flex-direction: column;
+    justify-content: end;
+    list-style: none;
+    padding: 5rem;
+    display: none;
+  }
+  .main-sub-menu.open {
+    display: block;/
+  }
+  .main-sub-menu li {
+    padding: 1rem;
+  }
+  .accordion-header {
+    cursor: pointer;
+    padding: 10px;
+    text-align: center;
+    font-size: 2rem;
+    font-family: "Pretendard-Regular";
+    font-weight: 700;
+    color: #2c407f;
+  }
+  .accordion-header li {
+    padding: 1rem;
+  }
+
+  .accordion-header.active {
+    padding: 1rem;
+    background-color: #ffffff;
+  }
+
+  .main-sub-menu-sb {
+    list-style: none;
+    padding: 1rem;
+    margin: 0;
+    text-align: center;
+    font-size: 1.5rem;
+    font-family: "Pretendard-Regular";
+  }
+  .main-sub-menu-sb li {
+    padding: 1rem;
+    color: #2c407f;
+  }
+
+  .router-link {
+    text-decoration: none;
+    color: #333;
+    display: block;
+    padding: 10px;
+    transition: background-color 0.3s;
+  }
+
+  .router-link:hover {
+    background-color: #e0e0e0;
+  }
+  /* 햄버거 끝! */
+  .mobile1 {
+    flex: 0 0 10%;
+    text-align: center;
+    font-size: 3rem;
+    color: #2c407f;
+  }
+  .m-text p {
+    font-size: 1rem;
+  }
+  .m-text {
+    display: none;
+  }
+  .m-text p {
+    font-size: 1rem;
+  }
+  .m-b {
+    background: url(../jpg/main.png) no-repeat center center;
+    background-size: cover;
+    height: auto;
+  }
+  .m-text span {
+    font-size: 25px;
+  }
+  .logo {
+    flex: 0 0 90%;
+  }
+  .m-p {
+    padding: 3rem;
+  }
+  .m-b-b {
+    flex-direction: column;
+    padding-top: 0;
+    height: 40rem;
+    padding: 2rem;
+  }
+  .m-benner {
+    display: none;
+  }
+  .m-p-container {
+    grid-template-columns: 1fr;
+  }
+  .m-h-g {
+    grid-template-columns: 1fr;
+  }
+  .m-pa-pa {
+    width: 100%;
+    flex-direction: column;
+  }
+  .m-pa-pa div {
+    justify-content: center;
+  }
+  .m-p-c-3 {
+    background: url(../jpg/m3-1.png) no-repeat;
+    background-size: cover;
+  }
+  .m-pa-logo {
+    width: 100%;
+    align-items: center;
+    height: 5rem;
+    margin: 2rem;
+  }
+
+  .lo1,
+  .lo2,
+  .lo3,
+  .lo4,
+  .lo5 {
+    background-size: contain;
+  }
+  /* 매칭서비스 */
+  .mat-b-g-g {
+    grid-template-columns: 1fr;
+  }
+  .mat-sec-a-1 {
+    grid-template-columns: 1fr;
+  }
+  .mat-sec-b {
+    width: 90%;
+  }
+  .mat-text {
+    font-size: 3rem;
+  }
+  /* 자료집 */
+  .data-main {
+    width: 100%;
+  }
+  .data-b-grid {
+    grid-template-columns: 1fr;
+  }
+  .data-b-b {
+    padding: 4rem;
+    text-align: center;
+  }
+  .data-b-1 p {
+    font-size: 2rem;
+    padding: 3rem;
+    padding-top: 5rem;
+    width: 50%;
+    font-family: SBaggroM;
+    text-align: left;
+    color: #014099;
+    margin: 0 auto;
+    cursor: pointer;
+  }
+  .data-b-3 p {
+    font-size: 2rem;
+    padding: 3rem;
+    padding-top: 5rem;
+    width: 50%;
+    margin: 0 auto;
+    cursor: pointer;
+    font-family: SBaggroM;
+    text-align: right;
+    color: #e07e27;
+  }
+  .data-b-1 p span {
+    font-size: 2.5rem;
+  }
+  .data-b-3::after,
+  .data-b-1::after {
+    display: none;
+  }
+}
+
+/* 모바일 가로, 테블릿 세로 */
+@media all and (max-width: 479px) {
+  .w1400 {
+    margin: 0 auto;
+    max-width: 100%;
+    overflow-x: hidden;
+  }
+
+  .sub-nav,
+  .toggle {
+    opacity: 1;
+  }
+  .b1400 {
+    width: 90%;
+    padding: 1rem;
+  }
+
+  .header-wrap {
+    padding: 3rem;
+    flex-direction: column;
+    box-shadow: 2px 2px 2px #3333330e;
+  }
+  .logo-toggle {
+    width: 100%;
+    display: flex;
+  }
+  .logo {
+    flex: 0 0 80%;
+    transform: translateY(0px);
+  }
+  .logo span {
+    font-family: "Pretendard-Regular";
+    width: 100%;
+    text-align: center;
+    font-size: 2.6rem;
+    flex: 0 0 90%;
+    margin: 1rem;
+    /* border: 1px solid red; */
+  }
+  .mobile1 {
+    flex: 0 0 10%;
+    text-align: center;
+    font-size: 3rem;
+    color: #2c407f;
+    /* border: 1px solid red; */
+  }
+  /* 메뉴 반응형 */
+  .sub-nav {
+    position: relative;
+    height: 100%;
+    opacity: 1;
+  }
+
+  .toggle {
+    flex: 0 0 6%;
+    display: block;
+    height: 10px;
+ 
+  }
+
+  .main-menu-1 {
+    display: none !important;
+  }
+  .main-sub-menu {
+    flex: 0 0 100% !important;
+    flex-direction: column;
+    justify-content: end;
+    list-style: none;
+    padding: 5rem;
+    display: none;
+  }
+  .main-sub-menu.open {
+    display: block;
+  }
+  .m-text {
+    display: none;
+  }
+  .m-text p {
+    font-size: 1rem;
+  }
+  .m-b {
+    background: url(../jpg/main.png) no-repeat center center;
+    background-size: cover;
+    height: auto;
+  }
+  .m-text span {
+    font-size: 25px;
+  }
+
+  .m-p {
+    padding: 3rem;
+  }
+  .m-b-b {
+    flex-direction: column;
+    padding-top: 0;
+    height: 40rem;
+  }
+  .m-benner {
+    width: 100%;
+    flex: 100%;
+    background-size: cover;
+    box-shadow: 0px 0px 0px;
+    display: none;
+  }
+  .m-p-container {
+    grid-template-columns: 1fr;
+  }
+  .m-h-g {
+    grid-template-columns: 1fr;
+  }
+  .m-pa-pa {
+    width: 100%;
+    flex-direction: column;
+  }
+  .m-pa-pa div {
+    justify-content: center;
+  }
+  .m-p-c-3 {
+    background: url(../jpg/m3-1.png) no-repeat;
+    background-size: cover;
+  }
+  .m-pa-logo {
+    width: 100%;
+    align-items: center;
+    height: 5rem;
+    margin: 2rem;
+  }
+  .lo1,
+  .lo2,
+  .lo3,
+  .lo4,
+  .lo5 {
+    background-size: contain;
+  }
+  .call p {
+    flex: 0 0 100%;
+  }
+  .call img {
+    flex-direction: column;
+    margin-top: 30px;
+    margin-left: -213px;
+  }
+  /* 매칭서비스 */
+  .mat-b-g-g {
+    grid-template-columns: 1fr;
+  }
+  .mat-sec-a-1 {
+    grid-template-columns: 1fr;
+    width: 100%;
+  }
+  .mat-text {
+    display: none;
+    font-size: 2rem;
+  }
+
+  /* 자료집 */
+  .data-main {
+    width: 100%;
+  }
+  .data-b-grid {
+    grid-template-columns: 1fr;
+  }
+  .data-b-b {
+    padding: 4rem;
+    text-align: center;
+  }
+
+  .main-sub-menu li {
+    padding: 1rem;
+  }
+  .accordion-header {
+    cursor: pointer;
+    padding: 10px;
+    text-align: center;
+    font-size: 2rem;
+    font-family: "Pretendard-Regular";
+    font-weight: 700;
+    color: #2c407f;
+  }
+  .accordion-header li {
+    padding: 1rem;
+  }
+
+  .accordion-header.active {
+    padding: 1rem;
+    background-color: #ffffff;
+  }
+
+  .main-sub-menu-sb {
+    list-style: none;
+    padding: 1rem;
+    margin: 0;
+    text-align: center;
+    font-size: 1.5rem;
+    font-family: "Pretendard-Regular";
+  }
+  .main-sub-menu-sb li {
+    padding: 1rem;
+    color: #2c407f;
+  }
+
+  .router-link {
+    text-decoration: none;
+    color: #333;
+    display: block;
+    padding: 10px;
+    transition: background-color 0.3s;
+  }
+
+  .router-link:hover {
+    background-color: #e0e0e0;
+  }
+  .data-b-1 p span {
+    font-size: 2.5rem;
+  }
+
+  .data-select {
+    width: 100%;
+    flex-direction: column;
+  }
+  .data-table-tr {
+    width: 100%;
+  }
+}
 
client/resources/font/SBaggroB.ttf (Binary) (added)
+++ client/resources/font/SBaggroB.ttf
Binary file is not shown
 
client/resources/font/SBaggroL.ttf (Binary) (added)
+++ client/resources/font/SBaggroL.ttf
Binary file is not shown
 
client/resources/font/SBaggroM.ttf (Binary) (added)
+++ client/resources/font/SBaggroM.ttf
Binary file is not shown
 
client/resources/jpg/123.png (Binary) (added)
+++ client/resources/jpg/123.png
Binary file is not shown
 
client/resources/jpg/PNG/hss자산 5dfd.png (Binary) (added)
+++ client/resources/jpg/PNG/hss자산 5dfd.png
Binary file is not shown
 
client/resources/jpg/PNG/ps4301.tmp (added)
+++ client/resources/jpg/PNG/ps4301.tmp
@@ -0,0 +1,0 @@
 
client/resources/jpg/data-img-text.png (Binary) (added)
+++ client/resources/jpg/data-img-text.png
Binary file is not shown
 
client/resources/jpg/data-img.png (Binary) (added)
+++ client/resources/jpg/data-img.png
Binary file is not shown
 
client/resources/jpg/data-img2.png (Binary) (added)
+++ client/resources/jpg/data-img2.png
Binary file is not shown
 
client/resources/jpg/data-img3.png (Binary) (added)
+++ client/resources/jpg/data-img3.png
Binary file is not shown
 
client/resources/jpg/fille.png (Binary) (added)
+++ client/resources/jpg/fille.png
Binary file is not shown
 
client/resources/jpg/hss자산 14dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 14dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 15dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 15dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 16dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 16dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 17dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 17dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 19dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 19dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 20dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 20dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 21dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 21dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 23dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 23dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 2dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 2dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 4dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 4dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 6dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 6dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 8dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 8dfd.png
Binary file is not shown
 
client/resources/jpg/ki-i.png (Binary) (added)
+++ client/resources/jpg/ki-i.png
Binary file is not shown
 
client/resources/jpg/ki.jpg (Binary) (added)
+++ client/resources/jpg/ki.jpg
Binary file is not shown
 
client/resources/jpg/logo/edutech.png (Binary) (added)
+++ client/resources/jpg/logo/edutech.png
Binary file is not shown
 
client/resources/jpg/logo/kefa.png (Binary) (added)
+++ client/resources/jpg/logo/kefa.png
Binary file is not shown
 
client/resources/jpg/logo/keris.gif (Binary) (added)
+++ client/resources/jpg/logo/keris.gif
Binary file is not shown
 
client/resources/jpg/logo/ketis.png (Binary) (added)
+++ client/resources/jpg/logo/ketis.png
Binary file is not shown
 
client/resources/jpg/logo/ko-go.jpg (Binary) (added)
+++ client/resources/jpg/logo/ko-go.jpg
Binary file is not shown
 
client/resources/jpg/logo/ko-go.png (Binary) (added)
+++ client/resources/jpg/logo/ko-go.png
Binary file is not shown
 
client/resources/jpg/logo/ko-w.png (Binary) (added)
+++ client/resources/jpg/logo/ko-w.png
Binary file is not shown
 
client/resources/jpg/logo/ko.png (Binary) (added)
+++ client/resources/jpg/logo/ko.png
Binary file is not shown
 
client/resources/jpg/m-1.png (Binary) (added)
+++ client/resources/jpg/m-1.png
Binary file is not shown
 
client/resources/jpg/m-2.png (Binary) (added)
+++ client/resources/jpg/m-2.png
Binary file is not shown
 
client/resources/jpg/m-h-g-1.png (Binary) (added)
+++ client/resources/jpg/m-h-g-1.png
Binary file is not shown
 
client/resources/jpg/m-h-g-3.png (Binary) (added)
+++ client/resources/jpg/m-h-g-3.png
Binary file is not shown
 
client/resources/jpg/m-h-g.png (Binary) (added)
+++ client/resources/jpg/m-h-g.png
Binary file is not shown
 
client/resources/jpg/m-p-ai.png (Binary) (added)
+++ client/resources/jpg/m-p-ai.png
Binary file is not shown
 
client/resources/jpg/m-p-ai2.png (Binary) (added)
+++ client/resources/jpg/m-p-ai2.png
Binary file is not shown
 
client/resources/jpg/m-p-ai3.png (Binary) (added)
+++ client/resources/jpg/m-p-ai3.png
Binary file is not shown
 
client/resources/jpg/m-w.png (Binary) (added)
+++ client/resources/jpg/m-w.png
Binary file is not shown
 
client/resources/jpg/m2.png (Binary) (added)
+++ client/resources/jpg/m2.png
Binary file is not shown
 
client/resources/jpg/m3-1.png (Binary) (added)
+++ client/resources/jpg/m3-1.png
Binary file is not shown
 
client/resources/jpg/m3.png (Binary) (added)
+++ client/resources/jpg/m3.png
Binary file is not shown
 
client/resources/jpg/m4.png (Binary) (added)
+++ client/resources/jpg/m4.png
Binary file is not shown
 
client/resources/jpg/main.png (Binary) (added)
+++ client/resources/jpg/main.png
Binary file is not shown
 
client/resources/jpg/mat-img.png (Binary) (added)
+++ client/resources/jpg/mat-img.png
Binary file is not shown
 
client/resources/jpg/mat-img1.png (Binary) (added)
+++ client/resources/jpg/mat-img1.png
Binary file is not shown
 
client/resources/jpg/moc.png (Binary) (added)
+++ client/resources/jpg/moc.png
Binary file is not shown
 
client/resources/jpg/notice-banner.png (Binary) (added)
+++ client/resources/jpg/notice-banner.png
Binary file is not shown
 
client/resources/jpg/swiper.png (Binary) (added)
+++ client/resources/jpg/swiper.png
Binary file is not shown
 
client/resources/jpg/swiper2.png (Binary) (added)
+++ client/resources/jpg/swiper2.png
Binary file is not shown
 
client/resources/jpg/zigaksa.jpg (Binary) (added)
+++ client/resources/jpg/zigaksa.jpg
Binary file is not shown
 
client/views/component/test/TestCompoent.vue (added)
+++ client/views/component/test/TestCompoent.vue
@@ -0,0 +1,24 @@
+<template>
+    <div>TestCompoent.vue</div>
+</template>
+
+<script>
+export default {
+    data () {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('TestCompoent mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/index.html (added)
+++ client/views/index.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="Node Vue Web">
+    <link rel="icon" href="" />
+    <link rel="stylesheet" href="/client/resources/css/Main.css">
+    <link rel="stylesheet" href="/client/resources/css/reset.css">
+    <link rel="stylesheet" href="/client/resources/css/common.css">
+    <link rel="stylesheet" href="/client/resources/css/footer.css">
+    <link rel="stylesheet" href="/client/resources/css/header.css">
+    <link rel="stylesheet" href="/client/resources/css/matching.css">
+    <link rel="stylesheet" href="/client/resources/css/Data.css">
+    <link rel="stylesheet" href="/client/resources/css/responsive.css">
+
+    <script src="https://kit.fontawesome.com/9f862d56b3.js" crossorigin="anonymous"></script>
+
+    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
+
+    <title>KERIS</title>
+
+
+</head>
+
+<body>
+    <div id="root"></div>
+    <script src="/client/build/bundle.js"></script>
+</body>
+
+</html>(파일 끝에 줄바꿈 문자 없음)
 
client/views/index.js (added)
+++ client/views/index.js
@@ -0,0 +1,13 @@
+/**
+ * @author : 최정우
+ * @since : 2022.10.19
+ * @dscription : Vue를 활용한 Client단 구현의 시작점(Index) Component 입니다.
+ */
+import { createApp } from 'vue';
+
+import AppRouter from './pages/AppRouter.js';
+import App from './pages/App.vue';
+
+const vue = createApp(App).use(AppRouter).mount('#root');
+
+
 
client/views/layout/Header.vue (added)
+++ client/views/layout/Header.vue
@@ -0,0 +1,58 @@
+<template>
+    <div class="header">
+        <div class="b1400">
+
+            <div class="login">
+                <i class="fa-solid fa-user fa-lg" style="color: #ffffff;"></i>
+                <router-link to="/Login.page"><input type="button" value="로그인" name="" id="input"></router-link>
+
+            </div>
+
+            <div class="join">
+                <i class="fa-solid fa-user-plus fa-lg" style="color: #ffffff;"></i>
+                <router-link to="/Join.page"><input type="button" value="회원가입" name="" id="input"></router-link>
+            </div>
+            <Menu class="menu" :isActive="isActive"></Menu>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Header mounted');
+    }
+}
+</script>
+<style scoped>
+.header {
+    width: 100%;
+    /* height: 40px; */
+    display: flex;
+    justify-content: flex-end;
+    padding: 0.5rem;
+    float: right;
+    background-color: #3f87f7;
+    /* border: 1px solid red; */
+}
+
+#input {
+    border: 0;
+    background-color: rgba(240, 248, 255, 0);
+    cursor: pointer;
+    color: white;
+}
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/layout/Menu copy.vue (added)
+++ client/views/layout/Menu copy.vue
@@ -0,0 +1,284 @@
+<template>
+    <div class="w1400 header-wrap">
+        <div class="logo">
+            <router-link to="/"><span>AI 디지털교과서 통합지원센터</span></router-link>
+        </div>
+        <header>
+            <nav>
+                <ul class="clearfix">
+                    <li @mouseenter="toggleSubMenu" @mouseleave="toggleSubMenu">통합지원센터 소개
+                        <ul v-if="showSubMenu">
+                            <li>통합지원센터란?</li>
+                            <li>협력 기업</li>
+                        </ul>
+                    </li>
+                    <!-- Add more menu items here -->
+                </ul>
+                <ul class="clearfix">
+                    <li @mouseenter="expandHeader" @mouseleave="collapseHeader">자료실
+                        <ul>
+                            <li>기술문서</li>
+                            <li>자료집</li>
+                        </ul>
+                    </li>
+                    <!-- Add more menu items here -->
+                </ul>
+                <ul class="clearfix">
+                    <li @mouseenter="expandHeader" @mouseleave="collapseHeader">내트워킹
+                        <ul>
+                            <li>기업 홍보관</li>
+                        </ul>
+                    </li>
+                    <!-- Add more menu items here -->
+                </ul>
+                <ul class="clearfix">
+                    <li @mouseenter="expandHeader" @mouseleave="collapseHeader">커뮤니티
+                        <ul>
+                            <li>공지사항</li>
+                            <li>홍보/뉴스</li>
+                        </ul>
+                    </li>
+                    <!-- Add more menu items here -->
+                </ul>
+                <ul class="clearfix">
+                    <li @mouseenter="expandHeader" @mouseleave="collapseHeader">마이페이지
+                        <ul>
+                            <li>내 정보 수정</li>
+                            <li>매칭 관리</li>
+                        </ul>
+                    </li>
+                    <!-- Add more menu items here -->
+                </ul>
+            </nav>
+        </header>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            showSubMenu: false,
+        }
+    },
+    methods: {
+        toggleSubMenu() {
+            this.showSubMenu = !this.showSubMenu;
+        },
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Menu mounted');
+    }
+}
+</script>
+
+<style scoped>
+.sub-menu {
+    width: 100%;
+}
+
+header {
+    display: flex
+}
+
+
+/*  폰트 적용 */
+@import url(//fonts.googleapis.com/earlyaccess/notosanskr.css);
+
+html {
+    font-family: "Noto Sans KR", sans-serif;
+}
+
+/* 노말라이즈 */
+body,
+ul,
+li,
+h1 {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+}
+
+a {
+    color: inherit;
+    text-decoration: none;
+}
+
+/* 라이브러리 */
+.con {
+    margin: 0 auto;
+}
+
+.img-box>img {
+    width: 100%;
+    display: block;
+}
+
+.row::after {
+    content: "";
+    display: block;
+    clear: both;
+}
+
+.cell {
+    float: left;
+    box-sizing: border-box;
+}
+
+.cell-right {
+    float: right;
+    box-sizing: border-box;
+}
+
+.margin-0-auto {
+    margin: 0 auto;
+}
+
+.block {
+    display: block;
+}
+
+.inline-block {
+    display: inline-block;
+}
+
+.text-align-center {
+    text-align: center;
+}
+
+.line-height-0-ch-only {
+    line-height: 0;
+}
+
+.line-height-0-ch-only>* {
+    line-height: normal;
+}
+
+.relative {
+    position: relative;
+}
+
+.absolute-left {
+    position: absolute;
+    left: 0;
+}
+
+.absolute-right {
+    position: absolute;
+    right: 0;
+}
+
+.absolute-middle {
+    position: absolute;
+    top: 50%;
+    transform: translateY(-50%);
+}
+
+.width-100p {
+    width: 100%;
+}
+
+.table {
+    display: table;
+}
+
+.table-cell {
+    display: table-cell;
+}
+
+.vertical-align-top {
+    vertical-align: top;
+}
+
+.vertical-align-middle {
+    vertical-align: middle;
+}
+
+.vertical-align-bottom {
+    vertical-align: bottom;
+}
+
+/* 커스텀 */
+
+.con {
+    width: 1180px;
+}
+
+.con-min-width {
+    min-width: 1180px;
+}
+
+/* 반응형 레이아웃 */
+/*
+.con {
+    max-width:1150px;
+}
+
+.con-min-width {
+    min-width:320px;
+}
+
+html, body {
+    overflow-x:hidden;
+}
+*/
+
+body {
+    background: rgb(255, 255, 255);
+}
+
+header {
+
+    /* border: 1px solid red; */
+    /* background: -webkit-linear-gradient(rgb(255, 255, 255) 50px, rgb(255, 255, 255) 50px); */
+    transition: 0.3s ease-in;
+    height: 50px;
+    /* overflow: hidden; */
+}
+
+
+nav {
+    width: 960px;
+    margin: 0 auto;
+    display: flex;
+    justify-content: flex-end;
+}
+
+nav>ul>li {
+    display: inline-block;
+    /* float: lef/t;  */
+    right: 0;
+
+    line-height: 50px;
+    margin-left: 40px;
+    font-size: 1.4rem;
+    /* position: relative; */
+    font-family: "Pretendard-Regular";
+
+}
+
+nav>ul>li ul {
+    width: 100%;
+    opacity: 0;
+    position: absolute;
+    transition: 0.3s 0.2s;
+}
+
+nav>ul>li ul li {
+    white-space: nowrap;
+}
+
+nav>ul>li:hover ul {
+    opacity: 1;
+    transition: 0.3s 0.2s;
+    z-index: 1;
+    background-color: white;
+
+}
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/layout/Menu.vue (added)
+++ client/views/layout/Menu.vue
@@ -0,0 +1,249 @@
+<template>
+    <div class="w1400 header-wrap">
+        <div class="logo-toggle">
+
+            <div class="logo">
+                <router-link to="/"><span>AI 디지털교과서 통합지원센터</span></router-link>
+            </div>
+            <input type="checkbox" id="checkbox" v-model="check">
+            <label for="checkbox" class="toggle" @click="toggleMenu">
+                <div class="bar bar--top"></div>
+                <div class="bar bar--middle"></div>
+                <div class="bar bar--bottom"></div>
+            </label>
+            <!-- <i v-if="!isOpened" class="fa-solid fa-bars mobile1" @click="toggleMenu"></i>
+            <i v-else class="fa-solid fa-times mobile1" @click="toggleMenu"></i> -->
+        </div>
+        <!-- 모바일 -->
+        <nav class=" sub-nav">
+            <ul class="main-sub-menu" :class="{ open: isOpened }">
+                <li v-for="menuItem in menuItems" :key="menuItem.text">
+                    <div @click="toggleAccordion(menuItem)" class="accordion-header"
+                        :class="{ 'active': menuItem.isExpanded }">
+                        {{ menuItem.text }}
+                    </div>
+                    <ul class="main-sub-menu-sb" v-if="menuItem.isExpanded">
+                        <li v-for="subMenuItem in menuItem.subMenu" :key="subMenuItem.text" @click="navClose(menuItem)">
+                            <router-link :to="subMenuItem.link">{{ subMenuItem.text }}</router-link>
+                        </li>
+                    </ul>
+                </li>
+            </ul>
+        </nav>
+        <!-- PC -->
+        <nav>
+            <ul class="main-menu main-menu-1">
+                <li v-for="menuItem in menuItems" :key="menuItem.text" :class="{ 'active': menuItem.isHovered }"
+                    @mouseover="menuItem.isHovered = true" @mouseout="menuItem.isHovered = false">
+                    <router-link :to="menuItem.link">{{ menuItem.text }}</router-link>
+                    <ul class="sub-menu sub-menu-1">
+                        <li v-for="subMenuItem in menuItem.subMenu" :key="subMenuItem.text" @click="navClose(menuItem)">
+                            <router-link :to="subMenuItem.link">{{ subMenuItem.text }}</router-link>
+                        </li>
+                    </ul>
+                </li>
+            </ul>
+        </nav>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            check: false,
+            isOpened: false,
+            menuItems: [
+                {
+                    text: "통합지원센터 소개",
+                    link: "/",
+                    subMenu: [
+                        { text: "통합지원센터란?", link: "" },
+                        { text: "협력 기업", link: "" }
+                    ]
+                },
+                {
+                    text: "자료실",
+                    link: "",
+                    isHovered: false,
+                    subMenu: [
+                        { text: "기술문서", link: "" },
+                        { text: "자료집", link: "/Data.page" }
+                    ]
+                },
+                {
+                    text: "네트워킹",
+                    link: "",
+                    isHovered: false,
+                    subMenu: [
+                        { text: "기업 홍보관", link: "/Matching.page" },
+                    ]
+                },
+                {
+                    text: "커뮤니티",
+                    link: "",
+                    isHovered: false,
+                    subMenu: [
+                        { text: "공지사항", link: "" },
+                        { text: "홍보/뉴스", link: "" }
+                    ]
+                },
+                {
+                    text: "마이페이지",
+                    link: "",
+                    isHovered: false,
+                    subMenu: [
+                        { text: "내 정보 수정", link: "" },
+                        { text: "매칭 관리", link: "" }
+                    ]
+                }
+            ]
+        };
+    },
+    methods: {
+        toggleAccordion(menuItem) {
+            menuItem.isExpanded = !menuItem.isExpanded;
+            console.log(menuItem.isExpanded);
+            this.isOpened = true;
+        },
+        toggleMenu() {
+            this.isOpened = !this.isOpened;
+        },
+        navClose(menuItem) {
+            this.isOpened = false;
+            menuItem.isExpanded = false;
+            this.check = false;
+        },
+        // mouseouts() {
+        //     this.isOpened = false;
+        //     console.log("active");
+        // }
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Menu mounted');
+    }
+}
+</script>
+
+<style scoped>
+ul.main-menu {
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
+}
+
+ul.main-menu>li {
+    position: relative;
+}
+
+ul.main-menu>li>a {
+    display: block;
+    padding: 25px;
+    font-size: 1.6rem;
+    font-weight: 500;
+    font-family: "Pretendard-Regular";
+
+}
+
+ul.sub-menu {
+    height: 0;
+    overflow: hidden;
+    transition: all 0.8s;
+    position: absolute;
+    top: 69px;
+    left: 0;
+    width: 100%;
+    z-index: 100000;
+    background-color: #fff;
+    box-shadow: 0px 2px 2px #3333331b;
+}
+
+ul.main-menu>li.active ul.sub-menu {
+    height: auto;
+}
+
+
+ul.sub-menu>li>a {
+    display: block;
+    padding: 15px;
+    font-size: 1.5rem !important;
+    font-weight: 500;
+    font-family: "Pretendard-Regular";
+    padding-bottom: 2rem;
+    text-align: center;
+    font-size: 1.2rem;
+}
+
+
+
+
+
+#checkbox {
+    display: none;
+}
+
+.toggle {
+    position: relative;
+    width: 30px;
+    cursor: pointer;
+    margin: auto;
+    display: block;
+    height: calc(4px * 3 + 11px * 2);
+}
+
+.bar {
+    position: absolute;
+    left: 0;
+    right: 0;
+    height: 3px;
+    border-radius: calc(4px / 2);
+    background: #2c407f;
+    color: inherit;
+    opacity: 1;
+    transition: none 0.35s cubic-bezier(.5, -0.35, .35, 1.5) 0s;
+}
+
+/***** Spin Animation *****/
+
+.bar--top {
+    bottom: calc(50% + 11px + 4px/ 2);
+    transition-property: bottom, transform;
+    transition-delay: calc(0s + 0.35s), 0s;
+}
+
+.bar--middle {
+    top: calc(50% - 4px/ 2);
+    transition-property: opacity;
+    transition-delay: calc(0s + 0.35s);
+}
+
+.bar--bottom {
+    top: calc(50% + 11px + 4px/ 2);
+    transition-property: top, transform;
+    transition-delay: calc(0s + 0.35s), 0s;
+}
+
+#checkbox:checked+.toggle .bar--top {
+    bottom: calc(50% - 4px/ 2);
+    transform: rotate(135deg);
+    transition-delay: 0s, calc(0s + 0.35s);
+}
+
+#checkbox:checked+.toggle .bar--middle {
+    opacity: 0;
+    transition-duration: 0s;
+    transition-delay: calc(0s + 0.35s);
+}
+
+#checkbox:checked+.toggle .bar--bottom {
+    top: calc(50% - 4px/ 2);
+    transform: rotate(225deg);
+    transition-delay: 0s, calc(0s + 0.35s);
+}
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/layout/Menusub.vue (added)
+++ client/views/layout/Menusub.vue
@@ -0,0 +1,44 @@
+<template>
+    <div class="w1400 header-sub-wrap">
+        <div>
+            <div class="sub-sub-menu">
+                <ul>
+                    <li><router-link to="/"> <span>통합지원센터 소개</span></router-link></li>
+                    <li><router-link to="/"> <span>자료실</span></router-link></li>
+                    <li><router-link to="/"> <span>네트워킹</span></router-link></li>
+                    <li><router-link to="/"> <span>커뮤니티</span></router-link></li>
+                    <li><router-link to="/main2"> <span>마이페이지</span></router-link></li>
+                </ul>
+            </div>
+
+        </div>
+
+    </div>
+</template>
+ 
+<script>
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Menu mounted');
+    }
+}
+</script>
+
+<style scoped>
+.sub-menu {
+    width: 100%;
+}
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/App.vue (added)
+++ client/views/pages/App.vue
@@ -0,0 +1,44 @@
+<template>
+   <div v-cloak>
+      <Header></Header>
+      <Menu></Menu>
+      <div class="main-warp">
+         <router-view />
+      </div>
+      <Footer></Footer>
+   </div>
+</template>
+
+<script>
+import Header from '../layout/Header.vue';
+import Menu from '../layout/Menu.vue';
+import Footer from '../layout/Footer.vue';
+
+const App = {
+   data: () => {
+      return {
+      }
+   },
+   methods: {
+
+   },
+   watch: {
+
+   },
+   computed: {
+
+   },
+   components: {
+      'Header': Header,
+      'Menu': Menu,
+      'Footer': Footer,
+   },
+   mounted: () => {
+      console.log('Vue mounted');
+   }
+}
+
+export default App;
+</script>
+
+<style></style>
 
client/views/pages/AppRouter.js (added)
+++ client/views/pages/AppRouter.js
@@ -0,0 +1,23 @@
+import { createWebHistory, createRouter } from "vue-router";
+
+import Main from "../pages/main/Main.vue";
+import Matching from "../pages/matching/Matching.vue";
+import Data from "../pages/Data/Data.vue";
+import Login from "../pages/login/Login.vue";
+import Join from "../pages/Join/Join.vue";
+
+const routes = [
+  /* 메인화면 */
+  { path: "/", name: "Main", component: Main },
+  { path: "/Data.page", name: "Data", component: Data },
+  { path: "/Matching.page", name: "Matching", component: Matching },
+  { path: "/Login.page", name: "Login", component: Login },
+  { path: "/Join.page", name: "Join", component: Join },
+];
+
+const AppRouter = createRouter({
+  history: createWebHistory(),
+  routes,
+});
+
+export default AppRouter;
 
client/views/pages/Data/Data.vue (added)
+++ client/views/pages/Data/Data.vue
@@ -0,0 +1,133 @@
+<template>
+    <div class="data-main">
+        <section class="main-sec sec1">
+            <!-- <div class="main-content"> -->
+            <div class="flex">
+                <!-- 자료집 비주얼 -->
+                <div class="data-b">
+                    <div class="w1400">
+                        <div class="data-b-b">
+                            <!-- 자료집 텍스트 -->
+                            <div class="data-text">
+
+                                <p>자료집</p>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </section>
+
+        <!-- 자료집 메인 -->
+        <section class="data-b-main">
+            <div class="data-b">
+                <div class="w1400">
+                    <div class="data-b-grid">
+                        <!-- 윗쪽 아이콘 -->
+                        <div class="data-b-1 da1">
+                            <p>AI 디지털교과서<br><span>개발 가이드 라인<br> 설명회 발표자료</span></p>
+                        </div>
+                        <div class="data-b-2 da1">
+                            <p>AI 디지털교과서<br><span>정책</span></p>
+                        </div>
+                        <div class="data-b-3 da1">
+                            <p>AI 디지털교과서<br><span>개발아이디어<br> 해커톤 작품집</span></p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </section>
+
+        <!-- 자료집 테이블 -->
+
+        <section class="data-table">
+            <div class="data-b">
+                <div class="w1400">
+                    <div class="data-select">
+
+
+                        <select name="data-table-sild" id="data-table-sild">
+                            <option value="전체" selected>전체</option>
+                            <option value="기본순">기본순</option>
+                            <option value="업로드순" disabled>업로드순</option>
+                            <option value="조회순">조회순</option>
+                        </select>
+                        <div class="input-group">
+                            <input type="text" class="input" onfocus="this.value=''; return true;" value="검색어를 입력해주세요.">
+                            <input class="button--submit" value="검색" type="submit">
+                        </div>
+                    </div>
+                    <div class="data-table-tr">
+                        <table>
+                            <th>NO</th>
+                            <th>공지사항</th>
+                            <th>날짜</th>
+
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </section>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Data mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/join/Join.vue (added)
+++ client/views/pages/join/Join.vue
@@ -0,0 +1,111 @@
+<template>
+    <div class="w1400">
+        <div>
+            <section class="join-logo">
+                <h1>회원가입</h1>
+            </section>
+
+            <section class="join-sec1">
+                <div class="join-sec-sub">
+                    <span>아이디</span>
+                    <input type="text">
+                    <button>중복확인</button>
+                </div>
+            </section>
+
+
+            <section class="join-sec2">
+                <div class="join-sec-sub">
+                    <span>기관업체</span>
+                    <input type="text" value="기관 및 업체명을 입력하세요.">
+                </div>
+            </section>
+
+
+            <section class="join-sec3">
+                <div class="join-sec-sub">
+                    <span>비밀번호</span>
+                    <input type="text">
+                </div>
+            </section>
+
+
+            <section class="join-sec4">
+                <div class="join-sec-sub">
+                    <span>비밀번호 확인</span>
+                    <input type="text">
+                </div>
+            </section>
+
+
+            <section class="join-sec5">
+                <div class="join-sec-sub">
+                    <span>담당자명</span>
+                    <input type="text">
+                </div>
+            </section>
+
+
+            <section class="join-sec6">
+                <div class="join-sec-sub">
+                    <label for="email_id">이메일</label>
+                    <input type="text" name="email_id" id="email_id"> @
+                    <input type="text" name="email_dns" id="email_dns">
+                    <select name="email_sel" id="email_sel">
+                        <option value="">직접 입력</option>
+                        <option value="naver.com">NAVER</option>
+                        <option value="hanmail.net">DAUM</option>
+                        <option value="gmail.com">GOOGLE</option>
+                    </select>
+                </div>
+            </section>
+        </div>
+
+
+
+        <!---------------------------------------------------------------------------------------------------------------->
+
+        <div>
+            <section class="join-sec">
+                <div class="join-sec-a">
+                    <h1>회사소개</h1>
+                </div>
+            </section>
+
+            <section class="join-sec-a-1">
+                <span>회사명</span>
+                <input type="text">
+            </section>
+            <section class="join-sec-a-1">
+                <span>우리회사 키워드</span>
+                <input type="text">
+            </section>
+            <section class="join-sec-a-1">
+                <span>회사 소개글</span>
+                <input type="text">
+            </section>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Join mounted');
+    }
+}
+</script>
+
 
client/views/pages/login/Login.vue (added)
+++ client/views/pages/login/Login.vue
@@ -0,0 +1,185 @@
+<template>
+    <div class="w1400">
+        <div class=" login-sec">
+            <section class="login-logo">
+                <div class="login-logo-d">
+                    <img src="../../../resources/jpg/logo/keris.gif" alt="">
+                    <h1>AI 디지털교과서 통합지원센터</h1>
+                </div>
+            </section>
+
+            <section class="login-input">
+                <div class="login-input-d">
+                    <div class="ID">
+                        <input type="text" class="id" value="아이디를 입력하세요.">
+                    </div>
+                    <div class="PW">
+                        <input type="password" class="password" value="비밀번호를 입력하세요.">
+                    </div>
+                </div>
+            </section>
+
+            <section class="login-checkbox">
+                <div class="login-checkbox-i">
+                    <input type="checkbox">
+                    <span>
+                        로그인상태 유지
+                    </span>
+                </div>
+                <div class="login-checkbox-b">
+                    <button>아이디 찾기</button>
+                    <button>비밀번호찾기</button>
+                    <button>회원가입</button>
+                </div>
+            </section>
+            <section class="login-button">
+                <button>로그인</button>
+            </section>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Login mounted');
+    }
+}
+</script>
+
+
+<style scoped>
+.w1400 {
+    overflow-y: hidden;
+    margin: 0 auto;
+    text-align: center;
+}
+
+.login-sec section {
+    /* border: 1px solid red; */
+}
+
+.login-logo {
+    width: 100%;
+    padding-top: 11rem;
+
+}
+
+.login-logo-d img {
+    width: 300px;
+    text-align: center;
+    /* border: 1px solid red; */
+    margin: 0 auto;
+    padding: 3rem;
+}
+
+.login-logo-d h1 {
+    /* border: 1px solid red; */
+    font-family: SBaggroM;
+    font-weight: 500;
+    color: #063a6d;
+    font-size: 2.5rem;
+}
+
+.login-input {
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+
+
+}
+
+.login-input-d div {
+    width: 100%;
+
+    padding: 1rem;
+}
+
+.ID input,
+.PW input {
+    width: 40rem;
+    height: 6rem;
+    border: 1px solid #9a9a9a;
+    border-radius: 1.2rem;
+    padding: 1rem;
+    color: #9a9a9a;
+}
+
+.login-checkbox {
+
+    width: 100%;
+}
+
+.login-checkbox-i {
+    width: 40rem;
+    text-align: left;
+    margin: 0 auto;
+    /* border: 1px solid red; */
+
+}
+
+.login-checkbox-i input[type=checkbox] {
+    text-align: left;
+    margin: 1rem;
+    /* border: 1px solid red; */
+    transform: scale(1.5);
+}
+
+.login-checkbox-i span {
+    font-size: 1.5rem;
+}
+
+.login-checkbox-b {
+    padding: 6rem;
+}
+
+.login-checkbox-b button {
+    padding: 1rem;
+    /* margin: 1rem; */
+    color: #333;
+    font-family: "Pretendard-Regular";
+    font-weight: 500;
+    font-size: 1.5rem;
+    background-color: #06396d00;
+}
+
+.login-checkbox-b button:nth-child(1) {
+    position: relative;
+}
+
+.login-checkbox-b button:nth-child(1)::after,
+.login-checkbox-b button:nth-child(2)::after {
+    content: 'ㅣ';
+    float: right;
+    display: block;
+    margin-left: 20px;
+}
+
+.login-button {
+    width: 100%;
+    padding: 0rem 0rem 10rem 0rem;
+}
+
+.login-button button {
+    width: 40rem;
+    padding: 2rem;
+    background-color: #3f87f7;
+    color: white;
+    font-size: 1.7rem;
+    border-radius: 1.2rem;
+    cursor: pointer;
+}
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/main/Main.vue (added)
+++ client/views/pages/main/Main.vue
@@ -0,0 +1,426 @@
+<template>
+    <div class="main-page">
+        <section class="main-sec sec1">
+            <!-- <div class="main-content"> -->
+            <div class="flex">
+                <!-- 메인비주얼 -->
+                <div class="m-b">
+                    <div class="w1400">
+                        <div class="m-b-b">
+                            <!-- 메인 텍스트 -->
+                            <div class="m-text">
+                                <p>신나고 재미있는 수업의 시작<br><span>디지털 교과서와 함께합니다.</span></p>
+                            </div>
+                            <!-- 메인 배너 -->
+                            <div class="m-benner">
+
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+
+                <!-- </div> -->
+            </div>
+        </section>
+        <section class="main-sec sec1">
+            <div class="main-content">
+                <div class="flex">
+                    <!-- 메인 퍼즐 -->
+                    <div class="m-p">
+                        <div class="w1400">
+                            <div class="m-p-container">
+                                <div class="m-p-c-1">
+                                    <div class="m-p-name">
+                                        <h3>공지사항</h3>
+                                        <input type="button" value="+ 더보기">
+                                    </div>
+                                    <div class="m-p-table">
+                                        <table>
+                                            <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr>
+                                            <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr>
+                                            <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr>
+                                            <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr>
+                                            <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr>
+                                            <!-- <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr>
+                                            <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr>
+                                            <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr> -->
+
+
+                                        </table>
+                                    </div>
+                                </div>
+
+                                <div class="m-p-c-2">
+                                    <div>
+                                        <img src="../../../resources/jpg/fille.png" alt="">
+                                        <input type="button" value="매칭서비스" class="m-p-ai">
+
+                                    </div>
+                                </div>
+                                <div class="m-p-c-3">
+                                    <div>
+                                        <img src="../../../resources/jpg/m-p-ai2.png" alt="">
+                                        <input type="button" value="자료집" class="m-p-ai">
+
+                                    </div>
+                                </div>
+                                <div class="m-p-c-4">
+                                    <div>
+                                        <img src="../../../resources/jpg/m-p-ai.png" alt="">
+                                        <input type="button" value="AI 디지털교과서 정책소개 다운" class="m-p-ai">
+
+                                    </div>
+                                </div>
+                                <div class="m-p-c-5">
+                                    <div>
+                                        <img src="../../../resources/jpg/ki-i.png" alt="">
+                                        <input type="button" value="기술문서" class="m-p-ai">
+
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+        </section>
+        <section class="main-sec sec1">
+
+            <div class=" flex">
+                <!-- 메인 홍보/뉴스 -->
+
+                <div class="m-n">
+                    <div class="w1400">
+                        <div class="m-n-n">
+
+                            <h3>홍보/뉴스</h3>
+                            <div class="m-n-hidden">
+                                <!-- 
+                                <swiper ref="{swiperRef}" :slidesPerView="3" :initialSlide="2" :centeredSlides="true"
+                                    :spaceBetween="30" :loop="true" :breakpoints="{
+                                        300: { slidesPerView: 1 },
+                                        479: { slidesPerView: 1 },
+                                        768: { slidesPerView: 2 },
+                                        1023: { slidesPerView: 3 }
+                                    }" :autoplay="{
+    delay: 4500,
+    disableOnInteraction: false,
+}" :pagination="{
+    type: 'fraction',
+}" :navigation="true" :modules="modules" class="mySwiper">
+                                    <swiper-slide>
+                                        <div class="vedio">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" width="100%"
+                                                height="100px" type="">
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide><embed src="https://webst.edunet.net/AIDT/playertest.mp4" width="100%"
+                                            height="100px" type=""></swiper-slide>
+                                    <swiper-slide><embed src="https://webst.edunet.net/AIDT/playertest.mp4" width="100%"
+                                            height="100px" type=""></swiper-slide>
+                                    <swiper-slide><embed src="https://webst.edunet.net/AIDT/playertest.mp4" width="100%"
+                                            height="100px" type=""></swiper-slide>
+                                    <swiper-slide><embed src="https://webst.edunet.net/AIDT/playertest.mp4" width="100%"
+                                            height="100px" type=""></swiper-slide>
+                                    <swiper-slide><embed src="https://webst.edunet.net/AIDT/playertest.mp4" width="100%"
+                                            height="100px" type=""></swiper-slide>
+
+                                </swiper> -->
+                                <swiper :navigation="true" :pagination="false" :slidesPerView="3" :mousewheel="true"
+                                    :initialSlide="2" :centeredSlides="false" :spaceBetween="55" :loop="true" :breakpoints="{
+                                        300: { slidesPerView: 1 },
+                                        479: { slidesPerView: 1 },
+                                        768: { slidesPerView: 2 },
+                                        1023: { slidesPerView: 3 }
+                                    }" :modules="modules" class="mySwiper">
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+
+                                </swiper>
+
+
+                            </div>
+                        </div>
+
+
+                    </div>
+                </div>
+
+            </div>
+
+        </section>
+        <section class="main-sec sec1">
+
+            <div class=" flex">
+                <!-- 히스토리 -->
+
+                <div class="m-h">
+                    <div class="w1400">
+                        <div class="m-h-h">
+                            <h1>History</h1>
+                            <div class="m-h-g">
+                                <div class="m-h-g-1">
+                                    <div>
+                                        <h3>방문자수</h3>
+                                        <p></p>
+                                        <p>367,700 </p>
+                                        <span>명</span>
+
+                                    </div>
+                                </div>
+                                <div class="m-h-g-2">
+                                    <div>
+                                        <h3>참가업체</h3>
+                                        <p></p>
+                                        <p>52,500 </p>
+                                        <span>업체</span>
+
+                                    </div>
+                                </div>
+                                <div class="m-h-g-3">
+                                    <div>
+                                        <h3>참가인원</h3>
+                                        <p></p>
+                                        <p>360,000</p>
+                                        <span>명</span>
+
+                                    </div>
+                                </div>
+                            </div>
+
+
+                        </div>
+
+                    </div>
+                </div>
+
+            </div>
+
+        </section>
+        <section class="main-sec sec1">
+            <div class=" flex">
+                <!-- 파트너사 -->
+
+                <div class="m-partner">
+                    <div class="w1400">
+                        <div class="m-pa">
+                            <h1>파트너사</h1>
+                            <div class="m-pa-pa">
+                                <div class="m-pa-logo lo1"></div>
+                                <div class="m-pa-logo lo2"></div>
+                                <div class="m-pa-logo lo3"></div>
+                                <div class="m-pa-logo lo4"></div>
+                                <div class="m-pa-logo lo5"></div>
+                            </div>
+
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+
+            <div class="m-p-sw">
+                <div class="w1400">
+                    <div class="m-p-sw-1">
+
+                        <swiper :slides-per-view="7" :space-between="30" :loop="true" :speed="1000" :centered-slides="true"
+                            :autoplay="{ delay: 0, disableOnInteraction: false }" :breakpoints="{
+                                300: { slidesPerView: 1 },
+                                479: { slidesPerView: 2 },
+                                768: { slidesPerView: 3 },
+                                1023: { slidesPerView: 5 }
+                            }" :navigation="false" :modules="modules" class="mySwiper swiper-2">
+
+                            <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/kefa.png" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/keris.gif" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/ko.png" alt=""></swiper-slide>
+
+                        </swiper>
+                    </div>
+                </div>
+            </div>
+
+        </section>
+
+
+
+
+
+    </div>
+</template>
+
+<script>
+import { Swiper, SwiperSlide } from 'swiper/vue';
+import { Navigation } from 'swiper/modules';
+import 'swiper/css';
+import 'swiper/css/navigation';
+import 'swiper/css/pagination';
+
+import { Autoplay, Pagination } from 'swiper/modules';
+
+export default {
+    data() {
+        return {
+            module: [Pagination],
+        }
+    },
+    methods: {
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+        Swiper,
+        SwiperSlide,
+
+
+    },
+    setup() {
+        return {
+            modules: [Autoplay, Pagination, Navigation],
+        };
+    },
+    mounted() {
+        console.log('Main mounted');
+    }
+}
+</script>
+
+<style scoped>
+.swiper-button-prev:after,
+.swiper-button-next:after {
+    color: aliceblue;
+}
+
+.swiper-button-next,
+.swiper-button-prev {
+    margin-top: -50px !important;
+    color: aliceblue;
+}
+
+.swiper {
+    height: 260px;
+    padding: 0px 50px 50px 50px;
+}
+
+
+.swiper-div {
+    display: flex;
+    align-items: center;
+    flex-direction: column;
+}
+
+.swiper-div embed {
+    height: 230px;
+    width: 350px;
+}
+
+.swiper-div p {
+    padding: 1rem;
+    font-size: 1.7rem;
+    color: white;
+}
+
+.swiper-slide {
+    height: 200px;
+    padding-bottom: 40px;
+}
+
+.swiper-slide img {
+    width: 40%;
+}
+
+.swiper-2 {
+    height: 100px;
+    transition-timing-function: linear;
+}
+</style>
 
client/views/pages/matching/Matching.vue (added)
+++ client/views/pages/matching/Matching.vue
@@ -0,0 +1,383 @@
+<template>
+    <div class="mat-main">
+        <section class="main-sec sec1">
+            <!-- <div class="main-content"> -->
+            <div class="flex">
+                <!-- 매칭비주얼 -->
+                <div class="mat-b">
+                    <div class="w1400">
+                        <div class="mat-b-b">
+                            <div class="mat-img">
+                                <img src="../../../resources/jpg/mat-img.png" alt="">
+                            </div>
+                            <!-- 매칭 텍스트 -->
+                            <div class="mat-text">
+                                <i class="fa-regular fa-handshake fa-lg" style="color: #ffffff;"></i>
+                                <p>추천 매칭서비스</p>
+                            </div>
+                            <div class="mat-img">
+                                <img src="../../../resources/jpg/mat-img1.png" alt="">
+                            </div>
+
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+        </section>
+
+        <!-- best기업 -->
+        <section class="match-b-main">
+            <div class="mat-b-1">
+                <div class="w1400">
+                    <div class="mat-b-grid">
+                        <!-- best 기업 -->
+                        <h3>BEST 기업</h3>
+                        <div class="mat-b-g-g">
+
+
+                            <div class="mat-b-g-1  g1">
+                                <div>
+
+                                    <h3>(주)지학사</h3>
+                                    <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt="">
+                                    <p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p>
+                                    <div class="g1-1">
+                                        <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                        <p class="g-2">조회수 <span>120</span></p>
+
+                                    </div>
+
+                                    <div class="mat-span">
+
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="mat-b-g-2  g1">
+                                <div>
+                                    <h3>(주)지학사</h3>
+                                    <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt="">
+                                    <p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p>
+                                    <div class="g1-1">
+                                        <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                        <p class="g-2">조회수 <span>120</span></p>
+
+                                    </div>
+                                    <div class="mat-span">
+
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="mat-b-g-3  g1">
+                                <div>
+                                    <h3>(주)지학사</h3>
+                                    <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt="">
+                                    <p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p>
+                                    <div class="g1-1">
+                                        <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                        <p class="g-2">조회수 <span>120</span></p>
+
+                                    </div>
+                                    <div class="mat-span">
+
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="mat-b-g-3  g1">
+                                <div>
+                                    <h3>(주)지학사</h3>
+                                    <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt="">
+                                    <p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p>
+                                    <div class="g1-1">
+                                        <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                        <p class="g-2">조회수 <span>120</span></p>
+
+                                    </div>
+                                    <div class="mat-span">
+
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="mat-b-g-3  g1">
+                                <div>
+                                    <h3>(주)지학사</h3>
+                                    <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt="">
+                                    <p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p>
+                                    <div class="g1-1">
+                                        <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                        <p class="g-2">조회수 <span>120</span></p>
+
+                                    </div>
+                                    <div class="mat-span">
+
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="mat-b-g-3 g1">
+                                <div>
+                                    <h3>(주)지학사</h3>
+                                    <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt="">
+                                    <p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p>
+                                    <div class="g1-1">
+                                        <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                        <p class="g-2">조회수 <span>120</span></p>
+
+                                    </div>
+                                    <div class="mat-span">
+
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+        </section>
+        <!-- 일반기업 -->
+        <section class="mat-sec">
+            <div class="mat-sec-a">
+                <div class="w1400">
+                    <div class="mat-sec-a-1">
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+        </section>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Matching mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
 
package-lock.json (added)
+++ package-lock.json
@@ -0,0 +1,3958 @@
+{
+  "name": "keris-web",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "dependencies": {
+        "@babel/cli": "7.19.3",
+        "@babel/core": "7.19.3",
+        "@fortawesome/fontawesome-svg-core": "^6.4.2",
+        "@fortawesome/free-brands-svg-icons": "^6.4.2",
+        "@fortawesome/free-regular-svg-icons": "^6.4.2",
+        "@fortawesome/free-solid-svg-icons": "^6.4.2",
+        "@fortawesome/vue-fontawesome": "^3.0.3",
+        "axios": "^1.5.1",
+        "babel-loader": "8.2.5",
+        "css-loader": "6.7.1",
+        "express": "4.18.1",
+        "express-http-proxy": "^2.0.0",
+        "file-loader": "6.2.0",
+        "fs": "0.0.1-security",
+        "git": "^0.1.5",
+        "new-line": "^1.1.1",
+        "pg": "8.8.0",
+        "swiper": "^10.3.1",
+        "url-loader": "4.1.1",
+        "vue": "3.2.40",
+        "vue-carousel": "^0.18.0",
+        "vue-loader": "^17.0.0",
+        "vue-router": "4.1.5",
+        "vue-slick": "^1.2.0",
+        "vue-style-loader": "4.1.3",
+        "vue3-sfc-loader": "^0.8.4",
+        "vueperslides": "^3.5.1",
+        "vuex": "^4.1.0",
+        "webpack": "5.74.0",
+        "webpack-cli": "4.10.0"
+      },
+      "devDependencies": {
+        "less": "^4.2.0",
+        "less-loader": "^11.1.3"
+      }
+    },
+    "node_modules/@ampproject/remapping": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+      "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/cli": {
+      "version": "7.19.3",
+      "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.19.3.tgz",
+      "integrity": "sha512-643/TybmaCAe101m2tSVHi9UKpETXP9c/Ff4mD2tAwkdP6esKIfaauZFc67vGEM6r9fekbEGid+sZhbEnSe3dg==",
+      "dependencies": {
+        "@jridgewell/trace-mapping": "^0.3.8",
+        "commander": "^4.0.1",
+        "convert-source-map": "^1.1.0",
+        "fs-readdir-recursive": "^1.1.0",
+        "glob": "^7.2.0",
+        "make-dir": "^2.1.0",
+        "slash": "^2.0.0"
+      },
+      "bin": {
+        "babel": "bin/babel.js",
+        "babel-external-helpers": "bin/babel-external-helpers.js"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "optionalDependencies": {
+        "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3",
+        "chokidar": "^3.4.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/code-frame": {
+      "version": "7.22.13",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
+      "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
+      "dependencies": {
+        "@babel/highlight": "^7.22.13",
+        "chalk": "^2.4.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/compat-data": {
+      "version": "7.23.2",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz",
+      "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/core": {
+      "version": "7.19.3",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz",
+      "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==",
+      "dependencies": {
+        "@ampproject/remapping": "^2.1.0",
+        "@babel/code-frame": "^7.18.6",
+        "@babel/generator": "^7.19.3",
+        "@babel/helper-compilation-targets": "^7.19.3",
+        "@babel/helper-module-transforms": "^7.19.0",
+        "@babel/helpers": "^7.19.0",
+        "@babel/parser": "^7.19.3",
+        "@babel/template": "^7.18.10",
+        "@babel/traverse": "^7.19.3",
+        "@babel/types": "^7.19.3",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.2.1",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
+      }
+    },
+    "node_modules/@babel/generator": {
+      "version": "7.23.0",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz",
+      "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==",
+      "dependencies": {
+        "@babel/types": "^7.23.0",
+        "@jridgewell/gen-mapping": "^0.3.2",
+        "@jridgewell/trace-mapping": "^0.3.17",
+        "jsesc": "^2.5.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz",
+      "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==",
+      "dependencies": {
+        "@babel/compat-data": "^7.22.9",
+        "@babel/helper-validator-option": "^7.22.15",
+        "browserslist": "^4.21.9",
+        "lru-cache": "^5.1.1",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-environment-visitor": {
+      "version": "7.22.20",
+      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+      "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-function-name": {
+      "version": "7.23.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+      "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+      "dependencies": {
+        "@babel/template": "^7.22.15",
+        "@babel/types": "^7.23.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-hoist-variables": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+      "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+      "dependencies": {
+        "@babel/types": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-imports": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+      "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
+      "dependencies": {
+        "@babel/types": "^7.22.15"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-transforms": {
+      "version": "7.23.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz",
+      "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==",
+      "dependencies": {
+        "@babel/helper-environment-visitor": "^7.22.20",
+        "@babel/helper-module-imports": "^7.22.15",
+        "@babel/helper-simple-access": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.6",
+        "@babel/helper-validator-identifier": "^7.22.20"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-simple-access": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+      "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+      "dependencies": {
+        "@babel/types": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-split-export-declaration": {
+      "version": "7.22.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+      "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+      "dependencies": {
+        "@babel/types": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+      "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.22.20",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+      "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-option": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz",
+      "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers": {
+      "version": "7.23.2",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz",
+      "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==",
+      "dependencies": {
+        "@babel/template": "^7.22.15",
+        "@babel/traverse": "^7.23.2",
+        "@babel/types": "^7.23.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/highlight": {
+      "version": "7.22.20",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz",
+      "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==",
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.22.20",
+        "chalk": "^2.4.2",
+        "js-tokens": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.23.0",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz",
+      "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==",
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/template": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+      "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
+      "dependencies": {
+        "@babel/code-frame": "^7.22.13",
+        "@babel/parser": "^7.22.15",
+        "@babel/types": "^7.22.15"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse": {
+      "version": "7.23.2",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
+      "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
+      "dependencies": {
+        "@babel/code-frame": "^7.22.13",
+        "@babel/generator": "^7.23.0",
+        "@babel/helper-environment-visitor": "^7.22.20",
+        "@babel/helper-function-name": "^7.23.0",
+        "@babel/helper-hoist-variables": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.6",
+        "@babel/parser": "^7.23.0",
+        "@babel/types": "^7.23.0",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.23.0",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz",
+      "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.22.5",
+        "@babel/helper-validator-identifier": "^7.22.20",
+        "to-fast-properties": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@discoveryjs/json-ext": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+      "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/@fortawesome/fontawesome-common-types": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz",
+      "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==",
+      "hasInstallScript": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@fortawesome/fontawesome-svg-core": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz",
+      "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "@fortawesome/fontawesome-common-types": "6.4.2"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@fortawesome/free-brands-svg-icons": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.4.2.tgz",
+      "integrity": "sha512-LKOwJX0I7+mR/cvvf6qIiqcERbdnY+24zgpUSouySml+5w8B4BJOx8EhDR/FTKAu06W12fmUIcv6lzPSwYKGGg==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "@fortawesome/fontawesome-common-types": "6.4.2"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@fortawesome/free-regular-svg-icons": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.2.tgz",
+      "integrity": "sha512-0+sIUWnkgTVVXVAPQmW4vxb9ZTHv0WstOa3rBx9iPxrrrDH6bNLsDYuwXF9b6fGm+iR7DKQvQshUH/FJm3ed9Q==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "@fortawesome/fontawesome-common-types": "6.4.2"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@fortawesome/free-solid-svg-icons": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.2.tgz",
+      "integrity": "sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "@fortawesome/fontawesome-common-types": "6.4.2"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@fortawesome/vue-fontawesome": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.3.tgz",
+      "integrity": "sha512-KCPHi9QemVXGMrfuwf3nNnNo129resAIQWut9QTAMXmXqL2ErABC6ohd2yY5Ipq0CLWNbKHk8TMdTXL/Zf3ZhA==",
+      "peerDependencies": {
+        "@fortawesome/fontawesome-svg-core": "~1 || ~6",
+        "vue": ">= 3.0.0 < 4"
+      }
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+      "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+      "dependencies": {
+        "@jridgewell/set-array": "^1.0.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+      "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/source-map": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
+      "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.4.15",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
+      "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "node_modules/@nicolo-ribaudo/chokidar-2": {
+      "version": "2.1.8-no-fsevents.3",
+      "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz",
+      "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==",
+      "optional": true
+    },
+    "node_modules/@types/eslint": {
+      "version": "8.44.4",
+      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.4.tgz",
+      "integrity": "sha512-lOzjyfY/D9QR4hY9oblZ76B90MYTB3RrQ4z2vBIJKj9ROCRqdkYl2gSUx1x1a4IWPjKJZLL4Aw1Zfay7eMnmnA==",
+      "dependencies": {
+        "@types/estree": "*",
+        "@types/json-schema": "*"
+      }
+    },
+    "node_modules/@types/eslint-scope": {
+      "version": "3.7.5",
+      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.5.tgz",
+      "integrity": "sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==",
+      "dependencies": {
+        "@types/eslint": "*",
+        "@types/estree": "*"
+      }
+    },
+    "node_modules/@types/estree": {
+      "version": "0.0.51",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
+      "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ=="
+    },
+    "node_modules/@types/json-schema": {
+      "version": "7.0.13",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz",
+      "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ=="
+    },
+    "node_modules/@types/node": {
+      "version": "20.8.6",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz",
+      "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==",
+      "dependencies": {
+        "undici-types": "~5.25.1"
+      }
+    },
+    "node_modules/@vue/compiler-core": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.40.tgz",
+      "integrity": "sha512-2Dc3Stk0J/VyQ4OUr2yEC53kU28614lZS+bnrCbFSAIftBJ40g/2yQzf4mPBiFuqguMB7hyHaujdgZAQ67kZYA==",
+      "dependencies": {
+        "@babel/parser": "^7.16.4",
+        "@vue/shared": "3.2.40",
+        "estree-walker": "^2.0.2",
+        "source-map": "^0.6.1"
+      }
+    },
+    "node_modules/@vue/compiler-dom": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.40.tgz",
+      "integrity": "sha512-OZCNyYVC2LQJy4H7h0o28rtk+4v+HMQygRTpmibGoG9wZyomQiS5otU7qo3Wlq5UfHDw2RFwxb9BJgKjVpjrQw==",
+      "dependencies": {
+        "@vue/compiler-core": "3.2.40",
+        "@vue/shared": "3.2.40"
+      }
+    },
+    "node_modules/@vue/compiler-sfc": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.40.tgz",
+      "integrity": "sha512-tzqwniIN1fu1PDHC3CpqY/dPCfN/RN1thpBC+g69kJcrl7mbGiHKNwbA6kJ3XKKy8R6JLKqcpVugqN4HkeBFFg==",
+      "dependencies": {
+        "@babel/parser": "^7.16.4",
+        "@vue/compiler-core": "3.2.40",
+        "@vue/compiler-dom": "3.2.40",
+        "@vue/compiler-ssr": "3.2.40",
+        "@vue/reactivity-transform": "3.2.40",
+        "@vue/shared": "3.2.40",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.25.7",
+        "postcss": "^8.1.10",
+        "source-map": "^0.6.1"
+      }
+    },
+    "node_modules/@vue/compiler-ssr": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.40.tgz",
+      "integrity": "sha512-80cQcgasKjrPPuKcxwuCx7feq+wC6oFl5YaKSee9pV3DNq+6fmCVwEEC3vvkf/E2aI76rIJSOYHsWSEIxK74oQ==",
+      "dependencies": {
+        "@vue/compiler-dom": "3.2.40",
+        "@vue/shared": "3.2.40"
+      }
+    },
+    "node_modules/@vue/devtools-api": {
+      "version": "6.5.1",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz",
+      "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA=="
+    },
+    "node_modules/@vue/reactivity": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.40.tgz",
+      "integrity": "sha512-N9qgGLlZmtUBMHF9xDT4EkD9RdXde1Xbveb+niWMXuHVWQP5BzgRmE3SFyUBBcyayG4y1lhoz+lphGRRxxK4RA==",
+      "dependencies": {
+        "@vue/shared": "3.2.40"
+      }
+    },
+    "node_modules/@vue/reactivity-transform": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.40.tgz",
+      "integrity": "sha512-HQUCVwEaacq6fGEsg2NUuGKIhUveMCjOk8jGHqLXPI2w6zFoPrlQhwWEaINTv5kkZDXKEnCijAp+4gNEHG03yw==",
+      "dependencies": {
+        "@babel/parser": "^7.16.4",
+        "@vue/compiler-core": "3.2.40",
+        "@vue/shared": "3.2.40",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.25.7"
+      }
+    },
+    "node_modules/@vue/runtime-core": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.40.tgz",
+      "integrity": "sha512-U1+rWf0H8xK8aBUZhnrN97yoZfHbjgw/bGUzfgKPJl69/mXDuSg8CbdBYBn6VVQdR947vWneQBFzdhasyzMUKg==",
+      "dependencies": {
+        "@vue/reactivity": "3.2.40",
+        "@vue/shared": "3.2.40"
+      }
+    },
+    "node_modules/@vue/runtime-dom": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.40.tgz",
+      "integrity": "sha512-AO2HMQ+0s2+MCec8hXAhxMgWhFhOPJ/CyRXnmTJ6XIOnJFLrH5Iq3TNwvVcODGR295jy77I6dWPj+wvFoSYaww==",
+      "dependencies": {
+        "@vue/runtime-core": "3.2.40",
+        "@vue/shared": "3.2.40",
+        "csstype": "^2.6.8"
+      }
+    },
+    "node_modules/@vue/server-renderer": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.40.tgz",
+      "integrity": "sha512-gtUcpRwrXOJPJ4qyBpU3EyxQa4EkV8I4f8VrDePcGCPe4O/hd0BPS7v9OgjIQob6Ap8VDz9G+mGTKazE45/95w==",
+      "dependencies": {
+        "@vue/compiler-ssr": "3.2.40",
+        "@vue/shared": "3.2.40"
+      },
+      "peerDependencies": {
+        "vue": "3.2.40"
+      }
+    },
+    "node_modules/@vue/shared": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.40.tgz",
+      "integrity": "sha512-0PLQ6RUtZM0vO3teRfzGi4ltLUO5aO+kLgwh4Um3THSR03rpQWLTuRCkuO5A41ITzwdWeKdPHtSARuPkoo5pCQ=="
+    },
+    "node_modules/@webassemblyjs/ast": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
+      "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
+      "dependencies": {
+        "@webassemblyjs/helper-numbers": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
+      "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
+    },
+    "node_modules/@webassemblyjs/helper-api-error": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
+      "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
+    },
+    "node_modules/@webassemblyjs/helper-buffer": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
+      "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
+    },
+    "node_modules/@webassemblyjs/helper-numbers": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
+      "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
+      "dependencies": {
+        "@webassemblyjs/floating-point-hex-parser": "1.11.1",
+        "@webassemblyjs/helper-api-error": "1.11.1",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
+      "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
+    },
+    "node_modules/@webassemblyjs/helper-wasm-section": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
+      "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/ieee754": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
+      "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
+      "dependencies": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "node_modules/@webassemblyjs/leb128": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
+      "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
+      "dependencies": {
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webassemblyjs/utf8": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
+      "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
+    },
+    "node_modules/@webassemblyjs/wasm-edit": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
+      "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/helper-wasm-section": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1",
+        "@webassemblyjs/wasm-opt": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1",
+        "@webassemblyjs/wast-printer": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-gen": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
+      "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/ieee754": "1.11.1",
+        "@webassemblyjs/leb128": "1.11.1",
+        "@webassemblyjs/utf8": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-opt": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
+      "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-parser": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
+      "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-api-error": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/ieee754": "1.11.1",
+        "@webassemblyjs/leb128": "1.11.1",
+        "@webassemblyjs/utf8": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/wast-printer": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
+      "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webpack-cli/configtest": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
+      "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
+      "peerDependencies": {
+        "webpack": "4.x.x || 5.x.x",
+        "webpack-cli": "4.x.x"
+      }
+    },
+    "node_modules/@webpack-cli/info": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz",
+      "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==",
+      "dependencies": {
+        "envinfo": "^7.7.3"
+      },
+      "peerDependencies": {
+        "webpack-cli": "4.x.x"
+      }
+    },
+    "node_modules/@webpack-cli/serve": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
+      "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
+      "peerDependencies": {
+        "webpack-cli": "4.x.x"
+      },
+      "peerDependenciesMeta": {
+        "webpack-dev-server": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+    },
+    "node_modules/@xtuc/long": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+    },
+    "node_modules/accepts": {
+      "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==",
+      "dependencies": {
+        "mime-types": "~2.1.34",
+        "negotiator": "0.6.3"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/acorn": {
+      "version": "8.10.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+      "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-import-assertions": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+      "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+      "peerDependencies": {
+        "acorn": "^8"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/ajv-keywords": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "peerDependencies": {
+        "ajv": "^6.9.1"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "optional": true,
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+    },
+    "node_modules/axios": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz",
+      "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
+      "dependencies": {
+        "follow-redirects": "^1.15.0",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "node_modules/babel-loader": {
+      "version": "8.2.5",
+      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz",
+      "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==",
+      "dependencies": {
+        "find-cache-dir": "^3.3.1",
+        "loader-utils": "^2.0.0",
+        "make-dir": "^3.1.0",
+        "schema-utils": "^2.6.5"
+      },
+      "engines": {
+        "node": ">= 8.9"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0",
+        "webpack": ">=2"
+      }
+    },
+    "node_modules/babel-loader/node_modules/make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+      "dependencies": {
+        "semver": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+    },
+    "node_modules/big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/body-parser": {
+      "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.2",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "http-errors": "2.0.0",
+        "iconv-lite": "0.4.24",
+        "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/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/body-parser/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "optional": true,
+      "dependencies": {
+        "fill-range": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/browserslist": {
+      "version": "4.22.1",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
+      "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "caniuse-lite": "^1.0.30001541",
+        "electron-to-chromium": "^1.4.535",
+        "node-releases": "^2.0.13",
+        "update-browserslist-db": "^1.0.13"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      }
+    },
+    "node_modules/buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+    },
+    "node_modules/buffer-writer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
+      "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/bytes": {
+      "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/caniuse-lite": {
+      "version": "1.0.30001549",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001549.tgz",
+      "integrity": "sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ]
+    },
+    "node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://paulmillr.com/funding/"
+        }
+      ],
+      "optional": true,
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/chrome-trace-event": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+      "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+      "engines": {
+        "node": ">=6.0"
+      }
+    },
+    "node_modules/clone-deep": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+      "dependencies": {
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.2",
+        "shallow-clone": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+    },
+    "node_modules/colorette": {
+      "version": "2.0.20",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+      "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/commander": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+      "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+    },
+    "node_modules/content-disposition": {
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+      "dependencies": {
+        "safe-buffer": "5.2.1"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/content-type": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/convert-source-map": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
+    },
+    "node_modules/cookie": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+    },
+    "node_modules/copy-anything": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
+      "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+      "dev": true,
+      "dependencies": {
+        "is-what": "^3.14.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/css-loader": {
+      "version": "6.7.1",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz",
+      "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==",
+      "dependencies": {
+        "icss-utils": "^5.1.0",
+        "postcss": "^8.4.7",
+        "postcss-modules-extract-imports": "^3.0.0",
+        "postcss-modules-local-by-default": "^4.0.0",
+        "postcss-modules-scope": "^3.0.0",
+        "postcss-modules-values": "^4.0.0",
+        "postcss-value-parser": "^4.2.0",
+        "semver": "^7.3.5"
+      },
+      "engines": {
+        "node": ">= 12.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "^5.0.0"
+      }
+    },
+    "node_modules/css-loader/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/css-loader/node_modules/semver": {
+      "version": "7.5.4",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/css-loader/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
+    "node_modules/cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/csstype": {
+      "version": "2.6.21",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz",
+      "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w=="
+    },
+    "node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "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/destroy": {
+      "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/dom-walk": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
+      "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+    },
+    "node_modules/ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+    },
+    "node_modules/electron-to-chromium": {
+      "version": "1.4.556",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.556.tgz",
+      "integrity": "sha512-6RPN0hHfzDU8D56E72YkDvnLw5Cj2NMXZGg3UkgyoHxjVhG99KZpsKgBWMmTy0Ei89xwan+rbRsVB9yzATmYzQ=="
+    },
+    "node_modules/emojis-list": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/enhanced-resolve": {
+      "version": "5.15.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
+      "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
+      "dependencies": {
+        "graceful-fs": "^4.2.4",
+        "tapable": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/envinfo": {
+      "version": "7.10.0",
+      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz",
+      "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==",
+      "bin": {
+        "envinfo": "dist/cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/errno": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "prr": "~1.0.1"
+      },
+      "bin": {
+        "errno": "cli.js"
+      }
+    },
+    "node_modules/es-module-lexer": {
+      "version": "0.9.3",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+      "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
+    },
+    "node_modules/es6-promise": {
+      "version": "4.2.8",
+      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
+      "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
+    },
+    "node_modules/escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/eslint-scope": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esrecurse/node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+    },
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "engines": {
+        "node": ">=0.8.x"
+      }
+    },
+    "node_modules/express": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
+      "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
+      "dependencies": {
+        "accepts": "~1.3.8",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.20.0",
+        "content-disposition": "0.5.4",
+        "content-type": "~1.0.4",
+        "cookie": "0.5.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "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.4.1",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.7",
+        "qs": "6.10.3",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.2.1",
+        "send": "0.18.0",
+        "serve-static": "1.15.0",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.10.0"
+      }
+    },
+    "node_modules/express-http-proxy": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/express-http-proxy/-/express-http-proxy-2.0.0.tgz",
+      "integrity": "sha512-TXxcPFTWVUMSEmyM6iX2sT/JtmqhqngTq29P+eXTVFdtxZrTmM8THUYK59rUXiln0FfPGvxEpGRnVrgvHksXDw==",
+      "dependencies": {
+        "debug": "^3.0.1",
+        "es6-promise": "^4.1.1",
+        "raw-body": "^2.3.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/express-http-proxy/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/express/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/express/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+    },
+    "node_modules/fastest-levenshtein": {
+      "version": "1.0.16",
+      "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+      "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+      "engines": {
+        "node": ">= 4.9.1"
+      }
+    },
+    "node_modules/file-loader": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
+      "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+      "dependencies": {
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "^4.0.0 || ^5.0.0"
+      }
+    },
+    "node_modules/file-loader/node_modules/schema-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "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==",
+      "optional": true,
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/finalhandler": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+      "dependencies": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "statuses": "2.0.1",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/finalhandler/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/finalhandler/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
+    "node_modules/find-cache-dir": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+      "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+      "dependencies": {
+        "commondir": "^1.0.1",
+        "make-dir": "^3.0.2",
+        "pkg-dir": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+      }
+    },
+    "node_modules/find-cache-dir/node_modules/make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+      "dependencies": {
+        "semver": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "dependencies": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/flat": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+      "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+      "bin": {
+        "flat": "cli.js"
+      }
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.3",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
+      "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/forwarded": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fs": {
+      "version": "0.0.1-security",
+      "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
+      "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w=="
+    },
+    "node_modules/fs-readdir-recursive": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
+      "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA=="
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+      "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+      "dependencies": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/git": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/git/-/git-0.1.5.tgz",
+      "integrity": "sha512-N+bfOrXyKMU/fQtCj6D/U9MQOEN0DAA8TLHSLdUQRSWBOkeRvsjJHdrdkvcq05xO7GSDKWc3nDEGoTZ4DfCCSg==",
+      "dependencies": {
+        "mime": "1.2.9"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/git/node_modules/mime": {
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.9.tgz",
+      "integrity": "sha512-WiLgbHTIq5AYUvU/Luli4mZ1bUcHpGNHyCsbl+KPMg4zt+XUDpQehWjuBjdLaEvDTinvKj/FgfQt3fPoT7j08g=="
+    },
+    "node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "optional": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/glob-to-regexp": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+    },
+    "node_modules/global": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
+      "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+      "dependencies": {
+        "min-document": "^2.19.0",
+        "process": "^0.11.10"
+      }
+    },
+    "node_modules/globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+    },
+    "node_modules/has": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
+      "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/has-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "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/hash-sum": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
+      "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg=="
+    },
+    "node_modules/http-errors": {
+      "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": "2.0.0",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "toidentifier": "1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/icss-utils": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+      "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+      "dev": true,
+      "optional": true,
+      "bin": {
+        "image-size": "bin/image-size.js"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/import-local": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+      "dependencies": {
+        "pkg-dir": "^4.2.0",
+        "resolve-cwd": "^3.0.0"
+      },
+      "bin": {
+        "import-local-fixture": "fixtures/cli.js"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "node_modules/interpret": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+      "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "optional": true,
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.13.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
+      "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
+      "dependencies": {
+        "has": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "optional": 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==",
+      "optional": 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==",
+      "optional": true,
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dependencies": {
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-what": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
+      "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+      "dev": true
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+    },
+    "node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/jest-worker": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+      "dependencies": {
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^8.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      }
+    },
+    "node_modules/jest-worker/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-worker/node_modules/supports-color": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
+      }
+    },
+    "node_modules/jquery": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
+      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
+      "peer": true
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "node_modules/jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+    },
+    "node_modules/json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/less": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz",
+      "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==",
+      "dev": true,
+      "dependencies": {
+        "copy-anything": "^2.0.1",
+        "parse-node-version": "^1.0.1",
+        "tslib": "^2.3.0"
+      },
+      "bin": {
+        "lessc": "bin/lessc"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "optionalDependencies": {
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "make-dir": "^2.1.0",
+        "mime": "^1.4.1",
+        "needle": "^3.1.0",
+        "source-map": "~0.6.0"
+      }
+    },
+    "node_modules/less-loader": {
+      "version": "11.1.3",
+      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.3.tgz",
+      "integrity": "sha512-A5b7O8dH9xpxvkosNrP0dFp2i/dISOJa9WwGF3WJflfqIERE2ybxh1BFDj5CovC2+jCE4M354mk90hN6ziXlVw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 14.15.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "less": "^3.5.0 || ^4.0.0",
+        "webpack": "^5.0.0"
+      }
+    },
+    "node_modules/loader-runner": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+      "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+      "engines": {
+        "node": ">=6.11.5"
+      }
+    },
+    "node_modules/loader-utils": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+      "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^2.1.2"
+      },
+      "engines": {
+        "node": ">=8.9.0"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "dependencies": {
+        "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dependencies": {
+        "yallist": "^3.0.2"
+      }
+    },
+    "node_modules/magic-string": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+      "dependencies": {
+        "sourcemap-codec": "^1.4.8"
+      }
+    },
+    "node_modules/make-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+      "dependencies": {
+        "pify": "^4.0.1",
+        "semver": "^5.6.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/make-dir/node_modules/semver": {
+      "version": "5.7.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+    },
+    "node_modules/merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+    },
+    "node_modules/methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/min-document": {
+      "version": "2.19.0",
+      "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
+      "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
+      "dependencies": {
+        "dom-walk": "^0.1.0"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+      "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/needle": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz",
+      "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "debug": "^3.2.6",
+        "iconv-lite": "^0.6.3",
+        "sax": "^1.2.4"
+      },
+      "bin": {
+        "needle": "bin/needle"
+      },
+      "engines": {
+        "node": ">= 4.4.x"
+      }
+    },
+    "node_modules/needle/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/needle/node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/negotiator": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+    },
+    "node_modules/new-line": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/new-line/-/new-line-1.1.1.tgz",
+      "integrity": "sha512-BHhU5J48wv56aU2DaYnR0brR7PDTaJOeZW/R1koEt03ygvmX/WDnsXsxAq4JLK15vJeP4HHQHBGCfg3npp7onQ=="
+    },
+    "node_modules/node-releases": {
+      "version": "2.0.13",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
+      "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "optional": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz",
+      "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "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/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/packet-reader": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
+      "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
+    },
+    "node_modules/parse-node-version": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+    },
+    "node_modules/path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+    },
+    "node_modules/pg": {
+      "version": "8.8.0",
+      "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz",
+      "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==",
+      "dependencies": {
+        "buffer-writer": "2.0.0",
+        "packet-reader": "1.0.0",
+        "pg-connection-string": "^2.5.0",
+        "pg-pool": "^3.5.2",
+        "pg-protocol": "^1.5.0",
+        "pg-types": "^2.1.0",
+        "pgpass": "1.x"
+      },
+      "engines": {
+        "node": ">= 8.0.0"
+      },
+      "peerDependencies": {
+        "pg-native": ">=3.0.1"
+      },
+      "peerDependenciesMeta": {
+        "pg-native": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/pg-connection-string": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz",
+      "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA=="
+    },
+    "node_modules/pg-int8": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+      "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/pg-pool": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz",
+      "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==",
+      "peerDependencies": {
+        "pg": ">=8.0"
+      }
+    },
+    "node_modules/pg-protocol": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz",
+      "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q=="
+    },
+    "node_modules/pg-types": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+      "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+      "dependencies": {
+        "pg-int8": "1.0.1",
+        "postgres-array": "~2.0.0",
+        "postgres-bytea": "~1.0.0",
+        "postgres-date": "~1.0.4",
+        "postgres-interval": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/pgpass": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+      "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+      "dependencies": {
+        "split2": "^4.1.0"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "optional": true,
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/pkg-dir": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+      "dependencies": {
+        "find-up": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.4.31",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+      "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "nanoid": "^3.3.6",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/postcss-modules-extract-imports": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+      "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-modules-local-by-default": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz",
+      "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==",
+      "dependencies": {
+        "icss-utils": "^5.0.0",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.1.0"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-modules-scope": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+      "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+      "dependencies": {
+        "postcss-selector-parser": "^6.0.4"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-modules-values": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+      "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+      "dependencies": {
+        "icss-utils": "^5.0.0"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-selector-parser": {
+      "version": "6.0.13",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+      "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-value-parser": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+    },
+    "node_modules/postgres-array": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+      "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postgres-bytea": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+      "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/postgres-date": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+      "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/postgres-interval": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+      "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+      "dependencies": {
+        "xtend": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+      "engines": {
+        "node": ">= 0.6.0"
+      }
+    },
+    "node_modules/proxy-addr": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+      "dependencies": {
+        "forwarded": "0.2.0",
+        "ipaddr.js": "1.9.1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+    },
+    "node_modules/prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+      "dev": true,
+      "optional": true
+    },
+    "node_modules/punycode": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+      "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/qs": {
+      "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/randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dependencies": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/raw-body": {
+      "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.2",
+        "http-errors": "2.0.0",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "optional": true,
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/rechoir": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
+      "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
+      "dependencies": {
+        "resolve": "^1.9.0"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/regenerator-runtime": {
+      "version": "0.12.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz",
+      "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg=="
+    },
+    "node_modules/resolve": {
+      "version": "1.22.8",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+      "dependencies": {
+        "is-core-module": "^2.13.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/resolve-cwd": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+      "dependencies": {
+        "resolve-from": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
+    "node_modules/sax": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz",
+      "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==",
+      "dev": true,
+      "optional": true
+    },
+    "node_modules/schema-utils": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.5",
+        "ajv": "^6.12.4",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 8.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/send": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+      "dependencies": {
+        "debug": "2.6.9",
+        "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": "2.0.0",
+        "mime": "1.6.0",
+        "ms": "2.1.3",
+        "on-finished": "2.4.1",
+        "range-parser": "~1.2.1",
+        "statuses": "2.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/send/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/send/node_modules/debug/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
+    "node_modules/send/node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+    },
+    "node_modules/serialize-javascript": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+      "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+      "dependencies": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "node_modules/serve-static": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+      "dependencies": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.18.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+    },
+    "node_modules/shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+      "dependencies": {
+        "kind-of": "^6.0.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "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/slash": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+      "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/slick-carousel": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz",
+      "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==",
+      "peerDependencies": {
+        "jquery": ">=1.8.0"
+      }
+    },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+      "dependencies": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "node_modules/sourcemap-codec": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+      "deprecated": "Please use @jridgewell/sourcemap-codec instead"
+    },
+    "node_modules/split2": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+      "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+      "engines": {
+        "node": ">= 10.x"
+      }
+    },
+    "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/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/swiper": {
+      "version": "10.3.1",
+      "resolved": "https://registry.npmjs.org/swiper/-/swiper-10.3.1.tgz",
+      "integrity": "sha512-24Wk3YUdZHxjc9faID97GTu6xnLNia+adMt6qMTZG/HgdSUt4fS0REsGUXJOgpTED0Amh/j+gRGQxsLayJUlBQ==",
+      "funding": [
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/swiperjs"
+        },
+        {
+          "type": "open_collective",
+          "url": "http://opencollective.com/swiper"
+        }
+      ],
+      "engines": {
+        "node": ">= 4.7.0"
+      }
+    },
+    "node_modules/tapable": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/terser": {
+      "version": "5.22.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz",
+      "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==",
+      "dependencies": {
+        "@jridgewell/source-map": "^0.3.3",
+        "acorn": "^8.8.2",
+        "commander": "^2.20.0",
+        "source-map-support": "~0.5.20"
+      },
+      "bin": {
+        "terser": "bin/terser"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/terser-webpack-plugin": {
+      "version": "5.3.9",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
+      "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
+      "dependencies": {
+        "@jridgewell/trace-mapping": "^0.3.17",
+        "jest-worker": "^27.4.5",
+        "schema-utils": "^3.1.1",
+        "serialize-javascript": "^6.0.1",
+        "terser": "^5.16.8"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "^5.1.0"
+      },
+      "peerDependenciesMeta": {
+        "@swc/core": {
+          "optional": true
+        },
+        "esbuild": {
+          "optional": true
+        },
+        "uglify-js": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/terser/node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+    },
+    "node_modules/to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "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==",
+      "optional": true,
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/toidentifier": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+      "dev": true
+    },
+    "node_modules/type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "dependencies": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/undici-types": {
+      "version": "5.25.3",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz",
+      "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA=="
+    },
+    "node_modules/unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/update-browserslist-db": {
+      "version": "1.0.13",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+      "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "escalade": "^3.1.1",
+        "picocolors": "^1.0.0"
+      },
+      "bin": {
+        "update-browserslist-db": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/url-loader": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
+      "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
+      "dependencies": {
+        "loader-utils": "^2.0.0",
+        "mime-types": "^2.1.27",
+        "schema-utils": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "file-loader": "*",
+        "webpack": "^4.0.0 || ^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "file-loader": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/url-loader/node_modules/schema-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+    },
+    "node_modules/utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/vue": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.40.tgz",
+      "integrity": "sha512-1mGHulzUbl2Nk3pfvI5aXYYyJUs1nm4kyvuz38u4xlQkLUn1i2R7nDbI4TufECmY8v1qNBHYy62bCaM+3cHP2A==",
+      "dependencies": {
+        "@vue/compiler-dom": "3.2.40",
+        "@vue/compiler-sfc": "3.2.40",
+        "@vue/runtime-dom": "3.2.40",
+        "@vue/server-renderer": "3.2.40",
+        "@vue/shared": "3.2.40"
+      }
+    },
+    "node_modules/vue-carousel": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/vue-carousel/-/vue-carousel-0.18.0.tgz",
+      "integrity": "sha512-a2zxh7QJioDxNMguqcuJ7TPbfgK5bGDaAXIia7NWxPAWsEvNE4ZtHgsGu40L5Aha4uyjmNKXvleB14QAXFoKig==",
+      "dependencies": {
+        "global": "^4.3.2",
+        "regenerator-runtime": "^0.12.1",
+        "vue": "^2.5.17"
+      }
+    },
+    "node_modules/vue-carousel/node_modules/@vue/compiler-sfc": {
+      "version": "2.7.14",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz",
+      "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==",
+      "dependencies": {
+        "@babel/parser": "^7.18.4",
+        "postcss": "^8.4.14",
+        "source-map": "^0.6.1"
+      }
+    },
+    "node_modules/vue-carousel/node_modules/csstype": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
+      "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
+    },
+    "node_modules/vue-carousel/node_modules/vue": {
+      "version": "2.7.14",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz",
+      "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==",
+      "dependencies": {
+        "@vue/compiler-sfc": "2.7.14",
+        "csstype": "^3.1.0"
+      }
+    },
+    "node_modules/vue-loader": {
+      "version": "17.3.0",
+      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.3.0.tgz",
+      "integrity": "sha512-VUURABiN0TIUz0yvJJ/V/rZjGUh10JZtD+IDI5bXFslzFi9mV6ebKkPzoqiSi8e0vh8Ip7JHJx+I0AzAG0KsCA==",
+      "dependencies": {
+        "chalk": "^4.1.0",
+        "hash-sum": "^2.0.0",
+        "watchpack": "^2.4.0"
+      },
+      "peerDependencies": {
+        "webpack": "^4.1.0 || ^5.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/compiler-sfc": {
+          "optional": true
+        },
+        "vue": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue-loader/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/vue-loader/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/vue-loader/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/vue-loader/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "node_modules/vue-loader/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/vue-loader/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/vue-router": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.5.tgz",
+      "integrity": "sha512-IsvoF5D2GQ/EGTs/Th4NQms9gd2NSqV+yylxIyp/OYp8xOwxmU8Kj/74E9DTSYAyH5LX7idVUngN3JSj1X4xcQ==",
+      "dependencies": {
+        "@vue/devtools-api": "^6.1.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/vue-slick": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/vue-slick/-/vue-slick-1.2.0.tgz",
+      "integrity": "sha512-1hjZsKyBbnOQPwyoJqAmnEs7d24CHACC+R0fKOaOsycB2g7K1JIYqsLpK0N2SRLcJBhfno9YrOYfEPiPZVCjCA==",
+      "dependencies": {
+        "slick-carousel": "^1.8.1"
+      },
+      "peerDependencies": {
+        "jquery": "*"
+      }
+    },
+    "node_modules/vue-style-loader": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
+      "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==",
+      "dependencies": {
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.0.2"
+      }
+    },
+    "node_modules/vue-style-loader/node_modules/hash-sum": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+      "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA=="
+    },
+    "node_modules/vue-style-loader/node_modules/json5": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+      "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/vue-style-loader/node_modules/loader-utils": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+      "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/vue3-sfc-loader": {
+      "version": "0.8.4",
+      "resolved": "https://registry.npmjs.org/vue3-sfc-loader/-/vue3-sfc-loader-0.8.4.tgz",
+      "integrity": "sha512-eziaIrk/N9f9OCpyFEkR6vMsZUHcF5mQslXjffwcb5Iq6EuU74QrlpBeJqA04MvAGT7f5O8la2v9k3NtQnJb3Q=="
+    },
+    "node_modules/vueperslides": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/vueperslides/-/vueperslides-3.5.1.tgz",
+      "integrity": "sha512-g/Lauv1svlSaERzLNeys0oeLmpDFiXkIa+lxg+lJma6m6wXqJKzKKVIi8Kvc95XPnl42n7PYYJyr0+FMV6WZGw==",
+      "funding": {
+        "url": "https://github.com/sponsors/antoniandre"
+      },
+      "peerDependencies": {
+        "vue": "^2.6.14 || ^3.2.0"
+      }
+    },
+    "node_modules/vuex": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz",
+      "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==",
+      "dependencies": {
+        "@vue/devtools-api": "^6.0.0-beta.11"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/watchpack": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+      "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+      "dependencies": {
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.1.2"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/webpack": {
+      "version": "5.74.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz",
+      "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==",
+      "dependencies": {
+        "@types/eslint-scope": "^3.7.3",
+        "@types/estree": "^0.0.51",
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/wasm-edit": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1",
+        "acorn": "^8.7.1",
+        "acorn-import-assertions": "^1.7.6",
+        "browserslist": "^4.14.5",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^5.10.0",
+        "es-module-lexer": "^0.9.0",
+        "eslint-scope": "5.1.1",
+        "events": "^3.2.0",
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.2.9",
+        "json-parse-even-better-errors": "^2.3.1",
+        "loader-runner": "^4.2.0",
+        "mime-types": "^2.1.27",
+        "neo-async": "^2.6.2",
+        "schema-utils": "^3.1.0",
+        "tapable": "^2.1.1",
+        "terser-webpack-plugin": "^5.1.3",
+        "watchpack": "^2.4.0",
+        "webpack-sources": "^3.2.3"
+      },
+      "bin": {
+        "webpack": "bin/webpack.js"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependenciesMeta": {
+        "webpack-cli": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/webpack-cli": {
+      "version": "4.10.0",
+      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz",
+      "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==",
+      "dependencies": {
+        "@discoveryjs/json-ext": "^0.5.0",
+        "@webpack-cli/configtest": "^1.2.0",
+        "@webpack-cli/info": "^1.5.0",
+        "@webpack-cli/serve": "^1.7.0",
+        "colorette": "^2.0.14",
+        "commander": "^7.0.0",
+        "cross-spawn": "^7.0.3",
+        "fastest-levenshtein": "^1.0.12",
+        "import-local": "^3.0.2",
+        "interpret": "^2.2.0",
+        "rechoir": "^0.7.0",
+        "webpack-merge": "^5.7.3"
+      },
+      "bin": {
+        "webpack-cli": "bin/cli.js"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "4.x.x || 5.x.x"
+      },
+      "peerDependenciesMeta": {
+        "@webpack-cli/generators": {
+          "optional": true
+        },
+        "@webpack-cli/migrate": {
+          "optional": true
+        },
+        "webpack-bundle-analyzer": {
+          "optional": true
+        },
+        "webpack-dev-server": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/webpack-cli/node_modules/commander": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/webpack-merge": {
+      "version": "5.10.0",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
+      "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
+      "dependencies": {
+        "clone-deep": "^4.0.1",
+        "flat": "^5.0.2",
+        "wildcard": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/webpack-sources": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+      "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/webpack/node_modules/schema-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/wildcard": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
+      "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ=="
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+    },
+    "node_modules/xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "engines": {
+        "node": ">=0.4"
+      }
+    },
+    "node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+    }
+  }
+}
 
package.json (added)
+++ package.json
@@ -0,0 +1,48 @@
+{
+  "dependencies": {
+    "@babel/cli": "7.19.3",
+    "@babel/core": "7.19.3",
+    "@fortawesome/fontawesome-svg-core": "^6.4.2",
+    "@fortawesome/free-brands-svg-icons": "^6.4.2",
+    "@fortawesome/free-regular-svg-icons": "^6.4.2",
+    "@fortawesome/free-solid-svg-icons": "^6.4.2",
+    "@fortawesome/vue-fontawesome": "^3.0.3",
+    "axios": "^1.5.1",
+    "babel-loader": "8.2.5",
+    "css-loader": "6.7.1",
+    "express": "4.18.1",
+    "express-http-proxy": "^2.0.0",
+    "file-loader": "6.2.0",
+    "fs": "0.0.1-security",
+    "git": "^0.1.5",
+    "new-line": "^1.1.1",
+    "pg": "8.8.0",
+    "swiper": "^10.3.1",
+    "url-loader": "4.1.1",
+    "vue": "3.2.40",
+    "vue-carousel": "^0.18.0",
+    "vue-loader": "^17.0.0",
+    "vue-router": "4.1.5",
+    "vue-slick": "^1.2.0",
+    "vue-style-loader": "4.1.3",
+    "vue3-sfc-loader": "^0.8.4",
+    "vueperslides": "^3.5.1",
+    "vuex": "^4.1.0",
+    "webpack": "5.74.0",
+    "webpack-cli": "4.10.0"
+  },
+  "scripts": {
+    "prod": "set NODE_ENV=production&&node ./server/modules/web/server.js",
+    "dev": "set NODE_ENV=development&&node ./server/modules/web/server.js",
+    "windows-prod": "set NODE_ENV=production&&node ./server/modules/web/server.js",
+    "windows-dev": "set NODE_ENV=development&&node ./server/modules/web/server.js",
+    "linux-prod": "export NODE_ENV=production&&node ./server/modules/web/server.js",
+    "linux-dev": "export NODE_ENV=development&&node ./server/modules/web/server.js",
+    "webpack-build": "webpack",
+    "webpack-build-watch": "webpack --watch"
+  },
+  "devDependencies": {
+    "less": "^4.2.0",
+    "less-loader": "^11.1.3"
+  }
+}
 
server/modules/db/mysql/MysqlConnection.js (added)
+++ server/modules/db/mysql/MysqlConnection.js
@@ -0,0 +1,62 @@
+/**
+ * @author : 최정우
+ * @since : 2022.10.21
+ * @dscription : Mysql DB Connection Pool 생성 관리 모듈 입니다. (private와 public object 환경 구성)
+ */
+ const MysqlConnection = (function () {
+
+    //Mysql DB Connection 라이브러리 모듈
+    const mysql = require('mysql');
+
+    //Connection Pool 객체 - private object(변수)
+    const connectionPool = mysql.createPool({
+        host: 'localhost',
+        user: 'root',
+        password: '1234',
+        database: 'test',
+        ssl: false,
+        port: 3306,
+        max: 10,
+    });
+
+    return {
+        getConnectionPool: function () {
+            return connectionPool;
+        },
+        queryExcute: function (sql, params) {
+            const result = new Promise((resolve, reject) => {
+                connectionPool.getConnection(function (connectionError, connection) {
+                    if (!connectionError) {
+                        try {
+                            connection.query(sql, params, function (queryError, rows, columns) {
+                                if (!queryError) {
+                                    resolve({'rows': rows, 'columns': columns});
+                                } else {
+                                    reject(queryError);
+                                }
+                            })
+                        } catch (proccessError) {
+                            reject(proccessError);
+                        } finally {
+                            connection.release(); 
+                        }
+                    } else {
+                        reject(connectionError);
+                    }
+                })
+
+                /* connectionPool.getConnection().then(async (connection) => {
+                    let queryResult = await connection.query(sql);
+                    resolve(queryResult);
+                    connection.release();
+                }).catch((error) => {
+                    reject(error);
+                }); */
+            })
+            return result;
+        },
+    }
+
+})();
+
+module.exports = MysqlConnection;(파일 끝에 줄바꿈 문자 없음)
 
server/modules/db/oracle/OracleConnection.js (added)
+++ server/modules/db/oracle/OracleConnection.js
@@ -0,0 +1,62 @@
+/**
+ * @author : 방선주
+ * @since : 2022.09.22
+ * @dscription : Oracle DB Connection Pool 생성 관리 모듈 입니다.
+ * 
+ * @modifier : 최정우
+ * @modified : 2022.10.30
+ */
+ const { BASE_DIR } = require('../../../../Global');
+
+ const OracleConnection = function () {
+   //오라클 라이브러리 import
+   const oracledb = require('oracledb');
+   //라이브러리 초기화(oracle client setting)
+   oracledb.initOracleClient({ libDir: `${BASE_DIR}/server/modules/db/oracle/client/client_19.16` });
+ 
+   //DB Connection Pool
+   let connectionPool = null;
+ 
+   //DB Connection Pool 생성
+   oracledb.createPool({
+     user: 'ajin_data',
+     password: 'ajinvldosvl1121',  // myhrpw contains the hr schema password
+     connectString: '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 211.216.206.147)(PORT = 1521)))(CONNECT_DATA = (SID = XE)))',
+     poolMin: 0,
+     poolMax: 20,
+     //poolAlias: 'ajin_odbcp'//poolAlias가 정의되지 않으면, default pool로 정의됨
+   }).then((result) => {
+     connectionPool = result;
+     console.log("Successfully connected to Oracle Database");
+   }).catch((error) => {
+     console.error(error);
+   });
+ 
+   return {
+     getConnectionPool: function () {
+       return connectionPool;
+     },
+     getConnection: function () {
+       return oracledb.getConnection();
+     },
+     queryExcute: function (sql, params) {
+       const result = new Promise((resolve, reject) => {
+         oracledb.getConnection().then(async (connection) => {
+           let queryResult = null;
+           if (!params) {
+             queryResult = await connection.execute(sql);
+           } else {
+             queryResult = await connection.execute(sql, params);
+           }
+           resolve(queryResult);
+           connection.close();
+         }).catch((error) => {
+           reject(error);
+         });
+       })
+       return result;
+     },
+   }
+ }();
+ 
+ module.exports = OracleConnection;(파일 끝에 줄바꿈 문자 없음)
 
server/modules/db/oracle/client/client_19.16/BASIC_LICENSE (added)
+++ server/modules/db/oracle/client/client_19.16/BASIC_LICENSE
@@ -0,0 +1,123 @@
+Oracle Free Use Terms and Conditions
+
+Definitions
+
+"Oracle" refers to Oracle America, Inc. "You" and "Your" refers to (a)
+a company or organization (each an "Entity") accessing the Programs,
+if use of the Programs will be on behalf of such Entity; or (b) an
+individual accessing the Programs, if use of the Programs will not be
+on behalf of an Entity. "Program(s)" refers to Oracle software
+provided by Oracle pursuant to the following terms and any updates,
+error corrections, and/or Program Documentation provided by
+Oracle. "Program Documentation" refers to Program user manuals and
+Program installation manuals, if any. If available, Program
+Documentation may be delivered with the Programs and/or may be
+accessed from www.oracle.com/documentation. "Separate Terms" refers to
+separate license terms that are specified in the Program
+Documentation, readmes or notice files and that apply to Separately
+Licensed Technology. "Separately Licensed Technology" refers to Oracle
+or third party technology that is licensed under Separate Terms and
+not under the terms of this license.
+
+Separately Licensed Technology
+
+Oracle may provide certain notices to You in Program Documentation,
+readmes or notice files in connection with Oracle or third party
+technology provided as or with the Programs. If specified in the
+Program Documentation, readmes or notice files, such technology will
+be licensed to You under Separate Terms. Your rights to use Separately
+Licensed Technology under Separate Terms are not restricted in any way
+by the terms herein. For clarity, notwithstanding the existence of a
+notice, third party technology that is not Separately Licensed
+Technology shall be deemed part of the Programs licensed to You under
+the terms of this license.
+
+Source Code for Open Source Software
+
+For software that You receive from Oracle in binary form that is
+licensed under an open source license that gives You the right to
+receive the source code for that binary, You can obtain a copy of the
+applicable source code from https://oss.oracle.com/sources/ or
+http://www.oracle.com/goto/opensourcecode. If the source code for such
+software was not provided to You with the binary, You can also receive
+a copy of the source code on physical media by submitting a written
+request pursuant to the instructions in the "Written Offer for Source
+Code" section of the latter website.
+
+-------------------------------------------------------------------------------
+
+The following license terms apply to those Programs that are not
+provided to You under Separate Terms.
+
+License Rights and Restrictions
+
+Oracle grants to You, as a recipient of this Program, a nonexclusive,
+nontransferable, limited license to, subject to the conditions stated
+herein, (a) internally use the unmodified Programs for the purposes of
+developing, testing, prototyping and demonstrating your applications,
+and running the Programs for your own internal business operations;
+and (b) redistribute unmodified Programs and Programs Documentation,
+under the terms of this License, provided that You do not charge Your
+end users any additional fees for the use of the Programs. You may
+make copies of the Programs to the extent reasonably necessary for
+exercising the license rights granted herein and for backup
+purposes. You are granted the right to use the Programs to provide
+third party training in the use of the Programs and associated
+Separately Licensed Technology only if there is express authorization
+of such use by Oracle on the Program's download page or in the Program
+Documentation.
+
+Your license is contingent on Your compliance with the following conditions:
+
+    - You include a copy of this license with any distribution by You
+      of the Programs;
+
+    - You do not remove markings or notices of either Oracle's or a
+      licensor's proprietary rights from the Programs or Program
+      Documentation;
+
+    - You comply with all U.S. and applicable export control and
+      economic sanctions laws and regulations that govern Your use of
+      the Programs (including technical data);
+
+    - You do not cause or permit reverse engineering, disassembly or
+      decompilation of the Programs (except as allowed by law) by You
+      nor allow an associated party to do so.
+
+For clarity, any source code that may be included in the distribution
+with the Programs is provided solely for reference purposes and may
+not be modified, unless such source code is under Separate Terms
+permitting modification.
+
+Ownership
+
+Oracle or its licensors retain all ownership and intellectual property
+rights to the Programs.
+
+Information Collection
+
+The Programs' installation and/or auto-update processes, if any, may
+transmit a limited amount of data to Oracle or its service provider
+about those processes to help Oracle understand and optimize
+them. Oracle does not associate the data with personally identifiable
+information. Refer to Oracle's Privacy Policy at
+www.oracle.com/privacy.
+
+Disclaimer of Warranties; Limitation of Liability
+
+THE PROGRAMS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. ORACLE
+FURTHER DISCLAIMS ALL WARRANTIES, EXPRESS AND IMPLIED, INCLUDING
+WITHOUT LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE, OR NONINFRINGEMENT.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL ORACLE BE LIABLE TO
+YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+Last updated:  8 October 2018
+
 
server/modules/db/oracle/client/client_19.16/BASIC_README (added)
+++ server/modules/db/oracle/client/client_19.16/BASIC_README
@@ -0,0 +1,30 @@
+Basic Package Information 
+========================= 
+Sun Jul 17 14:46:23 MDT 2022
+Client Shared Library 64-bit - 19.16.0.0.0
+
+Windows NT Version V6.2  
+CPU                 : 4 - type 86644 physical cores
+Process Affinity    : 0x0000000000000000
+Memory (Avail/Total): Ph:10181M/16381M, Ph+PgF:12546M/18813M 
+
+
+TIMEZONE INFORMATION
+--------------------
+Operating in ORACLE_HOME environment.
+
+Small timezone file = timezone_32.dat
+Large timezone file = timezlrg_32.dat
+
+LICENSE AGREEMENT
+-----------------------------
+Your use of this copy of Oracle Instant Client software product is subject to, and may not exceed the conditions of use for which you are authorized under one of the following:
+
+(i) the license or cloud services terms that you accepted when you obtained the right to use Oracle Instant Client software; or
+(ii) the license terms that you agreed to when you placed your order with Oracle for an Oracle product containing Oracle Instant Client software; or
+(iii) the Oracle Instant Client software license terms, if any, included with the hardware that you acquired from Oracle; or
+(iv) the Oracle Technology Network License Agreement (which you acknowledge you have read and agree to) available at http://www.oracle.com/technetwork/licenses/distribution-license-152002.html; or, if (i), (ii), (iii), and or (iv) are not applicable, then,
+(v) the Oracle Free Use Terms and Conditions available at BASIC_LICENSE.
+
+Oracle's obligations with respect to your use of the Oracle Instant Client, including, without limitation, obligations to indemnify you, if any, shall only be as set forth in the specific license under which you are authorized and choose to use Oracle Instant Client.
+
 
server/modules/db/oracle/client/client_19.16/adrci.exe (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/adrci.exe
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/adrci.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/adrci.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/genezi.exe (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/genezi.exe
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/genezi.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/genezi.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oci.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oci.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oci.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oci.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/ocijdbc19.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/ocijdbc19.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/ocijdbc19.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/ocijdbc19.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/ociw32.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/ociw32.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/ociw32.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/ociw32.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/ojdbc8.jar (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/ojdbc8.jar
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oramysql19.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oramysql19.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oramysql19.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oramysql19.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/orannzsbb19.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/orannzsbb19.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/orannzsbb19.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/orannzsbb19.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oraocci19.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oraocci19.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oraocci19.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oraocci19.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oraocci19d.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oraocci19d.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oraocci19d.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oraocci19d.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oraociei19.dll (added)
+++ server/modules/db/oracle/client/client_19.16/oraociei19.dll
This file is too big to display.
 
server/modules/db/oracle/client/client_19.16/oraociei19.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oraociei19.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oraons.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oraons.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/orasql19.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/orasql19.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/orasql19.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/orasql19.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/ucp.jar (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/ucp.jar
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/uidrvci.exe (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/uidrvci.exe
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/uidrvci.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/uidrvci.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/vc14/oraocci19.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/vc14/oraocci19.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/vc14/oraocci19.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/vc14/oraocci19.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/vc14/oraocci19d.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/vc14/oraocci19d.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/vc14/oraocci19d.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/vc14/oraocci19d.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/xstreams.jar (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/xstreams.jar
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/BASIC_LICENSE (added)
+++ server/modules/db/oracle/client/client_21.6/BASIC_LICENSE
@@ -0,0 +1,123 @@
+Oracle Free Use Terms and Conditions
+
+Definitions
+
+"Oracle" refers to Oracle America, Inc. "You" and "Your" refers to (a)
+a company or organization (each an "Entity") accessing the Programs,
+if use of the Programs will be on behalf of such Entity; or (b) an
+individual accessing the Programs, if use of the Programs will not be
+on behalf of an Entity. "Program(s)" refers to Oracle software
+provided by Oracle pursuant to the following terms and any updates,
+error corrections, and/or Program Documentation provided by
+Oracle. "Program Documentation" refers to Program user manuals and
+Program installation manuals, if any. If available, Program
+Documentation may be delivered with the Programs and/or may be
+accessed from www.oracle.com/documentation. "Separate Terms" refers to
+separate license terms that are specified in the Program
+Documentation, readmes or notice files and that apply to Separately
+Licensed Technology. "Separately Licensed Technology" refers to Oracle
+or third party technology that is licensed under Separate Terms and
+not under the terms of this license.
+
+Separately Licensed Technology
+
+Oracle may provide certain notices to You in Program Documentation,
+readmes or notice files in connection with Oracle or third party
+technology provided as or with the Programs. If specified in the
+Program Documentation, readmes or notice files, such technology will
+be licensed to You under Separate Terms. Your rights to use Separately
+Licensed Technology under Separate Terms are not restricted in any way
+by the terms herein. For clarity, notwithstanding the existence of a
+notice, third party technology that is not Separately Licensed
+Technology shall be deemed part of the Programs licensed to You under
+the terms of this license.
+
+Source Code for Open Source Software
+
+For software that You receive from Oracle in binary form that is
+licensed under an open source license that gives You the right to
+receive the source code for that binary, You can obtain a copy of the
+applicable source code from https://oss.oracle.com/sources/ or
+http://www.oracle.com/goto/opensourcecode. If the source code for such
+software was not provided to You with the binary, You can also receive
+a copy of the source code on physical media by submitting a written
+request pursuant to the instructions in the "Written Offer for Source
+Code" section of the latter website.
+
+-------------------------------------------------------------------------------
+
+The following license terms apply to those Programs that are not
+provided to You under Separate Terms.
+
+License Rights and Restrictions
+
+Oracle grants to You, as a recipient of this Program, a nonexclusive,
+nontransferable, limited license to, subject to the conditions stated
+herein, (a) internally use the unmodified Programs for the purposes of
+developing, testing, prototyping and demonstrating your applications,
+and running the Programs for your own internal business operations;
+and (b) redistribute unmodified Programs and Programs Documentation,
+under the terms of this License, provided that You do not charge Your
+end users any additional fees for the use of the Programs. You may
+make copies of the Programs to the extent reasonably necessary for
+exercising the license rights granted herein and for backup
+purposes. You are granted the right to use the Programs to provide
+third party training in the use of the Programs and associated
+Separately Licensed Technology only if there is express authorization
+of such use by Oracle on the Program's download page or in the Program
+Documentation.
+
+Your license is contingent on Your compliance with the following conditions:
+
+    - You include a copy of this license with any distribution by You
+      of the Programs;
+
+    - You do not remove markings or notices of either Oracle's or a
+      licensor's proprietary rights from the Programs or Program
+      Documentation;
+
+    - You comply with all U.S. and applicable export control and
+      economic sanctions laws and regulations that govern Your use of
+      the Programs (including technical data);
+
+    - You do not cause or permit reverse engineering, disassembly or
+      decompilation of the Programs (except as allowed by law) by You
+      nor allow an associated party to do so.
+
+For clarity, any source code that may be included in the distribution
+with the Programs is provided solely for reference purposes and may
+not be modified, unless such source code is under Separate Terms
+permitting modification.
+
+Ownership
+
+Oracle or its licensors retain all ownership and intellectual property
+rights to the Programs.
+
+Information Collection
+
+The Programs' installation and/or auto-update processes, if any, may
+transmit a limited amount of data to Oracle or its service provider
+about those processes to help Oracle understand and optimize
+them. Oracle does not associate the data with personally identifiable
+information. Refer to Oracle's Privacy Policy at
+www.oracle.com/privacy.
+
+Disclaimer of Warranties; Limitation of Liability
+
+THE PROGRAMS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. ORACLE
+FURTHER DISCLAIMS ALL WARRANTIES, EXPRESS AND IMPLIED, INCLUDING
+WITHOUT LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE, OR NONINFRINGEMENT.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL ORACLE BE LIABLE TO
+YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+Last updated:  8 October 2018
+
 
server/modules/db/oracle/client/client_21.6/BASIC_README (added)
+++ server/modules/db/oracle/client/client_21.6/BASIC_README
@@ -0,0 +1,30 @@
+Basic Package Information 
+========================= 
+Fri May 27 02:14:20 MDT 2022
+Client Shared Library 64-bit - 21.6.0.0.0
+
+Windows NT Version V6.3  OS Build 9600
+CPU                 : 4 - type 86644 physical cores
+Process Affinity    : 0x0000000000000000
+Memory (Avail/Total): Ph:10006M/16381M, Ph+PgF:12115M/18813M 
+
+
+TIMEZONE INFORMATION
+--------------------
+Operating in ORACLE_HOME environment.
+
+Small timezone file = timezone_35.dat
+Large timezone file = timezlrg_35.dat
+
+LICENSE AGREEMENT
+-----------------------------
+Your use of this copy of Oracle Instant Client software product is subject to, and may not exceed the conditions of use for which you are authorized under one of the following:
+
+(i) the license or cloud services terms that you accepted when you obtained the right to use Oracle Instant Client software; or
+(ii) the license terms that you agreed to when you placed your order with Oracle for an Oracle product containing Oracle Instant Client software; or
+(iii) the Oracle Instant Client software license terms, if any, included with the hardware that you acquired from Oracle; or
+(iv) the Oracle Technology Network License Agreement (which you acknowledge you have read and agree to) available at http://www.oracle.com/technetwork/licenses/distribution-license-152002.html; or, if (i), (ii), (iii), and or (iv) are not applicable, then,
+(v) the Oracle Free Use Terms and Conditions available at BASIC_LICENSE.
+
+Oracle's obligations with respect to your use of the Oracle Instant Client, including, without limitation, obligations to indemnify you, if any, shall only be as set forth in the specific license under which you are authorized and choose to use Oracle Instant Client.
+
 
server/modules/db/oracle/client/client_21.6/adrci.exe (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/adrci.exe
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/adrci.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/adrci.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/genezi.exe (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/genezi.exe
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/genezi.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/genezi.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/network/admin/README (added)
+++ server/modules/db/oracle/client/client_21.6/network/admin/README
@@ -0,0 +1,9 @@
+============================================================================= 
+This is the default directory for Oracle Network and Oracle Client 
+configuration files. You can place files such as tnsnames.ora, sqlnet.ora 
+and oraaccess.xml in this directory. 
+NOTE: 
+If you set an environment variable TNS_ADMIN to another directory containing 
+configuration files, they will be used instead of the files in this default 
+directory. 
+============================================================================= 
 
server/modules/db/oracle/client/client_21.6/oci.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oci.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oci.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oci.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/ocijdbc21.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/ocijdbc21.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/ocijdbc21.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/ocijdbc21.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/ociw32.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/ociw32.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/ociw32.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/ociw32.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/ojdbc8.jar (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/ojdbc8.jar
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oramysql.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oramysql.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oramysql.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oramysql.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/orannzsbb.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/orannzsbb.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/orannzsbb.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/orannzsbb.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oraocci21.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oraocci21.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oraocci21.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oraocci21.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oraocci21d.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oraocci21d.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oraocci21d.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oraocci21d.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oraociei.dll (added)
+++ server/modules/db/oracle/client/client_21.6/oraociei.dll
This file is too big to display.
 
server/modules/db/oracle/client/client_21.6/oraociei.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oraociei.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/orasql.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/orasql.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/orasql.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/orasql.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/ucp.jar (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/ucp.jar
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/uidrvci.exe (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/uidrvci.exe
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/uidrvci.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/uidrvci.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/xstreams.jar (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/xstreams.jar
Binary file is not shown
 
server/modules/db/postgresql/PostgresqlConnection.js (added)
+++ server/modules/db/postgresql/PostgresqlConnection.js
@@ -0,0 +1,41 @@
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : PostgreSQL DB Connection Pool 생성 관리 모듈 입니다. (private와 public object 환경 구성)
+ */
+const PostgresqlConnection = (function () {
+
+    //PostgreSQL DB Connection 라이브러리 모듈
+    const pg = require('pg');
+
+    //Connection Pool 객체 - private object(변수)
+    const connectionPool = new pg.Pool({
+        //host: 'localhost',
+        host: '192.168.0.250',
+        user: 'test_user',
+        password: '1234',
+        database: 'test_db',
+        ssl: false,
+        port: 5432,
+        max: 10,
+    });
+
+    //public object
+    return {
+        getConnectionPool: function () {
+            return connectionPool;
+        },
+        getConnectionPoolClient: function () {
+            return connectionPool.connect();
+        },
+        queryExcute: function (sql, params) {
+            return connectionPool.query(sql, params);
+        },
+    }
+
+})();
+
+//Module Export
+module.exports = PostgresqlConnection;
+
+
 
server/modules/log/Logger.js (added)
+++ server/modules/log/Logger.js
@@ -0,0 +1,131 @@
+const { LOG_BASE_DIR, SERVICE_STATUS } = require('../../../Global');
+const fs = require('fs');
+const Queue = require('../util/Queue');
+
+/**
+ * @author : 최정우
+ * @since : 2022.09.21
+ * @dscription : Log 생성기 모듈 입니다.
+ */
+const Logger = (function () {
+
+    /* let testInterval = setInterval(() => {
+        const date = new Date();
+        var now = `${date.getFullYear()}.${(date.getMonth()+1)}.${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}.${date.getMilliseconds()}`;
+        console.log('now :', now);
+    }, 1000) */
+
+    //로그 쓰기 전, 대기 저장소
+    const eventQueue = new Queue();
+    //로그 쓰는 중인지 아닌지 상태값
+    let isLogging = false;
+
+    /**
+     * @author : 최정우
+     * @since : 2022.09.21
+     * @dscription : Log 처리
+     */
+    const logging = (message) => {
+        const date = new Date();
+        let year = date.getFullYear();
+        let month = prefixZero((date.getMonth() + 1), 2);
+        let day = prefixZero(date.getDate(), 2);
+        let hour = prefixZero(date.getHours(), 2);
+        let minute = prefixZero(date.getMinutes(), 2);
+        let second = prefixZero(date.getSeconds(), 2);
+        let millisecond = prefixZero(date.getMilliseconds(), 3);
+
+        //로그에 쓰일 정보
+        const logMessage = {
+            message: message,
+            datetime: `${year}.${month}.${day} ${hour}:${minute}:${second}.${millisecond}`,
+            logFolderDir: `${LOG_BASE_DIR}/${year}${month}`,//log 폴더 경로
+            logFileName: `log-${year}${month}${day}.log`//log 파일명
+        }
+
+        //로그 쓰는 중이면, 대기 저장소에 등록
+        if (isLogging == true) {
+            eventQueue.push(logMessage);
+        } else {//로그 쓰는 중이 아니면, 로그 쓰는 중인 상태로 변경 후, 로그 쓰기
+            isLogging = true;
+
+            try {
+                //log 폴더 생성
+                if (!fs.existsSync(logMessage.logFolderDir)) {
+                    fs.mkdirSync(logMessage.logFolderDir, { recursive: true/*재귀적 폴더 생성*/ });
+                }
+
+                //log 파일 Full Path
+                let logFileFullPath = `${logMessage.logFolderDir}/${logMessage.logFileName}`;
+                //log 내용
+                let logContent = `[${logMessage.datetime}] ${logMessage.message}`;
+
+                //log 내용 쓰기
+                writeLogFile(logFileFullPath, logContent);
+            } catch (error) {
+                console.log('logging error : ', error);
+            } finally {
+                isLogging = false;
+            }
+        }
+    }
+
+    /**
+     * @author : 최정우
+     * @since : 2022.09.21
+     * @dscription : Log 내용 쓰기
+     */
+    const writeLogFile = (path, content) => {
+        if (SERVICE_STATUS == 'development') {
+            console.log(content);
+        }
+        
+        //파일 쓰기
+        fs.appendFileSync(path, `${content}\n`, 'utf8');
+
+        //로그 쓰기 저장소에서 로그 메세지 꺼내기
+        let logMessage = eventQueue.pop();
+        //메세지가 존재하면 => Log 내용 쓰기 (재귀 호출)
+        if (logMessage != undefined) {
+            //log 파일 Full Path
+            let logFileFullPath = `${logMessage.logFolderDir}/${logMessage.logFileName}`;
+            //log 내용
+            let logContent = `[${logMessage.datetime}] ${logMessage.message}`;
+            //Log 내용 쓰기 (재귀 호출)
+            writeLogFile(logFileFullPath, logContent);
+        } else {
+            return;
+        }
+    }
+
+    /**
+     * @author : 최정우
+     * @since : 2022.09.21
+     * @dscription : 특정 길이만큼 앞에 '0' 붙이기
+     */
+    const prefixZero = (target, length) => {
+        let zero = '';
+        let suffix = target;
+        let result = '';
+
+        if ((typeof target) === "number") {
+            suffix = target.toString();
+        }
+        if (suffix.length < length) {
+            for (i = 0; i < length - suffix.length; i++) {
+                zero += '0';
+            }
+        }
+        result = zero + suffix;
+        return result;
+    }
+
+
+    return {
+        logging: logging
+    }
+
+})();
+
+//Module Export
+module.exports = Logger;(파일 끝에 줄바꿈 문자 없음)
 
server/modules/util/Queue.js (added)
+++ server/modules/util/Queue.js
@@ -0,0 +1,32 @@
+/**
+ * @author : 최정우
+ * @since : 2022.09.21
+ * @dscription : Queue(선입선출) 자료형 객체 입니다.
+ */
+class Queue {
+    constructor() {
+        this._arr = [];
+    }
+
+    //입력
+    push (item) {
+        this._arr.push(item);
+    }
+
+    //출력 후, 제거
+    pop () {
+        return this._arr.shift();
+    }
+
+    //출력 대기 중인 item return
+    peek () {
+        return this._arr[0];
+    }
+
+    //확인
+    showQueue () {
+        console.log('Queue : ', this._arr);
+    }
+}
+
+module.exports = Queue;(파일 끝에 줄바꿈 문자 없음)
 
server/modules/web/Server.js (added)
+++ server/modules/web/Server.js
@@ -0,0 +1,118 @@
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : Express 라이브러리 활용 HTTP Web Server 모듈입니다.
+ */
+const { BASE_DIR, PORT, API_SERVER_HOST } = require('../../../Global');
+const Logger = require('../log/Logger');//Logger(필수)
+
+const express = require('express');
+const webServer = express();
+const expressProxy = require('express-http-proxy');
+
+//파일 시스템 관련 라이브러리
+const FS = require('fs');
+//stream: 특정 자원을 Streaming 하기 위한 라이브러리 => Transform: Streaming 중인 자원의 Data에 Data 수정 및 추가를 지원해주는 객체
+const Transform = require('stream').Transform;
+//Streaming 중인 자원에 새로운 데이터를 stream 공간에 추가하기 위한 라이브러리
+const newLineStream = require('new-line');
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : HTTP Server start
+ */
+webServer.listen(PORT, function () {
+    Logger.logging(`★★★ Node.js를 활용한 Web Server 구동(Port:${PORT}) ★★★`);
+})
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : Intercepter 역할을 하는 미들웨어 기능
+ */
+webServer.use(function (request, response, next) {
+    let ip = request.headers['x-forwarded-for'] || request.socket.remoteAddress;
+    Logger.logging(`[HTTP] ${request.url} (Method: ${request.method}, IP: ${ip})`);
+    next();
+});
+
+
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : ROOT URL -> index.html
+ */
+webServer.get('/', function (request, response) {
+    //response.sendFile을 통한 HTTP html reponse (html내용 Streaming)
+    response.sendFile(`${BASE_DIR}/client/views/index.html`);
+})
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : 화면요청 URL 처리
+ */
+webServer.get('*.page', function (request, response, next) {
+    //index.html 내용을 직접 Streaming하여 Response, Streaming 중간에 내용 수정
+    //수정 내용 : URL 요청이 아닌, 브라우저에 표시된 URL만 변경하여, 해당하는 URL PATH의 Vue Component를 routing하기 위함
+    const StreamTransform = new Transform();
+    StreamTransform._transform = function (data, encoding, done) {
+        let fileContent = data.toString();
+        let replaceBeforeContent = `<script id="app-start-vue-page">const APP_USER_HTTP_REQUEST_URL = '/';</script>`;
+        let replaceAfterContent = `<script id="app-start-vue-page">const APP_USER_HTTP_REQUEST_URL = '${request.params['0']}.page';</script>`;
+        fileContent.replace(replaceBeforeContent, replaceAfterContent);
+        this.push(fileContent);
+        done();
+    }
+    //Streaming 진행
+    FS.createReadStream(`${BASE_DIR}/client/views/index.html`).pipe(newLineStream()).pipe(StreamTransform).pipe(response);
+})
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : REST API 서버에 데이터 요청 보내기(Proxy)
+ */
+webServer.use('*.json', expressProxy(API_SERVER_HOST, {
+    proxyReqPathResolver: function (request) {
+        //console.log('request : ', request.url, request.params[0]);
+        return `${request.params['0']}.json`;
+    }
+}));
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : REST API 서버에 데이터 요청 보내기(Proxy)
+ */
+webServer.use('*.file', expressProxy(API_SERVER_HOST, {
+    parseReqBody : false,
+    proxyReqPathResolver: function (request) {
+        console.log('request : ', request.url, request.params[0]);
+        return `${request.params['0']}.file`;
+    }
+}));
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : ROOT URL, Router's, 화면요청 URL 등.. 이 외 나머지 정적 자원에 대한 처리 기능
+ */
+webServer.get('*.*', function (request, response, next) {
+    response.sendFile(`${BASE_DIR}${request.params['0']}.${request.params['1']}`);
+})
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : Global Error Handler (*맨 마지막에 적용해야됨)
+ */
+webServer.use(function (error, request, response, next) {
+    const errorCode = !error.statusCode ? 500 : error.statusCode;
+    response.status(errorCode).send('에러가 발생하였습니다. 관리자에게 문의바랍니다.');
+    let message = `[Error:${errorCode}] ${request.url}/n ${error.stack}/n`;
+    Logger.logging(message);
+    //next();
+})(파일 끝에 줄바꿈 문자 없음)
 
server/service/test/model/TestDAO.js (added)
+++ server/service/test/model/TestDAO.js
@@ -0,0 +1,190 @@
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트용 DB 접근을 담당하는 모듈 입니다.
+ */
+ const TestDAO = (function () {
+
+    //PostgreSQL DB Connection 객체 - private object(변수)
+    const PostgresqlConnection = require('../../../modules/db/postgresql/PostgresqlConnection');
+    //console.log('PostgresqlConnection : ', PostgresqlConnection);
+    const connectionPool = PostgresqlConnection.getConnectionPool();
+
+    //public object
+    return {
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 목록 조회
+         */
+        testSelectList: function (param) {
+            return connectionPool.query('SELECT * FROM test_schema.test_table');
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 상세 조회
+         */
+        testSelectOne: function (param) {
+            return connectionPool.query('SELECT * FROM test_schema.test_table WHERE test_seq = $1', param);
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 등록
+         */
+        testInsertOne: function (param) {
+            return connectionPool.query(
+                //RETURNING <*||COLUMN NAME1,COLUMN NAME2,...> : 등록한 Data return 받는 기능
+                //ex1) RETURNING * : 모든 컬럼 다 return 함
+                //ex2) RETURNING name : 컬럼명이 'name'인 데이터만 return 함
+                `INSERT INTO test_schema.test_table (
+                    test_seq
+                    , test_title
+                    , test_content
+                    , test_create_datetime
+                    , test_create_user
+                ) VALUES (
+                    (SELECT COALESCE(MAX(test_seq), 0) + 1 FROM test_schema.test_table)
+                    , $1
+                    , $2
+                    , current_timestamp
+                    , 1
+                ) RETURNING test_seq`,
+                param
+            );
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 수정
+         */
+        testUpdateOne: function (param) {
+            return connectionPool.query(
+                `UPDATE
+                    test_schema.test_table
+                SET 
+                    test_title = $2
+                    , test_content = $3
+                    , test_update_datetime = current_timestamp
+                    , test_update_user = 1
+                WHERE
+                    test_seq = $1`,
+                param
+            );
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 삭제
+         */
+        testDeleteOne: function (param) {
+            return connectionPool.query(
+                `DELETE
+                FROM
+                    test_schema.test_table
+                WHERE
+                    test_seq = $1`,
+                param
+            );
+        },
+
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 트랜젝션 처리
+         * 
+         * 트랜잭션 작업 진행 시나리오
+         *  1. connection pool 한 개 받아오기
+         *  2. BEGIN(트랜잭션 시작 처리)
+         *  3. [※작업내용1] 데이터 등록
+         *  4. [※작업내용2] 등록한 데이터 수정
+         *  5. *작업 완료시, 실행(dispatch)한 모든 쿼리를 COMMIT(커밋)
+         *     *에러 발생시, 실행(dispatch)한 모든 쿼리를 ROLLBACK(롤백)
+         *  6. 받아온 connection pool 반납(해제) - 필수(반납하지 않으면 해당 pool을 사용하는 query는 트랜잭션에 계속 매달려있음)
+         */
+         testTransaction: function (param) {
+            return new Promise((resolve, reject) => {
+                //1. connection pool 한 개 받아오기
+                const poolClient = PostgresqlConnection.getConnectionPoolClient();
+                poolClient.then(async(client) => {//async 처리
+                    try {
+                        //2. BEGIN(트랜잭션 시작 처리)
+                        await client.query('BEGIN');
+
+                        //처리 3초 지연
+                        //await client.query('SELECT pg_sleep(3);');
+
+                        //3. [※작업내용1] 데이터 등록
+                        let insertResultData = await client.query(
+                            `INSERT INTO test_schema.test_table (
+                                test_seq
+                                , test_title
+                                , test_content
+                                , test_create_datetime
+                                , test_create_user
+                            ) VALUES (
+                                (SELECT COALESCE(MAX(test_seq), 0) + 1 FROM test_schema.test_table)
+                                , $1
+                                , $2
+                                , current_timestamp
+                                , 1
+                            ) RETURNING test_seq`,
+                            param
+                        );
+                        //console.log('등록 결과 정보 insertResultData : ', insertResultData);
+
+                        //throw '트랜잭션 처리중 Error 강제로 발생시킴';
+
+                        //4. [※작업내용2] 등록한 데이터 수정
+                        let updateResultData = await client.query(
+                            `UPDATE
+                                test_schema.test_table
+                            SET 
+                                test_title = 'title transaction update'
+                                , test_content = 'content transaction update'
+                                , test_update_datetime = current_timestamp 1231ㄱㄹㅇㄴ
+                                , test_update_user = 1
+                            WHERE
+                                test_seq = ${insertResultData.rows[0].test_seq}`
+                        );
+                        //console.log('수정 결과 정보 updateResultData : ', updateResultData);
+
+                        throw '트랜잭션 처리중 Error 강제로 발생시킴';
+
+                        //5. *작업 완료시, 실행(dispatch)한 모든 쿼리를 COMMIT(커밋)
+                        let commitResultData = await client.query('COMMIT');
+                        //console.log('커밋 결과 정보 commitResultData : ', commitResultData);
+
+                        //Promise resolve 처리
+                        resolve(commitResultData);
+                    } catch (error) {
+                        //5. *에러 완료시, 실행(dispatch)한 모든 쿼리를 COMMIT(커밋)
+                        let rollbackResultData = await client.query('ROLLBACK');
+                        console.log('롤백 결과 정보 rollbackResultData : ', rollbackResultData);
+
+                        //Promise reject 처리
+                        reject(error);
+                    } finally {
+                        //6. 받아온 connection pool 반납(해제) - 필수(반납하지 않으면 해당 pool을 사용하는 query는 트랜잭션에 계속 매달려있음)
+                        client.release();
+                    }
+                }).catch((error) => {
+                    //Promise reject 처리
+                    reject(error);
+                })
+            });
+        },//testTransaction() end
+
+    }//return end
+ 
+ })();
+ 
+ //Module Export
+ module.exports = TestDAO;(파일 끝에 줄바꿈 문자 없음)
 
server/service/test/model/TestService.js (added)
+++ server/service/test/model/TestService.js
@@ -0,0 +1,138 @@
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트용 서비스 로직을 담당하는 모듈 입니다.
+ */
+ const TestService = (function () {
+
+    //DAO
+    const TestDAO = require('./TestDAO');
+    
+    //public object
+    return {
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 목록 조회
+         * @callback : parameter -> {data: Object, error: Object}
+         */
+        testSelectList: function (callback, param) {
+            //Data Access 접근
+            let dataAccessResult = TestDAO.testSelectList(param);
+            //Data Access 결과
+            dataAccessResult.then((data) => {
+                console.log('TestService testSelectList connect dataAccessResult : ', data);
+                callback({data: data, error: null});//Router에 결과 전달
+            }).catch((error) => {
+                callback({data: null, error: error});//Router에 Error 전달
+            })
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 상세 조회
+         */
+        testSelectOne: function (callback, param) {
+            param = [1];
+            //Data Access 접근
+            let dataAccessResult = TestDAO.testSelectOne(param);
+            //Data Access 결과
+            dataAccessResult.then((data) => {
+                console.log('TestService testSelectOne connect dataAccessResult : ', data);
+                callback({data: data, error: null});//Router에 결과 전달
+            }).catch((error) => {
+                callback({data: null, error: error});//Router에 Error 전달
+            })
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 등록
+         */
+         testInsertOne: function (callback, param) {
+            param = ['test title', 'test content'];
+            //Data Access 접근
+            let dataAccessResult = TestDAO.testInsertOne(param);
+            //Data Access 결과
+            dataAccessResult.then((data) => {
+                console.log('TestService testInsertOne connect dataAccessResult : ', data.rows[0]['test_seq']);
+                callback({data: data, error: null});//Router에 결과 전달
+            }).catch((error) => {
+                callback({data: null, error: error});//Router에 Error 전달
+            })
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 수정
+         */
+        testUpdateOne: function (callback, param) {
+            param = [1, 'test title update', 'test content update'];
+            //Data Access 접근
+            let dataAccessResult = TestDAO.testUpdateOne(param);
+            //Data Access 결과
+            dataAccessResult.then((data) => {
+                console.log('TestService testUpdateOne connect dataAccessResult : ', data);
+                callback({data: data, error: null});//Router에 결과 전달
+            }).catch((error) => {
+                callback({data: null, error: error});//Router에 Error 전달
+            })
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 삭제
+         */
+        testDeleteOne: function (callback, param) {
+            param = [10];
+            //Data Access 접근
+            let dataAccessResult = TestDAO.testDeleteOne(param);
+            //Data Access 결과
+            dataAccessResult.then((data) => {
+                console.log('TestService testDeleteOne connect dataAccessResult : ', data);
+                callback({data: data, error: null});//Router에 결과 전달
+            }).catch((error) => {
+                callback({data: null, error: error});//Router에 Error 전달
+            })
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 트랜젝션 처리
+         * 
+         * 트랜잭션 작업 진행 시나리오
+         *  1. connection pool 한 개 받아오기
+         *  2. BEGIN(트랜잭션 시작 처리)
+         *  3. [※작업내용1] 데이터 등록
+         *  4. [※작업내용2] 등록한 데이터 수정
+         *  5. *작업 완료시, 실행(dispatch)한 모든 쿼리를 COMMIT(커밋)
+         *     *에러 발생시, 실행(dispatch)한 모든 쿼리를 ROLLBACK(롤백)
+         *  6. 받아온 connection pool 반납(해제) - 필수(반납하지 않으면 해당 pool을 사용하는 query는 트랜잭션에 계속 매달려있음)
+         */
+         testTransaction: function (callback, param) {
+            param = ['test title', 'test content'];
+            //Data Access 접근
+            let dataAccessResult = TestDAO.testTransaction(param);
+            //Data Access 결과
+            dataAccessResult.then((data) => {
+                console.log('TestService testTransaction connect dataAccessResult : ', data);
+                callback({data: data, error: null});//Router에 결과 전달
+            }).catch((error) => {
+                callback({data: null, error: error});//Router에 Error 전달
+            })
+        },
+
+
+    }
+ 
+ })();
+ 
+ //Module Export
+ module.exports = TestService;
+ (파일 끝에 줄바꿈 문자 없음)
 
server/service/test/router/TestRouter.js (added)
+++ server/service/test/router/TestRouter.js
@@ -0,0 +1,119 @@
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트용 Router(Controller) 모듈 입니다.
+ */
+const express = require('express');
+const router = express.Router();
+
+//Service
+const TestService = require('../model/TestService');
+
+
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트 데이터 목록 조회(POST)
+ */
+router.get('/testSelectList.json', function (request, response, next) {
+    //Callback 함수 Parameter result = {data: Object, error: Object}
+    TestService.testSelectList((result) => {
+        if (!result.error) {
+            response.send(result.data);
+        } else {
+            next(result.error);//Global Error Handler에게 예외상황 맡기기
+        }
+    });
+})
+
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트 데이터 상세 조회(POST)
+ */
+router.get('/testSelectOne.json', function (request, response, next) {
+    //Callback 함수 Parameter -> result = {data: Object, error: Object}
+    TestService.testSelectOne((result) => {
+        if (!result.error) {
+            response.send(result.data);
+        } else {
+            next(result.error);//Global Error Handler에게 예외상황 맡기기
+        }
+    });
+})
+
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트 데이터 등록 (POST)
+ */
+router.get('/testInsertOne.json', function (request, response, next) {
+    //Callback 함수 Parameter -> result = {data: Object, error: Object}
+    TestService.testInsertOne((result) => {
+        if (!result.error) {
+            response.send(result.data);
+        } else {
+            next(result.error);//Global Error Handler에게 예외상황 맡기기
+        }
+    })
+})
+
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트 데이터 수정 (POST)
+ */
+router.get('/testUpdateOne.json', function (request, response, next) {
+    //Callback 함수 Parameter -> result = {data: Object, error: Object}
+    TestService.testUpdateOne((result) => {
+        if (!result.error) {
+            response.send(result.data);
+        } else {
+            next(result.error);//Global Error Handler에게 예외상황 맡기기
+        }
+    })
+})
+
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트 데이터 삭제 (POST)
+ */
+router.get('/testDeleteOne.json', function (request, response, next) {
+    //Callback 함수 Parameter -> result = {data: Object, error: Object}
+    TestService.testDeleteOne((result) => {
+        if (!result.error) {
+            response.send(result.data);
+        } else {
+            next(result.error);//Global Error Handler에게 예외상황 맡기기
+        }
+    })
+})
+
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트 트랜젝션 처리
+ * 
+ * 트랜잭션 작업 진행 시나리오
+ *  1. connection pool 한 개 받아오기
+ *  2. BEGIN(트랜잭션 시작 처리)
+ *  3. [※작업내용1] 데이터 등록
+ *  4. [※작업내용2] 등록한 데이터 수정
+ *  5. *작업 완료시, 실행(dispatch)한 모든 쿼리를 COMMIT(커밋)
+ *     *에러 발생시, 실행(dispatch)한 모든 쿼리를 ROLLBACK(롤백)
+ *  6. 받아온 connection pool 반납(해제) - 필수(반납하지 않으면 해당 pool을 사용하는 query는 트랜잭션에 계속 매달려있음)
+ */
+router.get('/testTransaction.json', function (request, response, next) {
+    //Callback 함수 Parameter -> result = {data: Object, error: Object}
+    TestService.testTransaction((result) => {
+        if (!result.error) {
+            response.send(result.data);
+        } else {
+            next(result.error);//Global Error Handler에게 예외상황 맡기기
+        }
+    })
+})
+
+//Module Export
+module.exports = router;(파일 끝에 줄바꿈 문자 없음)
 
webpack.config.js (added)
+++ webpack.config.js
@@ -0,0 +1,42 @@
+const { VueLoaderPlugin } = require("vue-loader");
+
+const {PROJECT_NAME, BASE_DIR, SERVICE_STATUS} = require('./Global');
+
+module.exports = {
+  name: PROJECT_NAME,
+  mode: SERVICE_STATUS,
+  devtool: 'eval',
+
+  entry: {
+    app: [`${BASE_DIR}/client/views/index.js`]
+  },
+
+  module: {
+    rules: [{
+      test: /\.vue?$/,
+      loader: 'vue-loader',
+    }, {
+      test: /\.(js|jsx)?$/,
+      loader: 'babel-loader',
+    }, {
+      test: /\.css$/,
+      use: ['vue-style-loader', 'css-loader']
+    }, {
+      test: /\.(jpe?g|png|gif|svg|ttf|eot|woff|woff2)$/i,
+      use: [{
+        loader:'url-loader',
+        options:{
+          limit:8192,
+          fallback:require.resolve('file-loader')
+        }
+      }]
+    }],
+  },
+
+  plugins: [new VueLoaderPlugin()],
+
+  output: {
+    path: `${BASE_DIR}/client/build`,	// __dirname: webpack.config.js 파일이 위치한 경로
+    filename: 'bundle.js'
+  },
+}(파일 끝에 줄바꿈 문자 없음)
 
yarn-error.log (added)
+++ yarn-error.log
@@ -0,0 +1,75 @@
+Arguments: 
+  C:\takensoft\dev\Nodejs\node.exe C:\Program Files (x86)\Yarn\bin\yarn.js add 'vue-awesome-swiper' --save-dev
+
+PATH: 
+  C:\takensoft\tools\nodejs\;C:\Program Files (x86)\Yarn\bin\;C:\Program Files\Git\cmd;C:\Windows\System32;C:\takensoft\tools\nodejs;C:\takensoft\dev\Nodejs\;C:\takensoft\tools\jdk\jdk-15\bin\;C:\takensoft\download\Maven\apache-maven-3.9.0-bin\apache-maven-3.9.0\bin\;C:\takensoft\download\apache-tomcat-9.0.73\bin\;C:\Users\mycom\AppData\Local\Microsoft\WindowsApps;C:\takensoft\tools\intellij\IntelliJ IDEA 2020.1.2\bin;;C:\Users\mycom\AppData\Local\GitHubDesktop\bin;C:\Users\mycom\AppData\Local\Yarn\bin;C:\takensoft\tools\vscode\bin;C:\Users\mycom\AppData\Roaming\npm
+
+Yarn version: 
+  1.22.19
+
+Node version: 
+  18.16.1
+
+Platform: 
+  win32 x64
+
+Trace: 
+  Error: https://registry.yarnpkg.com/%27vue-awesome-swiper%27: Not found
+      at params.callback [as _callback] (C:\Program Files (x86)\Yarn\lib\cli.js:66145:18)
+      at self.callback (C:\Program Files (x86)\Yarn\lib\cli.js:140890:22)
+      at Request.emit (node:events:513:28)
+      at Request.<anonymous> (C:\Program Files (x86)\Yarn\lib\cli.js:141862:10)
+      at Request.emit (node:events:513:28)
+      at IncomingMessage.<anonymous> (C:\Program Files (x86)\Yarn\lib\cli.js:141784:12)
+      at Object.onceWrapper (node:events:627:28)
+      at IncomingMessage.emit (node:events:525:35)
+      at endReadableNT (node:internal/streams/readable:1359:12)
+      at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
+
+npm manifest: 
+  {
+    "dependencies": {
+      "@babel/cli": "7.19.3",
+      "@babel/core": "7.19.3",
+      "@fortawesome/fontawesome-svg-core": "^6.4.2",
+      "@fortawesome/free-brands-svg-icons": "^6.4.2",
+      "@fortawesome/free-regular-svg-icons": "^6.4.2",
+      "@fortawesome/free-solid-svg-icons": "^6.4.2",
+      "@fortawesome/vue-fontawesome": "^3.0.3",
+      "axios": "^1.5.1",
+      "babel-loader": "8.2.5",
+      "css-loader": "6.7.1",
+      "express": "4.18.1",
+      "express-http-proxy": "^2.0.0",
+      "file-loader": "6.2.0",
+      "fs": "0.0.1-security",
+      "new-line": "^1.1.1",
+      "pg": "8.8.0",
+      "swiper": "^5.3.7",
+      "url-loader": "4.1.1",
+      "vue": "3.2.40",
+      "vue-loader": "^17.0.0",
+      "vue-router": "4.1.5",
+      "vue-style-loader": "4.1.3",
+      "vue3-sfc-loader": "^0.8.4",
+      "vuex": "^4.1.0",
+      "webpack": "5.74.0",
+      "webpack-cli": "4.10.0"
+    },
+    "scripts": {
+      "prod": "set NODE_ENV=production&&node ./server/modules/web/server.js",
+      "dev": "set NODE_ENV=development&&node ./server/modules/web/server.js",
+      "windows-prod": "set NODE_ENV=production&&node ./server/modules/web/server.js",
+      "windows-dev": "set NODE_ENV=development&&node ./server/modules/web/server.js",
+      "linux-prod": "export NODE_ENV=production&&node ./server/modules/web/server.js",
+      "linux-dev": "export NODE_ENV=development&&node ./server/modules/web/server.js",
+      "webpack-build": "webpack",
+      "webpack-build-watch": "webpack --watch"
+    }
+  }
+
+yarn manifest: 
+  No manifest
+
+Lockfile: 
+  No lockfile
Add a comment
List