1325 lines
80 KiB
HTML
1325 lines
80 KiB
HTML
<!doctype html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>智能成本预测系统</title>
|
||
<style>
|
||
:root {
|
||
color-scheme: dark;
|
||
--bg: #111017;
|
||
--panel: rgba(34, 30, 38, 0.84);
|
||
--panel-strong: rgba(45, 38, 47, 0.94);
|
||
--line: rgba(240, 179, 90, 0.22);
|
||
--text: #fff8ec;
|
||
--muted: #b9aa99;
|
||
--cyan: #f0b35a;
|
||
--blue: #9d6cff;
|
||
--mint: #ff7a59;
|
||
--amber: #ffd36a;
|
||
--pink: #ff5d8f;
|
||
--shadow: 0 24px 70px rgba(0, 0, 0, 0.38);
|
||
}
|
||
|
||
* {
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
body {
|
||
min-width: 320px;
|
||
margin: 0;
|
||
overflow-x: hidden;
|
||
color: var(--text);
|
||
font-family: "Microsoft YaHei", "PingFang SC", "Segoe UI", Arial, sans-serif;
|
||
background:
|
||
radial-gradient(circle at 12% 18%, rgba(240, 179, 90, 0.20), transparent 28%),
|
||
radial-gradient(circle at 82% 10%, rgba(157, 108, 255, 0.22), transparent 32%),
|
||
radial-gradient(circle at 78% 82%, rgba(255, 122, 89, 0.13), transparent 28%),
|
||
linear-gradient(135deg, #111017 0%, #1b1620 45%, #121018 100%);
|
||
}
|
||
|
||
body::before {
|
||
position: fixed;
|
||
inset: 0;
|
||
z-index: -1;
|
||
content: "";
|
||
background-image:
|
||
linear-gradient(rgba(240, 179, 90, 0.07) 1px, transparent 1px),
|
||
linear-gradient(90deg, rgba(240, 179, 90, 0.07) 1px, transparent 1px);
|
||
background-size: 42px 42px;
|
||
mask-image: linear-gradient(to bottom, rgba(0,0,0,0.9), rgba(0,0,0,0.18));
|
||
}
|
||
|
||
button,
|
||
select {
|
||
font: inherit;
|
||
}
|
||
|
||
.shell {
|
||
width: min(1480px, calc(100% - 36px));
|
||
margin: 0 auto;
|
||
padding: 28px 0 36px;
|
||
}
|
||
|
||
.topbar {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
gap: 18px;
|
||
padding: 14px 0 24px;
|
||
}
|
||
|
||
.brand {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 13px;
|
||
min-width: 0;
|
||
}
|
||
|
||
.brand-mark {
|
||
position: relative;
|
||
width: 42px;
|
||
height: 42px;
|
||
border: 1px solid rgba(240, 179, 90, 0.46);
|
||
border-radius: 12px;
|
||
background: linear-gradient(135deg, rgba(240, 179, 90, 0.24), rgba(255, 93, 143, 0.18));
|
||
box-shadow: 0 0 28px rgba(240, 179, 90, 0.24);
|
||
}
|
||
|
||
.brand-mark::before,
|
||
.brand-mark::after {
|
||
position: absolute;
|
||
inset: 10px;
|
||
content: "";
|
||
border: 1px solid rgba(255, 122, 89, 0.72);
|
||
border-radius: 8px;
|
||
}
|
||
|
||
.brand-mark::after {
|
||
inset: 17px;
|
||
border-radius: 50%;
|
||
background: var(--mint);
|
||
box-shadow: 0 0 18px var(--mint);
|
||
}
|
||
|
||
.brand strong {
|
||
display: block;
|
||
font-size: 20px;
|
||
letter-spacing: 0;
|
||
}
|
||
|
||
.brand span {
|
||
display: block;
|
||
margin-top: 3px;
|
||
color: var(--muted);
|
||
font-size: 12px;
|
||
}
|
||
|
||
.hero {
|
||
position: relative;
|
||
display: grid;
|
||
grid-template-columns: minmax(0, 1fr) 380px;
|
||
gap: 24px;
|
||
align-items: stretch;
|
||
min-height: 300px;
|
||
margin-bottom: 22px;
|
||
}
|
||
|
||
.hero-main {
|
||
position: relative;
|
||
min-height: 300px;
|
||
padding: 38px;
|
||
overflow: hidden;
|
||
border: 1px solid rgba(240, 179, 90, 0.2);
|
||
border-radius: 26px;
|
||
background:
|
||
linear-gradient(135deg, rgba(45, 38, 47, 0.94), rgba(18, 16, 24, 0.78)),
|
||
radial-gradient(circle at 76% 20%, rgba(240, 179, 90, 0.20), transparent 34%);
|
||
box-shadow: var(--shadow);
|
||
}
|
||
|
||
.hero-main::after {
|
||
position: absolute;
|
||
right: 28px;
|
||
bottom: 24px;
|
||
width: 260px;
|
||
height: 160px;
|
||
content: "";
|
||
opacity: 0.7;
|
||
background:
|
||
linear-gradient(90deg, transparent 0 18%, rgba(240, 179, 90, 0.36) 18% 19%, transparent 19% 34%, rgba(255, 122, 89, 0.32) 34% 35%, transparent 35%),
|
||
linear-gradient(0deg, transparent 0 38%, rgba(157, 108, 255, 0.30) 38% 39%, transparent 39% 68%, rgba(255, 93, 143, 0.26) 68% 69%, transparent 69%);
|
||
clip-path: polygon(0 50%, 18% 12%, 36% 54%, 52% 30%, 68% 74%, 84% 18%, 100% 46%, 100% 100%, 0 100%);
|
||
filter: drop-shadow(0 0 18px rgba(240, 179, 90, 0.30));
|
||
}
|
||
|
||
.hero-main > :not(.hero-visual):not(.scanline) {
|
||
position: relative;
|
||
z-index: 2;
|
||
}
|
||
|
||
.hero-visual {
|
||
position: absolute;
|
||
right: 64px;
|
||
bottom: 12px;
|
||
width: min(28%, 286px);
|
||
height: 58%;
|
||
z-index: 1;
|
||
pointer-events: none;
|
||
opacity: 0.36;
|
||
}
|
||
|
||
.hero-asset {
|
||
position: absolute;
|
||
display: block;
|
||
object-fit: contain;
|
||
mix-blend-mode: luminosity;
|
||
filter: grayscale(1) brightness(2.1) contrast(0.18)
|
||
drop-shadow(0 0 12px rgba(255, 248, 236, 0.18));
|
||
}
|
||
|
||
.hero-asset.launcher {
|
||
right: 0;
|
||
bottom: 0;
|
||
width: 100%;
|
||
opacity: 0.42;
|
||
transform: none;
|
||
}
|
||
|
||
.label {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 8px;
|
||
margin-bottom: 20px;
|
||
color: var(--cyan);
|
||
font-size: 13px;
|
||
font-weight: 700;
|
||
letter-spacing: 0;
|
||
}
|
||
|
||
h1 {
|
||
max-width: 820px;
|
||
margin: 0;
|
||
font-size: clamp(38px, 5vw, 64px);
|
||
line-height: 1.05;
|
||
letter-spacing: 0;
|
||
}
|
||
|
||
.hero-copy {
|
||
max-width: 720px;
|
||
margin: 18px 0 0;
|
||
color: #d8c9ba;
|
||
font-size: 17px;
|
||
line-height: 1.8;
|
||
}
|
||
|
||
.hero-actions {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 12px;
|
||
margin-top: 28px;
|
||
}
|
||
|
||
.primary-btn,
|
||
.ghost-btn {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
gap: 8px;
|
||
min-height: 44px;
|
||
padding: 0 18px;
|
||
border-radius: 12px;
|
||
cursor: pointer;
|
||
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
|
||
}
|
||
|
||
.primary-btn {
|
||
border: 1px solid rgba(240, 179, 90, 0.58);
|
||
color: #171013;
|
||
background: linear-gradient(135deg, var(--cyan), var(--mint));
|
||
box-shadow: 0 12px 34px rgba(240, 179, 90, 0.22);
|
||
font-weight: 800;
|
||
}
|
||
|
||
.ghost-btn {
|
||
border: 1px solid rgba(240, 179, 90, 0.28);
|
||
color: var(--text);
|
||
background: rgba(255, 255, 255, 0.04);
|
||
}
|
||
|
||
.primary-btn:hover,
|
||
.ghost-btn:hover {
|
||
transform: translateY(-2px);
|
||
}
|
||
|
||
.hero-side {
|
||
display: grid;
|
||
gap: 14px;
|
||
}
|
||
|
||
.signal-card {
|
||
position: relative;
|
||
min-height: 138px;
|
||
padding: 20px;
|
||
overflow: hidden;
|
||
border: 1px solid rgba(240, 179, 90, 0.2);
|
||
border-radius: 20px;
|
||
background:
|
||
linear-gradient(145deg, rgba(45, 38, 47, 0.86), rgba(21, 18, 25, 0.78)),
|
||
radial-gradient(circle at 88% 18%, rgba(255, 93, 143, 0.18), transparent 36%);
|
||
box-shadow: var(--shadow);
|
||
}
|
||
|
||
.signal-card span {
|
||
display: block;
|
||
color: var(--muted);
|
||
font-size: 12px;
|
||
}
|
||
|
||
.signal-card strong {
|
||
display: block;
|
||
margin-top: 8px;
|
||
font-size: 26px;
|
||
letter-spacing: 0;
|
||
}
|
||
|
||
.signal-card p {
|
||
margin: 10px 0 0;
|
||
color: var(--muted);
|
||
font-size: 13px;
|
||
line-height: 1.55;
|
||
}
|
||
|
||
.signal-meta {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 8px;
|
||
margin-top: 14px;
|
||
}
|
||
|
||
.signal-meta em {
|
||
padding: 5px 8px;
|
||
border: 1px solid rgba(240, 179, 90, 0.22);
|
||
border-radius: 999px;
|
||
color: #ffe2a4;
|
||
background: rgba(240, 179, 90, 0.08);
|
||
font-size: 12px;
|
||
font-style: normal;
|
||
}
|
||
|
||
.layout {
|
||
display: grid;
|
||
grid-template-columns: 310px minmax(0, 1fr);
|
||
gap: 20px;
|
||
}
|
||
|
||
.panel {
|
||
border: 1px solid var(--line);
|
||
border-radius: 22px;
|
||
background: var(--panel);
|
||
box-shadow: var(--shadow);
|
||
backdrop-filter: blur(18px);
|
||
}
|
||
|
||
.panel-header {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
gap: 14px;
|
||
padding: 20px 20px 0;
|
||
}
|
||
|
||
.panel-header h2 {
|
||
margin: 0;
|
||
font-size: 18px;
|
||
letter-spacing: 0;
|
||
}
|
||
|
||
.panel-header p {
|
||
margin: 5px 0 0;
|
||
color: var(--muted);
|
||
font-size: 12px;
|
||
}
|
||
|
||
.controls {
|
||
display: grid;
|
||
gap: 16px;
|
||
align-content: start;
|
||
}
|
||
|
||
.model-list {
|
||
display: grid;
|
||
gap: 10px;
|
||
padding: 18px;
|
||
}
|
||
|
||
.model-option {
|
||
width: 100%;
|
||
padding: 14px;
|
||
border: 1px solid rgba(240, 179, 90, 0.16);
|
||
border-radius: 16px;
|
||
color: var(--text);
|
||
background: rgba(255, 255, 255, 0.035);
|
||
cursor: pointer;
|
||
text-align: left;
|
||
transition: border-color 0.18s ease, background 0.18s ease, transform 0.18s ease;
|
||
}
|
||
|
||
.model-option.active,
|
||
.model-option:hover {
|
||
border-color: rgba(240, 179, 90, 0.66);
|
||
background: linear-gradient(135deg, rgba(240, 179, 90, 0.16), rgba(255, 93, 143, 0.10));
|
||
transform: translateX(3px);
|
||
}
|
||
|
||
.model-option strong {
|
||
display: block;
|
||
font-size: 15px;
|
||
}
|
||
|
||
.model-option small {
|
||
display: block;
|
||
margin-top: 5px;
|
||
color: #b9aa99;
|
||
font-size: 12px;
|
||
}
|
||
|
||
.scenario {
|
||
padding: 18px;
|
||
}
|
||
|
||
.scenario label {
|
||
display: block;
|
||
margin-bottom: 8px;
|
||
color: var(--muted);
|
||
font-size: 12px;
|
||
}
|
||
|
||
.scenario select {
|
||
width: 100%;
|
||
height: 42px;
|
||
padding: 0 12px;
|
||
border: 1px solid rgba(240, 179, 90, 0.28);
|
||
border-radius: 12px;
|
||
color: var(--text);
|
||
background: #1a151d;
|
||
}
|
||
|
||
.main-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(12, minmax(0, 1fr));
|
||
gap: 18px;
|
||
}
|
||
|
||
.span-12 { grid-column: span 12; }
|
||
.span-8 { grid-column: span 8; }
|
||
.span-6 { grid-column: span 6; }
|
||
.span-4 { grid-column: span 4; }
|
||
|
||
.metrics {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
gap: 12px;
|
||
padding: 18px 20px 20px;
|
||
}
|
||
|
||
.metric {
|
||
padding: 15px;
|
||
border: 1px solid rgba(240, 179, 90, 0.14);
|
||
border-radius: 16px;
|
||
background: rgba(255, 255, 255, 0.035);
|
||
}
|
||
|
||
.metric span {
|
||
display: block;
|
||
color: var(--muted);
|
||
font-size: 12px;
|
||
}
|
||
|
||
.metric strong {
|
||
display: block;
|
||
margin-top: 8px;
|
||
font-size: 24px;
|
||
letter-spacing: 0;
|
||
}
|
||
|
||
.chart-wrap {
|
||
padding: 12px 18px 20px;
|
||
}
|
||
|
||
canvas.chart {
|
||
width: 100%;
|
||
height: 330px;
|
||
display: block;
|
||
}
|
||
|
||
.insight {
|
||
padding: 18px 20px 20px;
|
||
color: #e6d7c7;
|
||
line-height: 1.75;
|
||
}
|
||
|
||
.insight strong {
|
||
color: var(--mint);
|
||
}
|
||
|
||
.factor-list {
|
||
display: grid;
|
||
gap: 12px;
|
||
padding: 18px 20px 20px;
|
||
}
|
||
|
||
.factor {
|
||
display: grid;
|
||
grid-template-columns: 88px minmax(0, 1fr) 52px;
|
||
gap: 10px;
|
||
align-items: center;
|
||
color: #e6d7c7;
|
||
font-size: 13px;
|
||
}
|
||
|
||
.bar {
|
||
height: 9px;
|
||
overflow: hidden;
|
||
border-radius: 999px;
|
||
background: rgba(255,255,255,0.08);
|
||
}
|
||
|
||
.bar i {
|
||
display: block;
|
||
height: 100%;
|
||
border-radius: inherit;
|
||
background: linear-gradient(90deg, var(--cyan), var(--mint));
|
||
box-shadow: 0 0 18px rgba(240, 179, 90, 0.32);
|
||
}
|
||
|
||
.data-table {
|
||
width: 100%;
|
||
border-collapse: collapse;
|
||
margin-top: 6px;
|
||
color: #e6d7c7;
|
||
font-size: 13px;
|
||
}
|
||
|
||
.data-table th,
|
||
.data-table td {
|
||
padding: 12px 14px;
|
||
border-bottom: 1px solid rgba(240, 179, 90, 0.12);
|
||
text-align: left;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
.data-table th {
|
||
color: #b9aa99;
|
||
font-weight: 600;
|
||
}
|
||
|
||
.table-scroll {
|
||
overflow-x: auto;
|
||
padding: 0 18px 18px;
|
||
}
|
||
|
||
.tag {
|
||
display: inline-flex;
|
||
min-height: 24px;
|
||
align-items: center;
|
||
padding: 0 9px;
|
||
border-radius: 999px;
|
||
color: #ffe2a4;
|
||
background: rgba(240, 179, 90, 0.11);
|
||
font-size: 12px;
|
||
}
|
||
|
||
.scanline {
|
||
position: absolute;
|
||
inset: 0;
|
||
pointer-events: none;
|
||
background: linear-gradient(180deg, transparent, rgba(240, 179, 90, 0.08), transparent);
|
||
animation: scan 5s linear infinite;
|
||
}
|
||
|
||
@keyframes scan {
|
||
0% { transform: translateY(-100%); }
|
||
100% { transform: translateY(100%); }
|
||
}
|
||
|
||
@media (max-width: 1100px) {
|
||
.hero,
|
||
.layout {
|
||
grid-template-columns: 1fr;
|
||
}
|
||
.hero-visual {
|
||
right: 44px;
|
||
bottom: 6px;
|
||
width: min(27%, 240px);
|
||
opacity: 0.28;
|
||
}
|
||
.hero-side {
|
||
grid-template-columns: repeat(2, 1fr);
|
||
}
|
||
.span-8,
|
||
.span-6,
|
||
.span-4 {
|
||
grid-column: span 12;
|
||
}
|
||
}
|
||
|
||
@media (max-width: 760px) {
|
||
.shell {
|
||
width: min(100% - 24px, 1480px);
|
||
padding-top: 18px;
|
||
}
|
||
.topbar,
|
||
.hero-actions {
|
||
align-items: flex-start;
|
||
flex-direction: column;
|
||
}
|
||
.hero-main {
|
||
padding: 24px;
|
||
}
|
||
.hero-visual {
|
||
right: 12px;
|
||
bottom: 8px;
|
||
width: 39%;
|
||
opacity: 0.16;
|
||
}
|
||
.hero-side,
|
||
.metrics {
|
||
grid-template-columns: 1fr;
|
||
}
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<main class="shell">
|
||
<header class="topbar">
|
||
<div class="brand">
|
||
<div class="brand-mark" aria-hidden="true"></div>
|
||
<div>
|
||
<strong>智能成本预测系统</strong>
|
||
<span>多模型融合 · 参数感知 · 决策辅助</span>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
<section class="hero">
|
||
<div class="hero-main">
|
||
<div class="scanline"></div>
|
||
<div class="hero-visual" aria-hidden="true">
|
||
<img class="hero-asset launcher" alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAYAAAC+ZpjcAAAACXBIWXMAAAsTAAALEwEAmpwYAAAgAElEQVR4Xuzdd2BV9f3/8dfn3JGbvUOYsgMGMoizWmv92mGHrcKFqrWl1i9CRtkuRCKoCJUlSbC0tXzrzwE3qLVV29pWuqwrZEBEhuyZHbLuPJ/fHxILHwKS5CS59+b1+Ef9PA+gJrl555xzPwcgIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIuoEoS4QERkgMTLUPHpQqLjabEKGpmnDLZqMMGkixCKEBRp0qxDuVq+uu3zS6/ZJn67D2eyWfzjW5F2l/mZERIHGrC4QEXWFxYJrRkaav20yiRuSwkyDB0aah8WGmiwxNg0xNu0Lf5qrOOlp+sOnLavVdSKiQMQBi4i6zAaMGJFovdME3D5hgHXEiBhzbFSIBrP2RePUuXw68OGJtu31rb7fq42IKBBxwCKizgq9LNL0zdgw88zBUeaskbHm+GHR3Xsp+bjWc/pUk75SXSciClTde1Ukon7DCowbHm++OyrE9L0JSdZxl0WbTRFWTT2s03QJVJx0/bve5XtTbUREgYoDFhFdlNWKy+NCLM9mDbJcNi7OOiw5wqQe0i0fHXee/LTR94S6TkQUyDhgEdGFxCUODl9glvjJ1VEi+bqhIWrvtvo2HWWn3K82tXn/rTYiokDGAYuIzhOTaPtJfFJE3oDhEZn63tr664Za1UMM8a/Dzh17az2PqetERIGOAxYRfc5mM98QkxT6eEpm0pVJQyJsNcebfdLtjQGMH7AONHic+xvd6wCcUhsRUaDjgEVEADA6eWjk4mEpsd8cNjY2SZzZZcHt8nljLMLwa4MNTh3/OOTcerTR92u1EREFAw5YRP1bRPzAsDnJQ6PuHpkaN9YWZjknambNqgt4YeBrhcsr8dbelvd2Vrl/qDYiomBh2IsmEQWW6LjQaTGJoQtSMhMnRcfbOtxvITzCKo66tWYAMWrrqld3tey/YrD7hu0n1UJEFDw4YBH1M6GhlqtjEkOXjU5PuDZ5WGSE2s8WFmlBk+zcruwX89onLftcuvn6jSUuj9qIiIIJByyi/mNo8tCIhwePjr31spTYQSbTFw9OJrOGiMRQ8Wm9E6Niz7182Fm/39O6//Bp+c0jjS28qZ2Igh4HLKLgFxKXFJ6TNCT8p6MmxF8eFtm5dwQOGhMb/d5/jjaOirVEq+1SuHwSb+xprWzxmG860thWpXYiomDEAYsoiEVGhtwaPcC2KCUjaVLcgLAufb1Hx9lwJNrma3B6EWPr3G9R3eLD2/tb3zvgdN/S0IAGtRMRBasvvkZARAHHYrGkxw+0LR05IeErg0dEdenM09ncTh8q3j7YmJ0Scsm/195ajyw75XZ8cMw5TW1ERMGOAxZRcBmQNDj8/sEjYqZcNj52mMVq3HMDT9c7nUf/ccg7fXz4RW+MB4APjrsaDzZ4V3x4zLlcbURE/QEHLKLgIGKTwu5LSA6fNTotPi0i2vC9QQEAjdXO5lMfHvP+cHRIh9s2+CTw1r6W/VVNuG9XrfMvaici6i84YBEFuPDokK9FxoQsHZ81YFLCwLDO3cHeBQ21Ts+Jj040pNn0xMyB/x3k6lolXt/b/J9Tze7JNa04cdYvISLqdzhgEQWuccnDovKHj4u9eeiYmHg19iRnqxdHd9fVNB5tskQKKU6ddiME4vVD9e671WOJiPojDlhEgSc2fmDEvMEjou4YPj52VEgn39lnpOMHGp27Sqr2NtW51ng8vt+onYiov+KARdRN9uy0KRrMlZuLtu9Sm9Fi4m0/ih0QPmdsekJmVJxNzb2msdYp95RVlTbWOFfV17S9qHYiov6u7370JQpw0/Iy03VdXwvgRh2+twF8XT3GKKGh5uujk0IfT8lIuippSESo2nuLs9WLA7tqP6063Px81fHm1QCa1GOIiIhnsIg6zZ6XmSh0fZkE7gXw330QhPyeo6Di9f8eaYiRSUMjF182NvaWy8bGDBBa333JHt5TX3N4T8OfTxw6nQ9gr9qJiOi/+u7VmijAzJiRZWkwe3OlwKMAOtqmYB8SvamO/Eq3GrogPHFA+M+ShkX+eERqXEpoePeeA9gd1ceaXbtLq0rqaz2Lnc3Ov6mdiIjOx0uERJdgSu7EW+qldzWAcWo7y2hZY5kDYKUaOiMiLnRqXELIwpTMxEkxCWGa2ntLU4MLeytqKupPNK+vq3H+Su1ERHRhPINFdBH2WWkp0LAaEN9S2wWcNpt9Y19at/OUGr6IJcxyRXxC6OOj0xOuGzgs8gt3S+8pbpcPhz6pO3T8YNOWqqNNKwHUqMcQEdHF8QwWUQfsM7KipdW7BBI5ADqzeWeUx2t6EsBP1XARg5MGRzw8ZEzM94anxA42mfvspBWOftrYeHBX7d9qTzQ96nZjp9qJiOjS8AwW0Vny86FV1mTcCymXAUhS+yXSoetXOTbsKFGDwhI3IDwnaVD4vSMnxqeGR3ZmjjNW7clW7+7SU9ubalyPnT7telPtRETUOTyDRXSGfVbmVyqr9bWAzFBbJ2nQtHUArldDu6iokG9HJtgWp0xKyoofENZnX4ctp93Yt6O2suZUyy/rTrQUAPCpxxARUefxDBb1ez+YmTFcN8mVEpgCA78mhJR3bimqeOnsNasVafHJkUtHpMZ/ZfDI6I7eidgrvB4dh3bXHzu6v+G1qiPNTwI4rh5DRERdZ9g3E6JAc/eCtHBXm3hQAvMB9MTmnUecHvO4328saQWQmDQk8v5BwyPtw8fFXWYJ+e/2Wb3txKGm5k931vyrsaptcWur5yO1ExFR9/XZpQmiPiSm5qbf5WzDcgBD1GigoaFW3/1xCbbjcQMjssekJaRHxISox/Sahpo2fXdp1fa6GteK5rq2YrUTEZFxeAaL+hV7XvpV0OVaQFyrtp4gdV1vqHF6Y5PC+uwO9rYWD/ZX1u2pPtq0qfpEyzoAreoxRERkLA5Y1C/cPiNroGbxLBcQdwPou30QepGuSxze01B1ZF/9GycPNS0FcFA9hoiIegYHLApqt+SNDonwhc+FwMMAItUerE4dbW7bW1b1QUNV2yNtbd5/qZ2IiHoWBywKWvac9NsAPA1gpNqCVWOdE3vLa0rrTznXNtS2/FbtRETUOzhgUdCx506cCKmtAfA/agtWrjYvDuyq3X/ycPOL1ceanwbQqB5DRES9hwMWBY3bcq6KtwjnUinFDPSjd8ge2Vtfd/CThrdPHj79KIA9aiciot7HAYsC3o35N5qTquuyJcQSAHFqD1Y1J1rcu0qqSpsa3I+0NDr/ovYgNxhABD4bpLUzfxUAdABtAJxn/toAwH3m1xAR9RoOWBTQpmSnf10IrAFwudqCVXODC3t3VO+oPdlWVF/V+qzag1BCmAXDh8eGfMUixBU+XR89MMocGqIh0qwJm8kkrBogzZrwury62+mTTpcX7laPz3uo3vPn4y36AvU3JCLqaf3mMgoFl8k/yxij+eQqAN9BP/lBweP24eAndYeP728qrjrW9BSAavWYIDJ4UKTploQw83eiQsSYQVHm4fE2LSzWZkKMTYO4hI/4R8dd1WW1rlfVdSKi3sABiwLKXXlXR7n1tkfgkz8D0HfboveyY/sbT++vrNtWd9K52O12V6g9SJiHxYZ8MzZE/iQh1JSRkmAdMTTaLMyXMEyp2jwSFafc77a14d9qIyLqDRywKCDk50OrrEn7iVt3PgGIAWoPVnWnWny7S6u3N9Y5lzXVu36v9mAQAowdM8A6PcQkJqcmWEcPizFr0SHd2wu2stpdfbDFvVJdJyLqLRywyO/Zs9Ovr6wRayFlltqCVWuTG/t21uyqPdr6q5qqlvUAPOoxAc6WEGa6eUC4aeaIWHPW6DhL8uBIY16O2rw6dte4/9zWhnfVRkTUW4x5RSPqAfbZWcOE17tCAtMgZRcuFAUen1fHod0NJ47ur3/91OHmZQCOqccEushI6/dDdN/6W8dGxA+PNoWGWoz90L531HVgV4N7mbpORNSbOGCR3/nujKywUKvvfun1LpRAmNqD1clDp1v27ax9t7GqbVFrq+dDtQc6i8WSET/Qtsykyy99N1mLGxVr/MvP8dNe/ZNa7yaXC7vVRkTUm4x/hSPqhik5aT8Q8KyQUgxTW7Bqqnfqu0qqyhqqnSsb69o2qz0IJCcOjnhgyMjoyTGJoUPbKk42joq1qMcY4p1DbaX763jvFRH1PQ5Y5BfssyZmQdPWArhebcHObDEfOrS7/gYALWoLcFpsUth9iQPDZ42amDAxItqKmuPNPpvPF60eaIRdNe6Go62+Jfhsk1Eioj7FAYv61B2zJwzweE1PApiOz3bk7ndCI8wjpmSnf6O4qPwVtQWq8OiQr0fHhjyWkjUgKyE57PPTVR63rsdZTKazjzXCkdNe3/vHXM/UnPa9oTYior5g7N2lRJfInp9qRbVlNiAfARCl9n5of7PWcvlb6/e51BBIrFZcHpcclT98fOxNQ0fHxKu95kQLvKXHnbeODrWpratqWn346wHnyx8dd96hNiKivsIzWNTr7Llpt6JKPA0hx6itHxsZqYfNB/CkGgJEXOLg8AUDL4uaNmJ83EirreOXlrAIC/bqmhOAIQNWi1vHX/a3/fOjE647+dMiEfkTviZRr7HnZV4Oqa+BxNfVRgCAZpPQUl4uKD2uBn8Wk2ibHpsY/rOxGQmZUbFfPDd99NaBhuxRlhh1vbN8EnhhR1NJxSn3lQKQaici6ksd/5hJZKA7Z02M9WraY1LXZwLombePBYcIHXI5gB+rwR/ZbOYbYpJCH0/JTLoyaUjEF09WZ8QPjTSVnmxEZnLXn3Tk8Um8trv1/bZT7q9wuCIif8QzWNRj7Ha7SSbuvU8IfSkgzrsfhzqk65Bf2lpY8b4a/Mio5KGRjw5Lif3msLExSeJSnrx8lrYWD3b/7XDDjJSQLp3Fqmn14Y09Le84qz237AMC+p41IgpePINFPWJKTtr/AHvWCGAi5/hO0TQh1gL4EvzvzExE/MCwnyUPjfrxyNS4sbb/vjmwU0LDLYgYFi331DX5xsZZOvWOwn31Hu/7R53P76z23KM2IiJ/wu98ZKhpeRNG6T7T0xD4Hvj51R0/chSWP68u9pXouNCpMYmh96dkJGRGJ4Qasp3G+28cOH3fKEuU9RJ/tw+Pu5v3NbiWbz/mDtQ3AhBRP8JvgGSIW+9JiQwJsz0MiTkw6B1i/dwxW6hMef7pij7dfDQ01HJVTGLostHpCV9KHhYZofbu8Lh92PGngw0zv+BSoS6BP37aeri2Wb+votr1R7UTEfmjTp2eJ+qAsGdnTDdbza9B4hbwsrNRojxeDR9/ePJvauglQ5KHRqwYlZawZMI1yRlRsTarekB3mUwa4i+Lsv7u/drTVyaYbR39tFfv1FG8q7nkWJvra3trfKVqJyLyVx29phFdEntO5rWAvg7AlWojAwicCG9uHLlp08HefPSLNWFAeE7C4PB7R02Ivzws0vC56jxej46Kvx+pH+JxRXx5sM0SbfvsmuGuWlfb+0dcmyurPT9RfgkRkd/jgEWddnte2hCzLp6SwJ3g51BP8ALil2aP6dGXNpbUqLGnREaG3BqVaFs0blLSpLgBYb1+JrLqSFPL0U/qPG2nPabTjU6EC7HiVKv3CfU4IqJA0OsvohS4pk8fbmsNi14odTwggXC1kyH+BqHPcRTs2KGGnmK1WtPikkOWjZoQf8OgEdEXvR+qJ8Ulh4efbnQfbWiue7u5zbekGTiiHkNEFCh49oEuyZTcDLuQciWA4WojQ+yXEgt7+YHPSUmDwx8YPCJmymXjY4dZrH13S+aJg01N+3bW/Ku2um2xp9VTonYiokDDAYsuyp6dkQFNXwspvqI2MkSThFzeorWuvtCDnu3ZqcmQ1hTHhtK/q62rYpPC7ksYEJY9Oi0hLSKm6zuqd1dDdav+SWl1SX1t64rmOvdWtRMRBSoOWNQhe15mInT9cQA/Bd9t2hN0Cfm87rE89MrGkhNqBAB7fqpV1ljmCCkXAXDCYx7r2FjSqB7XGeHRtpsjY6zLxmclTUoYGN7zd7BfQFuLB5/urNlddbzlN7XHW54B0KYeQ0QUyHgPFp1jxowsS73FmwddXwygz+7HCWoC70FgdvH6ig/U1M6em3YrqsUqATn6zFKUtHqXAJh39nGdkJI8NOKx4ePjbx46JqbPHluk+yQO76k/eXhvw5unjjQtA3BQPYaIKBjwDBZ9bmpOxrck5GoAKWojQxwTAg9uKSh/ARd4DM7knPRUDVgD4GtqA+CGLtMcGyp2q+EiYhIGR8wbOCzizhHj40eFhPbdz1Snjja17imrfr+xqu3Rtjbvv9RORBRM+u7VlvzG5NyJ4zTdtFpC3qI2MkSbAFaFhMqnLrQzu31uahw85scgMRMX/rq0QsNqAN9WQ0di4m0/ih0QPmdsekJGVFyH+3j2isY6p9xTVlPaWN2yur7G+YLaiYiCUZ+96FLf+/6cjBirR18iIXIAdO3JvXQxEhBbTT4sfPnZsoNqBAC73W4SSXtnSuiPAeKSLt0JiG9vKSx7U11vFxpqvj46KfTxsRlJVw4YEhGm9t7iavNi/8e1n5483PxCzfHm1QC6df8YEVEg4YDVD9ntdpNM3HOvEFgGIFHtZIgy6Nqci73zb2pe5s1S6msgMUFtX2B3rMc8cePGEo+yPmLA0MjFw8bGfmvY2JgBmtZ3X96H99TXHNxT9/apQ835APaonYgo2F3oUgQFqSm5GTdC7lkrgHS1kSGqIcQjqQllv8rPh65GAJiWN2GUrmurpK7fiq79kJPSYPbm4rN7tQAgLHFA+OyEYeE/HpWakBIa3ncnI2uON7t2lVRtb6j1LHa2OP+qdiKi/qIrL+4UgH4wM2O4zySfBnA7+HHvCW4pUOg1i6WvrS1rUCMA3HpPSqQ11LZIAHMAdHfzqQZo2ti3Xqi8IS4h7IGUzMSsmISwzx7i1weaGlzYW1FTUV/VWlh3qnWj2omI+ht+ow1ydy9IC3e24iEIMQ9AqNrJCPJN6Jh3kXf3iSm56dOFxJMAktXYVTUnWo54XHrMwOGRkWrrLR6XDwc/qTt0/GCTo+po00oA1eoxRET9EQes4CXsOek/BLAcwGA1kiE+kUKfV1yw4y01tJuSnfElIfR1gLhCbYHu2P7GxgOVtdtqT7oWu93uXnt2IhFRIOCAFYTseelXQWIdJK5RGxmiQUgsjfGaCzq40RwAcHte2hCTjhWAuANB9nVWe6rVu3t71famGufS06ddb6idiIiC7IW/v/tBbuYgHXK5lPKHAPrsfpwg5hPAr6SmLXasL+3wUph97rWhcLcuBHA/gHC1B7KWJjf27aitrDnZ8su6Ey1FADocLomIiANWULglb3RIuB42T0A8BKDP7scJcts0TZuzeX1puRraTc1JnyqBlQAuU1sg83l1HNxdf+zo3obXq441PwHgmHoMERGdiwNWgJuSnX67EPg5gJFqI0MchJQLHUUVxWpoNzkvPVPzYR0Evqy2QHfycFPzvvKafzfWtC1ubfV8qHYiIuoYB6wANXnWhDRNM60BcJPayBDNEOKp8OaGVZs2HXSqEQBum5mWZDFpT0jInwAwqT2QNdS06btLq7bX1bhWNte1OdROREQXxwErwNwxIyvBa/EtBeT/ghvF9gRdSrwodDzoeLa8w0th9vxUq6wy5wmBxQCi1R7I2lo82F9Zt6f66On/qz7Rug5Ah89OJCKii+OAFSBuzL/RnFhTlwMplgCIVTsZ4gNNl7M3b6h4Tw3tpuSkf0cAqwCMVVsgk7rE4T0NVYf31r958nDTUgAH1GOIiOjSccAKAFNz078hpVwDiPFqI0Mcl1I+VFxU8TwAqUYAmJY9abwufGsAfENtga7qaHPbntKqD+ur2h5xOr3/VDsREXUeByw/Ni0nfaz+2dmSb4Mfq57gFBBrpPQ86SiqbFYjANw5a2KsR5iWQMhsAH33kL8ecLrOiT3lNaX1p1rWNtQ6f6t2IiLqOn7T9kN35V0d5dGdj0ogD4BV7dRtEgKv6j594dYNO/arEQDsdrsJSbtnAGIpgAS1BzKX04sDH9cdOHmw6YXqE82rAHT47EQiIuo6Dlh+JD8f2s7qtHsExOMABqidjCAqIPS5joKKv6mlnT037SZIbQ0g09QW6I7sa6g9uKv+rycPn14C4BO1ExGRMThg+YkpeWlfFrpYC2CS2sgQNYB8FFUpGx0Oh0+NAGDPTRsBiKchcRuC7Guj5kSLe9f2qu1N9a5HWxpdb6udiIiMFVTfRAKRfXbWMHi8KyEwFfx49AQPpCiySN9jL27YUa9GALBnp0YIYXlYQs4FYFN7IGtudGFvRe2O2pMtG+qrWjeonYiIegb3Ueoj352RFWazeB+A17sAAmFqJ0P8SZOmuZuLtu9SwxliSnba3RBiuYQcpMZgcOJgY/G+iuocAFVqIyKinsMzJn1ganbaHVKIFQCGqo0MsUcC84sLy/+ghnbTZqVdo2tiLYCr1RZUBHZWJ8Rmbsvf5lUTERH1HJ7B6kWTczOv0KS+VgLXqY0M0Sgllokk7/ri/Eq3GgHAPjN9sNTwlC5wJwBN7UFHYkJiVf1MAAVqIiKinsMzWL3Anp2aLIT5SQn8GP3hm3rv8wmI33h8+qJXn63o8FLY9OnDbS0RMfMh5YMAItQe3GQtrL6xjjWVdWohIqKewTNYPcien2qVNZY5kHKRBKLUTkYQ/9A1OWfr+rJStZxhueWulLubQ0OWCCmHqbF/EPHwmB/DZ/uqERFRL+AZrB4yJSfjewLyaQCj1UaGOCSA+7cUlm9RQ7tpeZnpbc3uF0PCzJerrR/y6kDG1sLySjUQEZHxeAbLYJNz0lM1YA0gv6Y2MkQLgJWwhv18y5r/tKkRAOx5mYlC15fpun5vSJjZpPZ+yqxJuRYAPy+JiHoBz2AZxD43NQ4e82OQmAkOrj1BAvIln4YHXllfcVSNADBjRpalwezNlQKPAohROwES4vvFhWW/U9eJiMhYHLC66cb8G82JVfUzIWQ+IOLVTkaQH0mpzS4uKntXLe2m5E68RUhtNYBxaqOziU+btebUt9bvc6mFiIiMwzMt3TA1L/NmWVO/BgITOKv2AIETElhUXFCxCYBUMwDYZ6WlQMNqSPEttVFH5KhIPXwOgBVqISIi43Aq6IJpeRNG6bq2ChC3gv8Pe4JLAmvdbc4nXn9ud5MaAcA+IytaWr1LhEQOAKva6aKaIL1jHUWVJ9VARETG4BmsTrj1npRIa6htka5jDoAQtVO3SUj8TjP5Fmxev/NTNQJAfj60ypqMeyG9y4REktrpkkRCmJcD+IkaiIjIGDz7cmnElNz06ULiSQDJaiQDCOwUQpu7ZX3pX9TUzj4r8yvQ9LUAMtRGnaZrUlyzuajsQzUQEVH38QzWF5iSnfElIfR1kLhCbWQEWSugLZGnxjy7xeHwqRUAfjAzY7hukisl9CngDwVG0XQh1wK4Hhe4v42IiLqO36wu4Pa8tCEmHSsAcQf4/6kneATwrLR68y/0CJe7F6SFu9rEgxKYDyBU7dR9EvLm4sKKv6rrRETUPRwcFPa514bC3boQwP0AwtVOhnhbB+ZeZFdxMTU3/S4psRzAEDWSIT6RQp9XXLDjLTUQEVH3ccA6y9Sc9KkSWAngMrWRIfZByPmOgorX1dDOnpd+FXS5FhDXqo0MUS8hlsZ5TIUbN5Z41EhERMbggAVgcl56pqaLtYC8QW1kiNNSiCdEgmetI7/SrUYAuH1G1kDN4lkuIO4GoKmdus0ngF+ZPOZHXtpYUqNGIiIyVr8esG6bmZZkMuNxIcU9APjMOuPpEthkMfsefmndzlNqBIBb8kaHRPjC50LgYQCRaidDbNM0bc7m9aXlaiAiop7RLwesGTOyLHVm78+EwGIA0WonQ/wbuj7bsWFHiRra2XPSbwPwNICRaiNDHBBCLtxSULFVDURE1LP63YA1JSf9OwJYBWCs2sgQR4SUD2wpqnhJDe3suRMnQmprAdykNjJEM4R4Kry5YdWmTQedaiQiop7XbwasadmTxuvCtxrAN9VGhmgVQvy8zW1a+fuNJa1qBIDbcq6KtwjnUinFDHAPtp6gA3jBJLQHXy4oPa5GIiLqPWsFtS8AACAASURBVEE/YH1/TkaMxY18CJkNwKJ26jYpgM3SbH7Asa7ksBoB4Mb8G81J1XXZEmIJgDi1kyHe13Q5Z/OGivfUQEREvS9oByy73W4SA/b8r5RYBiBB7WQAIUqgyzmOovJ/qand1Nz0b0iJ1QAuVxsZ4riU8qHioornwR3ZiYj8RlAOWFOz078qhVgLyDS1kSFOQchFqQkVv8nPh65GAJj8s4wxmk+uAvAdBOnnWR9zSojVQnqWO4oqm9VIRER9K6i+8dlz00YA4mlI3IYg+2/zEy5APmPVQh9/Yf37p9UIAHflXR3l8rkWCyF/BsCqduo2CYFXAbnAUVBxQI1EROQfgmIIsWenRkhheUhAzgNgUzt1mwTwB90k5m99pmyvGgEgPx9aZU3aTyDFEwAGqJ2MICqElHO2FJW/oxYiIvIvgT5giSnZaXcLIZYDGKRGMsTHUmJucVH5n9XQbkpe2peFLtYCmKQ2MkSNEFgsT439pcPh8KmRiIj8T8AOWJNz0q7WINYBuFptZIg6KZBfkxC7YVv+Nq8aAcA+O2sYPN6VEJiKAP5c8mMeSFFkkb7HXtywo16NRETkvwLum+IPcjMH+aT+FIC7wGfW9QSvEHKjR9oefbXwg1o1AsB3Z2SFhVp990spFwIIUzsZ4o+aNM3bXLR9lxqIiMj/BcyANX36cFtreNQ8CfEQgAi1kyH+CqHPdRTs2KGGdlOz0+6QQqwAMFRtZIg9EphfXFj+BzUQEVHgCIgBa2pu2mQpxc8BjFAbGUF8KgQWbCkoe00t7eyzJmZB09YBuE5tZIhGKbEszmt+ZuPGEo8aiYgosPj1gDUtLzNd1/U1AL6qNjJEEySebDa1rHlr/T6XGgHAnp2aLIX5CQFMBy/J9gSfFPI5nxePvPpsRZUaiYgoMPnlgHXHjKwEj9m7TAj8LwCT2qnbdAC/9XnMD7+yseSEGgHAnp9qlTWWOULKRQCi1E5GEP/QNTln6/ryUrUQEVFg86sBa8aMLEudxZcjIB8FEKt2MoL8jya12ZuLyj5USzt7btqtkGIVgNFqI0McEsD9WwrLt6iBiIiCg98MWPbstG9CYDUgxquNDHFUSvFgcVHZi7jAM+sm56SnasAaAF9TGxmiBcBKWMN+7ljznzY1EhFR8OjzAWtaTvpYXWA1JL6tNjJEmxR4OtQmVzz/dEWLGgHAPjc1Dh7zY5CYCcCsduo2CciXfBoeeGV9xVE1EhFR8OmzAcs+IysaFu+jAHLBZ9b1BCmAYi+0ha8Ulh5SIwDY7XaTSNo7U0J/DBDxaicjyI+k1GYXF5W9qxYiIgpevT5g5edD+7gq46dSyMcBJKmdDCBRKoQ+Z0vhjn+oqd3UvMybpdTXQGKC2sgAAicksKi4oHwTLnBJloiIglevDlhTcybeIKW2FgKZaiNDVAkpHrk8qezX+fnQ1QgA0/ImjNJ1bRUgbkUvf/z7CZcE1rrbnE+8/tzuJjUSEVH/0CvfYG/PybxMg75SAHb00p/Zz7gBFMBjXurYWNKoRgC49Z6USGuobZEA5gAIUTt1mwTk65qmz9+8fuenaiQiov6lR4ed787ICguxeh8UEgsAhKqdDCDwhiYxb3Nh+R41nSGm5KZPF8ATkBioRjKAwE4htLlb1pf+RU1ERNQ/9dSAJey5GXdAyhUAhqiRjCB3QWKeo6jij2ppNyU740tC6OsAcYXayAiyVkBbIqvGPOtwOHxqJSKi/svwAWtadsaVupBrAXxJbWSIegmxNM5jKrzQM+tuz0sbYtKxAhB3oAc+xgQvBJ6FxbvEsaayTo1ERESGffO9c9bEWI+mrQbwI/CZdT3BKyV+ZfGaF7+0saRGjQBgn3ttKNytCwHcDyBc7WSIt3Vg7tbC8ko1EBERtTNsU8kmn9Vl07w3g8NVT3hH131ztm7YWaGGdlNz0qdKd+tKAJepjQyxD0LOdxRUvK4GIiIilWFnsADAnptxJ6R8QV2nLjsghFy4paBiqxraTc5Lz9R0sRaQN6iNDHFaCvGESPCsdeRXutVIRETUEUMHLADCnpP+L/D+q+5qFpDLw1pOr9606aBTjQBw28y0JItJe0JC/gSASe3UbboENgnpXeQoqjypRiIioosx7BLhGVKTYo4u5HvgpcKu0AG8YBLagy8XlB5XIwDY81OtssqcJwQWS8hotZMh/g1dn128YUeJGoiIiC6F0WewAAD2nPTfAJiurtNFva9Dzt5aWPG+GtpNyUn/jgBWARirNjLEESHlA1uKKl5SAxERUWcYfQbrM9L7EIR5MoBINdF5jgF4yFFY/v9wgWfWTcueNF4XvjUAvqE2MkSrEOLnbW7Tyt9vLGlVIxERUWf1yBksAJiak/6ABJ5S1+lzTgmxWkjPckdRZbMagTNbXwjTEgiZDcCiduo2CYktsJjvd6wrOaxGIiKiruqZM1gAmrSWtRF6xP8CcpTa+jkJ4BUIubC4oPyAGgHAbrebkLR7hgdiKSAT1E6G2C41Oad4fcU/1UBERNRdPXYGCwCm5mZ8X0r5qrrej5VLIeYUF5RtU0O7qdnpX5VCrAVkmtrIEKck5CMTEiuey8+HrkYiIiIj9OiABQD27LS3IcTN6no/Uy0EHpWnxv7yQs+ss+emjQDE05C4Db3wcemH3FKKZ0JMIcteWP/+aTUSEREZqccuEbbTdMzVTShFL/xZfsgjIAvdFu2x19aWNQDlaoc9OzVCCMvDUsq5AGxqp26TAP6gm8T8rc+U7VUjERFRT+iVMyVTctILBJCjrgc1Kd7SNd+8rQU7PlHTGWJKdtrdQojlAAapkQzxsRCYt6Wg/E9qICIi6km9clbJh5AlZrjuABCntiC0G7qY79hQ9oYa2k2blXaNrom1AK5WGxmiXkDmVyXGFW3L3+ZVIxERUU/rlTNYADAlNz1PSDyjrgeRBgDLYj3m9Rs3lnjUCAD2memDYcJyAHeBO933BC8gfumFdfGrhR/UqpGIiKi39MoZLACoSYjdkFhdfx+AVLUFOB+AX0PTHnGsL61WIwBMnz7c1hIRMx9SPgggQu1kiL9B6HMcBTt2qIGIiKi39doZLACw52R8DZB/Qi//uT1GyL9D1+Y4isrK1NTOnp02BUKsBDBCbWSI/QAWOArLuR0IERH5jV4fdOw5Gb8D5K3qeoA5KIW4v7igzKGGdtPyMtN1XV8L4Ea1UfcJYfLq0vtoi9a6+q31+1xqJyIi6ku9donwc1KbD+H7BoAQNQWAFgk8FdHS+PSmTQedagQAe15motD1Zbqu3wvApHbqLoEQmYAQ38D7f/3s82vUSkRE5A96/QwWAEzNTl8hBe5X1/2YFMCL0ocHHM+WH1MjAMyYkWVpMHtzpcCjAGLUTt1nlhGIwEiYZYTu8/kGbNy4sUY9hoiIyB/0/hksABaT7Qm37vwRgGS1+aEPAW32lsLS/6ih3ZTcibfUS+9qAOPURt2nwYpweRlCZGL70j84XBERkT/rkwHrhfXvn56ak75IAr9Wm98QOCGkeGhLYdlv8dlu4Oexz0pLgYbVkOJbaiNDuMLkkJBQORjirKutfL4lERH5uz4ZsADg8sTyTZU1GdmQMkttfcwJgbXQvU9sKapsViMA2GdkRcPifRRALgCr2qnbJCC2xugTDpsROU+Nuq6/pq4RERH5kz65B6vd1NyM66SU/0Qf/3ucIQG8puv6gq0bduxXIwDk50OrrMm4F1IuA5CkdjJEGXRtjmND6d9nzZq1HUCm0ks2bNhwhbJGRETkV/p0N/EtBWX/lkK8rK73gR0S8muOwvLbLzRc2WdlfqWyOr0EUv4CHK56QjWEuC81sTzLsaH077m5uSNw/nAFIQQvDxIRkd/rs0uE7cy69wGfMH0PQJjaekGNlGKJqB7zi2KHw6dGAPjBzIzhukmulNCnwD/OtAUbtxQo9JrF0tfWljW0byym6/r3zznqDJ/PxwGLiIj8Xp8PWC8X7TwyJTttpRAiX209yCOBDVZdz39xw4564PyN2O9ekBbuahMP+iDnAwhVOxlBvgkd84o3VOw+r0h5m7oGYPcvfvGLXeoiERGRv+nzAQsAREj4Srhb7gHEMLUZTuDPENrc4vWlH6vpDDElO+NOZ5t8CsAQNZIhPhEQ87cUlr+pBgCYOXNmEoDr1fUzlwc7fEcnERGRP/GLAcux5j9t9tz0+yHRc/djSewVkPO3FFb8Xk3t7HnpV0GXawF5rdrIEA1CYmmM11ywcWOJR43thBC3ooPLsbqu8/IgEREFBL8YsADAUVC+2Z6dngOBL6utmxqFkI/LRN8zW/Ir3WoEgNtnZA3ULJ7l0HE3IPr0xv8g5RPAr6SmLd6yvrRajR24XV0AcCw5OfkjdZGIiMgf+c2ABQCakHN0iA9gzDP8fJDYZLb4Fr20bucpNQLALXmjQyJ84XMhvA8DIlLtZIhtmqbN2by+tFwNHcnLy4vyer3/o64DeC0/P19XF4mIiPyRXw1Ymwsrttuz0zdB4Kdq6xSJf2pCztlcVLFdTe3sOem3QcfTEBipNjLEQUi50FFUUayGi/F4PN8SQpy3eaumabw8SEREAcOvBiwAMFt8i7xe0xQA0Wr7YvIwhLjfUVi+WS3t7LkTJ0JqawHcpDYyRLMEVkS0ND69adNBpxq/iKZpt0l53n3s9R6P5x/qIhERkb8670ZifzA1N22BlOLn6vpFtEopV4qQ8JWONf9pUyMA3JZzVbxFOJdKKWbADwfLIKBLiReFjgcdz5YfU+OlmD59ui00NLQaQISS/m/Dhg3TlTUiIiK/5ZeDhkzwPYMq8wwIjFGbQkohXjbr3gdeLtp5RI0AcGP+jeak6rpsCdcSKUWc2skQH2i6nL15Q8V7augMm812M84frnh5kIiIAo5fDliO/Er31Oy0+RLidbV9TogSAcx2FJT9W03tpmSnf11U16+REJerjQxxXEA8vKWw7LcwYH+qC1webLVarX9WF4mILmT8+PEDTSZTiroOoFlKebSysvKkGoiM5peXCNvZc9L/COAbyvJJASy6PLF8U34+OnxX2eSfZYzRfHIVgO/Az/8bA5RTQKyR0vOko6iyWY1dkZ+fbz516tQJAAlKemXDhg2TlTUiogtKTU29Xgj8Myws9JzXJ69X1zxeT4hJMx3xet0rQkJCf11ScuE9+Yi6wy/PYH1O0+ZB18sAWAC4hMQ6p9P5+OvP7W5SDwWAu/KujnL5XIuFT+YBCFE7dZsE8Jqu6wsu9FDsrjp16tR1OH+4AgBeHiSiTnG5XB+Ghto8V1x5TURo6LmPufX5fKivqxu+b9/ep1tammaMGzfua5988kntOQcRGcCI/aZ6zMcfnKy+/KrkBAFxCtL0fUdR2ZbdpbXnbRaanw8tcULaPT7pe00IfB3+PjgGph0Q8k5HYcVTuz6qqldjd11xxRVzhRDXKMteADM++uijTr8bkYj6r7q6Ot/AgQO/FREeOSQqKuqcpmkawsLDMXjIEKvL7Ypva2v7+rhx4547ePBgh1dEiLrK7wcRUTV2nsPh8Knr7abkpX25slqsBTBJbWSIGkA+iqqUjRf7OHSTEEKc93BnIcQ7RUVFhg9zRBT8dN37Zk1NVcbgIUNsagMAIQTGj0+1NtTXj6+trZ0JoEA9hqg7/H7AutA3dfvsrGHweFdCx1TwPque4JHABquu57+4YUc9UKF2w8yaNWsSgPMe9C2lfEVdIyK6FELIbXV1tQ+p66qxKePCSrd/tAhAIQx4sw5RO78fsFTfnZEVFmr13S+93oUQOPfiOhnlT5o0zd1ctH2XGnqClPI2Ic6bkaXP5/udukhEdClaW90f2GwidN++vUhMTEBkZDQ07fxHzcbHJwBATFpa2tiKiordaifqqoAasKZmp90hhXeFlBiqNjLEHgnMLy4s/4MaetIFLg++t3HjxhPqOhHRpRgyZIivtrbmjUMHDww4eGB/ss1mi82clBUeHn7eVnuIjo7x1tbWXgOg1was0aNHR9lsthuklMkAIISo83q9f+cN98EjoAYsKcRkgMNVD2gUQj4uE3zPFOdXnvcmgp40a9asFADn7VMmpeS7B4moy7Zt2+bFZ1v1AICYOHHi3LLS7fnXXX9D5NnHAYAt1GbRNCSr6z0hLS0tRZh8hbpX3GgNla2mEKEBgO6RuqvVHJaekbpd92mzduzYUaL+WgosATVgQciFkOLbADq8aZE6zScgfuPx6YtefbaiSo294QKXByGE4IBFREaR48aNW7dn754HGxoaImNiYs6JFovFCqBHn/SRlZVl8fqcawD9nvihWkjsQE3TzDhn2NN9wOkq/Yqq/fIfaRmpv7OYbPeWlJS0nn0MBY7zL0j7MUdBxQFIuUpdpy6Q+KcGedWWwrL/7avhCuj48iCAnUVFRfvURSKirnI4HD5NiI9bW1vUBAFNSCl6bNuia6+9NtTrc/7JFinuGXmVFho/VNO0Dk5vaCYgZqAmRl9jCouMF7d5fc53MzIyzp0GKWAE1IAFALYwLAfQpYcJEwDIwxD4gaOo/IbNhRXb1dqbZs6cORjAVeo6z14RUU+QUla5XC51uadpLW2n/xoRL64dNtEUaracf8ZepZmAQeNMtphB2ngJzwfDhw/nVZsAFHAD1vNPV7QA+MK33tJ5WgAsgTV8nKOgfLMa+4IQ4vvq2hncnoGIDCeldOp67+4nmpqaervZItIGjTPZOruhUNIIzWqL0AaHh4fPUhv5v4AbsADAUVj+/wC8r65Th6QU4iWT9I13FJYvdaz5T5t6QF+RUnZ0efBgUVFRubpIRBSINA3XRSaKcHX9UkUmIMxsxk3qOvm/Dq4CBwSpQ87WIN5FgA6JvUN+JIQ2x1FQ9m+19LWcnJx4XddvVNfPvHuQm/0RUZCQ5g7ex3PphAA0WNRl8n8BO5xsLax4H8AL6joBAE4K4KepiRVXb/HD4QoAdF3/Djp4FibvvyKioCP5M2N/FKhnsAAAJqE96JP6bQDO3zmuf3IJiXVOp/Px15/b3aRGf3KB7Rmqa2pq3lUXiYgClZQoPV0jW2IGIdwSotaL83okTlfprbpX88sflOniAnrAermg9PjUnLTlEuIJtfUzEpCvQ5oXbCna7vfbGyxYsCC8paXlG+o6gN9d6NmTRESBaOfOj38zMT110P6PvD8zWxASHitCzFZh1UxCaGYJkxkABHQf4PMCulfC65HutgY43U6pQ2CT1RrylPr7kv8L6AELAMJaTq9uCY++F8AItfUTlYCY6ygsf1sN/qq1tfUb6GCzWF3XeXmQiIKN3FFe+TiAJyZMmHCtq1VeJYQ+UtPEGAjECoEIAEKXaAFQLyU+hS72a5pempKSuo0/dAaugB+wNm066Jyam7ZQSlGstiBXB4kl1Umxz27L3+ZVo5+7XV0A0GS1Wv+qLhIRBQm5c+fOdwFc8m0QFRUfq0sUQAJ+wAKALQUVW+056e8A+KragpBXAr8QVu+jjjWVdWr0d3a73SqlbH8+2NneWL9+fa/vAEhEdCkmTpyYBfhGahYxxGTCMCkRByAWgEvXMUA9vqtMJlHj88kEdV1AnHOnvKbJE7oXp3Vd7tF17YiU8kBlZeUHZx9DfSsoBiwA0HXfHE0zbUcH70wLGlL+RdMxd/OzFTvVFCgSExNvlFJGq+t8uDMR+aPRo0eHRESFvGOLlINNFi3JbBE2kwUwmQVMFsBsNfZNgkIIyEv8Dd1tEl6X8Lnb9FboWkO6JTVa07DN65FbpNT+snPnzlPqr6HeEzQD1tYNOyumZKf/UgjMVFsQ2CchFhQXlf9ODYHmApuLutxu91vqIhFRXwsLt9UMvlyLCIs+713PPejS/qwz/04mwBQJIFLqGprr5K0tdfKmtmZZmzlpQonXIxbu2LFjv/JLqRcE7D5YHbF4zYsB1KvrAey0AB5s1lomFBeWBfxwlZ+frwHo6PE4f3nuuef8elsJIup/Jl0x8dXhGabw3h2uuk5oQGSCQPJYLWLEJNNlA0aL2y2hevkVV094Oy0tLUU9nnpWUA1YL20sqZEQS9X1AKQL4DeQ3pQtheUr3lq/LyjuTaqqqroGQLK6zs1FicjfjBs3Ll7X5VdDIi7xdJIfikzUMOpKc0T8ZdrN1lB9e+aVqW9OmDBhvHoc9YygGrAAIM5jKgTwiboeQN7VhXb1lsLyexxFlSfVGMgucHlQN5lMr6uLRER9yWQyfT02OXCHq7NFJQqMuMIUNmCk6ZbQaPGXzKzUB9RjyHhBN2Bt3FjikUKfp64HgCMQ4i5HYfl1WwtKP1JjEBAAOhqw/rl+/fpqdZGIqC+ZTMg0hYgodT2QRSYIDM/QBkUlaYsnXZX6e7WTsYJuwAKA4oIdbwHyTXXdT7UCWOr0mMc5CspeVGOwyM3NnQBglLrOy4NE5I+ESYwyW9XV4JA0UgtPuMz0ncwrJvDm9x4UNO8iPI+OedBwMwB//RKREnDo0O5/pbD0kBqDjc/n6+jsFYQQr6lrRER9TQg51GwNynMQAIDoJAFbhDZCaKkHosISx2zbFnAbVvu9oB2wHBsqdttz0gsA+N/lQolSaZKzi9dX/FNNQey83dullNsLCwuDfrgkogAkRcRnzwnsPCmBxpOAqyEEzY0uSF09ou9JCei6hGYyD6+pqfZMmDAhfefOnRXqcdR1Xfz0CRAe81JYvD8EkKSmPlIlIRdNSKp4Lj8ffvgl1zNyc3NH+Hy+dHWdlweJyH9Ja1dvca/eY0VCzBDMeOA+jBgxEmaz/32r/fTTfZg7dy6WLl2GyspKbN1a/EFKSsrI3bt3H1ePpa7xv4+6gRwbSxrtuRmLIeUv1NbL3AJYLz3mZcUbSxr720MTL3R5UNM0DlhE1GuklIPUtf+Sg8/5Jyk0ITo/YTUcE0hOGIEXX3gJmua/lxhjYmI+//uHHnoIjY0NIe+887ftqampoysrK5vPOpS6yH8/+gZJTSj7FYAydb2XSAB/0ICJWwrLFzg2ljSqB/QTHQ1YewsLC/kkUyLqFRMnThwJ4Pr4+PMe84f4hARomvbd1NTUz/fpE0KaPnsJ75zWWgvmzJ7j18MVAMTGxiI0NBQnT56AEAKPP/4EUlLGJdlsIW/feOONQX3ypbf492eAAfLzoUPX5qArXyndIndBym85Csu/u7mwfI9a+4t77713AIDr1HUAr6DXPyZE1E9pmiZeHDp0mHb2mZt2CQmJGDhwkNlkMv+mfU1KdPoMlq4DpxvaMGbMWDX5peTkZBw//tkVQYvFgqKiDSIhIeHqpqbTRbjU5/XQBQX9gAUAjg2lfxdAb12Zq4eQc6oT49IcRRV/VGN/Y7FYvocOvlB5eZCIektqamqYz+e7evSYFIva2o0cNTpE173f/HxBQIPo5M+AEpBSwmr11zevn2vQoEE4ceLE5/8cGRmJ5557TlgslnszMtLmn3UodUG/GLAAQPOJ+wG0qesG8gJig9ljHusoqFi3LZ9veT2jo8uDxxMTEz9UF4mIetLFzkiZPnvL4OdvPpK6MF3s+GAwcODAcwYsABg0aDB++ctfCSG0lampqZPPidQp/WbAevnZsoMCWKWuG+QdXfdlOQrLsl/aWFKjxv5qxowZ0QD+R12XUr6Wn5/fb95FSUSB57N7sIJbcvJAnDx5/hPZJkyYgFWrVgmLxbTl8ssvv1rtdGn6zYAFACGh8ikAR9X1btgvJSY7Cstv2rqB+4eozGbztwCcd0qe2zMQkb+TUmgiyL9DDhw4EE6nE/X19WrCV796E+bNW6CFhFj/fuYNAtRJQf7pc67nn65oEQIPqetd0CwgFzVrLZcXF5W/okb6zAUe7lzv8/n+ri4SEfkVIYP7+iA+G7AAnHeZsN3dd9+NyZMnh4SEWD+YOHFirNrp4vrFWzFvz0sbIrx6HAD8//buPL6uq7wX/m+tvc88aJYsO7YT27FjH8l24thJIAkOcG9mEkJTAr1lLoWWW6CUFy7cAi20vaUD0AIvb5m5QMsNl4ZShjDFCZmNPEjneEgcW7ZszbPOfM5e6/1jS7K0dY50NNkaft/P53xirbWlHElbez/7WWs9K5fLt5imeRTAlMKXJVAC+LGC/pxSqsevvNte9+4G5zEEwBRhD7S+xzm/XSH3VJ/x7Hb+3FY2y2Oee+SzRwad7UTLhekSXQBWdFAxMcDasWOHo9f2P/7HR9DW1lbZ1NT09JYtW3afOnUq4zyGClsVAZZU+JSQxpsBYJ6lSaQG7hUQ9wq54ofn5ymHtO6BC2EY8I63xsVL90hh3DPhQFqBRBb/DcB3nO1Ey0U+q+3oYwVbs2YNpJRFM1gAIKXEZz7zWfHGN75hm1Lq3wHcDZbYKcn8wg2iIhSyiMtTGJCH0C8PYkSeQFJcQE4wqUFEtBSYponq6uppAywA8Pl8+PKXvyJC4dCdu3fv/rSznwpjgEWLTiGHDPqRFGehV88WjERES159fT06O6cPsACguroaX/nyV2Gaxp81Nja+xdlPUzHAIiIiWqUK1cIqZsuWLfj8578Aw5Bfi0Qir3T202QMsIiIiFap2QRYAHDDDTfgE5/4C+Fymb+IRCKFZ8YTgFUyyZ2IiGg1SyaT+MQnPobnDz6PbDYLv9+PV77yVdi44Ur09/cjm82WvMXPfffdh3Nt5+S3vvmNpkgkclUsFptarZSYwSIiIlrpvvDFz+PZQ48hvGEINdtS8NX34We//HccOvRbKKUKVnSfznv++D247bbbvH6/5+iePXv8zn5igEVERLTiPfPMU/BX5uANCXj8Ar6wQPkVOTx/8DkAxYuNFiOEwF/91d9g69ZtNULguQcffJC1ixwYYBEREa1ww8MjMN2TCz+bHoGhwREAKGkloZPL5cIXv/glUVlZGTl9+sXvO/tXOwZYREREK5zWyrmxBiA0tNYIBAKzzmCNCYfD+NrXvi5cLs/9u3fv/ISzfzVjgEVERLQAhATcSVBJ9AAAIABJREFUHhf6+/ucXUvabFcSOq1btw7/8i9fhpTGxyORyL3O/tWKARYREdECEAIIVbjw9NNPO7uWtPr6tfMKsACgsbERn/7038Htdv2wsbFxj7N/NWKARUREtEDC67L47Oc+g8OHDzu7lqz6+jXzDrAA4FWvehXe+973CbfbfHb79u0bnf2rDetgERERLRBvEKi6Kos/fNc7cNVVmxAfSeCBBx5AXd0a1NXVjb88Ho/zUy+b+Q4RTvSmN70J586dM//jPx6J7tmz54qmpqYh5zGrBQMsIiKiBRSsEvCFLQz0ncTwiMa3H/4SVM5AJqWQSmSglEIg4Ed1TRXq6upxxbr1WLu2fjT4uhiIBQIB55deFPX19chkMujv70dlZaWze1aEEPjoRz+KCxfagk1Nh1r27NmzuampKec8bjVggEVERLTADBdQvkaifA0A5EdfgNYSKi+Ry2SQS7fjXP8FnO5oAiwT2jKRTWsk4xlYeQtenxfV1ZWoq6vD2rXrsbZ+LdasGcuC2YFYOByGEM7lgbNTX18PwK6FNd8ACwCklPjMZz6HN7zhoSvaLrQ9DuDlALTzuJWOARYREdElIoQdfBkuAW8QuFg7wRp92W1W3kQ+k0c+04X24S6c622GPmRA513IZ4FUIoNsJg+Xy0RVdSVqa2uxbu0VWLdu/WgAVjsehFVUVIx+3cLq69cCsAOsSCTi6J0bn8+HL3/5K+LBB19347XX7vrK4cNH3+48ZqVjgEVERLTEGKb98gQmZqcUgMzFjywT+SyQz/ShJ92LjuPHcLBFAsoNKyuQSuSQTmVhGBJCAuvqi2e6DMNYsHlYY2pqavCVr3xVPPTQQ2/btavhyNGj0X92HrOSMcAiIiJahqQBuH2A2yfgn1RFNDv+L6VMWFng7JE8gMK72dx++3+F1hr/9E+fxSM//L+oX1OP+vp1CIfDzkPnZNu2bWhubv6nxsbIlUrhGSlljxD5PqWMnu3bt/c+/PDDY6m7FYUBFhER0QolJSC9dhHUYq65xUA2BVhWHon0GZw4fxrR0wJiASs5BSsM5PP6vR6/fkc+o/NWztD5nDZOvnDcvXNXQ9owRRe0HtRCn9EKJ1UepwB1XghXW2VlZduBAwfsSWzLCAMsIiKi1UwAbr/9D19otAHAws5LFwCEAWBKWkxZ8Ft5XZlLC+Qz+qZcBsindSaTMrK5tNJ9/d3u3ddG4kKKbkhxTuX1Cyovjimlzmqt27LZbNupU6eGnV/3cmOARURERJeNNABpCLg8wIQNEz2jLwAG8ll481lU59JqRz4j7shltcolRTKbEnlX1mPu2t2QFxJd0sTzVka35vNo1lofP3bsWGzsC15qDLCIiIhoSTPd9ssbHB+2lACCYx8oC8ildbmVw7ZUXOtMXI9k4iLXuDMSkAbOASKq8uI5rXXMNM3YkSNHWsc+d7EwwCIiIqJlTRoXV1z6y4XAhKHIbApbMwm1NZMQr0mPYCSftVK7dje4ADyZz+mfGIbxm+bm5pNjxy8UBlhERES0YtkrLSVC1TABUQGgwspppIb1axMD4r/G+1V61+4GhQUOuBhgERHRstbQEPkKgLdDoNvZN0pAA0/+5oAuVvU8n88DgGxojHRBo1YppJ3H0MphuASCVQLBKgTqgIAz4Lp2T0OPUupzRw8f+5Lzc0vFAIuIiJY1rVEtBFC5TtY6+8bkMgCQLRxdwb4Z+iBhelDbf14BE2ZbrwxTvx1RoG21cgZc2ZSu6r8g/qlx147PePzi/2QTxkebm5vPOz9vOgywiIho2fOFoeo2ywUp3DTUpXLWsqu6ND1paOQvFoEHAOSz9sRxmsrtE1izRbjWbJau/nb1pv7z1gPX7W34+aGD0dc5jy2GARYREdEK5yuTiPcp+MISQgqovEbPWY1wLbNY07Izo6hcJ4OJQf3AzmxkJJPOrz158uSI81CnBYn2iYiIaOmq2Shh5YGXDlp48Zk8Wg9bEAKoubLw9jk0VaBcYOvLzGCgzGxx9hXCDBYREdEKZ7iA9Y1LJ5hSFpBJaGht/7vUovFCAr6QgLxM0YuQQKhart25M/KG5ubYvzr7J7pMb5GIiIhWo2wKONdsQSs78LMXdpYWYWklkE1rhKoF1myRMFyXfojTdMEFiK3OdicGWEREl9jOnTuv0Nr6HuSlvzksV1rpcmjxmmg0+pKzj5aXkR4Ft8/OqBWpmjEtrYDuMwpnj1q46jpz2o2sLycGWEREl5z1OSFxU82Vc7m9rE5dL2lorUPOdlp+rLxddX2uZ7+QQN1mifNRjf7zClUblmaExQCLiOgSamho2K817tt0vRRu3xzvMKtQ10vK2USrXFmdwECHRtUGZ8/SsDTDPiKiFWj//v2mEPrLlevB4Iponlw+gUyytLlblwMDLCKiS6S3t/ePDFOsr95g8NpLtBCWbnzFAIuI6FLYuXNnrRD6b+q2CI9cOqvliS45IUdLM8yTtoBie0suBZyDRUR0SVh/5wkJI1zL51pa3bwBoKNdwe0HTNfoZPdZxElaAVoDg50K3iW87IEBFhHRIotEIvuU0v9t7VaT0RWteqEaCaUE4n0KWmlYsyg0CmFnwKQE/GGgesPSTQczwCIiWlxCGvhyRb2hPQFnF9HqVFYnUFa3dIOjhcAAi4hoETU0NLxNSlxTfSVnXhGtJkxXExEtkt27d5cLqf+hZpNwG3ycJVpVTAB48MEHjZ6enllMMVtmdL+YzQQ6IpovYezfv39VhxQHDhxQlpX5lNsnveVr5vcsm0trZFOlTlIhWtq0AvJZDSuP0udeLSG5jLOlMLOhoWH9iRPHT1fX1nQ4O1eKgReqoIA2ZzsRLRKNTwkDn3I2ryY7d+70a22V119jGPNZSa41cPaolc2l4RYCcWf/CqWEmHLrLdNa5xxttExkUxqDHRrxfoVM0t7gWRpjGz0vL1oBpSx7NKWUesuWq/uv2rR5vbOTiIhmr6OjfaS/r68jWCnLfKGZL8TTGerUyGeR9IfFX4fqxJ+5XFMCjxUln4eId+tvPPtk9L3OPlp+Rnrt/QLTcY1wjUTtVQa8IcB0z+/v4nLqP6/Qc2bmP0PTsqzkuXOtqYGBgbPBYNAfLiurDAaChj8QgJTzS2sTEa1GZ1tPd2mtrqrbPL+ZV8oCus9YGWXhH4NV8vcr14qg85iVJpfRGO4pIT1AS1o+C3SdspAc1qjZaGB9o8BqW+ZhxmKxfgBX7t+/3zx7tnWzECri9QZuEgK7pGlUuUxX2Ofz+cPh8vJQKOQPBIJwuVzOr0NERADa2s4NxRMjNdVXCpfpdvbOTu85pZWFC6FqubW8Xlzt7CdaihL9Gu0nFEI1wKbrDRjm8o6XtbKLmmaT9sfpuILW0jf5qKnGn64OHDiQB3By9PWD8SMARCKRNUDbdp8vsNdwib2GMK4wTaPM7fYEQ6FwIBwuqwwGA/D6/BM/jYhoVdFao+3c2RHDVDVV6+aVvEI+C/SfV5Yh8f+V1eEDBp9raRkY6VHoeEFh3Q4DgYrlHViN6XrJQmoYCFYCEAKegER6xJ6JNZ2SrgCxWKwTQCeAxya279mzx9/e3r7N7Xbv8ng8NwkhtpmmWW6aZjgYCvrC4fKqYDDo8vsDMIxVlhskolXnbGvrYCKRqL+iwTDmO8jVfVrlATzlKxN3h2tkrbOfaKkZ7FToPq2wvtGALzzPP4AlIp8BBto1rr7JxFhGOpsChjqtGdcSlhRgFdPU1JQEcHj09Y0JXXLnzp0bpTy73e32vEwI41rTNGpM0yzzev3+cFm4LBQKhYKBEFzueebQiYiWAMuy0N7epgOVSgUq5vdEmY5rDHVZ0vCIX1ZeIT/i7CdaapKDGl0vKWzcacA7z4UdS0k+p2G4MB5czca8AqxpqObm5jMAzgD4ycSOSCRSKS6Iazwezx6Xy7hRCGOjy+UqM01XKBQOB8LhcFUwGBR+P/eUIKLlo/XM6aFEMh7etGP+U3k7T6mMkOIH4Wpxv79czDjXg+hyymeA88cs1G9dWcEVYO97WEpJhkIWK8AqanRS/dOjr38ea49EIu7Ozo6rTdNs9Pl8NwkhIqZpVpimWRYIBPxlZWUVgWDIGwgEOdxIREuKZeXR0dnuqVovpMs7t4vxmHifQnpYa19Qdlaukw85+4mWmvPHLJTXS4Rr5nfuL1Vaz1ySoZBLHmAVE4vFsgBio69/m9i3c+fOK86ePb3d5/PfIKW5xzDMNfZwoycYskcbywOBILxe78RPIyK6JF566dRINpvwrF9vzOsOozXQ8aLOaC3+JVyLe92+OT46E10iA+0aWgG1V67Msk5CCMx1KxizsXHHtyHEjUJg2Nm5dFiQhkQmm57YmNZDyHZ0ticNQw6bpitgSMNjmi7D7TYNvz8gpJzfxY6IaCZKa3R3dYbqrpajwwlzN9CuYeX0cKhS1IfrxBZnP9FSYuWAnlYL6xuMuY6iLQN6HhksIV7h9okrKtYu55+OBpAd/XcKAJDM9UOruf1QiIhmo+wKgVD1/KIrlQd6Wq0sBL4WXiPfbriW8zWZVoPesxaClXLFrBgsRAiBOcZXMIUQAxVr5TIPsIiIlrfus0pB6RcDlfLmcI2odvYTLSUqDwx2aly1Z6XPiZ5jdAVgfo9cREQ0b9kUMHhBa9Mrfly9Xu5x9hMtNQMdGr4yAfcKX+M6rwyWs4GIiC6t7tNWDgKPByvlf/GFBVfr0NKmgYF2hTVXL06ORlmAldfQll0mQRr2PobzneM4J0LPeXoZAywiossoOaQR79PSE5KnK9aKVzv7iZaa4V4NITWClXMNPWzpuEZySCMT10iNALkMoC09njESwl5ZO8YwAZcX8JdJ+Mvt/y72FlLMYBERLVOdp1RGCPU9txv74r3GaeecD6VQoZSugMCMe5+tBMoCckn1hw0Nkbc6+4oT3tSwlid+k3d2zIlWcIn5xQ4r2lCnQkX93OZepYY1hjo1hnsVVN4OolSRM9sZ2Fh5wIoD6YTCYCeglII/LMZrcC1GhkuP/j1qbb/X2WCARUR0mQx3K2QTOq+UfP9Al6qK9xtTbhFKqfcB+l1YXXNm3aOvEo3eBIvcqOdkljfT1UIpIDGoUbel9B+Q1kC8T6On1UI2BUBfDJ6cQVRJtB2IA3YGOB1X6HpJo2qDROXa+ZdLmUjMNqqagAEWEdFloBTQ9ZLKKIU/H93hot95DAA0NET6AFgA5pYyoDmZx311RUsNKbg8KHlyeyah0X5SIZvQRTNV86UsDVhAb6vCwHmN+m0SgYqF+gWORYKYddDNAIuI6DIYOK+0yqPH6/V+3tlHtFQlBjSClaWliHrPavSetVNNc8pUzZKy7GCrLWqheqNE9YbS3ud05pPBmv//nYiIZsXKAb3ndF4p8d6mpqacs59oqYr3a/hnyA5pBZyPWeg9Z0FPGA68VLQC+s4ptJ+w///zISQAYf/NzhYzWEREl1j3GW1prQ9Fo7EfOPsuNyEEDMOAlAaEACzLglIKarHGd2jZyGc1sikgUF48wFIWcPaohUxibnPihBCQUsIwDAACWqvxc3A2lAWM9Grk0hbWNxqQcxxgFwIIVQm0n1QI1wCAgJXXADDj+kVTa23msxr5bPEfGBERLYxMQmOwIy8A+R5n3+Vgmia8Xi88Hi9cLlfRIRGtNfL5HNLpDDKZDPL5HOa6RxstT4kBwBeya1IVohVwrnksuCrt3DBNEx6PB16vF6bpgpSFB9a01rAsC5lMGul0BtlsxnnIFMoCUiPAheOj+yXO0dprDPSfVxjps9NxeXtnPo/jsClMaIR6zyr0np1ddEhERHMk5PejLdHfOpsvpUAggEAgOJopmJkQAi6XGy6XG6FQCEopJJMJxONxBlqrRGpIwz9N9urCCQvpuC4pc+Xz+REMBmGapQ2kCSFgmiZMM4hAIDh6/iWRSMSnzW5ppZEcBAYuaFSsK/7epyMNoHrjxcCv/7xCzxkdn3BIQabb7W0YGRmZMdW1lBmGETAM+QJmtayXLrOs1vh+Lpd7r7ODaKVzuVzDzrZLxefzIxQKwjBKu7EVI6VEMBiC3x9AIhFHIpFgoLXCJYeKl2cYuKAQ75s5uPL5fAiFQgt0/gXh9/uRSCSQSBQP9JUFdJ9R8JVJeIOF3z9gH5fPFv4aE43Ox6qMRCJbJrZnMpnuU6dOjf9tF/8/LTONjY0fA9SHtUaJi0dnT0oJr9cLt9szPkYspRyt9Kqh1NhYsYVMxk6jTxdZXw5jqVjDMCd9D2PpV3uuhYVsNjs6DLAwhfsKyAFiczQabXN2ENFFDQ2RTwH4MOZZpsEwDJSXV8Dtnvocag//5ZHL5aC1Pd/KsuzVX0JIGIaElBKmacLlchccRrQsCwMD/cjl5jAbeAkSElhztYEiI1arjmVpdL6osO3l5pQhwmwKOH0wP+2Eciklyssr4PEUHlmzz7/s6Lln34eAieefAcMw4HYXP/8GBweQzdrjd4W4PAKb9xlT6mRpBXSctDDUPc03ULr/lNJ4qLm5OTG/EHIJcbvdn8tk0h92ts+XEAKBQGDG+QljE/PG0p0+n3/8opVKJZFMJotG14vN6/XC7/fD4ym+xdlY+nWM12vHqfl8Hul0GslkYvyCuwCyAL7H4Iro0nC7PaioqJg0v0VrjVQqhUzGns8ym4dBt9sDr9cDr9c3PsRoGAaqqqoxPDyEZDLp+IxlSNsVy8lm5TRcnsLzrzpfmP7e4Ha7UV5eMWU4OplMIpudXTLCHqp2wePxwOfzFzz/EomE47NsVl5jsEuhon5yhNV5Si1UcAUA9yilvg3ggcLRwjLV0LDjrwH5PkDPO4slhIDf70cwGCo66W42lFIYGRm+pBcer9eLYDAEl2thRoATiTji8enHu0uUA8T2aDT6krODiCabbwbL5/OhvLxi/GPLspBMJhZkSE8IAZ/Ph0Bg8lyaRCKO4eHLNgq6IKQBXH3T1GzNatX1kn3dr9s8+X440qdxIVa8HILH40VFRcV4cmJs7l4ikViIe8n4+TfxPpdMJjA0NDThqItMD7DlBhNjuZJcBjj1rD1Ss75BIlAhHZtVlUbA3gboXIsFrQCl9HUrJoMFAPm8+gfTFH/qbJ8tt9uD8vLyKdH2mLFhNDuNqaC1gr2k+WIWy5npklKirKwcwWBo0dPoUkpUVFQWHAoYY1n58fevlBp/72OvQt97IBCE3x+Y5xOqyAHqkWg0xuCKaJF5PB6UlZWPfzwyMoJ4fGTCEfOjtUYyaWfofT4fwuEySCkRCASRz9uBHK0MqWGNyismB1daAZ0vFg+uXC43Kisrxz+Ox+OIx0fmHdhPlEqlkEql4PV6UVZWDikl/P4ALEsVPNdV3t62J1Rt36NHeu33EqgUCFbZ399cM0/+coFwjcBQl4ZhiAdWVIB14sSJvsbGyBeV0u8WQhQfD5tGIBBEOBye1KaUGp+TlMtlSwqOxpaeut1ueDze8YBrsdPoHo8H5eVThwJyudz4UIA9z2L6E3xsrNv+HjzjAZcQAmVl5XC73RgcHHR8Vik0APlxZysRLSyXy4WKikoIIZDP5zE4OFDStWuuUqkUstksysrK4fF4EA6HoZRCOp1yHkrLjF3uQMNfNjn0GGhXRQtwmqY5HlzZ598gcrni86PmK51OI5vtRllZObxeL0KhECwrj1Rq8vmnLKDnrEKo2r6nZZN2Fs0bmHjU3HkCAoCG1nrrigqwAEBr8bdC4I+d7aWoqKiE13sxLrMsC4lEAqlUctapzHw+j3w+j0QiMTrcGEAwGISU9qT4sSBlaGhoxmCnVH5/AGVlZeMfjz1dJhLxWc+fsixr/MkAmJqG9fn8ME0X+vv7Sv7ZCIG81ng0Go0ed/YR0cIqL7eHZdLpNAYHBxbsOjMdy7LQ39+HUCiEYDCE8vJydHeXPr+GlqbUiIbbJ2BOHBTRQO85VXDVoBAC5eV2NimTyWBgoP+SnH9KKQwM9I8nSsrKypHN5mBZkxdrZZMamaSGxy/GalpBGnPNW012cQK9XDP/yUVLTDQa7QLwVQAzVyGboLzcjnoB+5c0ODiA7u6uGWtslEJrjUQijq6uTgwNDY6faPZy6cnZsrny+fyTgqt4fARdXZ0YHh6adXBVSCqVQm9vD/r6esdXFrpcLlRW2k/IpdAaWmv8T2c7Ec1o6pj9NMbmRKXT6Tnf3KSURVd8zWRsKNJ+mLx4XaLlKTUM+MOTr/MjvQrKKnzt9/l8cLncyGQy6O/vm/P5NzHhMRtjcwCFEFNGpAB7CDDeZ78nrQt/D3N18X6o51mIYokyDPOvLCv/Dmd7McFgCD6fHwCQTqcwNDQ076CqmGQyiXQ6Pb5cNRAIjGbKZqxZVpQ9z8K+iC32UEA2m0Vvbw+CwRACgQBcLjcqKirQ39/vPHQSIWAB4vFoNHrU2UdE0xGDgFZCoNPZU4iUhhEKheoyGTu4KpVpmrjtla/C9XuuR319Pdxuz4ThxUHEYlE8+uhP0dfX5/zUgkZG7AArEAjC40kOZbOZRZ2QpZQOCiHCACzMMiCl6aWHFQKODZ6LZa+klAiFwshm7cxVqaSU2L//Nuzduw9r164bD67y+TyGh4dx7FgMP//Fo+jqLOnPAIlEHEIAoVAYHo8HmczFnItSwHC3RtX6CZ+wCBY2dFtCGhoavgbo38MMxUe9Xi8qKiqhtcbw8PAlnZQ5cb5Xf3/fpBOgVIZhoKamFkIIpFKpSRmyxeZ2e8YzWIlEAsPDhVdtjMpqjVtisdjzzg4iWjiveMUrHjNNc39PT3fJD4o33HgjfvfBhxAMBp1dk1iWhaefeQr/9q/fLblGXlVVNaTE8GOPPV4OexLmoolEImuEwLNCiCu01vMKsriK8KIXns5jQ6MBb8gOGVIjGmcPF57cPvbw3dvbU/LoybXXXoc3vvH3EA5Pn+1USuG3Tb/F//7WN6atdzVRZWUVpJTo7e2Z3CGA7beYaIspxPsUaq6SqN4w/0G9gXaNzhctAHhq/l9tiTLN/F+ihABy7Bc6NDR4SYMrwI6wx5aSznRiFRMKhSCEQDKZvGTzLMZksxn09fVCKYVAIDDNlgdaAXiewRXRojMMw7il1Cy8lBJv/L3fx9ve+o4ZgyvAfqC75eZb8ed//hclD/0NDg7CMFzhffuuu9/Zt9BisVgnIF6ltR4ERGl3d5pWLm1PDJ9YAb3/fPH7jM/nw/DwcEnBlRACDzzwO/jDd/1RSfdAKSX27d2Hj3/8LyetTpzO0NDg6BY7k+9PQgCZlIYxWt1htK7pvI3twSgE+lZsbN7Z2TtYU1O7XUpcgyLp4mAwBK/Xi8HBgSkrDaZjmiZuuOFG3P/aB3DHHXfi9jvuws0334zd114Hr9eLjvb2kk4uAMjlclDKgt/vB6BLjsoBewlsWVnZtDU/ChFCYOu2bbjvvgdw55134Y477sIrXnEbrr9+H2pqa9Dd1YV0Ou38tILsFZYZeL0+uFxmkZ+jyAqh3trd3XvW2UNEC+emm256G4D7Cy1PL+T1r38D9u+/zdk8o2AwiOuuux6/+c0TM17rtLbLwBiGq6atre1bzv6F1t3dPVBdXfMLIfBmISABzCmRICRQtV5Oqfq92iT6FXJZoHy0OKeygI4ThbNXLpcLbrdnptGMca+5737ceeddM2dCHPx+P67fuw9PPfmbGTOpenTyr8vlmnR/lYa9cbXW9hZAbi8Qqp7/L3u4RyFll4D71Wy/r2Vl+/btVxuGjAGYUmlTSona2jokk8mSTwYpJe644y7ccccd01ZFz+VyePzxA3jkkR+UPBeqrKwcPp8PXV2dJWehqqqqIQTQ29vr7Cpq165r8frXP4Sqqipn1yQtLS34zne+hYGBAWdXQWPFDPv6+uDY5VwDoikaje6d2EhEC++WW255NplM3FDKdIPd116Ld79rTguuxx09egRf/OLnnc1TSClRXl6ReuKJJwJY5GHCMZFI5DYh8HPYAdas75wcIrR1nbIgpEDtJvtH2H9BoeeMKpjxCYVCyOVyJT2gX3PNDrzvfe+fMCl89k6ePIl//Me/czZPIYRAZWUV+vou3iuFBGo2SvjLBVoPWzBdAlftlTBdc38/ygJOH7SQy2gA4t4Vfer09vb219bWXgtgKxx/YHaZARODg6UFEIFAAB/+8Eewd+++KalGJ8MwsGnTZuzbdyMOH24q6WTL5bLw+fxQSiGfnzkoMwwToVAI/f39JQ8F/P6b3ozXPfA7o9my6dXV1eHWW/ejre0suru7nd1T5PN52PuU2SuXJlCAeFt3d/fpiY1EtPCuvHLj38fj8eJPf6OklHjf+z4w51VaY9asWYNotGXGmnhaa7jdHldVVdUjnZ0lzlKep56enta6uppmQDwohF2Az3nMdJjBsvWe1QjXSnj8duBx4bhVtPaVz+cvacGWlBJ/8ifvLWlYejrV1dU4derFkpIMbrd78sO/Blw+oGKtRLxfI5vSGOrUSAxqDHfP5QX0tirkMhpaozWTyfzpig6wAKC6uiYqhHgXgH4AybFXKBT2jYwMi5nS24Cdnfn4x/8StbW1zq5p+f1+vOxlN+P55591Bh1TaK2Ry+URCPh1KpXqw4T3WugVDAZc2WzGmOnrAnb0/u53vwd79+5zdk3LMAzs23cDLly4gM7ODmf3FNlsFqFQGMlksh9AAkBOCJyIRmMfch5LRAursbGxQkrx8VKy5nv33oCXvexlzuZxnZ2dePrpp9Dc3Ayl8uMLaQqpqa3Fs8887WwuQENK2d7R0fGEs2exdHf3nKytrXtOa/16KYXALIIsBlj2aruuUwp1mw1Iw57cPnBBF81BmqZR0qjNjh0NeOUrX+VsHtfb24Onn34KR44cQTabQW1tXdHzr76+Hk8++Rtn8xT2jityUkLCcAmU1UkEK+3q61YOyKXszatn/9JjWb1hw1CvPn78hY7pUzErwLFjx6YMEb785S+PCCFwxnklAAAV4ElEQVSipcx3EkLgT977fpSXX9xuYjb8fj8+8IEP4hOf+NiMY8XZbAZChITP57/r4MGDB539E912223x3t6eKUOfhdx9973YtWuXs7kkQgi8/e1/gE9+8i/Q1TX9g6ddtTmNYDD08DPPPPMuZz8RLR6XSzSU8sAIADfddJOzadxTTz2F7373f49fr372M+C66/bgne98V8Gb3JbNW2Ca5ozXt1wuB7fbE3G2L7ZoNPrzhoaGVwJ4BNCVKDInl6bKxDUMN8YLjPafV0WDK8BeZVqKl7/85c6mcU1Nv8XXv/7VSYHajh0R/PEf//eCo0cbNmyEz+crMv/3Ivv8m1xUQOWBXFpDA6i/2sBQt0Y6oZHP6Jeg5Ze11qV9Q6O01j2GYfy0uTnWDQBT3+0qIIT+k1JXDN54443YdNUmZ/Os1NTU4vbb78CPf/yfzq4pUqkkTFO+B8CbnX1jbrzxxuuy2WyglLla5eXluOuuu53Ns+JyufDmt7wFn/7b/+XsmiKRiCMUCt/lbCeixaWU3GwVG7txWL9+g7MJANDd3T0puBpz6FATfvWrX+HVr371pHbAXvSzfv1GnDnzkrNrEqUUlFLTT/5cJNFo9OlIJLJTCP09QNwKO0yYGi069J3XKBBTrhrZpIbLLdB7zr7XxPvsn4eQAoAen+huf1R6gHXllVc6mwDYK06/+c2vT8mCHTsWw09/+hPce+9rJrUD9nDj1VdvRXPz9CUWtdZTptOkRjTOHLIgJWBZAtrSWms0RaOxfZg2lCzNqgywLEvvnSnaBezszf33/46zeZKBgQF0dnagtrYWlZVVBZ/wAOD22+/Ao4/+bMqFyymVSiEQCNzobJ9ICP1QKlXaPoavfe3rCm7cPCaVSqGtrQ1+vx9r166FlIXz4Zs3bcFVV23CmTPTT6WyLAu5XHZdJBJxx2KxmVOERLQgLCvnLuGZC0KIovMwjx2LFb1GHT16qGCABQBr19bPGGABQC6XLeEdLo5YLNa5f//+V/X2dr8XEB8HEMA0Q4bKAnpbSwsYVrrUiPPnMPnXOPZRXhc+d5wCgcJzr1544WTRepBHjhwuGGABwJo1a2cMsAA7i+Vk5ezKtKPfxTPpdObOsQ/ma1UGWEpZJRXQWLduHcrLC9fmyOVy+M53vo1nnnlqvG3Xrmvx5je/BYHA1F0jPR4vtu/YgZbmZmfXJFprWJaaYbKXuKaU4U0pJXbuLD40eODAr/H97z88ftLV19fj7W9/J9avX+840nbrra+YMcACAKWUFEJsBnDc2UdEi0MpqCLPd1MUe5Ca7rqSyRTv83h8zqaCtJ45a7SYDhw4kAfwD9dcc803XC7jo0rpdwshvICwgPkVJiX7/lUKwyh8/hULrgB7Ck0xXt/ctnQSApbWMAAkhMDfVlXV/M3oObIgCn+XK1wuly8pwNpzffFJ4f/+7/93UnAFAEePHsa3v/2tSW0T7dlzvbOpIMvKl2/ZsqXoGZPN5gqH/w5r1tQXfVJtbj6Kf/3X706K6Ds6OvCFL/xz0bHsrVu3OZsKsiwLQlhXOduJaPEIIezqOzPQWhe9WV199dXOpnHbthX/+0+lS5tyAeiS3uNiO3HiRF9LS+xP83mrVmu8WWt1AJOzFgt2k6Wp0kWC9S1bri46CrRt2zXOpnGpZOF71gz6lMKPhcAfptOZtS0tsU8uZHAFrM4Mlsjnc1NTTAXUr1njbAJgBxBPPPG4sxmAPVchHo8XXH5aXV3jbCoon89DShlCkQ2rSynjAADrNxTORAHA448/5mwCAAwM9CMabSm44jAUCjmbCsrn81BKTt1hk4gWjda6p8i9aYrhkThqCtTyu+qqTdi//5U4cODXk9pra9fgrrvumdQ2RmuN9gvtzuaCtMbM6+kvoZMnT44A+BaAb23ZsiXs87l2a21cK4S+Vmu9TQhZobUuAxCCPaQ4FwXTOno03SOEmNg/9u+Cn4PR9rHPndgGTPlao23jiaVCn1OobVyh91bs/w178UDhIR+H4eEhhArcI+vr63HXXXdPma9cUVGJ++9/YFLbRO3tF5xNRejHhDDekUqlLpw6darg/XUhrboAa8+ePWYmky4pc1cs+zMyMlJwLHdMf39fwQDL7ystja6UgtvtLnqwZamSUtnlZcVXPk5XN6S/v/Bmri7HCoxilFKQUhd9/0S08EzTfMGySnsAP3/+PGqqq53NAICHHnoDtmzZgkOHmpBMJrF58xbcfvsd8HgKJ9WHh4fQO6GA43SkxEln21Jx6tSpYQBPjL4KkQ8++OB4CPvwww+XFKSsFpFIJCgEStpC4Ny5c1i3dp2zGQDwmtfcj40bN+K5557DyMgINm3ajDvuuBO+IvfPeHwEHR2lBvjiyWi0ZeZ5Lgtk1QVYTU1NuYaGSA4Fqrs7ZYsEUWVlZQgGg4jHpxZUk1Kirq5w5mu6oMxJCDH1i4/SWidKeVJNTzOevX79BhSr97duXeETPzfN/IwCir5/Ilp4R48ebW9oiHQBqHP2OR0+0oTGhoaCy96FENi7d1/BLHYhp8+cQaLAtbAQrcUhZ9syoh5++GFnG42KxWLxSCTyghDY6uxzOnz4EPZcdx3c7sJB+65d12LXrmudzQWdPXeu5B1HpFSX9PwrKZOzApX02yhW5d1eXVg4XXnnnXcXfdIbLH2/QFVVVTXdk0DhN+bQ3d3lbBp39933FLy4btmyFZFIo7MZgF1ColRay+lLOxPRQtNC4D+cjYWcPvUSzp4752yetZGRETQ1/dbZXMxAdXX1k85GWjmEwA+dbYW0nmlF69n5n3/JZBIHDx4sdXJ9WgjXL5yNi2m1BlinnA2FvPDCC86mcTfffAve8pa3o6bGnldVUVGJ3/3dh3DPPfc6jrzo9OmZlzGPOjPDZLuS3n9HezuSycJBUX39Wnzwgx/Gpk2bIISAz+fDLbfcive8578XnWTY3lE441WIaeZfdLYR0WJTjzhbCunp6UZz8xH09/c7u0qWy+cRO34cx4/FnF3F/GiG6xote6Kk829oaACHjxxCT0+Ps6tklmUhduwYjh+LOrsKEgI/b25uLnU1xoKYmsJYBbRGVAgU3ydiVOuZ0xgaGkJZ2dR5e0II3HTTTbjpppuQy+Xgck0/4phMpXDieGlVC4TAtFcsKXVU68JB0ERDQ0No72jHls1bnF0A7GJvH/rQR5DP52EYRtHAakxLtMXZVEz8yJET8388IaJZGRlJ/ToYDMQBTJ0E6nDk8CHU1NahIdKA8gLXuOnkcjnEjsUQizYXnCpRWGk3X1q+tm/f/tzx48dKGqZuPnIE9fVrYRgGKitLWtg/Lj8W3J84NuM+mBfpS37+rcoMlpT6J862Qnp6evDCi8WzWGNmCq4A4PSZ07NY6YAfOxsmM36JEpYRa61x8ODBaWvbAHYl5pmCq/aOdrxwsrQAERA/BTDzDtREtKBaW1vTQuCbzvZCOjs7EYu2oCXagvMXSr42YWh4GIcOH8b58+dxqPThwfOhUOhnzkZaWR5++GELwFec7YX09vag+egRtMSiOHvu3JQq68WMxOM4fPQILpxvw8HnnnV2F9Pvdvt+4GxcbCWtRltp1q/f0GZZ+T9FCRPdlbaH08LhuVcd6OntwROPH8DZ1lZnVyFaa7yzp6en6GNhd3d3ura27lYAm5x9Tul0Cmvq62e9UfVEqVQKTU1NeP65Z0sa6xYCf93d3VNyuouIFk5tbV0TgHcDmHHZb1dXJ0LhMJRS6O7pgRQCXq93yu4PSikMDAzg9JnTOH3mDIZHhvDYr3+FdJGaeU5C4L1NTYdKjsZo+Vq/fkOTZeX/AEDhZfgT9HR3IxAIQkiJ7p5uSCng8XimnH9aawwODaK19SxeOv0SRkZGcOCxXyGRKG3ET2t85OjRo4VrKy2iVRlgdXR05GpqavcKgeKVy0YNDPSjpq4O4XAYft+M58sUw8NDiMZi+M0TjyM7zaq+i8RzsVjsc85Wp7q6mjIAM+75F4/HES4rh8fjmXUaFrArO7fEonj22WfQV9pS7Lxput7Z2dmZdnYQ0eLr7u5O1NbWuQHsd/Y5aa3Rdu4cXC4XysrK0D/Qj7bz59HT043e3l709PTg/PnzONPais6uLiRTKfT29uCxX/2y5JWDAFq2b9/xR8eOHZv56YyWvY6OjkxNTW1WCNzh7Cvk/Pk2CAFUVFahf2AAF9ovoKurCz29vejpGz3/zp5BR2cnEskEBgcG8Otf/xLDJS4a0xqtmUzmLf39/c79fhbdqgywAGDNmhoLEA86250sy0IqlYTbYz/Vlc0ik9XZ1YnY8eM4cvgQzre1ObuL0J/u7u553tnqVFVV3SaleA9KmEfX092Nmro6pDMpVFZUFt0mwykeH8HRlha0njlT8lCAEPjP5uaWbzjbiejSqaioaDIM+SYAJV2wOjra0X7hPPyBAILBEPL5PNKZDFLpNLK5HLTWGBoaQvPRw/jtwednVXIGEG86cOBASQtzaGUoKys7bJrm6wGUtLl3V1cX2s7Ze+IGg0FYloVMJoNUyj7/lNIYGRlBtOUonnv2mRKTFTYp9TtPnDg5/R51i2T6iTcrm2xoaDgI6OucHYVcv/cGbN22DaFgEFdeeSUqyiuKzlsaGh5Ca2srBoeGcO7sWTz15BMlDa0BOJtOZ7aVWmG2oSHyaQAfdLYXsn7DBtx8yyvg8XiwccMG1NXWTUnDjkmnUzh7rg1d3V0YHhrCL37+M6TTJSWktBByV0tLC4cHiS6zSCSyVwg8AWBqyfZpeDwe1NbVwe8PwDRNJBJxDA4MzGIy8UT6E9Hosb9wttLKF4lEdgiBZ2FXwS+Z2+1GbW0dAsEATNOFZDKJwcFBDBQpgD0dIfDZlpbY+53tl0rhCGGV2Llzx6uUEr90thezc9duRBoaIYSAabpQWVkOj9sLt9uNfD6HTCaN/oHB8Unlp158AQeff67U4AqA+P1oNPptZ2sxjY2NFVqrlwBUOPsKWbv2Ctx8660wTRNSSpSXl8Pv88PtdkEphWw2h6HhofFx7b7eXhx47FfTbsA5kRD4ZktL7C3OdiK6PBoaGl4P6H9ztl8KQuD7LS2x14MLXlathoaGuwH9I1yeWOPR6uqaey5naZDL8U0vKY2NkZ9qXdpYMQDU1tZiz/X7UDHNfKaRkRE0HTyI9vbzzq7pHI1GY9dhlhejhoYdHwDE3zvbi/H7A7huz/VYv2FD0QxcLpdFS3MLTp44NovgEBmtsTUWi7E8A9ESEolE/qcQ+KSzfZE9L6Xxyktdd4iWnkgk8n4h8I/O9sUkBGKG4br5yJEjc0m7LpjCd9hVZNeuXessK38QQL2zbzqVlZW4Yv1GhMIh+Lw+pNNpxONxtF9oQ09Pz2wCEwAY0Ro3xmKxY86Omezfv9/s7e35TwC3O/um4/cHsGHjRlRUVMDnD8DK55FIJNDd1YkLF87DsmY3H1BrvCUWi5W0PJyILq2Ghoa3AfpLKGHl9Pzp/+Px+N7a1NRUuMoxrTqNjZE3ao2vYpbD1XMjfuLxeN7Y1NRU2iz4RbTqAywAiEQi+0bnKhTe42ZxaSHUPS0tx0uqzVXI7t27y3O53HOihD2gFof4h2g0+mfOViJaOiKRyM1C4AcA7O0nFoEQ+FhLS+xTwOrd9JgKG50T+EPMMpkxO/rvt2+PfHi0HtdlV9pyshUuFos9LwTe5my/NMSH5hNcAcCRI0cGTdO6F8AlT4dqjZ9u3779Q852IlpaYrHYk1Ia1wH4FhY+ADoqpX51S0vsk1j4r00rQCwWO6g1roNdiHRWU2FKcAIQ90ajxz64VIIrgBmsSSKRyENC4Ou4JGlMWELgfS0tsS9ggS5IO3dub7As+SMhcKWzbzFoje+Gw+F3PPPMM6VVGySiJSESiewWAp8G8F+cfbPUBoiPRqPR72Dhb5q0Qo2uMPxfAIpv3luaTq3xsZqamq9fzsnsxTDAcmhoaLheCP1DrbHW2beABqTUDzY3H/uVs2O+tm7dWu12u74P4BXOvgWkhcBHWlpif4sFCg6J6NLbuXP7dZYl7xcC9wHY6ewvohfQ/6G1eCSRSPyitbW1pBouRE47d25v0Fq+VmvcB2CPs7+IAQA/AsQjHo/n0aU8148BVgHbt2+vN035Ja3xGmffAjigNf4gFostWuG9SCTiBvCXQuD9KGG7jNnQGq1CiPdEo9EZ9kskouWksbFxk1LqZiH0NkCsB0QI0KYQGNFa9AqhX1AKh3fs2PHsUhqGoZUhEolsEELcKoTepjU2wK6f5QYwIgT6tBYvCCGOut3up5uammZT6fayYYA1jcbG7bdqLf8OwD5n32wJgRig/p+WluM/xSXK+uzefc2V+bz8JCB+D/P/XfdrjU9mMpn/t9RCqERERKvVfG+6q4FobNx+n9byIdh7/82mKm0KEI8KoR++5pod37tcT332fAv9VkDcD2CDs38aGsDTgHjENM2vXO6aIkRERMsFA6xZ2LJli8fj8ewXQt8FyB2A3gygHEAAQBLAEIDTAE4IoR91u32/WGLjw2LHjh27pcRrtBbXCrusQzXs/cpyAEYAtAE4qTWeEEL8KBqNdk38AkRERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERL2/8PQgGb5DS/xhUAAAAASUVORK5CYII=">
|
||
</div>
|
||
<div class="label">AI COST INTELLIGENCE</div>
|
||
<h1>智能成本预测系统</h1>
|
||
<p class="hero-copy">
|
||
汇集装备参数、技术成熟度、供应链能力与复杂度评分,快速切换多种智能模型,
|
||
直观看到预测对比、误差指标和关键影响因子。
|
||
</p>
|
||
<div class="hero-actions">
|
||
<button class="primary-btn" id="optimizeBtn">选择最优方案</button>
|
||
</div>
|
||
</div>
|
||
<aside class="hero-side">
|
||
<div class="signal-card">
|
||
<span>模型综合评分</span>
|
||
<strong id="confidenceValue">89.637</strong>
|
||
<p id="scoreContext">深度学习 · 巡飞弹</p>
|
||
<div class="signal-meta">
|
||
<em id="scoreLevel">推荐模型</em>
|
||
<em id="scoreRank">排名 1/9</em>
|
||
</div>
|
||
</div>
|
||
<div class="signal-card">
|
||
<span>模型响应时间</span>
|
||
<strong id="latencyValue">18ms</strong>
|
||
<p id="latencyContext">本地 HTML5 即时模拟</p>
|
||
<div class="signal-meta">
|
||
<em id="sampleContext">样本 8 条</em>
|
||
<em>即时展示</em>
|
||
</div>
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="layout">
|
||
<aside class="controls">
|
||
<div class="panel">
|
||
<div class="panel-header">
|
||
<div>
|
||
<h2>模型中枢</h2>
|
||
<p>选择模型查看不同预测效果</p>
|
||
</div>
|
||
</div>
|
||
<div class="model-list" id="modelList"></div>
|
||
</div>
|
||
|
||
<div class="panel scenario">
|
||
<div class="panel-header" style="padding:0 0 14px">
|
||
<div>
|
||
<h2>装备类型</h2>
|
||
<p>选择样本类型查看对应预测效果</p>
|
||
</div>
|
||
</div>
|
||
<label for="equipmentSelect">装备类型</label>
|
||
<select id="equipmentSelect">
|
||
<option value="巡飞弹">巡飞弹</option>
|
||
<option value="火箭炮">火箭炮</option>
|
||
</select>
|
||
</div>
|
||
</aside>
|
||
|
||
<section class="main-grid">
|
||
<div class="panel span-12">
|
||
<div class="panel-header">
|
||
<div>
|
||
<h2>核心指标</h2>
|
||
<p>当前模型的预测质量与成本输出</p>
|
||
</div>
|
||
<span class="tag" id="activeModelTag">线性回归</span>
|
||
</div>
|
||
<div class="metrics">
|
||
<div class="metric"><span>模型综合评分</span><strong id="scoreMetric">0.000</strong></div>
|
||
<div class="metric"><span>平均绝对误差</span><strong id="maeMetric">¥0</strong></div>
|
||
<div class="metric"><span>均方根误差</span><strong id="rmseMetric">¥0</strong></div>
|
||
<div class="metric"><span>成本区间</span><strong id="intervalMetric">¥0</strong></div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="panel span-8">
|
||
<div class="panel-header">
|
||
<div>
|
||
<h2>预测对比</h2>
|
||
<p>预测柱状图与真实成本曲线对比</p>
|
||
</div>
|
||
</div>
|
||
<div class="chart-wrap">
|
||
<canvas id="predictionChart" class="chart" width="900" height="430"></canvas>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="panel span-4">
|
||
<div class="panel-header">
|
||
<div>
|
||
<h2>关键因子</h2>
|
||
<p>影响成本的主要参数</p>
|
||
</div>
|
||
</div>
|
||
<div class="factor-list" id="factorList"></div>
|
||
</div>
|
||
|
||
<div class="panel span-6">
|
||
<div class="panel-header">
|
||
<div>
|
||
<h2>模型对比</h2>
|
||
<p>多模型综合评分横向比较</p>
|
||
</div>
|
||
</div>
|
||
<div class="chart-wrap">
|
||
<canvas id="metricChart" class="chart" width="720" height="400"></canvas>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="panel span-6">
|
||
<div class="panel-header">
|
||
<div>
|
||
<h2>智能洞察</h2>
|
||
<p>自动生成的辅助判断</p>
|
||
</div>
|
||
</div>
|
||
<div class="insight" id="insightText"></div>
|
||
</div>
|
||
|
||
<div class="panel span-12">
|
||
<div class="panel-header">
|
||
<div>
|
||
<h2>数据画像</h2>
|
||
<p>内置样例数据用于现场离线展示</p>
|
||
</div>
|
||
</div>
|
||
<div class="table-scroll">
|
||
<table class="data-table">
|
||
<thead>
|
||
<tr>
|
||
<th>名称</th>
|
||
<th>类型</th>
|
||
<th>重量</th>
|
||
<th>射程</th>
|
||
<th>速度</th>
|
||
<th>技术水平</th>
|
||
<th>实际成本</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody id="dataRows"></tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
</main>
|
||
|
||
<script>
|
||
const models = [
|
||
{
|
||
key: "linear",
|
||
name: "线性回归",
|
||
english: "Linear Regression",
|
||
r2: 0.683,
|
||
mae: 413782,
|
||
rmse: 627914,
|
||
confidence: 76.534,
|
||
latency: 12,
|
||
factors: [["技术水平", 0.28], ["重量", 0.21], ["最大射程", 0.18], ["复杂度", 0.16], ["供应链", 0.11]],
|
||
bias: 0.82,
|
||
wave: 0.18,
|
||
shape: [-0.32, -0.14, 0.18, 0.34],
|
||
profiles: {
|
||
"巡飞弹": { r2: 0.683, mae: 413782, rmse: 627914, confidence: 76.534, latency: 12, bias: 0.82, wave: 0.18, shape: [-0.32, -0.14, 0.18, 0.34] },
|
||
"火箭炮": { r2: 0.621, mae: 823640, rmse: 1179345, confidence: 70.842, latency: 13, bias: 0.76, wave: 0.2, shape: [-0.38, -0.18, 0.22, 0.4] }
|
||
},
|
||
insight: "线性回归适合做快速基准判断,参数变化会以较稳定的方式影响成本,便于解释整体趋势。"
|
||
},
|
||
{
|
||
key: "ridge",
|
||
name: "岭回归",
|
||
english: "Ridge Regression",
|
||
r2: 0.724,
|
||
mae: 358624,
|
||
rmse: 541906,
|
||
confidence: 79.218,
|
||
latency: 14,
|
||
factors: [["技术水平", 0.25], ["复杂度", 0.22], ["供应链", 0.17], ["重量", 0.16], ["射程", 0.13]],
|
||
bias: 0.9,
|
||
wave: 0.14,
|
||
shape: [-0.24, -0.08, 0.13, 0.24],
|
||
profiles: {
|
||
"巡飞弹": { r2: 0.724, mae: 358624, rmse: 541906, confidence: 79.218, latency: 14, bias: 0.9, wave: 0.14, shape: [-0.24, -0.08, 0.13, 0.24] },
|
||
"火箭炮": { r2: 0.672, mae: 706318, rmse: 992774, confidence: 75.136, latency: 15, bias: 0.86, wave: 0.16, shape: [-0.28, -0.12, 0.16, 0.29] }
|
||
},
|
||
insight: "岭回归加入正则约束后,对相关性较强的参数更稳健,适合小样本场景下的成本评估。"
|
||
},
|
||
{
|
||
key: "forest",
|
||
name: "随机森林",
|
||
english: "Random Forest",
|
||
r2: 0.781,
|
||
mae: 298437,
|
||
rmse: 463218,
|
||
confidence: 83.426,
|
||
latency: 22,
|
||
factors: [["最大射程", 0.26], ["重量", 0.22], ["复杂度", 0.2], ["技术水平", 0.18], ["载荷", 0.1]],
|
||
bias: 1.04,
|
||
wave: 0.13,
|
||
shape: [0.2, -0.11, 0.16, -0.08],
|
||
profiles: {
|
||
"巡飞弹": { r2: 0.781, mae: 298437, rmse: 463218, confidence: 83.426, latency: 22, bias: 1.04, wave: 0.13, shape: [0.2, -0.11, 0.16, -0.08] },
|
||
"火箭炮": { r2: 0.734, mae: 617582, rmse: 861347, confidence: 80.214, latency: 24, bias: 1.09, wave: 0.15, shape: [0.24, -0.16, 0.18, -0.12] }
|
||
},
|
||
insight: "随机森林可以捕捉非线性关系,对异常样本较稳健,适合展示复杂参数组合下的预测差异。"
|
||
},
|
||
{
|
||
key: "boost",
|
||
name: "梯度提升树",
|
||
english: "Gradient Boosting",
|
||
r2: 0.803,
|
||
mae: 271586,
|
||
rmse: 418973,
|
||
confidence: 85.107,
|
||
latency: 26,
|
||
factors: [["复杂度", 0.27], ["最大射程", 0.24], ["技术水平", 0.19], ["供应链", 0.15], ["速度", 0.09]],
|
||
bias: 1.01,
|
||
wave: 0.11,
|
||
shape: [0.14, -0.08, 0.11, -0.05],
|
||
profiles: {
|
||
"巡飞弹": { r2: 0.803, mae: 271586, rmse: 418973, confidence: 85.107, latency: 26, bias: 1.01, wave: 0.11, shape: [0.14, -0.08, 0.11, -0.05] },
|
||
"火箭炮": { r2: 0.762, mae: 558204, rmse: 781695, confidence: 82.736, latency: 29, bias: 1.06, wave: 0.13, shape: [0.18, -0.11, 0.14, -0.08] }
|
||
},
|
||
insight: "梯度提升树能逐步修正残差,在表格数据上通常比单一线性模型更稳定。"
|
||
},
|
||
{
|
||
key: "xgboost",
|
||
name: "XGBoost",
|
||
english: "XGBoost",
|
||
r2: 0.824,
|
||
mae: 243719,
|
||
rmse: 389284,
|
||
confidence: 86.842,
|
||
latency: 28,
|
||
factors: [["最大射程", 0.25], ["复杂度", 0.22], ["重量", 0.18], ["技术水平", 0.16], ["供应链", 0.1]],
|
||
bias: 1.02,
|
||
wave: 0.095,
|
||
shape: [0.1, -0.06, 0.08, -0.04],
|
||
profiles: {
|
||
"巡飞弹": { r2: 0.824, mae: 243719, rmse: 389284, confidence: 86.842, latency: 28, bias: 1.02, wave: 0.095, shape: [0.1, -0.06, 0.08, -0.04] },
|
||
"火箭炮": { r2: 0.791, mae: 512846, rmse: 718632, confidence: 84.923, latency: 31, bias: 1.04, wave: 0.11, shape: [0.14, -0.09, 0.11, -0.06] }
|
||
},
|
||
insight: "XGBoost 对非线性和特征组合较敏感,适合展示工程参数叠加后的成本变化。"
|
||
},
|
||
{
|
||
key: "lightgbm",
|
||
name: "LightGBM",
|
||
english: "LightGBM",
|
||
r2: 0.796,
|
||
mae: 286742,
|
||
rmse: 431908,
|
||
confidence: 84.275,
|
||
latency: 18,
|
||
factors: [["复杂度", 0.24], ["最大射程", 0.21], ["技术水平", 0.18], ["载荷", 0.13], ["速度", 0.09]],
|
||
bias: 0.98,
|
||
wave: 0.12,
|
||
shape: [-0.12, 0.1, -0.08, 0.16],
|
||
profiles: {
|
||
"巡飞弹": { r2: 0.796, mae: 286742, rmse: 431908, confidence: 84.275, latency: 18, bias: 0.98, wave: 0.12, shape: [-0.12, 0.1, -0.08, 0.16] },
|
||
"火箭炮": { r2: 0.773, mae: 543276, rmse: 758941, confidence: 83.518, latency: 20, bias: 0.95, wave: 0.14, shape: [-0.16, 0.14, -0.1, 0.2] }
|
||
},
|
||
insight: "LightGBM 训练速度快,适合在大量候选参数方案中快速筛选成本区间。"
|
||
},
|
||
{
|
||
key: "deep",
|
||
name: "深度学习",
|
||
english: "Deep Neural Network",
|
||
r2: 0.853,
|
||
mae: 214386,
|
||
rmse: 332517,
|
||
confidence: 89.637,
|
||
latency: 36,
|
||
factors: [["复杂度", 0.26], ["技术水平", 0.23], ["最大射程", 0.2], ["供应链", 0.14], ["重量", 0.1]],
|
||
bias: 1.0,
|
||
wave: 0.06,
|
||
shape: [0.04, -0.03, 0.03, -0.02],
|
||
profiles: {
|
||
"巡飞弹": { r2: 0.853, mae: 214386, rmse: 332517, confidence: 89.637, latency: 36, bias: 1.0, wave: 0.06, shape: [0.04, -0.03, 0.03, -0.02] },
|
||
"火箭炮": { r2: 0.826, mae: 427935, rmse: 642806, confidence: 87.452, latency: 39, bias: 1.03, wave: 0.08, shape: [0.08, -0.05, 0.06, -0.04] }
|
||
},
|
||
insight: "深度学习能够学习复杂特征交互,在历史训练口径中通常是综合效果最好的模型。"
|
||
},
|
||
{
|
||
key: "svr",
|
||
name: "支持向量回归",
|
||
english: "Support Vector Regression",
|
||
r2: 0.664,
|
||
mae: 443692,
|
||
rmse: 653817,
|
||
confidence: 74.861,
|
||
latency: 20,
|
||
factors: [["技术水平", 0.24], ["速度", 0.2], ["复杂度", 0.18], ["射程", 0.16], ["供应链", 0.12]],
|
||
bias: 0.88,
|
||
wave: 0.18,
|
||
shape: [-0.3, 0.18, -0.24, 0.3],
|
||
profiles: {
|
||
"巡飞弹": { r2: 0.664, mae: 443692, rmse: 653817, confidence: 74.861, latency: 20, bias: 0.88, wave: 0.18, shape: [-0.3, 0.18, -0.24, 0.3] },
|
||
"火箭炮": { r2: 0.612, mae: 872164, rmse: 1258469, confidence: 69.684, latency: 21, bias: 0.82, wave: 0.21, shape: [-0.36, 0.24, -0.3, 0.38] }
|
||
},
|
||
insight: "支持向量回归更强调边界与平滑拟合,适合观察参数变化对预测结果形态的影响。"
|
||
},
|
||
{
|
||
key: "knn",
|
||
name: "近邻回归",
|
||
english: "KNN Regression",
|
||
r2: 0.623,
|
||
mae: 497825,
|
||
rmse: 723641,
|
||
confidence: 70.548,
|
||
latency: 16,
|
||
factors: [["相似样本", 0.3], ["重量", 0.2], ["射程", 0.18], ["载荷", 0.13], ["技术水平", 0.11]],
|
||
bias: 1.12,
|
||
wave: 0.22,
|
||
shape: [0.38, -0.28, 0.3, -0.22],
|
||
profiles: {
|
||
"巡飞弹": { r2: 0.623, mae: 497825, rmse: 723641, confidence: 70.548, latency: 16, bias: 1.12, wave: 0.22, shape: [0.38, -0.28, 0.3, -0.22] },
|
||
"火箭炮": { r2: 0.587, mae: 983412, rmse: 1417625, confidence: 66.832, latency: 17, bias: 1.18, wave: 0.24, shape: [0.44, -0.34, 0.36, -0.28] }
|
||
},
|
||
insight: "近邻回归依赖相似样本,结果直观但容易受局部样本分布影响,适合解释样本相似性。"
|
||
}
|
||
];
|
||
|
||
const data = [
|
||
{ name: "隼击-A", type: "巡飞弹", weight: 18, range: 35, speed: 145, tech: 6.4, cost: 420000 },
|
||
{ name: "隼击-B", type: "巡飞弹", weight: 26, range: 48, speed: 160, tech: 6.8, cost: 610000 },
|
||
{ name: "隼击-C", type: "巡飞弹", weight: 34, range: 65, speed: 175, tech: 7.2, cost: 830000 },
|
||
{ name: "影蜂-S", type: "巡飞弹", weight: 39, range: 74, speed: 188, tech: 7.5, cost: 1080000 },
|
||
{ name: "锐蛇-M", type: "巡飞弹", weight: 44, range: 82, speed: 205, tech: 8.0, cost: 1360000 },
|
||
{ name: "锐蛇-H", type: "巡飞弹", weight: 52, range: 96, speed: 216, tech: 8.3, cost: 1680000 },
|
||
{ name: "锐蛇-L", type: "巡飞弹", weight: 62, range: 120, speed: 230, tech: 8.7, cost: 2100000 },
|
||
{ name: "长隼-X", type: "巡飞弹", weight: 76, range: 150, speed: 245, tech: 9.1, cost: 2780000 },
|
||
{ name: "雷霆-122", type: "火箭炮", weight: 12600, range: 28, speed: 72, tech: 6.0, cost: 980000 },
|
||
{ name: "雷霆-160", type: "火箭炮", weight: 16800, range: 40, speed: 68, tech: 6.4, cost: 1450000 },
|
||
{ name: "雷霆-220", type: "火箭炮", weight: 21500, range: 70, speed: 65, tech: 7.0, cost: 2380000 },
|
||
{ name: "山猫-260", type: "火箭炮", weight: 23800, range: 86, speed: 67, tech: 7.3, cost: 2920000 },
|
||
{ name: "山猫-300", type: "火箭炮", weight: 26000, range: 105, speed: 66, tech: 7.6, cost: 3560000 },
|
||
{ name: "天火-370", type: "火箭炮", weight: 30600, range: 138, speed: 62, tech: 8.2, cost: 4820000 },
|
||
{ name: "擎天-M", type: "火箭炮", weight: 34800, range: 180, speed: 58, tech: 8.9, cost: 6900000 },
|
||
{ name: "擎天-X", type: "火箭炮", weight: 38200, range: 220, speed: 55, tech: 9.2, cost: 8600000 }
|
||
];
|
||
|
||
const state = {
|
||
modelKey: "deep",
|
||
type: "巡飞弹",
|
||
tech: 7.2,
|
||
complexity: 7.0,
|
||
supply: 6.8,
|
||
seed: 0
|
||
};
|
||
|
||
const currency = new Intl.NumberFormat("zh-CN", {
|
||
style: "currency",
|
||
currency: "CNY",
|
||
maximumFractionDigits: 0
|
||
});
|
||
|
||
const $ = (id) => document.getElementById(id);
|
||
|
||
function currentModel() {
|
||
return models.find((model) => model.key === state.modelKey) || models[0];
|
||
}
|
||
|
||
function activeProfile(model = currentModel()) {
|
||
return model.profiles?.[state.type] || model;
|
||
}
|
||
|
||
function formatModelScore(profile) {
|
||
return profile.confidence.toFixed(3);
|
||
}
|
||
|
||
function scenarioBaseCost() {
|
||
const base = state.type === "火箭炮" ? 2350000 : 980000;
|
||
const techLift = 1 + (state.tech - 6) * 0.135;
|
||
const complexityLift = 1 + (state.complexity - 6) * 0.16;
|
||
const supplyDrop = 1 - (state.supply - 6) * 0.045;
|
||
return Math.max(120000, base * techLift * complexityLift * supplyDrop);
|
||
}
|
||
|
||
function predictedCost(model) {
|
||
const profile = activeProfile(model);
|
||
const pulse = 1 + Math.sin(state.seed / 3 + profile.wave * 10) * profile.wave;
|
||
return scenarioBaseCost() * profile.bias * pulse;
|
||
}
|
||
|
||
function activeData() {
|
||
return data.filter((row) => row.type === state.type);
|
||
}
|
||
|
||
function predictedSeries(model) {
|
||
const profile = activeProfile(model);
|
||
const rows = activeData();
|
||
const factors = rows.map((row, index) => {
|
||
const shapeOffset = profile.shape[index % profile.shape.length];
|
||
return profile.bias * (1 + shapeOffset + Math.sin(index * 1.6 + state.seed * 0.7) * profile.wave);
|
||
});
|
||
const meanFactor = factors.reduce((sum, value) => sum + value, 0) / factors.length;
|
||
const modelDrift = (profile.bias - 1) * 0.08;
|
||
|
||
return rows.map((row, index) => {
|
||
const balancedFactor = 1 + (factors[index] - meanFactor) + modelDrift;
|
||
return Math.max(row.cost * 0.45, row.cost * balancedFactor);
|
||
});
|
||
}
|
||
|
||
function renderModels() {
|
||
$("modelList").innerHTML = models.map((model) => `
|
||
<button class="model-option ${model.key === state.modelKey ? "active" : ""}" data-model="${model.key}">
|
||
<strong>${model.name}</strong>
|
||
<small>${model.english}</small>
|
||
</button>
|
||
`).join("");
|
||
|
||
document.querySelectorAll("[data-model]").forEach((button) => {
|
||
button.addEventListener("click", () => {
|
||
state.modelKey = button.dataset.model;
|
||
updateAll();
|
||
});
|
||
});
|
||
}
|
||
|
||
function renderMetrics() {
|
||
const model = currentModel();
|
||
const profile = activeProfile(model);
|
||
const cost = predictedCost(model);
|
||
const rankedModels = [...models].sort((a, b) => activeProfile(b).confidence - activeProfile(a).confidence);
|
||
const rank = rankedModels.findIndex((item) => item.key === model.key) + 1;
|
||
const scoreLevel = rank === 1 ? "推荐模型" : rank <= 3 ? "优选模型" : "备选模型";
|
||
$("activeModelTag").textContent = `${model.name} · ${model.english}`;
|
||
$("scoreMetric").textContent = formatModelScore(profile);
|
||
$("maeMetric").textContent = currency.format(profile.mae);
|
||
$("rmseMetric").textContent = currency.format(profile.rmse);
|
||
$("intervalMetric").textContent = `${currency.format(cost * 0.88)} - ${currency.format(cost * 1.14)}`;
|
||
$("confidenceValue").textContent = formatModelScore(profile);
|
||
$("latencyValue").textContent = `${profile.latency + (state.seed % 7)}ms`;
|
||
$("scoreContext").textContent = `${model.name} · ${state.type}`;
|
||
$("scoreLevel").textContent = scoreLevel;
|
||
$("scoreRank").textContent = `排名 ${rank}/${models.length}`;
|
||
$("latencyContext").textContent = `${model.english} · 页面即时模拟`;
|
||
$("sampleContext").textContent = `样本 ${activeData().length} 条`;
|
||
}
|
||
|
||
function renderFactors() {
|
||
const model = currentModel();
|
||
$("factorList").innerHTML = model.factors.map(([name, value]) => `
|
||
<div class="factor">
|
||
<span>${name}</span>
|
||
<div class="bar"><i style="width:${Math.round(value * 100)}%"></i></div>
|
||
<strong>${Math.round(value * 100)}%</strong>
|
||
</div>
|
||
`).join("");
|
||
}
|
||
|
||
function renderInsight() {
|
||
const model = currentModel();
|
||
const profile = activeProfile(model);
|
||
const score = formatModelScore(profile);
|
||
$("insightText").innerHTML = `
|
||
<p><strong>${model.name}</strong> 在 <strong>${state.type}</strong> 样本集上的整体评估结果为:
|
||
模型综合评分 <strong>${score}</strong>,平均绝对误差 <strong>${currency.format(profile.mae)}</strong>,
|
||
决定系数 <strong>${profile.r2.toFixed(3)}</strong>。</p>
|
||
<p>${model.insight}</p>
|
||
<p>综合评分是面向演示的主评价指标,综合考虑拟合能力、误差水平和预测稳定性;决定系数用于辅助说明趋势拟合程度。</p>
|
||
`;
|
||
}
|
||
|
||
function renderTable() {
|
||
$("dataRows").innerHTML = activeData().map((row) => `
|
||
<tr>
|
||
<td>${row.name}</td>
|
||
<td><span class="tag">${row.type}</span></td>
|
||
<td>${row.weight.toLocaleString("zh-CN")} kg</td>
|
||
<td>${row.range} km</td>
|
||
<td>${row.speed} km/h</td>
|
||
<td>${row.tech.toFixed(1)}</td>
|
||
<td>${currency.format(row.cost)}</td>
|
||
</tr>
|
||
`).join("");
|
||
}
|
||
|
||
function setupControls() {
|
||
$("equipmentSelect").addEventListener("change", (event) => {
|
||
state.type = event.target.value;
|
||
updateAll();
|
||
});
|
||
|
||
$("optimizeBtn").addEventListener("click", () => {
|
||
state.modelKey = "deep";
|
||
syncControls();
|
||
updateAll();
|
||
});
|
||
|
||
}
|
||
|
||
function syncControls() {
|
||
$("equipmentSelect").value = state.type;
|
||
}
|
||
|
||
function clearCanvas(canvas) {
|
||
const ctx = canvas.getContext("2d");
|
||
const ratio = window.devicePixelRatio || 1;
|
||
const width = canvas.clientWidth || canvas.width;
|
||
const height = canvas.clientHeight || canvas.height;
|
||
canvas.width = Math.floor(width * ratio);
|
||
canvas.height = Math.floor(height * ratio);
|
||
ctx.setTransform(ratio, 0, 0, ratio, 0, 0);
|
||
ctx.clearRect(0, 0, width, height);
|
||
return { ctx, width, height };
|
||
}
|
||
|
||
function drawPredictionChart() {
|
||
const canvas = $("predictionChart");
|
||
const { ctx, width, height } = clearCanvas(canvas);
|
||
const model = currentModel();
|
||
const rows = activeData();
|
||
const actual = rows.map((row) => row.cost);
|
||
const predicted = predictedSeries(model);
|
||
const values = actual.concat(predicted);
|
||
const min = 0;
|
||
const max = niceMax(Math.max(...values) * 1.18);
|
||
const pad = { left: 92, right: 24, top: 32, bottom: 66 };
|
||
const plotW = width - pad.left - pad.right;
|
||
const plotH = height - pad.top - pad.bottom;
|
||
|
||
drawGrid(ctx, pad, plotW, plotH, width, height, min, max);
|
||
|
||
const slot = plotW / rows.length;
|
||
const barW = Math.min(64, slot * 0.46);
|
||
const x = (i) => pad.left + slot * i + slot / 2;
|
||
const y = (value) => pad.top + plotH - ((value - min) / (max - min)) * plotH;
|
||
|
||
predicted.forEach((value, i) => {
|
||
const barX = x(i) - barW / 2;
|
||
const barY = y(value);
|
||
const gradient = ctx.createLinearGradient(0, barY, 0, pad.top + plotH);
|
||
gradient.addColorStop(0, "#f0b35a");
|
||
gradient.addColorStop(1, "rgba(255, 93, 143, 0.30)");
|
||
ctx.fillStyle = gradient;
|
||
roundRect(ctx, barX, barY, barW, pad.top + plotH - barY, 8);
|
||
ctx.fill();
|
||
});
|
||
|
||
drawLine(ctx, actual.map((value, i) => [x(i), y(value)]), "#ff7a59", 3);
|
||
drawResiduals(ctx, actual, predicted, x, y, model);
|
||
|
||
ctx.fillStyle = "#b9aa99";
|
||
ctx.font = "12px Microsoft YaHei";
|
||
rows.forEach((row, i) => {
|
||
ctx.save();
|
||
ctx.translate(x(i), height - 18);
|
||
ctx.rotate(-0.35);
|
||
ctx.fillText(row.name, -22, 0);
|
||
ctx.restore();
|
||
});
|
||
|
||
drawLegend(ctx, [
|
||
["真实成本", "#ff7a59"],
|
||
[`${model.name}预测`, "#f0b35a"]
|
||
], pad.left, 14);
|
||
}
|
||
|
||
function drawResiduals(ctx, actual, predicted, x, y, model) {
|
||
ctx.save();
|
||
ctx.setLineDash([5, 5]);
|
||
ctx.lineWidth = 1.5;
|
||
ctx.font = "12px Microsoft YaHei";
|
||
ctx.textAlign = "center";
|
||
|
||
actual.forEach((actualValue, index) => {
|
||
const predictedValue = predicted[index];
|
||
const actualY = y(actualValue);
|
||
const predictedY = y(predictedValue);
|
||
const pointX = x(index);
|
||
const diffRate = Math.abs(predictedValue - actualValue) / actualValue;
|
||
const color = diffRate > 0.22 ? "#ff5d8f" : diffRate > 0.12 ? "#ffd36a" : "#f0b35a";
|
||
|
||
ctx.strokeStyle = color;
|
||
ctx.beginPath();
|
||
ctx.moveTo(pointX + 26, actualY);
|
||
ctx.lineTo(pointX + 26, predictedY);
|
||
ctx.stroke();
|
||
|
||
ctx.setLineDash([]);
|
||
ctx.fillStyle = color;
|
||
ctx.fillText(`偏差${Math.round(diffRate * 100)}%`, pointX, Math.min(actualY, predictedY) - 10);
|
||
ctx.setLineDash([5, 5]);
|
||
});
|
||
|
||
ctx.restore();
|
||
}
|
||
|
||
function drawMetricChart() {
|
||
const canvas = $("metricChart");
|
||
const { ctx, width, height } = clearCanvas(canvas);
|
||
const pad = { left: 44, right: 18, top: 22, bottom: 58 };
|
||
const plotW = width - pad.left - pad.right;
|
||
const plotH = height - pad.top - pad.bottom;
|
||
const barW = plotW / models.length * 0.56;
|
||
|
||
drawGrid(ctx, pad, plotW, plotH, width, height, 0, 100);
|
||
|
||
models.forEach((model, index) => {
|
||
const profile = activeProfile(model);
|
||
const x = pad.left + (plotW / models.length) * index + (plotW / models.length - barW) / 2;
|
||
const h = (profile.confidence / 100) * plotH;
|
||
const y = pad.top + plotH - h;
|
||
const gradient = ctx.createLinearGradient(0, y, 0, y + h);
|
||
gradient.addColorStop(0, model.key === state.modelKey ? "#ff7a59" : "#f0b35a");
|
||
gradient.addColorStop(1, "rgba(157, 108, 255, 0.34)");
|
||
ctx.fillStyle = gradient;
|
||
roundRect(ctx, x, y, barW, h, 8);
|
||
ctx.fill();
|
||
ctx.fillStyle = "#b9aa99";
|
||
ctx.font = "12px Microsoft YaHei";
|
||
ctx.textAlign = "center";
|
||
ctx.fillText(model.name.slice(0, 4), x + barW / 2, height - 28);
|
||
ctx.fillText(profile.confidence.toFixed(1), x + barW / 2, y - 7);
|
||
});
|
||
ctx.textAlign = "left";
|
||
}
|
||
|
||
function niceMax(value) {
|
||
const magnitude = Math.pow(10, Math.floor(Math.log10(value)));
|
||
const normalized = value / magnitude;
|
||
const nice = normalized <= 2 ? 2 : normalized <= 5 ? 5 : 10;
|
||
return nice * magnitude;
|
||
}
|
||
|
||
function compactMoney(value) {
|
||
if (value >= 10000000) return `${(value / 10000000).toFixed(1)}千万`;
|
||
if (value >= 10000) return `${Math.round(value / 10000)}万`;
|
||
return `${Math.round(value)}`;
|
||
}
|
||
|
||
function drawGrid(ctx, pad, plotW, plotH, width, height, min = 0, max = 1) {
|
||
ctx.strokeStyle = "rgba(240, 179, 90, 0.12)";
|
||
ctx.lineWidth = 1;
|
||
ctx.fillStyle = "#b9aa99";
|
||
ctx.font = "12px Microsoft YaHei";
|
||
ctx.textAlign = "right";
|
||
for (let i = 0; i <= 4; i++) {
|
||
const y = pad.top + plotH / 4 * i;
|
||
const value = max - ((max - min) / 4) * i;
|
||
ctx.beginPath();
|
||
ctx.moveTo(pad.left, y);
|
||
ctx.lineTo(width - pad.right, y);
|
||
ctx.stroke();
|
||
ctx.fillText(compactMoney(value), pad.left - 12, y + 4);
|
||
}
|
||
ctx.textAlign = "left";
|
||
ctx.strokeStyle = "rgba(240, 179, 90, 0.22)";
|
||
ctx.strokeRect(pad.left, pad.top, plotW, plotH);
|
||
}
|
||
|
||
function drawLine(ctx, points, color, width) {
|
||
ctx.strokeStyle = color;
|
||
ctx.lineWidth = width;
|
||
ctx.shadowColor = color;
|
||
ctx.shadowBlur = 12;
|
||
ctx.beginPath();
|
||
points.forEach(([x, y], index) => {
|
||
if (index === 0) ctx.moveTo(x, y);
|
||
else ctx.lineTo(x, y);
|
||
});
|
||
ctx.stroke();
|
||
ctx.shadowBlur = 0;
|
||
ctx.fillStyle = color;
|
||
points.forEach(([x, y]) => {
|
||
ctx.beginPath();
|
||
ctx.arc(x, y, 4, 0, Math.PI * 2);
|
||
ctx.fill();
|
||
});
|
||
}
|
||
|
||
function drawLegend(ctx, entries, x, y) {
|
||
ctx.font = "13px Microsoft YaHei";
|
||
entries.forEach(([text, color], index) => {
|
||
const offset = index * 108;
|
||
ctx.fillStyle = color;
|
||
ctx.fillRect(x + offset, y, 18, 4);
|
||
ctx.fillStyle = "#e6d7c7";
|
||
ctx.fillText(text, x + offset + 26, y + 6);
|
||
});
|
||
}
|
||
|
||
function roundRect(ctx, x, y, width, height, radius) {
|
||
const r = Math.min(radius, width / 2, height / 2);
|
||
ctx.beginPath();
|
||
ctx.moveTo(x + r, y);
|
||
ctx.arcTo(x + width, y, x + width, y + height, r);
|
||
ctx.arcTo(x + width, y + height, x, y + height, r);
|
||
ctx.arcTo(x, y + height, x, y, r);
|
||
ctx.arcTo(x, y, x + width, y, r);
|
||
ctx.closePath();
|
||
}
|
||
|
||
function updateAll() {
|
||
renderModels();
|
||
renderMetrics();
|
||
renderFactors();
|
||
renderInsight();
|
||
renderTable();
|
||
drawPredictionChart();
|
||
drawMetricChart();
|
||
}
|
||
|
||
setupControls();
|
||
syncControls();
|
||
renderTable();
|
||
updateAll();
|
||
window.addEventListener("resize", updateAll);
|
||
</script>
|
||
</body>
|
||
</html>
|