332 lines
27 KiB
HTML
332 lines
27 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<link rel="stylesheet" href="../../globalcss.css">
|
|
<link rel="stylesheet" href="../panel.css">
|
|
<link rel="stylesheet" href="style.css">
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment.min.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
|
|
<link rel="shortcut icon" href="../../img/logo.png" type="image/x-icon">
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-sha1/0.6.0/sha1.min.js"></script>
|
|
<title>M-Panel | Dashboard</title>
|
|
</head>
|
|
<body>
|
|
<div id="loading-container" class="panel">
|
|
<div id="loading-item"></div>
|
|
</div>
|
|
|
|
<div id="app">
|
|
<m-navbar
|
|
loginhref="/Login/"
|
|
homehref="/"
|
|
rightbutton="Sign Out"
|
|
colorofbutton="yellow-white-linear"
|
|
></m-navbar>
|
|
<div id="background-front"></div>
|
|
<div id="background"></div>
|
|
<div id="page-content-container">
|
|
<div id="panel-content">
|
|
<left-navbar
|
|
activepage="Dashboard"
|
|
></left-navbar>
|
|
<div id="right-page-container">
|
|
<div id="header-content">
|
|
<p style="margin-left: 3.4259vh; font-size: 1.6667vw; font-weight: 600;">Dashboard</p>
|
|
<div id="server-status-container">
|
|
<div id="server-status-online-icon" style="background-image: url(img/OnlineStatus.png); background-position: center; background-size: 100%; background-repeat: no-repeat; width: 0.6204vh; height: 0.6204vh; margin-right: 1.3194vh;">
|
|
|
|
</div>
|
|
<p style="font-size: .8333vw; font-family: 'SF Pro Display Thin';">Server is <span style="color: #8BFF30;">online</span></p>
|
|
</div>
|
|
|
|
<!-- <div id="notifies-menu-container" v-if="notifyMenu">
|
|
<div id="notify-menu-header">
|
|
<img src="../../img/notifyIcon.png" class="bell" alt="notifyIcon">
|
|
<span>Notification Center</span>
|
|
<img src="../../img/cancelImg.png" class="cancel" alt="cancelIcon" @click="notifyMenu = false">
|
|
</div>
|
|
<div id="notify-menu-line"></div>
|
|
|
|
<div id="notify-menu-notifies">
|
|
<div id="notify-menu-item" v-for="data in notifications">
|
|
<div id="notify-item-header">
|
|
<img src="../../img/notifyIcon.png" alt="notifyIcon">
|
|
<span>Notification</span>
|
|
</div>
|
|
<span class="notify-content">{{ `${data.desc} by ${data.author}` }}</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="notify-menu-line" style="margin-top: 0.9259vh;"></div>
|
|
<div id="notify-menu-bottom">
|
|
<span @click="notifications = []">Delete All</span>
|
|
</div>
|
|
</div> -->
|
|
|
|
<notify-menu :notifymenu="notifyMenu" @closenotifymenu="notifyMenu = false"></notify-menu>
|
|
<new-notify :newnotify="newNotify" @closenewnotify="newNotify = false"></new-notify>
|
|
|
|
<div id="notify-container" @click="notifyMenu = true" v-if="!notifyMenu && !newNotify" style="margin-left: 28.2407vh;">
|
|
<div id="notify-icon"></div>
|
|
</div>
|
|
|
|
<div id="user-details-container" v-if="!notifyMenu && !newNotify" style="margin-left: 3.7037vh;">
|
|
<div id="text-details">
|
|
<p style="font-size: 1.4815vh; font-weight: 700; font-family: 'SF Pro Display';">{{ userUsername }}</p>
|
|
<p class="rank" :style="{ 'color': userRank.color }">{{ userRank.title }}</p>
|
|
</div>
|
|
<div id="user-icon" :style="{ 'border-color': userRank.color, 'background-image': 'url('+userIcon+')', 'background-size': 'cover', 'background-position': 'center' }">
|
|
<div id="circle-user-icon"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="right-page-content-container">
|
|
<div id="rpage-left-container">
|
|
<div id="rpage-seperate-container">
|
|
|
|
<div id="onlines-box">
|
|
<div id="rpage-box-title">
|
|
<span style="margin-left: 2.3148vh;">Onlines</span>
|
|
<span style="margin-right: 2.3148vh;">Peak</span>
|
|
</div>
|
|
<div id="rpage-box-description">
|
|
<span style="margin-left: 2.3148vh;">{{ date }}</span>
|
|
<span style="margin-right: 2.3148vh;"><span style="color: rgba(255, 255, 255, 0.65);">{{ peakCount }}</span> Players</span>
|
|
</div>
|
|
|
|
<div id="onlines-percentage-container">
|
|
<div id="percentage-ball-container" :style="{ 'transform': !onlinesScoreLast ? 'rotate('+Number(playerCount) / 2.77777777778+'deg)' : 'rotate('+Number(500) / 2.77777777778+'deg)' }">
|
|
<div id="percentage-ball"></div>
|
|
</div>
|
|
|
|
<div id="player-text-count-containerone">
|
|
<div id="player-text-count-containertwo">
|
|
<span style="font-size: 2.0833vw; font-weight: 600; margin-top: 1.463vh;">
|
|
{{ playerCount }}
|
|
</span>
|
|
<span style="font-size: .7292vw; opacity: 0.65; margin-top: 0.463vh;">
|
|
Online Players
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="server-box">
|
|
<div id="rpage-box-title">Version</div>
|
|
<span v-if="VersionCheck.CurrentVersion !== '0.0'" style="font-size: .625vw; margin-left: 2.3148vh; margin-top: 1.3889vh; opacity: 0.38; font-weight: 500;">
|
|
v{{ VersionCheck.CurrentVersion }} Current Version
|
|
</span>
|
|
<span v-else style="font-size: .625vw; margin-left: 2.3148vh; margin-top: 1.3889vh; opacity: 0.38; font-weight: 500;">
|
|
Your rank is not enough to see script version
|
|
</span>
|
|
|
|
<div id="power-button-elipse" @click="window.open('https://keymaster.fivem.net/', '_blank')">
|
|
<div id="button-elipse">
|
|
<div id="button-elipse-inline-border">
|
|
<div id="stroked-inline-button" v-if="!VersionCheck.Outdated">
|
|
<span style="margin-bottom: 1.2037vh;">mAdmin is</span>
|
|
<img src="img/VersionUpdateIcon.png" style="width: 4.9074vh; height: 4.9074vh;" alt="">
|
|
<span style="margin-top: 1.2037vh;">up to date</span>
|
|
</div>
|
|
<div id="stroked-inline-button" v-if="VersionCheck.Outdated">
|
|
<span style="margin-bottom: 1.2037vh; opacity: 1;">New Update</span>
|
|
<img src="img/NewUpdateIcon.png" style="width: 4.9074vh; height: 4.9074vh;" alt="">
|
|
<span style="margin-top: 1.2037vh; opacity: 1;">v{{VersionCheck.Outdated}}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
<div id="rpage-seperate-container" style="margin-top: 0.8602vh;">
|
|
|
|
<div id="performance-box">
|
|
<div id="rpage-box-title">Performance</div>
|
|
<div id="performance-container">
|
|
<div id="performance-inside-box">
|
|
<div id="performance-title">CPU Usage</div>
|
|
<div id="cpu-usage-container">
|
|
<span style="color: white;">%{{ cpuUsage }}</span> of {{ cpuCount }}x {{ cpuMhz }} MHz
|
|
|
|
<div id="cpu-progress-bar-full">
|
|
<div id="cpu-progress-bar-line" :style="{ 'width': String(cpuUsage)+'%' }"></div>
|
|
</div>
|
|
</div>
|
|
<div id="cpu-icon-container">
|
|
<div id="cpu-title-container">
|
|
<div id="cpu-title">CPU</div>
|
|
</div>
|
|
</div>
|
|
<div id="memory-usage-container">
|
|
<div id="memory-title">Memory Usage</div>
|
|
<span class="description"><span style="color: white;">%{{ memUsage }} </span>({{ freeMem }}Gb / {{ totalMem }}Gb)</span>
|
|
<div id="memory-progress-bar" style="display: flex; justify-content: right; margin-right: 1.6667vh;">
|
|
<div id="memory-progress-bar-full">
|
|
<div id="memory-progress-bar-line" :style="{ 'width': String(memUsage)+'%' }"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="controls-box" v-if="announcementClicked === false && kickplayersClicked === false">
|
|
<div id="rpage-box-title">Controls</div>
|
|
<div id="controls-box-container">
|
|
<div id="announcement-box" @click="changeControlsMode('Announcement')">
|
|
<div id="controls-boxes-title">Announcement</div>
|
|
<div id="controls-boxes-button">Make Announcement</div>
|
|
</div>
|
|
|
|
<div id="kickplayers-box" @click="changeControlsMode('KickPlayers')">
|
|
<div id="controls-boxes-title">Kick Players</div>
|
|
<div id="controls-boxes-button">Kick All Players</div>
|
|
</div>
|
|
</div>
|
|
|
|
<span style="margin-left: 2.3148vh; font-size: .7813vw;">Quick Console</span>
|
|
|
|
<div id="console-container">
|
|
<input type="text" placeholder="Start, stop, restart or ensure any resource..." v-model="executeCommandInput" id="executeCommandInput">
|
|
<div id="console-button" @click="executeCommand()"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="controls-box" v-if="announcementClicked === true" class="announcement">
|
|
<div id="announcement-mod-title">
|
|
<span style="margin-left: 2.3148vh;">Announcement</span>
|
|
<span style="margin-right: 2.2222vh;">Description</span>
|
|
</div>
|
|
|
|
<div id="text-box-area">
|
|
<textarea name="" id="" cols="30" rows="10" placeholder="Type your annoucement in here..." v-model="announcementInput"></textarea>
|
|
</div>
|
|
|
|
<div id="action-buttons-container">
|
|
<div id="action-button" @click="makeAnnouncement()">Make Announcement</div>
|
|
<div id="go-back-button" @click="changeControlsMode('Back')"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="controls-box" v-if="kickplayersClicked === true" class="kickplayers">
|
|
<div id="rpage-box-title">Kick Players</div>
|
|
|
|
<div id="text-box-area">
|
|
<div id="text-box-text">Are you sure to kick all players ?</div>
|
|
</div>
|
|
|
|
<div id="action-buttons-container">
|
|
<div id="action-button" class="kickplayers" @click="kickAllPlayers">Yes, kick all players.</div>
|
|
<div id="go-back-button" @click="changeControlsMode('Back')"></div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div id="rpage-right-container">
|
|
<span class="title">Onlines Overview</span>
|
|
<div id="rpage-right-categories" v-if="accountType === 'Roleplay'">
|
|
|
|
<div id="category-item" :class="{ active: inCategory === 'Admins' }" @click="changePlayerType('admin', 'Admins')">
|
|
<svg xmlns="http://www.w3.org/2000/svg" width=".7292vw" height=".8333vw" viewBox="0 0 14 16" fill="none">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.85487 0.00879439C6.03416 0.229404 0.312872 1.9054 0.239787 1.94659C0.183104 1.97855 0.105958 2.04445 0.0683759 2.09298L0 2.1813V5.89283C0 8.76935 0.00932256 9.6517 0.0414154 9.81464C0.351299 11.3885 1.65034 12.9091 3.97054 14.414C5.07696 15.1316 6.73566 16 7 16C7.26434 16 8.92303 15.1316 10.0295 14.414C12.3497 12.9091 13.6487 11.3885 13.9586 9.81464C13.9907 9.6517 14 8.76935 14 5.89283V2.1813L13.9316 2.09298C13.894 2.04445 13.8169 1.97855 13.7602 1.94659C13.6328 1.87472 7.22852 0.0210227 7.04872 0.00394686C6.97726 -0.00283969 6.89001 -0.000650482 6.85487 0.00879439Z" fill="white"/>
|
|
</svg>
|
|
{{ adminsCount }}
|
|
</div>
|
|
|
|
<div id="category-item" :class="{ active: inCategory === 'Polices' }" @click="changePlayerType(jobs.LSPD.job, 'Polices')">
|
|
<svg xmlns="http://www.w3.org/2000/svg" width=".8333vw" height=".8333vw" viewBox="0 0 16 16" fill="none">
|
|
<path d="M9.36405 6.5148C9.36405 7.63783 8.30155 7.63783 7.72897 7.63783H7.01505V5.51478H7.91221C8.41394 5.51478 9.36405 5.51478 9.36405 6.5148ZM14.8484 5.39378C14.9543 4.25109 15.3326 3.2024 16 2.24105L13.4403 0C12.6315 0.609346 11.7111 0.946686 10.6673 1.00635C9.71149 1.08202 8.80404 0.923019 7.95221 0.528344C7.07562 0.910352 6.17275 1.07002 5.23139 1.00635C4.25766 0.930019 3.37917 0.628013 2.5921 0.0926686L0.0251903 2.33272C0.656442 3.30774 1.00807 4.32842 1.0774 5.39378C1.11017 5.88446 0.950162 6.5598 0.591297 7.43282C0.403484 7.91683 0.261386 8.33684 0.164622 8.68751C0.0750962 9.03586 0.0190949 9.31919 0.000427867 9.5312C-0.0129057 10.4616 0.285386 11.3016 0.896828 12.0479C1.37455 12.5929 2.16238 13.1946 3.2565 13.853C4.45347 14.3863 5.37997 14.7326 6.02874 14.88L6.56666 15.0986C6.73581 15.17 6.91714 15.239 7.10648 15.3143C7.51449 15.5283 7.80135 15.7607 7.95221 16C8.13736 15.741 8.43032 15.5147 8.81966 15.3143C9.09471 15.2097 9.32748 15.1183 9.51415 15.0383C9.70082 14.9666 9.83987 14.9126 9.92064 14.8796C10.0589 14.8193 10.2406 14.7506 10.4605 14.6746C10.6826 14.5983 10.9565 14.5046 11.2837 14.4013C11.9161 14.205 12.3763 14.02 12.6689 13.8526C13.7299 13.1943 14.5055 12.6026 14.9992 12.0729C15.6324 11.3232 15.9398 10.4796 15.9257 9.53086C15.8884 9.10619 15.683 8.42651 15.3101 7.50049C14.9543 6.59914 14.7965 5.89912 14.8484 5.39378ZM10.1435 8.46384C9.53587 8.81185 8.70042 8.81185 8.26422 8.81185H7.0661V11.6806H5.26454V4.32176H7.82192C9.01052 4.32176 10.0044 4.38876 10.6947 5.12511C11.1256 5.59378 11.1984 6.12613 11.1984 6.50447C11.1976 7.36149 10.7942 8.08484 10.1435 8.46384Z" fill="white"/>
|
|
</svg>
|
|
{{ policesCount }}
|
|
</div>
|
|
|
|
<div id="category-item" :class="{ active: inCategory === 'Meds' }" @click="changePlayerType(jobs.EMS.job, 'Meds')">
|
|
<svg xmlns="http://www.w3.org/2000/svg" width=".7813vw" height=".8333vw" viewBox="0 0 15 16" fill="none">
|
|
<path d="M9.00334 0H5.94452V16H9.00334V0Z" fill="white"/>
|
|
<path d="M13.2189 2.23438L9.63721 4.65921V8.36836L14.9346 4.74745L13.2189 2.23438Z" fill="white"/>
|
|
<path d="M1.71569 13.7655L5.29739 11.3406V7.63147L0 11.2524L1.71569 13.7655Z" fill="white"/>
|
|
<path d="M9.63721 9.1436V11.3397L13.2189 13.7645L14.9346 11.2514L10.7549 8.39197L9.63721 9.1436Z" fill="white"/>
|
|
<path d="M0 4.74745L4.17974 7.60692L5.29739 6.85529V4.65921L1.71569 2.23438L0 4.74745Z" fill="white"/>
|
|
</svg>
|
|
{{ medsCount }}
|
|
</div>
|
|
|
|
<div id="category-item" :class="{ active: inCategory === 'Mechanic' }" @click="changePlayerType(jobs.Mechanic.job, 'Mechanic')">
|
|
<svg xmlns="http://www.w3.org/2000/svg" width=".7813vw" height=".7292vw" viewBox="0 0 15 14" fill="none">
|
|
<path d="M10.5906 7.76999C10.4792 7.66602 10.3311 7.60878 10.1735 7.60878C10.016 7.60878 9.86787 7.66602 9.75648 7.76999L9.24433 8.24798L8.4932 7.54694L10.795 5.39879C11.1662 5.5478 11.5694 5.62662 11.9855 5.62662C11.9856 5.62662 11.9855 5.62662 11.9856 5.62662C12.7925 5.62662 13.5507 5.33285 14.1204 4.79954C14.898 4.07154 15.1881 3.00591 14.8775 2.01846C14.8595 1.96102 14.8102 1.91671 14.7481 1.90195C14.686 1.88713 14.62 1.90412 14.5747 1.94655L12.6763 3.72374C12.5624 3.68062 12.2754 3.53359 11.7442 3.03929C11.213 2.545 11.0544 2.27756 11.0078 2.17132L12.9061 0.394031C12.9514 0.351605 12.9693 0.290066 12.9534 0.232082C12.9373 0.174099 12.8897 0.128265 12.8281 0.111571C12.5545 0.0375362 12.2709 0 11.9853 0C11.1784 0 10.4203 0.293671 9.85073 0.826981C8.95677 1.66394 8.74631 2.89878 9.21671 3.92391L6.91395 6.07305L4.55705 3.87334C4.55498 3.86958 4.55355 3.86573 4.55128 3.86203L3.47396 2.13828C3.45533 2.10849 3.43003 2.08296 3.39971 2.0633L1.58237 0.886446C1.48188 0.821351 1.34598 0.832809 1.25957 0.913462L0.44991 1.66912C0.363441 1.74978 0.35127 1.87666 0.420964 1.9704L1.68191 3.66654C1.70298 3.69484 1.73033 3.7185 1.76224 3.73584L3.60922 4.74131C3.61329 4.74353 3.61758 4.74516 3.62176 4.74714L5.97813 6.94636L4.20492 8.60131C3.83365 8.4523 3.43056 8.37348 3.01441 8.37348C2.2074 8.37348 1.44923 8.6672 0.879558 9.20056C0.101969 9.92856 -0.188132 10.9942 0.122501 11.9815C0.140547 12.039 0.189761 12.0833 0.251941 12.0981C0.314068 12.1128 0.380004 12.0959 0.425303 12.0535L2.32371 10.2762C2.43765 10.3194 2.72463 10.4665 3.25577 10.9607C3.78708 11.455 3.94562 11.7224 3.99219 11.8286L2.09389 13.6059C2.04859 13.6483 2.03065 13.7099 2.04663 13.7679C2.06266 13.8259 2.11024 13.8717 2.17189 13.8883C2.44548 13.9624 2.72902 14 3.01467 14C3.82153 14 4.57964 13.7063 5.14921 13.173C5.71766 12.6407 6.03004 11.9338 6.02882 11.1823C6.02819 10.7951 5.94368 10.4201 5.7845 10.0748L7.55738 8.4202L8.30851 9.12124L7.79642 9.59918C7.68503 9.7032 7.62364 9.84144 7.62364 9.98847C7.62364 10.1356 7.68497 10.2737 7.79637 10.3777L11.4141 13.7541C11.5255 13.8581 11.6736 13.9153 11.8311 13.9153C11.9886 13.9153 12.1368 13.8581 12.2482 13.7541L14.2081 11.9249C14.3196 11.8209 14.3809 11.6827 14.3809 11.5356C14.3809 11.3886 14.3196 11.2503 14.2082 11.1464L10.5906 7.76999ZM11.8711 12.5531C11.7422 12.6735 11.5332 12.6735 11.4043 12.5531L9.08335 10.3869C8.95444 10.2667 8.95444 10.0716 9.08335 9.95128C9.21226 9.83097 9.42124 9.83097 9.55015 9.95138L11.8711 12.1175C12 12.2377 12 12.4328 11.8711 12.5531ZM12.9213 11.5729C12.7925 11.6932 12.5834 11.6932 12.4545 11.5729L10.1337 9.40671C10.0048 9.28645 10.0048 9.09136 10.1336 8.97109C10.2625 8.85078 10.4716 8.85078 10.6004 8.97109L12.9213 11.1373C13.0502 11.2576 13.0502 11.4526 12.9213 11.5729Z" fill="white"/>
|
|
</svg>
|
|
{{ mechanicsCount }}
|
|
</div>
|
|
|
|
<div id="category-item" :class="{ active: inCategory === 'Players' }" @click="changePlayerType(jobs.Unemployed.job, 'Players')">
|
|
+ {{ otherCount }}
|
|
</div>
|
|
</div>
|
|
<span style="font-family: 'SF Pro Rounded'; justify-content: start; display: flex; font-size: .6771vw; margin-top: 1.3889vh; opacity: 0.38;">
|
|
{{ inCategory }}
|
|
</span>
|
|
<div id="rpage-right-players" :style="{ 'max-height': accountType === 'Roleplay' ? '47.0741vh' : '52.6852vh' }">
|
|
|
|
<div id="player-container" @click="inspectPlayer(data.uid)" v-for="data in toShowPlayers" v-if="inCategory === 'Admins'">
|
|
<div id="id-box">{{ data.id }}</div>
|
|
<div id="seperate-line"></div>
|
|
<div id="player-name">{{ data.name }}</div>
|
|
<div id="player-job-icon-container">
|
|
<div id="player-job-icon" style="background-image: url(img/adminIcon.png);"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="player-container" @click="inspectPlayer(data.uid)" v-for="data in toShowPlayers" v-if="inCategory === 'Polices'">
|
|
<div id="id-box">{{ data.id }}</div>
|
|
<div id="seperate-line"></div>
|
|
<div id="player-name">{{ data.name }}</div>
|
|
<div id="player-job-icon-container">
|
|
<div id="player-job-icon" style="background-image: url(img/policeIcon.png); width: 1.4815vh;"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="player-container" @click="inspectPlayer(data.uid)" v-for="data in toShowPlayers" v-if="inCategory === 'Meds'">
|
|
<div id="id-box">{{ data.id }}</div>
|
|
<div id="seperate-line"></div>
|
|
<div id="player-name">{{ data.name }}</div>
|
|
<div id="player-job-icon-container">
|
|
<div id="player-job-icon" style="background-image: url(img/emsIcon.png); width: 1.3889vh;"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="player-container" @click="inspectPlayer(data.uid)" v-for="data in toShowPlayers" v-if="inCategory === 'Mechanic'">
|
|
<div id="id-box">{{ data.id }}</div>
|
|
<div id="seperate-line"></div>
|
|
<div id="player-name">{{ data.name }}</div>
|
|
<div id="player-job-icon-container">
|
|
<div id="player-job-icon" style="background-image: url(img/mechanicIcon.png); width: 1.4815vh; height: 1.4815vh;"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="player-container" @click="inspectPlayer(data.uid)" v-for="data in toShowPlayers" v-if="inCategory === 'Players'">
|
|
<div id="id-box">{{ data.id }}</div>
|
|
<div id="seperate-line"></div>
|
|
<div id="player-name">{{ data.name }}</div>
|
|
<div id="player-job-icon-container">
|
|
<div id="player-job-icon"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script src="../../components.js"></script>
|
|
<script src="main.js"></script>
|
|
</body>
|
|
</html> |