From c175a2bd8fd484e1e33aad1cfe010715f7812e20 Mon Sep 17 00:00:00 2001 From: theamazing0 Date: Mon, 28 Jul 2025 15:09:45 -0400 Subject: [PATCH] Added post functionality --- astro.config.mjs | 44 +++++----- bun.lock | 25 ++---- package.json | 5 +- public/pubkey.txt | 14 ++++ src/components/ContactCard.astro | 9 +- src/components/EncryptedContactView.astro | 6 +- src/components/NavItem.astro | 5 +- src/content.config.ts | 34 ++++---- .../{Layout.astro => BaseLayout.astro} | 12 +++ src/pages/404.astro | 18 +--- src/pages/contact.astro | 9 +- src/pages/index.astro | 14 +--- src/pages/posts.astro | 82 +++++++++++++++++++ src/pages/posts/[id].astro | 62 ++++++++++++++ src/pages/projects.astro | 10 +-- src/posts/hello-world.md | 20 +++++ src/posts/post-2.md | 20 +++++ src/posts/post-3.md | 20 +++++ src/posts/post-9.md | 20 +++++ 19 files changed, 318 insertions(+), 111 deletions(-) create mode 100644 public/pubkey.txt rename src/layouts/{Layout.astro => BaseLayout.astro} (92%) create mode 100644 src/pages/posts/[id].astro create mode 100644 src/posts/hello-world.md create mode 100644 src/posts/post-2.md create mode 100644 src/posts/post-3.md create mode 100644 src/posts/post-9.md diff --git a/astro.config.mjs b/astro.config.mjs index 7449a39..a68fa55 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -3,29 +3,25 @@ import { defineConfig } from "astro/config"; import icon from "astro-icon"; -import cloudflare from "@astrojs/cloudflare"; - -import alpinejs from "@astrojs/alpinejs"; - // https://astro.build/config export default defineConfig({ - integrations: [icon({ - include: { - "simple-icons": [ - "signal", - "matrix", - "git", - "mastodon", - "github", - "gitlab", - "codeberg", - "devpost", - "linkedin", - "hackclub", - ], - lucide: ["mail", "globe"], - }, - }), alpinejs()], - - adapter: cloudflare(), -}); \ No newline at end of file + integrations: [ + icon({ + include: { + "simple-icons": [ + "signal", + "matrix", + "git", + "mastodon", + "github", + "gitlab", + "codeberg", + "devpost", + "linkedin", + "hackclub", + ], + lucide: ["mail", "globe", "rss", "calendar"], + }, + }), + ], +}); diff --git a/bun.lock b/bun.lock index 13a312b..f3f0c2e 100644 --- a/bun.lock +++ b/bun.lock @@ -4,14 +4,11 @@ "": { "name": "mini-site", "dependencies": { - "@astrojs/alpinejs": "^0.4.8", "@astrojs/check": "^0.9.4", - "@astrojs/cloudflare": "^12.6.0", + "@astrojs/rss": "^4.0.12", "@fontsource-variable/inter": "^5.0.18", "@iconify-json/lucide": "^1.2.57", "@iconify-json/simple-icons": "^1.2.44", - "@types/alpinejs": "^3.13.11", - "alpinejs": "^3.14.9", "astro": "^5.12.1", "astro-icon": "^1.1.5", "typescript": "^5.4.5", @@ -28,12 +25,8 @@ "@antfu/utils": ["@antfu/utils@8.1.1", "", {}, "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ=="], - "@astrojs/alpinejs": ["@astrojs/alpinejs@0.4.8", "", { "peerDependencies": { "@types/alpinejs": "^3.0.0", "alpinejs": "^3.0.0" } }, "sha512-aNiJELzqunTuwXZEzqLmiTzMirvrKI4tYKauyAxZbk+Stu/xUZIgnfXeWSy87yF2l/QpnYELgNTDlFduUbp/nw=="], - "@astrojs/check": ["@astrojs/check@0.9.4", "", { "dependencies": { "@astrojs/language-server": "^2.15.0", "chokidar": "^4.0.1", "kleur": "^4.1.5", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": "^5.0.0" }, "bin": { "astro-check": "dist/bin.js" } }, "sha512-IOheHwCtpUfvogHHsvu0AbeRZEnjJg3MopdLddkJE70mULItS/Vh37BHcI00mcOJcH1vhD3odbpvWokpxam7xA=="], - "@astrojs/cloudflare": ["@astrojs/cloudflare@12.6.0", "", { "dependencies": { "@astrojs/internal-helpers": "0.6.1", "@astrojs/underscore-redirects": "1.0.0", "@cloudflare/workers-types": "^4.20250507.0", "tinyglobby": "^0.2.13", "vite": "^6.3.5", "wrangler": "^4.14.1" }, "peerDependencies": { "astro": "^5.0.0" } }, "sha512-pQ8bokC59GEiXvyXpC4swBNoL7C/EknP+82KFzQwgR/Aeo5N1oPiAoPHgJbpPya/YF4E26WODdCQfBQDvLRfuw=="], - "@astrojs/compiler": ["@astrojs/compiler@2.12.2", "", {}, "sha512-w2zfvhjNCkNMmMMOn5b0J8+OmUaBL1o40ipMvqcG6NRpdC+lKxmTi48DT8Xw0SzJ3AfmeFLB45zXZXtmbsjcgw=="], "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.6.1", "", {}, "sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A=="], @@ -44,9 +37,9 @@ "@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="], - "@astrojs/telemetry": ["@astrojs/telemetry@3.3.0", "", { "dependencies": { "ci-info": "^4.2.0", "debug": "^4.4.0", "dlv": "^1.1.3", "dset": "^3.1.4", "is-docker": "^3.0.0", "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" } }, "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ=="], + "@astrojs/rss": ["@astrojs/rss@4.0.12", "", { "dependencies": { "fast-xml-parser": "^5.2.0", "kleur": "^4.1.5" } }, "sha512-O5yyxHuDVb6DQ6VLOrbUVFSm+NpObulPxjs6XT9q3tC+RoKbN4HXMZLpv0LvXd1qdAjzVgJ1NFD+zKHJNDXikw=="], - "@astrojs/underscore-redirects": ["@astrojs/underscore-redirects@1.0.0", "", {}, "sha512-qZxHwVnmb5FXuvRsaIGaqWgnftjCuMY+GSbaVZdBmE4j8AfgPqKPxYp8SUERyJcjpKCEmO4wD6ybuGH8A2kVRQ=="], + "@astrojs/telemetry": ["@astrojs/telemetry@3.3.0", "", { "dependencies": { "ci-info": "^4.2.0", "debug": "^4.4.0", "dlv": "^1.1.3", "dset": "^3.1.4", "is-docker": "^3.0.0", "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" } }, "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ=="], "@astrojs/yaml2ts": ["@astrojs/yaml2ts@0.2.2", "", { "dependencies": { "yaml": "^2.5.0" } }, "sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ=="], @@ -280,8 +273,6 @@ "@trysound/sax": ["@trysound/sax@0.2.0", "", {}, "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="], - "@types/alpinejs": ["@types/alpinejs@3.13.11", "", {}, "sha512-3KhGkDixCPiLdL3Z/ok1GxHwLxEWqQOKJccgaQL01wc0EVM2tCTaqlC3NIedmxAXkVzt/V6VTM8qPgnOHKJ1MA=="], - "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], @@ -322,18 +313,12 @@ "@vscode/l10n": ["@vscode/l10n@0.0.18", "", {}, "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="], - "@vue/reactivity": ["@vue/reactivity@3.1.5", "", { "dependencies": { "@vue/shared": "3.1.5" } }, "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg=="], - - "@vue/shared": ["@vue/shared@3.1.5", "", {}, "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA=="], - "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], "acorn-walk": ["acorn-walk@8.3.2", "", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="], "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "alpinejs": ["alpinejs@3.14.9", "", { "dependencies": { "@vue/reactivity": "~3.1.1" } }, "sha512-gqSOhTEyryU9FhviNqiHBHzgjkvtukq9tevew29fTj+ofZtfsYriw4zPirHHOAy9bw8QoL3WGhyk7QqCh5AYlw=="], - "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], @@ -530,6 +515,8 @@ "fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="], + "fast-xml-parser": ["fast-xml-parser@5.2.5", "", { "dependencies": { "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ=="], + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], @@ -928,6 +915,8 @@ "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "strnum": ["strnum@2.1.1", "", {}, "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw=="], + "suf-log": ["suf-log@2.5.3", "", { "dependencies": { "s.color": "0.0.15" } }, "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow=="], "supports-color": ["supports-color@10.0.0", "", {}, "sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ=="], diff --git a/package.json b/package.json index 5b9dc59..409d592 100644 --- a/package.json +++ b/package.json @@ -11,14 +11,11 @@ "deploy": "astro build && wrangler deploy" }, "dependencies": { - "@astrojs/alpinejs": "^0.4.8", "@astrojs/check": "^0.9.4", - "@astrojs/cloudflare": "^12.6.0", + "@astrojs/rss": "^4.0.12", "@fontsource-variable/inter": "^5.0.18", "@iconify-json/lucide": "^1.2.57", "@iconify-json/simple-icons": "^1.2.44", - "@types/alpinejs": "^3.13.11", - "alpinejs": "^3.14.9", "astro": "^5.12.1", "astro-icon": "^1.1.5", "typescript": "^5.4.5" diff --git a/public/pubkey.txt b/public/pubkey.txt new file mode 100644 index 0000000..9e41a32 --- /dev/null +++ b/public/pubkey.txt @@ -0,0 +1,14 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xjMEZcgbRxYJKwYBBAHaRw8BAQdAf2VltbsKXKF4dYyjd0YArnYhZ6E53c7m +ABxuKy4WssDNJXNhbXZpZGtAcHJvdG9uLm1lIDxzYW12aWRrQHByb3Rvbi5t +ZT7CjAQQFgoAPgWCZcgbRwQLCQcICZB5cxhfFHRVQgMVCAoEFgACAQIZAQKb +AwIeARYhBLDBnYOdNYpifYUj0XlzGF8UdFVCAACu7wEAm9lfGVNR9dCY6fQM +pbWLGpVS5snawp73O70HUjgHZQ4A/3KD/Cmye/CmwXC1fKAUZoiea+KjN201 +RVgTtktm9CkEzjgEZcgbRxIKKwYBBAGXVQEFAQEHQHZwkWMH8G6cEsaX1qlk +pdb3mvpHcm1NYFgdPbhZAJ92AwEIB8J4BBgWCgAqBYJlyBtHCZB5cxhfFHRV +QgKbDBYhBLDBnYOdNYpifYUj0XlzGF8UdFVCAACM3AD8DBFmxp36arRlJ1z9 +pPXmQccp55hk0j8kTH/LXOQb2RYBANCEplD2BBgbQKRbv96rJ8kI4x2H3dtZ +OA+u30LStEIM +=6GL1 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/src/components/ContactCard.astro b/src/components/ContactCard.astro index 9b0b644..a38db1f 100644 --- a/src/components/ContactCard.astro +++ b/src/components/ContactCard.astro @@ -1,8 +1,6 @@ --- interface Props { medium: string; - // id: string; - // link: string; pgp?: boolean; } @@ -30,7 +28,12 @@ const icons: { [key: string]: string } = {

