diff --git a/website/blog/2024-01-28-olomana/index.mdx b/website/blog/2024-01-28-olomana/index.mdx deleted file mode 100644 index dc91538..0000000 --- a/website/blog/2024-01-28-olomana/index.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -slug: olomana -title: Olomana (PWS) -authors: [jrunyan] -tags: [olomana, pws] ---- - -# Olomana - -Check out the link [here](https://github.com/runyanjake/olomana) to learn more about the olomana project, beyond what's in this blog! - -Whitney was the codename for my first homelab setup (For reference: https://www.reddit.com/r/homelab/). -It was built out of my friend's handmedown hardware in an old server case that was e-wasted from school. -This initial build was on the "janky" side, featuring an unmounted power supply in the optical bay, secured only by some green yarn. (Fire hazard, anyone?) - -[Whitney, PWS v1.0](@site/blog/2024-01-28-olomana/whitney.png) - -... \ No newline at end of file diff --git a/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/advanced_settings.png b/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/advanced_settings.png new file mode 100644 index 0000000..2e4f641 Binary files /dev/null and b/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/advanced_settings.png differ diff --git a/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/console_confirmation.png b/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/console_confirmation.png new file mode 100644 index 0000000..6f240c0 Binary files /dev/null and b/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/console_confirmation.png differ diff --git a/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/download_model.png b/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/download_model.png new file mode 100644 index 0000000..825feb4 Binary files /dev/null and b/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/download_model.png differ diff --git a/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/index.mdx b/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/index.mdx new file mode 100644 index 0000000..4a9fd20 --- /dev/null +++ b/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/index.mdx @@ -0,0 +1,77 @@ +--- +slug: llm-pipeline +title: LLM Pipeline with Rivet and LLMStudio +authors: [jrunyan] +tags: [ai, workflow] +--- + +# Building my LLM Pipeline + +Like so many others, I've recently delved into the wonderful world of Large Language Models (LLMs) and Generative AI, and more importantly, into the most recent of self-hostable resources from various researchers and fellow hobbyists. +With both of these machine learning flavors spawning hordes of AI-driven startups as of late, I wanted to give things a shot on my own and see just how much tinkering is really needed to start producing something interesting. + +I bring with me the concept of workflow being one of the most important factors of productivity. If the software devlopment process isn't streamlined, or your record->edit->upload pipeline for content creation has bottlenecks, your productivity takes a big hit. +The same is true here, so this is why I've looked through FOSS projects for a good way to build myself an LLM pipeline. + + +An ideal pipeline for me allows me to +- switch the models in use on demand +- change the "business logic" of the pipeline on demand +- interface from code or hook into other services, in case i decide to productize something + +Luckily others think like me, so we are luckily blessed with LLMStudio. This allows me to explore different models, hot swap them in, quickly test them, and most importantly, start them as an api which conforms to the OpenAI api format. + +When looking for a frontend for my pipeline, I tried a few things but ultimately felt like a lot of software was angled toward working directly with OpenAI resources and other AIaaS solutions that require api keys. Not a lot of them supported the self-hosted option. +Eventually I found Rivet, and it has been a good solution so far. It is happy to support anything that looks like OpenAI's api format, so we are good to go. + +What follows is a short tutorial for a POC of my LLM pipeline. + + +## Tutorial + +1. Install Rivet and LLM Studio (links below) + +2. Launch Rivet and begin a new Graph. +Add a simple flow with text nodes leading into a Chat node, and the output being dumped into a Graph Output node. + +![img alt](./simple_flow.png) + +Running this gives an error because there's no OpenAI credentials, but we'll be running locally so that's not a problem. + +3. In LM Studio, go to the Search tab and find a model. In the example I search for Mistral and find `mistral-7b-instruct-v0.1.Q2_K.gguf`. Download it to somewhere you've got space, these are large! +The model should show up in the "My Models" tab. + +![img alt](./download_model.png) + +4. Open the "Local Server" tab and in the top bar, load your model. + +![img alt](./load_model.png) + +Leave the configuration alone EXCEPT for enabling CORS, which allows us to connect from other origins (e.g. through curl). + +![img alt](./model_configuration.png) + +5. Click Start Server and confirm things are working by copying the curl given as an example. You will need to allow LM Studio through your computer's firewall. + +You should see console output confirming things work. + +![img alt](./console_confirmation.png) + +6. Back in Rivet, configure the Chat node. +In GPT Model, choose "Local Model". +In Advanced, put in the endpoint pointing to LM Studio. This would be the endpoint ending in /v1/chat/completions. + +IMPORTANTLY, DO NOT flip the switch to the right unless you plan to explicitly add your endpoint in as a node on the map. + +![img alt](./advanced_settings.png) + +7. Click run in the top right to generate an output. + +## Resources + +[Rivet Project Page](https://rivet.ironcladapp.com/) + +[LM Studio Project Page](https://lmstudio.ai/) + +[Reference Video](https://www.youtube.com/watch?v=vyzNkWYIcac) + diff --git a/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/load_model.png b/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/load_model.png new file mode 100644 index 0000000..76f8103 Binary files /dev/null and b/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/load_model.png differ diff --git a/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/model_configuration.png b/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/model_configuration.png new file mode 100644 index 0000000..ee28f83 Binary files /dev/null and b/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/model_configuration.png differ diff --git a/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/simple_flow.png b/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/simple_flow.png new file mode 100644 index 0000000..9fdaff4 Binary files /dev/null and b/website/blog/2024-02-13-llm-pipeline-with-rivet-and-llmstudio/simple_flow.png differ diff --git a/website/blog/2024-02-15-sdxl-pipeline-with-comfyui/blank_comfyui.png b/website/blog/2024-02-15-sdxl-pipeline-with-comfyui/blank_comfyui.png new file mode 100644 index 0000000..ac021b6 Binary files /dev/null and b/website/blog/2024-02-15-sdxl-pipeline-with-comfyui/blank_comfyui.png differ diff --git a/website/blog/2024-02-15-sdxl-pipeline-with-comfyui/index.mdx b/website/blog/2024-02-15-sdxl-pipeline-with-comfyui/index.mdx new file mode 100644 index 0000000..20ab59e --- /dev/null +++ b/website/blog/2024-02-15-sdxl-pipeline-with-comfyui/index.mdx @@ -0,0 +1,71 @@ +--- +slug: sdxl-pipeline +title: Stable Diffusion XL Pipeline with ComfyUI +authors: [jrunyan] +tags: [ai, workflow] +--- + +# Building my Stable Diffusion XL Pipeline + +Stable Diffusion is a fun way to experience AI. For someone exploring the models that others create, it's important to have a streamlined workflow so that the bulk of time can be spent on experimentation rather than configuration. + +I learned of Stable Diffusion XL in 2023 and wanted to find nice UI-based solution for doing this experimentation. ComfyUI has what I'm looking for. It's a commonly used tool now, and a lot of people contribute workflows, models, and fine tuning checkpoints. + +Here's how I work with it. + +## Setup + +1. Clone the ComfyUI repo (link below). + +2. In the ComfyUI folder, for Windows machines with Nvidia GPUs, run `run_nvidia_gpu.bat`. It starts a default project. + +![img alt](./blank_comfyui.png) + +3. That's it! All further configuration depends on what you're plugging into it. + +## Using ComfyUI + +You don't need to read it from me, ComfyUI has really thorough [examples](https://comfyanonymous.github.io/ComfyUI_examples/)! But here's what I typically do. + +### Custom Models/Workflows/Fine Tuning + +CivitAI has custom workflows you can download that do certain things. You can import other workflows, or export your current setup to a workflow with the Save feature. +Sometimes workflows require custom nodes which have to be downloaded seperately. + +- There are custom model checkpoints that you can add to the `/ComfyUI/models/checkpoints` folder and use in the `Load Checkpoint` node. +- There are custom fine-tuning weights called LoRAs that can be placed in the `/ComfyUI/models/loras` folder and used with the `Load LoRA` node. +- Also, you can download VAE weights, place in `/ComfyUI/models/vae` as well into some nodes. + +Check out ComfyUI's examples for workflows you can download. + +## Some Fun Examples! + +1. Text to Image + +The base SDXL workflow ([Base SDXL + Refiner](https://comfyanonymous.github.io/ComfyUI_examples/sdxl/)) is a pretty good way to generate images. + +Fun fact, the images on the home page of this website were generated using this workflow, specifying just positive and negative prompts! +After image generation they were passed through [Adobe's SVG conversion tool](https://new.express.adobe.com/tools/convert-to-svg). + +![img alt](@site/static/img/software_engineer.svg) + +![img alt](@site/static/img/homelabber.svg) + +![img alt](@site/static/img/learner.svg) + + +2. Text to Image to Video + +This flow is a combo of 2 examples. I'm using a model trained to generate valentines day cards! It has some problems with text but otherwise generates nice happy characters. +The image to video is best suited for photoreal images but does give us a little motion in the final result. + +[CivitAi Link](https://civitai.com/models/298774/valentines-cards-xl-concept) + +![img alt](./text_to_image_to_video.png) + + +## Resources + +[ComfyUI Page](https://github.com/comfyanonymous/ComfyUI) + +[CivitAI Page](https://civitai.com/tag/sdxl) diff --git a/website/blog/2024-02-15-sdxl-pipeline-with-comfyui/text_to_image_to_video.png b/website/blog/2024-02-15-sdxl-pipeline-with-comfyui/text_to_image_to_video.png new file mode 100644 index 0000000..89f5902 Binary files /dev/null and b/website/blog/2024-02-15-sdxl-pipeline-with-comfyui/text_to_image_to_video.png differ diff --git a/website/docs/about/about.mdx b/website/docs/about/about.mdx index c5d8dfe..3aec66e 100644 --- a/website/docs/about/about.mdx +++ b/website/docs/about/about.mdx @@ -5,6 +5,17 @@ tags: - about --- -# Hello world! +# About Me -it jake \ No newline at end of file +I'm an athlete, biker, and software engineer native to the Bay Area, working as a software engineer in Mountain View. + +On the weekends, you can catch me recording bike rides for my Youtube channel [Jake's West Coast](https://www.youtube.com/@jakeswestcoast), visiting with friends, or on a trip out in nature. +I've had a very sports-heavy life, and currently play multiple volleyball leagues as well as a good bit of pickup basketball when I'm not at the gym. + +When it comes to work/technical interests, I love building and maintaining products/services that people can use broadly, frequently, and to great value. I engage in the practice of [homelabbing](https://www.reddit.com/r/homelab/), and maintain my server Olomana where this website is hosted, in addition to cool open-source software and many side projects in various stages of development. + +In my personal life, cooking is a side hobby, and if you're looking for a curated list of recipes, I maintain [recipes.whitney.rip](https://recipes.whitney.rip/), an ad-free personal online cookbook. + +Thank you for checking out my website! + +I can be contacted at jake@runyan.dev. diff --git a/website/projects/2019-05-28-first-blog-post.md b/website/projects/2019-05-28-first-blog-post.md deleted file mode 100644 index 6958196..0000000 --- a/website/projects/2019-05-28-first-blog-post.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -slug: about-me -title: About Me -authors: - name: Jake Runyan -tags: [about, me] ---- - -Hello world this is jake \ No newline at end of file diff --git a/website/projects/2024-01-28-olomana/index.mdx b/website/projects/2024-01-28-olomana/index.mdx new file mode 100644 index 0000000..bfcd463 --- /dev/null +++ b/website/projects/2024-01-28-olomana/index.mdx @@ -0,0 +1,40 @@ +--- +slug: olomana +title: Olomana (PWS v2) +authors: [jrunyan] +tags: [olomana, pws] +--- + +Check out the link [here](https://github.com/runyanjake/olomana) to learn more about the The PWS 2.0 redesign, beyond what's in this blog! + +# Whitney + +Whitney was the codename for my first homelab setup (For reference: https://www.reddit.com/r/homelab/). +It was built out of my friend's handmedown hardware in an old server case that was e-wasted from school. +This initial build was on the "janky" side, featuring an unmounted power supply in the optical bay, secured only by some green yarn. (Fire hazard, anyone?) + +![img alt](@site/projects/2024-01-28-olomana/whitney.png) + +I ran a lot of services from this box - my personal website/online resume, side projects, a Covid-19 data tracker, game servers, and a lot of other projects that taught me lessons in DNS config, networking, maintaining persistent storage and others. + +But eventually I started running up against the limits of the box. The machine's CPU was released in 2008, which was indicative of the age of most of its hardware. +After spending a lot of work on the original Whitney config in the first repo, I decided that I had learned enough to warrant an upgrade. + +# The Upgrade + +PWS 2.0 was given the nickname of "Olomana", a second step in this pattern of mountainous server names. +Mount Olomana (https://en.wikipedia.org/wiki/Olomana\_(mountain)) is a mountain on the Windward side of Oahu, Hawaii. +It has 3 peaks which are are a popular, albeit difficult and dangerous hike. While visiting family in Kailua, I hiked the Ko'olau range and snapped this picture of the rarely seen backside of Mount Olomana. + +![img alt](@site/projects/2024-01-28-olomana/olomana.png) + +Olomana, the web server is a significant upgrade over its predecessor. I built it as a 4U rack-mounted machine with new components inside a RackSolutions 16U rack. +The build itself includes a number of current gen budget components. Cricital resources like Ram and CPU cores are more abundant in the new build. +A UPS was added to the system for resilience in power outages. In a few instances, the UPS has protected my drives during power outages during the last few years of Northern California winters. +A dedicated write drive that was tested on PWS 1.0 also helped to combat some data corruption issues I had faced on the old hardware. + +![img alt](@site/projects/2024-01-28-olomana/whitney.png) + +# Links + +Check out the [repo](https://github.com/runyanjake/olomana) if you'd like to learn more about it. \ No newline at end of file diff --git a/website/projects/2024-01-28-olomana/olomana.png b/website/projects/2024-01-28-olomana/olomana.png new file mode 100644 index 0000000..2f6be18 Binary files /dev/null and b/website/projects/2024-01-28-olomana/olomana.png differ diff --git a/website/blog/2024-01-28-olomana/whitney.png b/website/projects/2024-01-28-olomana/whitney.png similarity index 100% rename from website/blog/2024-01-28-olomana/whitney.png rename to website/projects/2024-01-28-olomana/whitney.png diff --git a/website/projects/2024-02-15-jakes-west-coast/davinci.png b/website/projects/2024-02-15-jakes-west-coast/davinci.png new file mode 100644 index 0000000..155c802 Binary files /dev/null and b/website/projects/2024-02-15-jakes-west-coast/davinci.png differ diff --git a/website/projects/2024-02-15-jakes-west-coast/gimp.png b/website/projects/2024-02-15-jakes-west-coast/gimp.png new file mode 100644 index 0000000..07c98f6 Binary files /dev/null and b/website/projects/2024-02-15-jakes-west-coast/gimp.png differ diff --git a/website/projects/2024-02-15-jakes-west-coast/index.mdx b/website/projects/2024-02-15-jakes-west-coast/index.mdx new file mode 100644 index 0000000..8cd0a26 --- /dev/null +++ b/website/projects/2024-02-15-jakes-west-coast/index.mdx @@ -0,0 +1,37 @@ +--- +slug: jakeswestcoast +title: Jake's West Coast +authors: [jrunyan] +tags: [jakeswestcoast, biking] +--- + +Jake's West Coast is my [YouTube channel](https://www.youtube.com/@jakeswestcoast) that chronicles the mountain, gravel, and road biking rides that I do with my friends. +We typically ride the Santa Cruz mountains, San Francisco, or the North Bay. + +Focusing on capturing footage while doing a long effort exercise is difficult but it gives me something to think about while I'm riding. I have a few camera angles that help me tell the stories of our rides. + +# Cameras + +Primarily, I've mounted a GoPro under the saddle using a mount that clamps onto the rails. I'm not crazy about this location, because it blocks me from using a saddle bag, but it gives a really good angle. + +![img alt](@site/projects/2024-02-15-jakes-west-coast/whitney.png) + +As a secondary angle, I have a second, older gopro that I use for forward-facing footage. Depending on what kind of riding we do, this is either mounted using GoPro's bite mount, or a chest strap for a POV angle. + +![img alt](@site/projects/2024-02-15-jakes-west-coast/whitney.png) + +# Editing Process + +Editing all the footage takes a good bit of effort as well, but I still try to get a one-day turnaround on videos to share with those that went on the ride. + +For the editing process, I use Davinci Resolve, a good node-based editor that allows me to do color grading in addition to cutting the video together. All footage is shot in log format. + +![img alt](@site/projects/2024-02-15-jakes-west-coast/davinci.png) + +When creating thumbnails, I use the FOSS software Gimp as a photo editor. + +![img alt](@site/projects/2024-02-15-jakes-west-coast/gimp.png) + +# Links + +Check out the channel [HERE](https://www.youtube.com/@jakeswestcoast) or the Instagram account [HERE](https://www.instagram.com/jakeswestcoast/) for more Jake's West Coast! \ No newline at end of file diff --git a/website/projects/2024-02-15-jakes-west-coast/whitney.png b/website/projects/2024-02-15-jakes-west-coast/whitney.png new file mode 100644 index 0000000..f83703d Binary files /dev/null and b/website/projects/2024-02-15-jakes-west-coast/whitney.png differ diff --git a/website/projects/authors.yml b/website/projects/authors.yml new file mode 100644 index 0000000..ef17bbd --- /dev/null +++ b/website/projects/authors.yml @@ -0,0 +1,5 @@ +jrunyan: + name: Jake Runyan + title: Site Owner + url: https://jake.runyan.dev + image_url: https://github.com/runyanjake/static/blob/main/jakeswestcoast_warm_logo_square.png diff --git a/website/src/components/HomepageFeatures/index.js b/website/src/components/HomepageFeatures/index.js index 1ac5371..7405ef8 100644 --- a/website/src/components/HomepageFeatures/index.js +++ b/website/src/components/HomepageFeatures/index.js @@ -5,7 +5,7 @@ import styles from './styles.module.css'; const FeatureList = [ { title: 'Software Engineer', - Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, + Svg: require('@site/static/img/software_engineer.svg').default, description: ( <> I finished a Computer Science degree in 3 years at UC Santa Cruz and have @@ -17,7 +17,7 @@ const FeatureList = [ }, { title: 'Homelabber', - Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, + Svg: require('@site/static/img/homelabber.svg').default, description: ( <> This website runs on Olomana, my v2 homelab setup. Check out r/homelab to @@ -29,7 +29,7 @@ const FeatureList = [ }, { title: 'Lifelong Learner', - Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, + Svg: require('@site/static/img/learner.svg').default, description: ( <> As side hobbies, I love cooking new things, improving at volleyball and cycling, diff --git a/website/src/pages/index.js b/website/src/pages/index.js index 5d198d6..8ceb56f 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -20,7 +20,7 @@ function HomepageHeader() { - Get to Know me Here! - 5min ⏱️ + About Me diff --git a/website/static/img/homelabber.svg b/website/static/img/homelabber.svg new file mode 100644 index 0000000..d5a11ac --- /dev/null +++ b/website/static/img/homelabber.svg @@ -0,0 +1,68967 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/static/img/learner.svg b/website/static/img/learner.svg new file mode 100644 index 0000000..8ad071d --- /dev/null +++ b/website/static/img/learner.svg @@ -0,0 +1,55014 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/static/img/software_engineer.svg b/website/static/img/software_engineer.svg new file mode 100644 index 0000000..4f974e0 --- /dev/null +++ b/website/static/img/software_engineer.svg @@ -0,0 +1,46823 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file