feat: add @polar-sh/sveltekit (#539)
* feat add @polar-sh/sveltekit * remove all lemonsqueezy text
This commit is contained in:
@@ -21,7 +21,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@carbon/charts-svelte": "^1.13.6",
|
||||
"@lemonsqueezy/lemonsqueezy.js": "^2.2.0",
|
||||
"@polar-sh/sveltekit": "^0.2.1",
|
||||
"@sentry/browser": "^7.61.0",
|
||||
"@sentry/integrations": "^7.61.0",
|
||||
"@sentry/vite-plugin": "^2.6.2",
|
||||
@@ -55,7 +55,6 @@
|
||||
"openai-edge": "^1.2.2",
|
||||
"papaparse": "^5.4.1",
|
||||
"pluralize": "^8.0.0",
|
||||
"polar-sveltekit": "^0.0.4",
|
||||
"posthog-js": "^1.180.1",
|
||||
"shared": "workspace:*",
|
||||
"sirv": "^2.0.3",
|
||||
|
||||
@@ -1,33 +1,111 @@
|
||||
<script>
|
||||
import ErrorIcon from '$lib/components/Icons/ErrorIcon.svelte';
|
||||
</script>
|
||||
|
||||
<div
|
||||
class="error-container m-auto flex flex-col-reverse lg:flex-row md:flex-col-reverse items-center justify-center h-screen w-screen py-10 dark:bg-black"
|
||||
>
|
||||
<div class="md:w-full p-2 lg:w-2/4">
|
||||
<h2 class="w-full text-lg lg:text-3xl font-medium lg:font-normal">
|
||||
Something unexpected occured.
|
||||
</h2>
|
||||
<p class="dark:text-white w-full text-base font-normal my-6 text-gray-600">
|
||||
<div class="error-container">
|
||||
<div class="error-content">
|
||||
<img src="/logo-512.png" class="logo" alt="ClassroomIO - Logo" />
|
||||
<h2>Something unexpected occured.</h2>
|
||||
<p>
|
||||
Don't worry, your learning is safe. It isn't your fault, it is ours. We have gotten the error
|
||||
notification and will push a fix ASAP. In the meantime, take a short break and come back a bit
|
||||
later.
|
||||
</p>
|
||||
<a
|
||||
class="bg-primary-700 hover:bg-primary-900 hover:no-underline transition-all py-3 px-9 rounded-xl text-white mt-3"
|
||||
href="mailto:[email protected]"
|
||||
>Contact Us</a
|
||||
>
|
||||
<a href="mailto:[email protected]">Contact Us</a>
|
||||
</div>
|
||||
|
||||
<div class="w-72 lg:w-2/4 flex items-center justify-center">
|
||||
<ErrorIcon />
|
||||
<div class="error-icon">
|
||||
<img src="/500-error.svg" alt="Error" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
.error-container {
|
||||
max-width: 964px;
|
||||
margin: auto;
|
||||
display: flex;
|
||||
flex-direction: column-reverse;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100vh;
|
||||
width: 100vw;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
:global(.dark) .error-container {
|
||||
background-color: black;
|
||||
}
|
||||
|
||||
.error-content {
|
||||
padding: 0.5rem;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.error-content h2 {
|
||||
width: 100%;
|
||||
font-size: 1.125rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.error-content p {
|
||||
width: 100%;
|
||||
font-size: 1rem;
|
||||
font-weight: 400;
|
||||
margin: 1.5rem 0;
|
||||
color: rgb(75, 85, 99);
|
||||
}
|
||||
|
||||
:global(.dark) .error-content p {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.error-content .logo {
|
||||
width: 5rem;
|
||||
}
|
||||
|
||||
.error-content a {
|
||||
background-color: rgb(29, 78, 216);
|
||||
padding: 0.75rem 2.25rem;
|
||||
border-radius: 0.75rem;
|
||||
color: white;
|
||||
margin-top: 0.75rem;
|
||||
transition: all 0.2s;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.error-content a:hover {
|
||||
background-color: rgb(30, 58, 138);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.error-icon {
|
||||
width: 18rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.error-content {
|
||||
width: 90%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1024px) {
|
||||
.error-container {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.error-content {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.error-content h2 {
|
||||
font-size: 1.875rem;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.error-icon {
|
||||
width: 50%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
import { validateUser } from '$lib/utils/services/middlewares';
|
||||
import type { Handle } from '@sveltejs/kit';
|
||||
|
||||
const PUBLIC_ROUTES = [
|
||||
'/api/completion',
|
||||
'student_prove_payment',
|
||||
'teacher_student_buycourse',
|
||||
'/api/polar'
|
||||
];
|
||||
|
||||
function isPublicRoute(pathname: string) {
|
||||
return PUBLIC_ROUTES.some((route) => pathname.includes(route));
|
||||
}
|
||||
|
||||
export const handle: Handle = async ({ event, resolve }) => {
|
||||
const response = await resolve(event);
|
||||
|
||||
const { pathname } = event.url;
|
||||
|
||||
// Only validate API routes
|
||||
if (!pathname.includes('/api')) {
|
||||
return response;
|
||||
}
|
||||
|
||||
// Skip public routes
|
||||
if (isPublicRoute(pathname)) {
|
||||
return response;
|
||||
}
|
||||
|
||||
const accessToken = event.request.headers.get('Authorization')!;
|
||||
|
||||
await validateUser(accessToken);
|
||||
|
||||
return response;
|
||||
};
|
||||
@@ -116,7 +116,7 @@
|
||||
<div class="relative mb-5">
|
||||
{#if !isLMS && !isOnLandingPage}
|
||||
<OverflowMenu
|
||||
class="absolute right-2 top-2 z-50 rounded-full bg-gray-200 opacity-0 transition-all delay-150 duration-200 ease-in-out group-hover:opacity-100 dark:bg-neutral-800"
|
||||
class="absolute right-2 top-2 z-40 rounded-full bg-gray-200 opacity-0 transition-all delay-150 duration-200 ease-in-out group-hover:opacity-100 dark:bg-neutral-800"
|
||||
size="sm"
|
||||
on:click={(e) => e.stopPropagation()}
|
||||
>
|
||||
|
||||
@@ -1,32 +1,27 @@
|
||||
<script>
|
||||
import { Grid, Row, Column } from 'carbon-components-svelte';
|
||||
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
|
||||
import { VARIANTS } from '$lib/components/PrimaryButton/constants';
|
||||
import { currentOrgPlan, isFreePlan } from '$lib/utils/store/org';
|
||||
import SectionTitle from '../SectionTitle.svelte';
|
||||
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
|
||||
import { t } from '$lib/utils/functions/translations';
|
||||
|
||||
let isRedirecting = false;
|
||||
import { currentOrgPlan, isFreePlan } from '$lib/utils/store/org';
|
||||
import { Column, Grid, Row } from 'carbon-components-svelte';
|
||||
import SectionTitle from '../SectionTitle.svelte';
|
||||
|
||||
async function onOpenBilling() {
|
||||
console.log({
|
||||
plan: $currentOrgPlan
|
||||
});
|
||||
|
||||
if ($currentOrgPlan?.subscriptionId) {
|
||||
isRedirecting = true;
|
||||
fetch('/api/lmz/subscriptions?subscriptionId=' + $currentOrgPlan?.subscriptionId)
|
||||
.then((response) => response.json())
|
||||
.then((res) => {
|
||||
isRedirecting = false;
|
||||
window.open(res.customerPortal, '_blank');
|
||||
});
|
||||
if ($currentOrgPlan?.customerId) {
|
||||
const url = new URL('/api/polar/portal', window.location.origin);
|
||||
url.searchParams.set('customerId', $currentOrgPlan?.customerId);
|
||||
|
||||
window.open(url.toString(), '_blank');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<Grid class="border-c rounded border-gray-200 dark:border-neutral-600 w-full mt-5">
|
||||
<Row class="flex lg:flex-row flex-col py-7 border-bottom-c">
|
||||
<Grid class="border-c mt-5 w-full rounded border-gray-200 dark:border-neutral-600">
|
||||
<Row class="border-bottom-c flex flex-col py-7 lg:flex-row">
|
||||
<Column sm={4} md={4} lg={4}
|
||||
><SectionTitle>{$t('settings.billing.sub_title')}</SectionTitle></Column
|
||||
>
|
||||
@@ -35,13 +30,13 @@
|
||||
{#if $isFreePlan}
|
||||
{$t('settings.billing.active')}
|
||||
{:else}
|
||||
<p class="mb-3">{$t('settings.billing.lemonsqueezy')}</p>
|
||||
<p class="mb-3">{$t('settings.billing.provider')}</p>
|
||||
|
||||
<PrimaryButton
|
||||
label={$t('settings.billing.open_billing')}
|
||||
variant={VARIANTS.CONTAINED_DARK}
|
||||
onClick={onOpenBilling}
|
||||
isLoading={isRedirecting}
|
||||
isDisabled={!$currentOrgPlan?.customerId}
|
||||
/>
|
||||
{/if}
|
||||
</Column>
|
||||
|
||||
@@ -1,15 +1,12 @@
|
||||
import { supabase } from '$lib/utils/functions/supabase';
|
||||
import { getAccessToken } from '$lib/utils/functions/supabase';
|
||||
|
||||
export async function queryUnsplash(searchQuery: string) {
|
||||
const { data } = await supabase.auth.getSession();
|
||||
const accessToken = data.session?.access_token || '';
|
||||
|
||||
try {
|
||||
const response = await fetch('/api/unsplash', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: accessToken
|
||||
Authorization: await getAccessToken()
|
||||
},
|
||||
body: JSON.stringify({ searchQuery })
|
||||
});
|
||||
|
||||
@@ -63,17 +63,14 @@ loading.subscribe(async ($loading) => {
|
||||
}
|
||||
});
|
||||
|
||||
export async function handleLocaleChange(newLocale) {
|
||||
export function handleLocaleChange(newLocale: string) {
|
||||
if (!newLocale) {
|
||||
return;
|
||||
}
|
||||
|
||||
locale.set(newLocale);
|
||||
|
||||
await fetch('/api/i18n', {
|
||||
body: JSON.stringify({ locale: newLocale }),
|
||||
method: 'POST'
|
||||
});
|
||||
selectedLocale.set(newLocale);
|
||||
}
|
||||
|
||||
export function lessonFallbackNote(
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
import { env } from '$env/dynamic/private';
|
||||
import { lemonSqueezySetup } from '@lemonsqueezy/lemonsqueezy.js';
|
||||
|
||||
export function configureLemonSqueezy() {
|
||||
return lemonSqueezySetup({
|
||||
apiKey: env.LEMON_SQUEEZY_API_KEY,
|
||||
onError: (error) => {
|
||||
throw new Error(`Lemon Squeezy API error: ${error.message}`);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
import axios from 'axios';
|
||||
|
||||
interface SubscriptionData {
|
||||
productId: string;
|
||||
email: string;
|
||||
name: string;
|
||||
triggeredBy: string;
|
||||
orgId: string;
|
||||
}
|
||||
|
||||
interface SubscriptionResponse {
|
||||
success: boolean;
|
||||
checkoutURL: string;
|
||||
}
|
||||
|
||||
export async function subscribeToProduct(data: SubscriptionData): Promise<SubscriptionResponse> {
|
||||
const response = await axios({
|
||||
method: 'POST',
|
||||
url: '/api/lmz/subscribe',
|
||||
data
|
||||
});
|
||||
|
||||
return response.data;
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
import { getServerSupabase } from '$lib/utils/functions/supabase.server';
|
||||
|
||||
const supabase = getServerSupabase();
|
||||
|
||||
export const validateUser = async (accessToken: string) => {
|
||||
let user;
|
||||
|
||||
try {
|
||||
const { data } = await supabase.auth.getUser(accessToken);
|
||||
user = data.user;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
throw new Error('Unauthenticated user');
|
||||
}
|
||||
|
||||
return user;
|
||||
};
|
||||
@@ -0,0 +1 @@
|
||||
export * from './authentication.server';
|
||||
@@ -1,4 +0,0 @@
|
||||
1. Welcome new user into classroomio
|
||||
2. Sends teacher welcome to course
|
||||
3. Notify teacher someone wants to buy course
|
||||
4
|
||||
@@ -77,7 +77,7 @@ export async function getOrganizations(userId: string, isOrgSite?: boolean, orgS
|
||||
organization_plan(
|
||||
plan_name,
|
||||
is_active,
|
||||
subscriptionId:payload->id
|
||||
customerId:payload->customerId
|
||||
)
|
||||
)
|
||||
`
|
||||
|
||||
@@ -1147,8 +1147,8 @@
|
||||
"sub_title": "Rechnungsdetails",
|
||||
"manage": "Verwalten Sie Ihre Abrechnung",
|
||||
"active": "Sie haben keine aktive Abrechnung",
|
||||
"lemonsqueezy": "Wir verwenden Lemonsqueezy, um Sie bei der Verwaltung Ihrer Abrechnung zu unterstützen",
|
||||
"open_billing": "Abrechnung öffnen"
|
||||
"open_billing": "Abrechnung öffnen",
|
||||
"provider": "Wir verwenden Polar, um Ihre Abrechnung zu verwalten"
|
||||
},
|
||||
"integrations": {
|
||||
"heading": "Telegramm",
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
"sub_title": "Billing details",
|
||||
"manage": "Manage your billing",
|
||||
"active": "You don't have any active billing",
|
||||
"lemonsqueezy": "We use Lemonsqueezy to help manage your billing",
|
||||
"provider": "We use Polar to help manage your billing",
|
||||
"open_billing": "Open billing"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1147,8 +1147,8 @@
|
||||
"sub_title": "Detalles de facturación",
|
||||
"manage": "Gestiona tu facturación",
|
||||
"active": "No tienes ninguna facturación activa",
|
||||
"lemonsqueezy": "Usamos Lemonsqueezy para ayudarlo a administrar su facturación",
|
||||
"open_billing": "Facturación abierta"
|
||||
"open_billing": "Facturación abierta",
|
||||
"provider": "Usamos Polar para ayudarte a gestionar tu facturación"
|
||||
},
|
||||
"integrations": {
|
||||
"heading": "Telegrama",
|
||||
|
||||
@@ -1147,8 +1147,8 @@
|
||||
"sub_title": "Détails de la facturation",
|
||||
"manage": "Gérez votre facturation",
|
||||
"active": "Vous n'avez aucune facturation active",
|
||||
"lemonsqueezy": "Nous utilisons Lemonsqueezy pour vous aider à gérer votre facturation",
|
||||
"open_billing": "Facturation ouverte"
|
||||
"open_billing": "Facturation ouverte",
|
||||
"provider": "Nous utilisons Polar pour vous aider à gérer votre facturation"
|
||||
},
|
||||
"integrations": {
|
||||
"heading": "Télégramme",
|
||||
|
||||
@@ -1147,8 +1147,8 @@
|
||||
"sub_title": "बिलिंग विवरण",
|
||||
"manage": "अपनी बिलिंग प्रबंधित करें",
|
||||
"active": "आपके पास कोई सक्रिय बिलिंग नहीं है",
|
||||
"lemonsqueezy": "हम आपकी बिलिंग प्रबंधित करने में सहायता के लिए लेमनस्क्वीज़ी का उपयोग करते हैं",
|
||||
"open_billing": "बिलिंग खोलें"
|
||||
"open_billing": "बिलिंग खोलें",
|
||||
"provider": "हम आपकी बिलिंग प्रबंधित करने में सहायता के लिए पोलर का उपयोग करते हैं"
|
||||
},
|
||||
"integrations": {
|
||||
"heading": "तार",
|
||||
|
||||
@@ -1147,8 +1147,8 @@
|
||||
"sub_title": "Detalhes de cobrança",
|
||||
"manage": "Gerencie seu faturamento",
|
||||
"active": "Você não tem nenhum faturamento ativo",
|
||||
"lemonsqueezy": "Usamos Lemonsqueezy para ajudar a gerenciar seu faturamento",
|
||||
"open_billing": "Faturamento aberto"
|
||||
"open_billing": "Faturamento aberto",
|
||||
"provider": "Usamos a Polar para ajudar a gerenciar seu faturamento"
|
||||
},
|
||||
"integrations": {
|
||||
"heading": "Telegrama",
|
||||
|
||||
@@ -1147,8 +1147,8 @@
|
||||
"sub_title": "Платежные реквизиты",
|
||||
"manage": "Управляйте своим биллингом",
|
||||
"active": "У вас нет активных платежных данных.",
|
||||
"lemonsqueezy": "Мы используем Lemonsqueezy для управления вашими счетами.",
|
||||
"open_billing": "Открыть биллинг"
|
||||
"open_billing": "Открыть биллинг",
|
||||
"provider": "Мы используем Polar, чтобы управлять вашими платежами."
|
||||
},
|
||||
"integrations": {
|
||||
"heading": "Телеграмма",
|
||||
|
||||
@@ -1147,8 +1147,8 @@
|
||||
"sub_title": "Chi tiết thanh toán",
|
||||
"manage": "Quản lý thanh toán của bạn",
|
||||
"active": "Bạn không có bất kỳ thanh toán nào đang hoạt động",
|
||||
"lemonsqueezy": "Chúng tôi sử dụng Lemonsqueezy để giúp quản lý hóa đơn của bạn",
|
||||
"open_billing": "Thanh toán mở"
|
||||
"open_billing": "Thanh toán mở",
|
||||
"provider": "Chúng tôi sử dụng Polar để giúp quản lý việc thanh toán của bạn"
|
||||
},
|
||||
"integrations": {
|
||||
"heading": "điện tín",
|
||||
|
||||
@@ -29,7 +29,7 @@ export interface CurrentOrg {
|
||||
customization: OrgCustomization;
|
||||
theme: string;
|
||||
organization_plan: {
|
||||
subscriptionId: string;
|
||||
customerId: string;
|
||||
plan_name: string;
|
||||
is_active: boolean;
|
||||
}[];
|
||||
|
||||
@@ -9,24 +9,10 @@ const CACHE_DURATION = 60 * 5; // 5 minutes
|
||||
export async function POST({ setHeaders, request }) {
|
||||
const { orgId } = await request.json();
|
||||
|
||||
const accessToken = request.headers.get('Authorization');
|
||||
|
||||
if (!orgId || !accessToken) {
|
||||
if (!orgId) {
|
||||
return json({ success: false, message: 'Request is missing required fields' }, { status: 400 });
|
||||
}
|
||||
|
||||
let user;
|
||||
try {
|
||||
const { data } = await supabase.auth.getUser(accessToken);
|
||||
user = data.user;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
return json({ success: false, message: 'Unauthenticated user' }, { status: 401 });
|
||||
}
|
||||
|
||||
setHeaders({
|
||||
'cache-control': `max-age=${CACHE_DURATION}`,
|
||||
'content-type': 'application/json'
|
||||
|
||||
@@ -15,24 +15,10 @@ const CACHE_DURATION = 60 * 5; // 5 minutes
|
||||
export async function POST({ setHeaders, request }) {
|
||||
const { userId, courseId, orgId } = await request.json();
|
||||
|
||||
const accessToken = request.headers.get('Authorization');
|
||||
|
||||
if (!userId || !accessToken) {
|
||||
if (!userId) {
|
||||
return json({ success: false, message: 'Request is missing required fields' }, { status: 400 });
|
||||
}
|
||||
|
||||
let user;
|
||||
try {
|
||||
const { data } = await supabase.auth.getUser(accessToken);
|
||||
user = data.user;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
return json({ success: false, message: 'Unauthenticated user' }, { status: 401 });
|
||||
}
|
||||
|
||||
setHeaders({
|
||||
'cache-control': `max-age=${CACHE_DURATION}`,
|
||||
'content-type': 'application/json'
|
||||
|
||||
@@ -1,19 +1,15 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { getSupabase } from '$lib/utils/functions/supabase';
|
||||
import {
|
||||
getConfigResponse,
|
||||
addDomainToVercel,
|
||||
getConfigResponse,
|
||||
removeDomainFromVercelProject
|
||||
} from '$lib/utils/services/org/domain';
|
||||
|
||||
const supabase = getSupabase();
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
export async function POST({ request }) {
|
||||
const { params } = await request.json();
|
||||
const accessToken = request.headers.get('Authorization');
|
||||
console.log('/GET api/domain', params);
|
||||
|
||||
if (!params?.key || !accessToken) {
|
||||
if (!params?.key) {
|
||||
return json({ success: false, message: 'Missing fields' }, { status: 400 });
|
||||
}
|
||||
|
||||
@@ -21,18 +17,6 @@ export async function POST({ request }) {
|
||||
return json({ success: false, message: 'Domain cannot contain classroomio' }, { status: 400 });
|
||||
}
|
||||
|
||||
let user;
|
||||
try {
|
||||
const { data } = await supabase.auth.getUser(accessToken);
|
||||
user = data.user;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
return json({ success: false, message: 'Unauthenticated user' }, { status: 401 });
|
||||
}
|
||||
|
||||
try {
|
||||
switch (params.key) {
|
||||
case 'verify_domain': {
|
||||
|
||||
@@ -1,29 +1,13 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { getSupabase } from '$lib/utils/functions/supabase';
|
||||
import sendEmail from '$mail/sendEmail';
|
||||
|
||||
const supabase = getSupabase();
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
export async function POST({ request }) {
|
||||
const { to, content, orgName, exerciseTitle } = await request.json();
|
||||
const accessToken = request.headers.get('Authorization') || '';
|
||||
|
||||
if (!to || !content || !orgName) {
|
||||
return json({ success: false, message: 'Missing required fields' }, { status: 400 });
|
||||
}
|
||||
|
||||
let user;
|
||||
try {
|
||||
const { data } = await supabase.auth.getUser(accessToken);
|
||||
user = data.user;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
return json({ success: false, message: 'Unauthenticated user' }, { status: 401 });
|
||||
}
|
||||
|
||||
const emailData = [
|
||||
{
|
||||
from: `"${orgName} (via ClassroomIO.com)" <[email protected]>`,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { getServerSupabase } from '$lib/utils/functions/supabase.server';
|
||||
import { getFeedForNotification } from '$lib/utils/services/newsfeed/index';
|
||||
import sendEmail from '$mail/sendEmail';
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
const supabase = getServerSupabase();
|
||||
|
||||
@@ -67,25 +67,12 @@ const sendEmailNotification = async (feedId: string, authorId: string, comment?:
|
||||
|
||||
export async function POST({ request }) {
|
||||
const { authorId, feedId, comment } = await request.json();
|
||||
const accessToken = request.headers.get('Authorization') || '';
|
||||
console.log('/POST api/email/course/newsfeed');
|
||||
|
||||
if (!authorId || !feedId || !accessToken) {
|
||||
if (!authorId || !feedId) {
|
||||
return json({ success: false, message: 'Missing required fields' }, { status: 400 });
|
||||
}
|
||||
|
||||
let user;
|
||||
try {
|
||||
const { data } = await supabase.auth.getUser(accessToken);
|
||||
user = data.user;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
return json({ success: false, message: 'Unauthenticated user' }, { status: 401 });
|
||||
}
|
||||
|
||||
await sendEmailNotification(feedId, authorId, comment);
|
||||
// TODO: Support sending to other platforms like telegram and discord
|
||||
// sendDiscordNotification(); sendTelegramNotification();
|
||||
|
||||
@@ -1,31 +1,15 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { getSupabase } from '$lib/utils/functions/supabase';
|
||||
import sendEmail from '$mail/sendEmail';
|
||||
|
||||
const supabase = getSupabase();
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
// Sends email to student when they successfully join a course
|
||||
export async function POST({ request }) {
|
||||
const { to, orgName, courseName } = await request.json();
|
||||
const accessToken = request.headers.get('Authorization') || '';
|
||||
console.log('/POST api/email/course/student_welcome', to, orgName);
|
||||
|
||||
if (!to || !orgName || !courseName) {
|
||||
return json({ success: false, message: 'Missing required fields' }, { status: 400 });
|
||||
}
|
||||
|
||||
let user;
|
||||
try {
|
||||
const { data } = await supabase.auth.getUser(accessToken);
|
||||
user = data.user;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
return json({ success: false, message: 'Unauthenticated user' }, { status: 401 });
|
||||
}
|
||||
|
||||
const emailData = [
|
||||
{
|
||||
from: `"${orgName} (via ClassroomIO.com)" <[email protected]>`,
|
||||
|
||||
@@ -1,29 +1,13 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { getSupabase } from '$lib/utils/functions/supabase';
|
||||
import sendEmail from '$mail/sendEmail';
|
||||
|
||||
const supabase = getSupabase();
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
export async function POST({ request }) {
|
||||
const { to, content, orgName } = await request.json();
|
||||
const accessToken = request.headers.get('Authorization') || '';
|
||||
|
||||
if (!to || !content || !orgName) {
|
||||
return json({ success: false, message: 'Missing required fields' }, { status: 400 });
|
||||
}
|
||||
|
||||
let user;
|
||||
try {
|
||||
const { data } = await supabase.auth.getUser(accessToken);
|
||||
user = data.user;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
return json({ success: false, message: 'Unauthenticated user' }, { status: 401 });
|
||||
}
|
||||
|
||||
const emailData = [
|
||||
{
|
||||
from: `"${orgName} (via ClassroomIO.com)" <[email protected]>`,
|
||||
|
||||
@@ -1,12 +1,8 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
// import { getSupabase } from '$lib/utils/functions/supabase';
|
||||
import sendEmail from '$mail/sendEmail';
|
||||
|
||||
// const supabase = getSupabase();
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
export async function POST({ request }) {
|
||||
const { to, courseName, studentEmail, studentFullname } = await request.json();
|
||||
// const accessToken = request.headers.get('Authorization') || '';
|
||||
console.log(
|
||||
'/POST api/email/course/teacher_student_buycourse',
|
||||
to,
|
||||
@@ -19,18 +15,6 @@ export async function POST({ request }) {
|
||||
return json({ success: false, message: 'Missing required fields' }, { status: 400 });
|
||||
}
|
||||
|
||||
// let user;
|
||||
// try {
|
||||
// const { data } = await supabase.auth.getUser(accessToken);
|
||||
// user = data.user;
|
||||
// } catch (error) {
|
||||
// console.error(error);
|
||||
// }
|
||||
|
||||
// if (!user) {
|
||||
// return json({ success: false, message: 'Unauthenticated user' }, { status: 401 });
|
||||
// }
|
||||
|
||||
const emailData = [
|
||||
{
|
||||
from: `"ClassroomIO" <[email protected]>`,
|
||||
|
||||
@@ -1,30 +1,14 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { getSupabase } from '$lib/utils/functions/supabase';
|
||||
import sendEmail from '$mail/sendEmail';
|
||||
|
||||
const supabase = getSupabase();
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
export async function POST({ request }) {
|
||||
const { to, courseName, studentName, studentEmail } = await request.json();
|
||||
const accessToken = request.headers.get('Authorization') || '';
|
||||
console.log('/POST api/email/course/teacher_student_joined', to, courseName);
|
||||
|
||||
if (!to || !courseName || !studentName || !studentEmail) {
|
||||
return json({ success: false, message: 'Missing required fields' }, { status: 400 });
|
||||
}
|
||||
|
||||
let user;
|
||||
try {
|
||||
const { data } = await supabase.auth.getUser(accessToken);
|
||||
user = data.user;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
return json({ success: false, message: 'Unauthenticated user' }, { status: 401 });
|
||||
}
|
||||
|
||||
const emailData = [
|
||||
{
|
||||
from: `"ClassroomIO" <[email protected]>`,
|
||||
|
||||
@@ -1,30 +1,14 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { getSupabase } from '$lib/utils/functions/supabase';
|
||||
import sendEmail from '$mail/sendEmail';
|
||||
|
||||
const supabase = getSupabase();
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
export async function POST({ request }) {
|
||||
const { to, name, orgName, courseName, orgSiteName } = await request.json();
|
||||
const accessToken = request.headers.get('Authorization') || '';
|
||||
console.log('/POST api/email/course/teacher_welcome', to, name, orgName);
|
||||
|
||||
if (!to || !name || !orgName || !courseName || !orgSiteName) {
|
||||
return json({ success: false, message: 'Missing required fields' }, { status: 400 });
|
||||
}
|
||||
|
||||
let user;
|
||||
try {
|
||||
const { data } = await supabase.auth.getUser(accessToken);
|
||||
user = data.user;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
return json({ success: false, message: 'Unauthenticated user' }, { status: 401 });
|
||||
}
|
||||
|
||||
const origin = request.headers.get('origin');
|
||||
const inviteLink = `${origin}/org/${orgSiteName}/courses`;
|
||||
|
||||
|
||||
@@ -1,36 +1,20 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { getSupabase } from '$lib/utils/functions/supabase';
|
||||
import sendEmail from '$mail/sendEmail';
|
||||
|
||||
const supabase = getSupabase();
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
// API to send invite to teacher
|
||||
export async function POST({ request }) {
|
||||
const body = await request.json();
|
||||
const { org, email } = body;
|
||||
|
||||
const accessToken = request.headers.get('Authorization');
|
||||
console.log('/POST api/email/invite', body);
|
||||
|
||||
if (!org || !Object.keys(org).length || !email || !accessToken) {
|
||||
if (!org || !Object.keys(org).length || !email) {
|
||||
return json(
|
||||
{ success: false, message: 'Org data and Teacher name are required' },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
let user;
|
||||
try {
|
||||
const { data } = await supabase.auth.getUser(accessToken);
|
||||
user = data.user;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
return json({ success: false, message: 'Unauthenticated user' }, { status: 401 });
|
||||
}
|
||||
|
||||
const { id, name, siteName } = org;
|
||||
|
||||
const origin = request.headers.get('origin');
|
||||
|
||||
@@ -1,30 +1,14 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { getSupabase } from '$lib/utils/functions/supabase';
|
||||
import sendEmail from '$mail/sendEmail';
|
||||
|
||||
const supabase = getSupabase();
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
export async function POST({ request }) {
|
||||
const { to, profileId, orgSiteName, fullname } = await request.json();
|
||||
const accessToken = request.headers.get('Authorization');
|
||||
console.log('/POST api/email/verify_email', to, profileId);
|
||||
|
||||
if (!to || !profileId || !accessToken) {
|
||||
if (!to || !profileId) {
|
||||
return json({ success: false, message: 'Name and To are required fields' }, { status: 400 });
|
||||
}
|
||||
|
||||
let user;
|
||||
try {
|
||||
const { data } = await supabase.auth.getUser(accessToken);
|
||||
user = data.user;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
return json({ success: false, message: 'Unauthenticated user' }, { status: 401 });
|
||||
}
|
||||
|
||||
const origin = request.headers.get('origin');
|
||||
const verificationData = JSON.stringify({
|
||||
profileId,
|
||||
|
||||
@@ -1,30 +1,14 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { getSupabase } from '$lib/utils/functions/supabase';
|
||||
import sendEmail from '$mail/sendEmail';
|
||||
|
||||
const supabase = getSupabase();
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
export async function POST({ request }) {
|
||||
const { to, name } = await request.json();
|
||||
const accessToken = request.headers.get('Authorization');
|
||||
console.log('/POST api/email/welcome', to, name);
|
||||
|
||||
if (!to || !name || !accessToken) {
|
||||
if (!to || !name) {
|
||||
return json({ success: false, message: 'Name and To are required fields' }, { status: 400 });
|
||||
}
|
||||
|
||||
let user;
|
||||
try {
|
||||
const { data } = await supabase.auth.getUser(accessToken);
|
||||
user = data.user;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
return json({ success: false, message: 'Unauthenticated user' }, { status: 401 });
|
||||
}
|
||||
|
||||
const emailData = [
|
||||
{
|
||||
from: `"Best from ClassroomIO" <[email protected]>`,
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
import { selectedLocale } from '$lib/utils/functions/translations';
|
||||
import { json, type RequestHandler } from '@sveltejs/kit';
|
||||
|
||||
export const POST = (async ({ request }) => {
|
||||
try {
|
||||
const body = await request.json();
|
||||
selectedLocale.set(body.locale);
|
||||
} catch (e) {
|
||||
selectedLocale.set('en');
|
||||
}
|
||||
|
||||
return json({ status: 200 });
|
||||
}) satisfies RequestHandler;
|
||||
@@ -1,38 +0,0 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { createCheckout } from '@lemonsqueezy/lemonsqueezy.js';
|
||||
import { env } from '$env/dynamic/private';
|
||||
import { configureLemonSqueezy } from '$lib/utils/services/lemonsqueezy';
|
||||
|
||||
export async function POST({ request }) {
|
||||
const { email, name, orgId, productId, triggeredBy } = await request.json();
|
||||
|
||||
await configureLemonSqueezy();
|
||||
|
||||
if (!productId) {
|
||||
return json({ success: false, message: 'Product Id is required' }, { status: 400 });
|
||||
}
|
||||
|
||||
const checkoutData = {
|
||||
email: email,
|
||||
name: name,
|
||||
custom: {
|
||||
org_id: orgId,
|
||||
triggered_by: `${triggeredBy}`
|
||||
}
|
||||
};
|
||||
|
||||
console.log({ checkoutData });
|
||||
|
||||
const { data } = await createCheckout(env.LEMON_SQUEEZY_STORE_ID, productId, {
|
||||
checkoutData
|
||||
});
|
||||
|
||||
const checkoutURL = data?.data.attributes.url;
|
||||
|
||||
console.log({ checkoutURL });
|
||||
|
||||
return json({
|
||||
success: true,
|
||||
checkoutURL
|
||||
});
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { getSubscription } from '@lemonsqueezy/lemonsqueezy.js';
|
||||
import { configureLemonSqueezy } from '$lib/utils/services/lemonsqueezy';
|
||||
|
||||
export async function GET({ url }) {
|
||||
const subscriptionId = url.searchParams.get('subscriptionId');
|
||||
|
||||
await configureLemonSqueezy();
|
||||
|
||||
if (!subscriptionId) {
|
||||
return json({ success: false, message: 'Subscription id is required' }, { status: 400 });
|
||||
}
|
||||
|
||||
const response = await getSubscription(subscriptionId);
|
||||
const customerPortal = response?.data?.data?.attributes?.urls?.customer_portal;
|
||||
|
||||
console.log({ customerPortal });
|
||||
|
||||
return json({
|
||||
success: true,
|
||||
customerPortal
|
||||
});
|
||||
}
|
||||
@@ -1,83 +0,0 @@
|
||||
import { env } from '$env/dynamic/private';
|
||||
import { getServerSupabase } from '$lib/utils/functions/supabase.server';
|
||||
import { cancelOrgPlan, createOrgPlan } from '$lib/utils/services/org';
|
||||
import { json } from '@sveltejs/kit';
|
||||
import crypto from 'crypto';
|
||||
import { PLAN } from 'shared/src/plans/constants';
|
||||
|
||||
export async function POST({ request }) {
|
||||
try {
|
||||
const supabase = getServerSupabase();
|
||||
|
||||
// Catch the event type
|
||||
const clonedReq = request.clone();
|
||||
const eventType = request.headers.get('X-Event-Name');
|
||||
const body = await request.json();
|
||||
|
||||
// Check signature
|
||||
const secret = env.LEMON_SQUEEZY_WEBHOOK_SECRET;
|
||||
const hmac = crypto.createHmac('sha256', secret);
|
||||
const digest = Buffer.from(hmac.update(await clonedReq.text()).digest('hex'), 'utf8');
|
||||
const signature = Buffer.from(request.headers.get('X-Signature') || '', 'utf8');
|
||||
|
||||
if (!crypto.timingSafeEqual(digest, signature)) {
|
||||
throw new Error('Invalid signature.');
|
||||
}
|
||||
|
||||
console.log(body);
|
||||
|
||||
// Logic according to event
|
||||
if (eventType === 'subscription_created' || eventType === 'subscription_resumed') {
|
||||
const orgId = body.meta.custom_data.org_id;
|
||||
const triggeredBy = body.meta.custom_data.triggered_by;
|
||||
const subscriptionId = body.data.id;
|
||||
const isSuccessful = body.data.attributes.status === 'active';
|
||||
|
||||
console.log({
|
||||
subscriptionId,
|
||||
triggeredBy,
|
||||
isSuccessful
|
||||
});
|
||||
|
||||
if (isSuccessful && orgId) {
|
||||
const { data, error } = await createOrgPlan({
|
||||
supabase,
|
||||
subscriptionId,
|
||||
orgId,
|
||||
triggeredBy: parseInt(triggeredBy),
|
||||
planName: PLAN.EARLY_ADOPTER,
|
||||
data: body.data
|
||||
});
|
||||
|
||||
if (error) console.error('Error creating org plan', error);
|
||||
console.log('Create plan', data);
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
['subscription_cancelled', 'subscription_expired', 'subscription_payment_refunded'].includes(
|
||||
`${eventType}`
|
||||
)
|
||||
) {
|
||||
const subscriptionId = body.data.id;
|
||||
const { data, error } = await cancelOrgPlan({
|
||||
subscriptionId,
|
||||
data: body.data
|
||||
});
|
||||
|
||||
if (error) console.error('Error canceling org plan', error);
|
||||
console.log('Cancel plan', data);
|
||||
}
|
||||
|
||||
return json({ message: 'Webhook received' });
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
return json({ message: 'Server error' }, { status: 500 });
|
||||
}
|
||||
}
|
||||
|
||||
export function GET() {
|
||||
return json({
|
||||
success: true
|
||||
});
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
const downloadTranscript = async () => {};
|
||||
|
||||
const uploadTranscriptToS3 = async () => {};
|
||||
|
||||
export async function GET({ url }) {
|
||||
const museFid = url.searchParams.get('museFid');
|
||||
|
||||
console.log('museFid');
|
||||
|
||||
// check the transcript table and see if we find a record
|
||||
// if we find one
|
||||
// check if downloaded = true
|
||||
// if true
|
||||
// return the transcript
|
||||
// if false
|
||||
// download the transcript from muse
|
||||
// upload it to S3
|
||||
// return the transcript
|
||||
// if we dont
|
||||
|
||||
return json({ success: true, museFid });
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
import { dev } from '$app/environment';
|
||||
import { env } from '$env/dynamic/private';
|
||||
import { CustomerPortal } from '@polar-sh/sveltekit';
|
||||
|
||||
export const GET = CustomerPortal({
|
||||
accessToken: env.POLAR_ACCESS_TOKEN,
|
||||
getCustomerId: async (e) => e.url.searchParams.get('customerId')!,
|
||||
server: dev ? 'sandbox' : 'production'
|
||||
});
|
||||
@@ -1,5 +1,6 @@
|
||||
import { dev } from '$app/environment';
|
||||
import { env } from '$env/dynamic/private';
|
||||
import { Checkout } from 'polar-sveltekit';
|
||||
import { Checkout } from '@polar-sh/sveltekit';
|
||||
|
||||
export const GET = ({ ...params }) => {
|
||||
const metadata = JSON.parse(params.url.searchParams.get('metadata') ?? '{}');
|
||||
@@ -7,7 +8,8 @@ export const GET = ({ ...params }) => {
|
||||
|
||||
const request = Checkout({
|
||||
accessToken: env.POLAR_ACCESS_TOKEN,
|
||||
successUrl
|
||||
successUrl,
|
||||
server: dev ? 'sandbox' : 'production'
|
||||
});
|
||||
|
||||
return request(params);
|
||||
|
||||
@@ -2,7 +2,7 @@ import { env } from '$env/dynamic/private';
|
||||
import { getServerSupabase } from '$lib/utils/functions/supabase.server';
|
||||
import { cancelOrgPlan, createOrgPlan, updateOrgPlan } from '$lib/utils/services/org';
|
||||
import type { PolarWebhookPayload } from '$lib/utils/types/polar';
|
||||
import { Webhooks } from 'polar-sveltekit';
|
||||
import { Webhooks } from '@polar-sh/sveltekit';
|
||||
import { PLAN } from 'shared/src/plans/constants';
|
||||
|
||||
export const POST = Webhooks({
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
export async function POST({ request }) {
|
||||
try {
|
||||
// Catch the event type
|
||||
// const clonedReq = request.clone();
|
||||
// const eventType = request.headers.get('X-Event-Name');
|
||||
const body = await request.json();
|
||||
|
||||
// // Check signature
|
||||
// const secret = LEMON_SQUEEZY_WEBHOOK_SECRET;
|
||||
// const hmac = crypto.createHmac('sha256', secret);
|
||||
// const digest = Buffer.from(hmac.update(await clonedReq.text()).digest('hex'), 'utf8');
|
||||
// const signature = Buffer.from(request.headers.get('X-Signature') || '', 'utf8');
|
||||
|
||||
// if (!crypto.timingSafeEqual(digest, signature)) {
|
||||
// throw new Error('Invalid signature.');
|
||||
// }
|
||||
|
||||
console.log(body);
|
||||
|
||||
// Logic according to event
|
||||
// if (eventType === 'order_created') {
|
||||
// const orgId = body.meta.custom_data.org_id;
|
||||
// const triggeredBy = body.meta.custom_data.triggered_by;
|
||||
// const isSuccessful = body.data.attributes.status === 'paid';
|
||||
|
||||
// console.log({
|
||||
// orgId,
|
||||
// triggeredBy,
|
||||
// isSuccessful
|
||||
// });
|
||||
|
||||
// if (isSuccessful) {
|
||||
// const { error } = await createOrgPlan({
|
||||
// orgId,
|
||||
// triggeredBy,
|
||||
// planName: PLAN.EARLY_ADOPTER,
|
||||
// data: body.data
|
||||
// });
|
||||
|
||||
// if (error) console.error('Error creating org plan', error);
|
||||
// }
|
||||
// }
|
||||
|
||||
return json({ message: 'Webhook received' });
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
return json({ message: 'Server error' }, { status: 500 });
|
||||
}
|
||||
}
|
||||
|
||||
export function GET() {
|
||||
return json({
|
||||
success: true
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
<svg width="312" height="312" viewBox="0 0 312 312" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M155.722 138.894C157.24 138.894 158.471 140.124 158.471 141.642C158.471 143.16 157.24 144.391 155.722 144.391C154.204 144.391 152.973 143.16 152.973 141.642C152.973 140.124 154.204 138.894 155.722 138.894ZM163.129 138.894C164.646 138.894 165.877 140.124 165.877 141.642C165.877 143.16 164.646 144.391 163.129 144.391C161.61 144.391 160.38 143.16 160.38 141.642C160.38 140.124 161.61 138.894 163.129 138.894ZM170.382 138.894C171.9 138.894 173.131 140.124 173.131 141.642C173.131 143.16 171.9 144.391 170.382 144.391C168.865 144.391 167.634 143.16 167.634 141.642C167.634 140.124 168.865 138.894 170.382 138.894ZM182.428 135.959C185.622 135.959 188.211 138.549 188.211 141.744C188.211 144.938 185.622 147.528 182.428 147.528C179.233 147.528 176.644 144.938 176.644 141.744C176.644 138.549 179.233 135.959 182.428 135.959ZM78.6013 128.764V130.094C79.0637 130.264 79.5304 130.435 80.0009 130.605V128.764H84.5824V132.217C85.0458 132.375 85.5121 132.533 85.9823 132.691V128.764H90.5638V134.186C91.0272 134.333 91.4941 134.479 91.9637 134.624V128.764H96.5452V136.006C97.0089 136.141 97.4755 136.277 97.9448 136.411V128.764H102.526V137.683C102.991 137.808 103.457 137.931 103.926 138.055V128.764H108.508V139.222C108.972 139.336 109.439 139.45 109.908 139.561V128.764H114.489V140.625C114.954 140.728 115.42 140.831 115.889 140.934V128.764H120.47V141.895C120.935 141.988 121.401 142.082 121.87 142.174V128.764H126.451V143.036C126.917 143.119 127.384 143.203 127.852 143.285V128.764H132.433V144.048C132.898 144.122 133.365 144.196 133.832 144.267V128.764H138.414V144.936C155.445 147.282 174.378 148.38 194.918 147.326V118.124H69.082V126.377C70.9835 127.164 72.9778 127.961 75.0641 128.764H78.6013Z" fill="#D3D3D3"/>
|
||||
<path d="M138.414 144.931V154.72H133.833V144.264C133.364 144.192 132.898 144.119 132.433 144.045V154.72H127.852V143.281C127.383 143.198 126.917 143.116 126.452 143.032V154.72H121.87V142.17C121.402 142.078 120.936 141.984 120.47 141.891V154.72H115.889V140.93C115.42 140.828 114.954 140.724 114.489 140.621V154.72H109.908V139.558C109.439 139.446 108.972 139.332 108.508 139.217V154.72H103.926V138.052C103.457 137.928 102.991 137.804 102.526 137.68V154.72H97.9447V136.407C97.4755 136.273 97.0089 136.137 96.5452 136.002V154.72H91.9637V134.621C91.4942 134.475 91.0271 134.329 90.5637 134.182V154.72H85.9822V132.687C85.5121 132.53 85.0457 132.372 84.5823 132.213V154.72H80.0009V130.601C79.5304 130.431 79.0637 130.261 78.6013 130.09V154.72H74.0199V128.76H75.0641C72.9778 127.958 70.9834 127.159 69.082 126.373V165.359H194.918V147.321C174.378 148.375 155.444 147.279 138.414 144.931Z" fill="#BABABA"/>
|
||||
<path d="M74.0195 128.763V154.725H78.601V130.093C77.3945 129.65 76.2151 129.205 75.0638 128.763H74.0195Z" fill="#919191"/>
|
||||
<path d="M75.0645 128.761C76.2158 129.204 77.3952 129.648 78.6017 130.092V128.761H75.0645Z" fill="#AAAAAA"/>
|
||||
<path d="M80.002 128.766V130.609C81.4896 131.146 83.0167 131.684 84.5833 132.22V128.766H80.002Z" fill="#AAAAAA"/>
|
||||
<path d="M80.002 154.725H84.5833V132.217C83.0167 131.682 81.4896 131.144 80.002 130.606V154.725Z" fill="#919191"/>
|
||||
<path d="M85.9824 154.725H90.5638V134.186C89.0026 133.692 87.4752 133.193 85.9824 132.692V154.725Z" fill="#919191"/>
|
||||
<path d="M85.9824 128.761V132.689C87.4753 133.19 89.0026 133.688 90.5638 134.184V128.761H85.9824Z" fill="#AAAAAA"/>
|
||||
<path d="M91.9629 128.763V134.625C93.4596 135.09 94.9873 135.55 96.5443 136.006V128.763H91.9629Z" fill="#AAAAAA"/>
|
||||
<path d="M91.9629 154.725H96.5443V136.006C94.9873 135.551 93.4597 135.09 91.9629 134.625V154.725Z" fill="#919191"/>
|
||||
<path d="M97.9453 128.768V136.416C99.4459 136.846 100.973 137.271 102.527 137.688V128.768H97.9453Z" fill="#AAAAAA"/>
|
||||
<path d="M97.9453 154.725H102.527V137.684C100.973 137.265 99.4459 136.842 97.9453 136.411V154.725Z" fill="#919191"/>
|
||||
<path d="M103.928 154.725H108.509V139.222C106.958 138.84 105.431 138.451 103.928 138.056V154.725Z" fill="#919191"/>
|
||||
<path d="M103.926 128.765V138.057C105.429 138.452 106.956 138.841 108.507 139.223V128.765H103.926Z" fill="#AAAAAA"/>
|
||||
<path d="M109.908 154.725H114.49V140.625C112.941 140.278 111.414 139.925 109.908 139.562V154.725Z" fill="#919191"/>
|
||||
<path d="M109.908 128.754V139.552C111.413 139.915 112.941 140.269 114.49 140.615V128.754H109.908Z" fill="#AAAAAA"/>
|
||||
<path d="M115.889 154.725H120.47V141.895C118.923 141.584 117.396 141.263 115.889 140.934V154.725Z" fill="#919191"/>
|
||||
<path d="M115.889 128.763V140.933C117.396 141.262 118.923 141.583 120.47 141.896V128.763H115.889Z" fill="#AAAAAA"/>
|
||||
<path d="M121.869 154.73H126.451V143.042C124.905 142.763 123.378 142.476 121.869 142.18V154.73Z" fill="#919191"/>
|
||||
<path d="M121.871 128.764V142.175C123.38 142.471 124.907 142.759 126.453 143.037V128.764H121.871Z" fill="#AAAAAA"/>
|
||||
<path d="M127.852 154.725H132.433V144.048C130.888 143.803 129.362 143.549 127.852 143.284V154.725Z" fill="#919191"/>
|
||||
<path d="M127.852 128.76V143.281C129.362 143.545 130.889 143.8 132.432 144.045V128.76H127.852Z" fill="#AAAAAA"/>
|
||||
<path d="M133.832 128.763V144.268C135.343 144.5 136.871 144.722 138.414 144.935V128.763H133.832Z" fill="#AAAAAA"/>
|
||||
<path d="M133.832 154.725H138.414V144.936C136.872 144.723 135.344 144.5 133.832 144.268V154.725Z" fill="#919191"/>
|
||||
<path d="M155.721 144.395C157.239 144.395 158.47 143.163 158.47 141.646C158.47 140.127 157.239 138.897 155.721 138.897C154.203 138.897 152.973 140.127 152.973 141.646C152.973 143.163 154.203 144.395 155.721 144.395Z" fill="#494949"/>
|
||||
<path d="M163.128 144.395C164.647 144.395 165.877 143.163 165.877 141.646C165.877 140.127 164.647 138.897 163.128 138.897C161.61 138.897 160.379 140.127 160.379 141.646C160.379 143.163 161.61 144.395 163.128 144.395Z" fill="#494949"/>
|
||||
<path d="M170.384 144.395C171.901 144.395 173.133 143.163 173.133 141.646C173.133 140.127 171.901 138.897 170.384 138.897C168.865 138.897 167.635 140.127 167.635 141.646C167.635 143.163 168.865 144.395 170.384 144.395Z" fill="#494949"/>
|
||||
<path d="M182.429 147.528C185.623 147.528 188.213 144.939 188.213 141.745C188.213 138.55 185.623 135.96 182.429 135.96C179.234 135.96 176.645 138.55 176.645 141.745C176.645 144.939 179.234 147.528 182.429 147.528Z" fill="#5A231C"/>
|
||||
<path d="M189.568 171.967H74.4316V165.361H189.568V171.967Z" fill="#595959"/>
|
||||
<path d="M189.568 168.02H74.4316V165.365H189.568V168.02Z" fill="#2B2B2B"/>
|
||||
<path d="M155.721 192.737C157.24 192.737 158.47 193.968 158.47 195.486C158.47 197.004 157.24 198.235 155.721 198.235C154.203 198.235 152.973 197.004 152.973 195.486C152.973 193.968 154.203 192.737 155.721 192.737ZM163.128 192.737C164.647 192.737 165.877 193.968 165.877 195.486C165.877 197.004 164.647 198.235 163.128 198.235C161.61 198.235 160.38 197.004 160.38 195.486C160.38 193.968 161.61 192.737 163.128 192.737ZM170.382 192.737C171.901 192.737 173.131 193.968 173.131 195.486C173.131 197.004 171.901 198.235 170.382 198.235C168.864 198.235 167.633 197.004 167.633 195.486C167.633 193.968 168.864 192.737 170.382 192.737ZM182.427 189.803C185.621 189.803 188.212 192.394 188.212 195.588C188.212 198.782 185.621 201.372 182.427 201.372C179.233 201.372 176.644 198.782 176.644 195.588C176.644 192.394 179.233 189.803 182.427 189.803ZM78.6013 182.607V183.939C79.0637 184.108 79.5304 184.279 80.0009 184.45V182.607H84.5823V186.061C85.0457 186.219 85.5121 186.377 85.9822 186.536V182.607H90.5637V188.03C91.0271 188.176 91.4942 188.323 91.9637 188.468V182.607H96.5452V189.85C97.0089 189.986 97.4755 190.12 97.9447 190.255V182.607H102.526V191.527C102.991 191.652 103.457 191.775 103.926 191.899V182.607H108.508V193.066C108.972 193.18 109.439 193.293 109.908 193.406V182.607H114.489V194.469C114.954 194.573 115.42 194.675 115.889 194.778V182.607H120.47V195.739C120.936 195.833 121.402 195.926 121.87 196.018V182.607H126.452V196.88C126.917 196.964 127.383 197.046 127.852 197.128V182.607H132.433V197.893C132.898 197.967 133.364 198.039 133.833 198.111V182.607H138.414V198.779C155.444 201.127 174.378 202.223 194.918 201.17V171.968H69.082V180.221C70.9834 181.008 72.9778 181.805 75.0641 182.607H78.6013Z" fill="#D3D3D3"/>
|
||||
<path d="M138.416 198.775V208.564H133.835V198.107C133.366 198.035 132.9 197.962 132.435 197.888V208.564H127.854V197.124C127.385 197.042 126.919 196.959 126.454 196.875V208.564H121.872V196.013C121.404 195.921 120.938 195.828 120.472 195.734V208.564H115.891V194.773C115.422 194.671 114.956 194.568 114.491 194.464V208.564H109.91V193.402C109.441 193.289 108.974 193.175 108.51 193.061V208.564H103.928V191.894C103.459 191.771 102.993 191.647 102.528 191.522V208.564H97.9467V190.251C97.4775 190.115 97.0109 189.981 96.5471 189.846V208.564H91.9657V188.463C91.4961 188.319 91.0291 188.171 90.5656 188.025V208.564H85.9842V186.531C85.5141 186.372 85.0477 186.215 84.5843 186.057V208.564H80.0028V184.445C79.5323 184.274 79.0656 184.104 78.6032 183.934V208.564H74.0218V182.602H75.0661C72.9798 181.801 70.9854 181.003 69.084 180.217V219.203H194.92V201.165C174.38 202.219 155.446 201.122 138.416 198.775Z" fill="#BABABA"/>
|
||||
<path d="M74.0215 182.607V208.568H78.6029V183.938C77.3965 183.493 76.2171 183.05 75.0658 182.607H74.0215Z" fill="#919191"/>
|
||||
<path d="M75.0645 182.611C76.2158 183.054 77.3952 183.498 78.6016 183.942V182.611H75.0645Z" fill="#AAAAAA"/>
|
||||
<path d="M80.002 182.609V184.452C81.4897 184.99 83.0168 185.528 84.5833 186.063V182.609H80.002Z" fill="#AAAAAA"/>
|
||||
<path d="M80.002 208.565H84.5835V186.058C83.0167 185.522 81.4897 184.984 80.002 184.446V208.565Z" fill="#919191"/>
|
||||
<path d="M85.9824 208.568H90.5637V188.029C89.0025 187.534 87.4752 187.036 85.9824 186.535V208.568Z" fill="#919191"/>
|
||||
<path d="M85.9824 182.612V186.541C87.4753 187.041 89.0022 187.54 90.564 188.034V182.612H85.9824Z" fill="#AAAAAA"/>
|
||||
<path d="M91.9629 182.607V188.468C93.4589 188.934 94.9866 189.395 96.5437 189.85V182.607H91.9629Z" fill="#AAAAAA"/>
|
||||
<path d="M91.9629 208.565H96.5446V189.846C94.9871 189.391 93.4599 188.93 91.9629 188.465V208.565Z" fill="#919191"/>
|
||||
<path d="M97.9453 182.61V190.258C99.4461 190.689 100.973 191.113 102.527 191.53V182.61H97.9453Z" fill="#AAAAAA"/>
|
||||
<path d="M97.9453 208.565H102.527V191.524C100.973 191.106 99.4459 190.682 97.9453 190.252V208.565Z" fill="#919191"/>
|
||||
<path d="M103.926 208.565H108.507V193.062C106.956 192.681 105.429 192.292 103.926 191.896V208.565Z" fill="#919191"/>
|
||||
<path d="M103.926 182.606V191.898C105.429 192.293 106.957 192.683 108.507 193.064V182.606H103.926Z" fill="#AAAAAA"/>
|
||||
<path d="M109.908 208.565H114.489V194.465C112.941 194.12 111.413 193.765 109.908 193.403V208.565Z" fill="#919191"/>
|
||||
<path d="M109.908 182.604V193.402C111.413 193.764 112.941 194.119 114.49 194.465V182.604H109.908Z" fill="#AAAAAA"/>
|
||||
<path d="M115.889 208.565H120.47V195.736C118.923 195.425 117.396 195.103 115.889 194.775V208.565Z" fill="#919191"/>
|
||||
<path d="M115.889 182.601V194.771C117.397 195.101 118.923 195.422 120.47 195.733V182.601H115.889Z" fill="#AAAAAA"/>
|
||||
<path d="M121.871 208.565H126.452V196.877C124.907 196.599 123.38 196.311 121.871 196.015V208.565Z" fill="#919191"/>
|
||||
<path d="M121.871 182.608V196.02C123.38 196.316 124.907 196.603 126.453 196.881V182.608H121.871Z" fill="#AAAAAA"/>
|
||||
<path d="M127.852 208.568H132.433V197.892C130.889 197.648 129.362 197.392 127.852 197.128V208.568Z" fill="#919191"/>
|
||||
<path d="M127.852 182.606V197.127C129.362 197.39 130.889 197.646 132.433 197.891V182.606H127.852Z" fill="#AAAAAA"/>
|
||||
<path d="M133.832 182.613V198.117C135.344 198.349 136.871 198.572 138.414 198.784V182.613H133.832Z" fill="#AAAAAA"/>
|
||||
<path d="M133.832 208.565H138.414V198.776C136.871 198.564 135.344 198.34 133.832 198.109V208.565Z" fill="#919191"/>
|
||||
<path d="M155.722 198.23C157.24 198.23 158.47 197 158.47 195.482C158.47 193.963 157.24 192.733 155.722 192.733C154.203 192.733 152.973 193.963 152.973 195.482C152.973 197 154.203 198.23 155.722 198.23Z" fill="#494949"/>
|
||||
<path d="M163.13 198.23C164.648 198.23 165.879 196.999 165.879 195.482C165.879 193.963 164.648 192.733 163.13 192.733C161.612 192.733 160.381 193.963 160.381 195.482C160.381 196.999 161.612 198.23 163.13 198.23Z" fill="#494949"/>
|
||||
<path d="M170.383 198.23C171.902 198.23 173.132 197 173.132 195.481C173.132 193.964 171.902 192.733 170.383 192.733C168.865 192.733 167.635 193.964 167.635 195.481C167.635 197 168.865 198.23 170.383 198.23Z" fill="#494949"/>
|
||||
<path d="M182.429 201.372C185.623 201.372 188.213 198.783 188.213 195.588C188.213 192.394 185.623 189.804 182.429 189.804C179.234 189.804 176.645 192.394 176.645 195.588C176.645 198.783 179.234 201.372 182.429 201.372Z" fill="#5A231C"/>
|
||||
<path d="M189.568 225.811H74.4316V219.205H189.568V225.811Z" fill="#595959"/>
|
||||
<path d="M189.568 221.863H74.4316V219.209H189.568V221.863Z" fill="#2B2B2B"/>
|
||||
<path d="M155.721 246.581C157.24 246.581 158.47 247.812 158.47 249.33C158.47 250.848 157.24 252.079 155.721 252.079C154.203 252.079 152.973 250.848 152.973 249.33C152.973 247.812 154.203 246.581 155.721 246.581ZM163.128 246.581C164.647 246.581 165.877 247.812 165.877 249.33C165.877 250.848 164.647 252.079 163.128 252.079C161.61 252.079 160.38 250.848 160.38 249.33C160.38 247.812 161.61 246.581 163.128 246.581ZM170.382 246.581C171.901 246.581 173.131 247.812 173.131 249.33C173.131 250.848 171.901 252.079 170.382 252.079C168.864 252.079 167.633 250.848 167.633 249.33C167.633 247.812 168.864 246.581 170.382 246.581ZM182.427 243.648C185.621 243.648 188.212 246.237 188.212 249.432C188.212 252.626 185.621 255.216 182.427 255.216C179.233 255.216 176.644 252.626 176.644 249.432C176.644 246.237 179.233 243.648 182.427 243.648ZM78.6013 236.451V237.782C79.0637 237.952 79.5304 238.123 80.0009 238.293V236.451H84.5823V239.905C85.0457 240.063 85.5121 240.221 85.9822 240.379V236.451H90.5637V241.873C91.0271 242.02 91.4942 242.166 91.9637 242.312V236.451H96.5452V243.693C97.0089 243.829 97.4755 243.964 97.9447 244.099V236.451H102.526V245.371C102.991 245.496 103.457 245.62 103.926 245.743V236.451H108.508V246.909C108.972 247.023 109.439 247.137 109.908 247.25V236.451H114.489V248.312C114.954 248.416 115.42 248.519 115.889 248.622V236.451H120.47V249.583C120.936 249.677 121.402 249.77 121.87 249.862V236.451H126.452V250.724C126.917 250.807 127.383 250.89 127.852 250.972V236.451H132.433V251.736C132.898 251.81 133.364 251.883 133.833 251.955V236.451H138.414V252.623C155.444 254.97 174.378 256.067 194.918 255.013V225.812H69.082V234.065C70.9834 234.851 72.9778 235.649 75.0641 236.451H78.6013Z" fill="#D3D3D3"/>
|
||||
<path d="M138.414 252.618V262.408H133.833V251.951C133.364 251.879 132.898 251.806 132.433 251.732V262.408H127.852V250.968C127.383 250.886 126.917 250.803 126.452 250.719V262.408H121.87V249.857C121.402 249.765 120.936 249.672 120.47 249.578V262.408H115.889V248.617C115.42 248.515 114.954 248.412 114.489 248.308V262.408H109.908V247.245C109.439 247.132 108.972 247.019 108.508 246.905V262.408H103.926V245.739C103.457 245.615 102.991 245.491 102.526 245.366V262.408H97.9447V244.094C97.4755 243.96 97.0089 243.824 96.5452 243.689V262.408H91.9637V242.308C91.4942 242.162 91.0271 242.016 90.5637 241.869V262.408H85.9822V240.375C85.5121 240.217 85.0457 240.059 84.5823 239.9V262.408H80.0009V238.288C79.5304 238.118 79.0637 237.948 78.6013 237.777V262.408H74.0199V236.447H75.0641C72.9778 235.644 70.9834 234.847 69.082 234.06V273.047H194.918V255.009C174.378 256.063 155.444 254.966 138.414 252.618Z" fill="#BABABA"/>
|
||||
<path d="M74.0195 236.451V262.412H78.601V237.781C77.3947 237.338 76.2152 236.893 75.064 236.451H74.0195Z" fill="#919191"/>
|
||||
<path d="M75.0645 236.461C76.2156 236.904 77.3951 237.348 78.6015 237.792V236.461H75.0645Z" fill="#AAAAAA"/>
|
||||
<path d="M80 236.452V238.294C81.488 238.832 83.015 239.37 84.5816 239.905V236.452H80Z" fill="#AAAAAA"/>
|
||||
<path d="M80 262.412H84.5816V239.904C83.015 239.369 81.488 238.831 80 238.293V262.412Z" fill="#919191"/>
|
||||
<path d="M85.9824 262.412H90.5637V241.873C89.0026 241.379 87.4753 240.88 85.9824 240.379V262.412Z" fill="#919191"/>
|
||||
<path d="M85.9824 236.456V240.384C87.4753 240.885 89.0026 241.384 90.5637 241.878V236.456H85.9824Z" fill="#AAAAAA"/>
|
||||
<path d="M91.9629 236.451V242.312C93.4596 242.777 94.9873 243.238 96.5443 243.693V236.451H91.9629Z" fill="#AAAAAA"/>
|
||||
<path d="M91.9629 262.412H96.5443V243.693C94.9873 243.238 93.4596 242.777 91.9629 242.312V262.412Z" fill="#919191"/>
|
||||
<path d="M97.9453 236.455V244.102C99.4455 244.532 100.973 244.956 102.527 245.374V236.455H97.9453Z" fill="#AAAAAA"/>
|
||||
<path d="M97.9453 262.412H102.527V245.371C100.973 244.953 99.4455 244.529 97.9453 244.098V262.412Z" fill="#919191"/>
|
||||
<path d="M103.928 262.412H108.509V246.909C106.958 246.528 105.431 246.139 103.928 245.743V262.412Z" fill="#919191"/>
|
||||
<path d="M103.928 236.45V245.742C105.431 246.138 106.958 246.527 108.509 246.908V236.45H103.928Z" fill="#AAAAAA"/>
|
||||
<path d="M109.908 262.412H114.49V248.312C112.94 247.966 111.413 247.612 109.908 247.249V262.412Z" fill="#919191"/>
|
||||
<path d="M109.908 236.449V247.247C111.413 247.609 112.94 247.963 114.49 248.31V236.449H109.908Z" fill="#AAAAAA"/>
|
||||
<path d="M115.889 262.412H120.47V249.583C118.923 249.271 117.396 248.95 115.889 248.621V262.412Z" fill="#919191"/>
|
||||
<path d="M115.889 236.454V248.625C117.396 248.953 118.923 249.274 120.47 249.586V236.454H115.889Z" fill="#AAAAAA"/>
|
||||
<path d="M121.871 262.412H126.452V250.723C124.907 250.445 123.38 250.158 121.871 249.861V262.412Z" fill="#919191"/>
|
||||
<path d="M121.871 236.452V249.863C123.38 250.159 124.907 250.446 126.452 250.725V236.452H121.871Z" fill="#AAAAAA"/>
|
||||
<path d="M127.852 262.412H132.433V251.736C130.889 251.491 129.362 251.236 127.852 250.972V262.412Z" fill="#919191"/>
|
||||
<path d="M127.852 236.447V250.968C129.362 251.232 130.889 251.487 132.433 251.732V236.447H127.852Z" fill="#AAAAAA"/>
|
||||
<path d="M133.834 236.443V251.948C135.346 252.18 136.873 252.403 138.416 252.615V236.443H133.834Z" fill="#AAAAAA"/>
|
||||
<path d="M133.832 262.412H138.414V252.623C136.871 252.41 135.344 252.188 133.832 251.955V262.412Z" fill="#919191"/>
|
||||
<path d="M155.722 252.074C157.24 252.074 158.47 250.844 158.47 249.325C158.47 247.807 157.24 246.576 155.722 246.576C154.203 246.576 152.973 247.807 152.973 249.325C152.973 250.844 154.203 252.074 155.722 252.074Z" fill="#494949"/>
|
||||
<path d="M163.13 252.074C164.648 252.074 165.879 250.844 165.879 249.325C165.879 247.807 164.648 246.576 163.13 246.576C161.612 246.576 160.381 247.807 160.381 249.325C160.381 250.844 161.612 252.074 163.13 252.074Z" fill="#494949"/>
|
||||
<path d="M170.383 252.074C171.902 252.074 173.132 250.844 173.132 249.325C173.132 247.807 171.902 246.576 170.383 246.576C168.865 246.576 167.635 247.807 167.635 249.325C167.635 250.844 168.865 252.074 170.383 252.074Z" fill="#494949"/>
|
||||
<path d="M182.429 255.222C185.623 255.222 188.213 252.632 188.213 249.438C188.213 246.243 185.623 243.654 182.429 243.654C179.234 243.654 176.645 246.243 176.645 249.438C176.645 252.632 179.234 255.222 182.429 255.222Z" fill="#5A231C"/>
|
||||
<path d="M189.568 279.663H74.4316V273.058H189.568V279.663Z" fill="#595959"/>
|
||||
<path d="M189.568 275.707H74.4316V273.052H189.568V275.707Z" fill="#2B2B2B"/>
|
||||
<path d="M202.508 19.04C180.343 18.0043 162.736 37.2854 162.736 55.7051C160.664 79.1135 183.658 112.881 206.031 93.2011C208.516 89.9557 212.784 82.0148 214.11 77.0431C215.197 72.9634 221.335 65.4895 225.562 60.4589C227.165 58.5526 228.397 56.3297 228.937 53.8987C234.929 26.8994 214.15 19.3707 202.508 19.04Z" fill="#5C6065"/>
|
||||
<path d="M185.938 29.3584H195.502C195.871 29.3584 196.056 29.8047 195.795 30.0657L186.645 39.216C186.384 39.477 186.569 39.9232 186.938 39.9232H196.502" stroke="#FBFEFC" stroke-width="2.48585" stroke-linecap="round"/>
|
||||
<path d="M202.717 46.1367H212.281C212.651 46.1367 212.835 46.583 212.574 46.844L203.424 55.9943C203.163 56.2553 203.348 56.7016 203.717 56.7016H213.282" stroke="#FBFEFC" stroke-width="2.48585" stroke-linecap="round"/>
|
||||
<path d="M184.486 68.9229H196.864C197.342 68.9229 197.581 69.5004 197.243 69.8381L185.402 81.6797C185.064 82.0175 185.303 82.595 185.781 82.595H198.158" stroke="#FBFEFC" stroke-width="3.21698" stroke-linecap="round"/>
|
||||
<path d="M167.293 90.5064C168.832 93.7017 170.805 97.4846 168.95 98.3783C167.095 99.2719 161.582 97.0161 160.043 93.8208C158.504 90.6255 159.866 85.4339 161.722 84.5402C163.577 83.6466 165.754 87.3111 167.293 90.5064Z" fill="#5C6065"/>
|
||||
<path d="M156.205 106.632C154.75 106.487 152.987 106.448 153.192 104.399C153.397 102.349 155.609 98.5627 157.064 98.7083C158.519 98.8538 159.849 102.485 159.644 104.534C159.439 106.583 157.66 106.778 156.205 106.632Z" fill="#5C6065"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 20 KiB |
Generated
+12155
-9630
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user