{ pgp ? ( - + PGP Key ) : null diff --git a/src/components/EncryptedContactView.astro b/src/components/EncryptedContactView.astro index 9952728..5bccfa9 100644 --- a/src/components/EncryptedContactView.astro +++ b/src/components/EncryptedContactView.astro @@ -6,8 +6,8 @@ import crypto from "crypto"; // Store contact info in a dictionary const contactInfo = { email: { - value: "me@samvid.dev", - link: "mailto:hi@samvid.dev", + value: "samvidk@proton.me", + link: "mailto:samvidk@proton.me", }, signal: { value: "samvidk.85", @@ -23,7 +23,7 @@ const encryptedContactInfo = JSON.stringify( encryptString(JSON.stringify(contactInfo)), ); -function encryptString(input: string, difficultyPrefix = "000") { +function encryptString(input: string, difficultyPrefix = "0000") { const challenge = crypto.randomBytes(8).toString("hex"); let nonce = 0; let hash; diff --git a/src/components/NavItem.astro b/src/components/NavItem.astro index 3b7a5b6..288b2aa 100644 --- a/src/components/NavItem.astro +++ b/src/components/NavItem.astro @@ -1,11 +1,12 @@ --- interface Props { - text: string; + text?: string; href: string; newtab?: boolean; + feedicon?: boolean; } -const { href, text, newtab = false } = Astro.props; +const { href, text = "", newtab = false, feedicon = false } = Astro.props; --- { diff --git a/src/content.config.ts b/src/content.config.ts index 0843419..b70cacc 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -1,22 +1,18 @@ -// // 1. Import utilities from `astro:content` -// import { defineCollection, z } from "astro:content"; +// 1. Import utilities from `astro:content` +import { defineCollection, z } from "astro:content"; -// // 2. Import loader(s) -// import { glob, file } from "astro/loaders"; +// 2. Import loader(s) +import { glob } from "astro/loaders"; -// // 3. Define your collection(s) -// const blog = defineCollection({ -// /* ... */ -// }); -// const projects = defineCollection({ -// loader: file("src/data/projects.json"), -// schema: z.object({ -// name: z.string(), -// description: z.string(), -// git: z.string().url().optional(), -// web: z.string().url().optional(), -// }), -// }); +// 3. Define your collection(s) +const posts = defineCollection({ + loader: glob({ pattern: "**/*.md", base: "./src/posts" }), + schema: z.object({ + title: z.string(), + pubDate: z.date(), + description: z.string(), + }), +}); -// // 4. Export a single `collections` object to register your collection(s) -// export const collections = { blog, projects }; +// 4. Export a single `collections` object to register your collection(s) +export const collections = { posts }; diff --git a/src/layouts/Layout.astro b/src/layouts/BaseLayout.astro similarity index 92% rename from src/layouts/Layout.astro rename to src/layouts/BaseLayout.astro index 73364ae..8984f39 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/BaseLayout.astro @@ -36,6 +36,7 @@ import interWoff2 from "@fontsource-variable/inter/files/inter-latin-wght-normal +
@@ -49,6 +50,7 @@ import interWoff2 from "@fontsource-variable/inter/files/inter-latin-wght-normal font-family: "Inter Variable", sans-serif; background: #1b1e1a; + color: #c3d6b2; background-image: url("/bg.svg"); background-attachment: fixed; @@ -60,12 +62,22 @@ import interWoff2 from "@fontsource-variable/inter/files/inter-latin-wght-normal overflow-x: hidden; } + h1, + h2, + h3, + h4, + h5, + h6 { + color: #e6fbd4; + } + body { margin: 0; } .sm-container { margin: 1rem; + /* padding-top: 1rem; */ } a { diff --git a/src/pages/404.astro b/src/pages/404.astro index b4c2964..59b58d8 100644 --- a/src/pages/404.astro +++ b/src/pages/404.astro @@ -1,19 +1,9 @@ --- -import Layout from "../layouts/Layout.astro"; +import BaseLayout from "../layouts/BaseLayout.astro"; --- - -

- 404 -

+ +

404

This page either never existed or has been deleted ¯\_(ツ)_/¯

Check out my homepage instead?

-
- - + diff --git a/src/pages/contact.astro b/src/pages/contact.astro index dd2c166..74a74f6 100644 --- a/src/pages/contact.astro +++ b/src/pages/contact.astro @@ -1,20 +1,17 @@ --- -import Layout from "../layouts/Layout.astro"; +import BaseLayout from "../layouts/BaseLayout.astro"; import EncryptedContactView from "../components/EncryptedContactView.astro"; --- - +

Contact

-
+ diff --git a/src/pages/index.astro b/src/pages/index.astro index afee71d..e711e4f 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,10 +1,10 @@ --- -import Layout from "../layouts/Layout.astro"; +import BaseLayout from "../layouts/BaseLayout.astro"; import { Icon } from "astro-icon/components"; --- - +

Samvid Konchada

@@ -50,20 +50,12 @@ import { Icon } from "astro-icon/components";

- + diff --git a/src/pages/posts/[id].astro b/src/pages/posts/[id].astro new file mode 100644 index 0000000..48fff4c --- /dev/null +++ b/src/pages/posts/[id].astro @@ -0,0 +1,62 @@ +--- +import { getCollection, render } from "astro:content"; +// 1. Generate a new path for every collection entry +export async function getStaticPaths() { + const posts = await getCollection("posts"); + return posts.map((post) => ({ + params: { id: post.id }, + props: { post }, + })); +} +// 2. For your template, you can get the entry directly from the prop +const { post } = Astro.props; +const { Content } = await render(post); + +import BaseLayout from "../../layouts/BaseLayout.astro"; + +function formatDate(dateString: string) { + const date = new Date(dateString); + return date.toLocaleDateString("en-US", { + year: "numeric", + month: "short", + day: "numeric", + }); +} + +import { Icon } from "astro-icon/components"; +--- + + +
+ <- All posts +

+ {post.data.title} +

+
+ +

+ {formatDate(post.data.pubDate.toString())} +

+
+
+ +
+
+
+ + diff --git a/src/pages/projects.astro b/src/pages/projects.astro index 4fe43ed..db99797 100644 --- a/src/pages/projects.astro +++ b/src/pages/projects.astro @@ -1,5 +1,5 @@ --- -import Layout from "../layouts/Layout.astro"; +import BaseLayout from "../layouts/BaseLayout.astro"; import ProjectCard from "../components/ProjectCard.astro"; const projectsData = [ @@ -14,7 +14,7 @@ const projectsData = [ ]; --- - +

Projects

@@ -31,15 +31,11 @@ const projectsData = [ }
-
+