feat(tools): remove eslint-plugin-prettier for prettier (#42438)

* feat: remove eslint-plugin-prettier for prettier

This removes the annoying lint warnings when all that needs to change is
formatting

* fix: use .js lint-staged config to ignore properly

* fix: lint everything if a lot of files are changed

It's faster than making lots of individual linter calls

* chore: apply prettier

* fix: ignore code in curriculum-file-structure
This commit is contained in:
Oliver Eyton-Williams
2021-10-06 17:32:21 +02:00
committed by GitHub
parent 8518079316
commit c8d7f0a782
152 changed files with 905 additions and 735 deletions

View File

@ -131,7 +131,6 @@
"operator-assignment": 0,
"padded-blocks": 0,
"prefer-object-spread/prefer-object-spread": 2,
"prettier/prettier": "error",
"quote-props": [2, "as-needed"],
"quotes": [2, "single", "avoid-escape"],
"radix": 2,

View File

@ -10,15 +10,14 @@
"root": true,
"extends": [
"./.eslintrc-base.json",
"plugin:prettier/recommended",
"plugin:import/typescript",
"plugin:jsx-a11y/recommended"
"plugin:jsx-a11y/recommended",
"prettier"
],
"plugins": [
"react",
"import",
"prefer-object-spread",
"prettier",
"react-hooks",
"jsx-a11y",
"jest-dom",
@ -58,7 +57,10 @@
"plugins": ["@typescript-eslint"]
},
{
"files": ["./tools/ui-components/**/*.test.[jt]s?(x)", "./client/**/*.test.[jt]s?(x)"],
"files": [
"./tools/ui-components/**/*.test.[jt]s?(x)",
"./client/**/*.test.[jt]s?(x)"
],
"extends": ["plugin:testing-library/react", "plugin:jest-dom/recommended"]
},
{

12
.github/labeler.yml vendored
View File

@ -1,22 +1,22 @@
"scope: docs":
'scope: docs':
- docs/**/*
"scope: curriculum":
'scope: curriculum':
- curriculum/challenges/**/*
"platform: client":
'platform: client':
- client/**/*
"platform: api":
'platform: api':
- api-server/**/*
"scope: tools/scripts":
'scope: tools/scripts':
- cypress/**/*
- tools/**/*
- .github/**/*
- utils/**/*
"scope: i18n":
'scope: i18n':
- any: ['curriculum/challenges/**/*', '!curriculum/challenges/english/**/*']
- docs/i18n/**/*
- client/i18n/**/*

View File

@ -2,9 +2,9 @@ name: Autoclose
on:
pull_request_target:
branches:
- "main"
- 'main'
paths:
- ".gitignore"
- '.gitignore'
jobs:
autoclose:

View File

@ -1,4 +1,4 @@
name: "CodeQL"
name: 'CodeQL'
on:
push:
@ -14,7 +14,7 @@ jobs:
strategy:
fail-fast: false
matrix:
language: ["javascript"]
language: ['javascript']
steps:
- name: Checkout repository
uses: actions/checkout@v2

View File

@ -3,7 +3,7 @@ on:
workflow_dispatch:
schedule:
# runs everyday at 11:15 AM UTC
- cron: "15 11 * * *"
- cron: '15 11 * * *'
jobs:
i18n-upload-client-ui-files:

View File

@ -56,7 +56,6 @@ jobs:
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID_CURRICULUM }}
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_CAMPERBOT_SERVICE_TOKEN }}
# Convert Simplified Chinese to Traditional #
- name: Generate Translations
uses: ./tools/crowdin/actions/convert-chinese

View File

@ -3,7 +3,7 @@ on:
workflow_dispatch:
schedule:
# runs everyday at 11:30 AM UTC
- cron: "30 11 * * *"
- cron: '30 11 * * *'
jobs:
i18n-upload-curriculum-files:

View File

@ -3,7 +3,7 @@ on:
workflow_dispatch:
schedule:
# runs everyday at 11:00 AM UTC
- cron: "0 11 * * *"
- cron: '0 11 * * *'
jobs:
i18n-upload-docs-files:

View File

@ -53,7 +53,6 @@ jobs:
name: webpack-stats
path: client/public/stats.json
cypress-run:
name: Test
runs-on: ubuntu-18.04

View File

@ -1,4 +1,4 @@
name: "Pull Request Labeler"
name: 'Pull Request Labeler'
on:
- pull_request_target
@ -8,5 +8,5 @@ jobs:
steps:
- uses: actions/labeler@v3
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
repo-token: '${{ secrets.GITHUB_TOKEN }}'
sync-labels: true

28
.lintstagedrc.js Normal file
View File

@ -0,0 +1,28 @@
const { ESLint } = require('eslint');
const cli = new ESLint();
// if a lot of files are changed, it's faster to run prettier/eslint on the
// whole project than to run them on each file separately
module.exports = {
'*.(js|ts|tsx)': files =>
files.length > 10
? ['eslint --max-warnings=0 --cache --fix .', 'prettier --write .']
: [
'eslint --max-warnings=0 --cache --fix ' +
files.filter(file => !cli.isPathIgnored(file)).join(' '),
...files.map(filename => `prettier --write '${filename}'`)
],
'*.!(js|ts|tsx)': files =>
files.length > 10
? 'prettier --write .'
: files.map(
filename => `prettier --write --ignore-unknown '${filename}'`
),
'./curriculum/challenges/**/*.md': files =>
files.length > 10
? 'npm run lint:challenges'
: files.map(
filename => `node ./tools/scripts/lint/index.js '${filename}'`
)
};

View File

@ -1,6 +1,9 @@
**/.cache
**/public
client/static
fixtures
**/*fixtures*
curriculum/challenges/_meta/*/*
curriculum/challenges/**/*
config/**/*.json
client/i18n/**/*.json
docs/i18n

View File

@ -1,2 +1 @@
> Our Code of Conduct is available here: <https://www.freecodecamp.org/code-of-conduct/>

View File

@ -6,14 +6,14 @@ All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
- Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
- Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
- Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

View File

@ -2,9 +2,11 @@
"presets": [
[
"@babel/preset-env",
{"targets": {
{
"targets": {
"node": 10
}}
}
}
]
],
"plugins": [

View File

@ -1 +1,3 @@
&{ @import "./app/index.less"; }
& {
@import './app/index.less';
}

View File

@ -276,9 +276,7 @@
"default": {}
},
"donationEmails": {
"type": [
"string"
]
"type": ["string"]
},
"isDonating": {
"type": "boolean",

View File

@ -25,10 +25,6 @@
"clean": "gatsby clean",
"predevelop": "node ../tools/scripts/build/ensure-env.js && npm run build:workers -- --env development",
"develop": "node --max_old_space_size=4000 node_modules/gatsby-cli develop --inspect=9230",
"format": "npm run format:gatsby && npm run format:src && npm run format:utils",
"format:gatsby": "prettier-eslint --write --trailing-comma none --single-quote './gatsby-*.js'",
"format:src": "prettier-eslint --write --trailing-comma none --single-quote './src/**/*.js'",
"format:utils": "prettier-eslint --write --trailing-comma none --single-quote './utils/**/*.js'",
"lint": "node ./i18n/schema-validation.js",
"serve": "gatsby serve -p 8000",
"serve-ci": "serve -l 8000 -c ../serve.json public",

View File

@ -3,15 +3,17 @@ title: Introduction to the Back End Development and APIs Projects
block: Back End Development and APIs Projects
superBlock: Back End Development and APIs
---
## Introduction to the Back End Development and APIs Projects
Time to put your newly learnt skills to work! By working on projects you would have the opportunity of applying all the skills, principles and concepts you have learnt so far including npm packages, basic Node, basic Express, MongoDB, and Mongoose.
In this section you get the chance to:
* Build a Timestamp Microservice
* Build a Request Header Parser Microservice
* Build a URL Shortener Microservice
* Build a Exercise Tracker
* Build a File Metadata Microservice
- Build a Timestamp Microservice
- Build a Request Header Parser Microservice
- Build a URL Shortener Microservice
- Build a Exercise Tracker
- Build a File Metadata Microservice
By the end of this, you would have 5 microservices under your belt that you can show off to friends, family, employers, etc. Have fun and remember to use the [Read-Search-Ask](https://forum.freecodecamp.org/t/how-to-get-help-when-you-are-stuck-coding/19514) method if you get stuck.

View File

@ -2,6 +2,7 @@
title: Back End Development and APIs
superBlock: back-end-development-and-apis
---
## Introduction to Back End Development and APIs
This is a stub introduction for Back End Development and APIs
@ -19,6 +20,7 @@ A monolith typically has the three key components of any application - the UI, B
To overcome some of the issues, one of the suggestions that was made early on was to functionally decompose an application, referred to as the Scale Cube in the book [The Art of Scalability](www.theartofscalability.com). This eventually led to the microservices pattern that we see now. A microservice takes a single bit of functionality and bundles all the layers of technology into it. This means that each microservice has its own UI, business logic and data store. To deliver a larger piece of functionality, microservices talk to one another through common communication methods like APIs or messages.
## Key benefits
1. Microservices can be developed and deployed independently of one another, thereby reducing the risk of one wrong piece of code bringing down an entire application
2. Easier to isolate and find where issues lie, while debugging
3. Fits the modern DevOps paradigm, as the architecture is well placed for Continuous Integration/Continuous Deployment
@ -28,6 +30,7 @@ To overcome some of the issues, one of the suggestions that was made early on wa
7. Easy to change, as it encapsulates a single piece of business functionality
## Key drawbacks
1. Additional operational overheads to monitor and manage multiple services
2. Manage communications between services
3. Additional effort to build fault tolerance
@ -35,6 +38,7 @@ To overcome some of the issues, one of the suggestions that was made early on wa
5. Distributed transaction model comes with its own share of issues regarding data consistency (eventual consistency)
### Sources
1. Microservices, a definition - by Martin Fowler and James Lewis : https://www.martinfowler.com/articles/microservices.html
2. Introduction to Microservices - NGINX blog : https://www.nginx.com/blog/introduction-to-microservices/
3. What are microservices - Smartbear : https://smartbear.com/learn/api-design/what-are-microservices/

View File

@ -3,6 +3,7 @@ title: Introduction to the Coding Interview Algorithms
block: Algorithms
superBlock: Coding Interview Prep
---
## Introduction to the Coding Interview Prep Algorithms
These challenges are meant to teach and challenge you with common algorithms that you will encounter in real life. These challenges will be a great learning experience to help improve your programming and logical skills.

View File

@ -3,6 +3,7 @@ title: Introduction to the Coding Interview Data Structure Questions
block: Data Structures
superBlock: Coding Interview Prep
---
## Introduction to the Coding Interview Data Structure Questions
These excercises are meant to help you deal with large or complex data by using many different data types other than your standard objects or arrays.

View File

@ -3,6 +3,7 @@ title: Introduction to the Project Euler Problems
block: Project Euler
superBlock: Coding Interview Prep
---
## Introduction to the Project Euler Problems
[Project Euler](https://projecteuler.net/) (pronounced Oiler) is a series of challenging mathematical/computer programming problems meant to delve into unfamiliar areas and learn new concepts in a fun and recreational manner.

View File

@ -3,7 +3,9 @@ title: Introduction to the Rosetta Code Problems
block: Rosetta Code
superBlock: Coding Interview Prep
---
## Introduction to the Rosetta Code Problems
[The Rosetta Code](https://rosettacode.org) is a list of programming challenges which will help you build your programming skills.
> "The idea is to present solutions to the same task in as many different languages as possible, to demonstrate how languages are similar and different, and to aid a person with a grounding in one approach to a problem in learning another." - _Homepage of the Rosetta Code site_

View File

@ -3,6 +3,7 @@ title: Introduction to the Coding Interview Take Home Projects
block: Take Home Projects
superBlock: Coding Interview Prep
---
## Introduction to the Coding Interview Take Home Projects
Programming interviews have always been stressful. One of the solutions is giving the applicant a take home project to be completed outside of the interview. These types of interviews usually require a lot of work, but they're a great way for employers to see how you might perform on the job.
@ -10,9 +11,10 @@ Programming interviews have always been stressful. One of the solutions is givin
The interview after the project submission could be a discussion about the applicants design decisions, scalability, and what the applicant might have done differently. This approach is more effective when the applicant doesnt have a lot of publicly available past projects.
In this section you get the chance to work on many Take Home Projects like:
* Show Local Weather using Weather API and Geolocation
* Build a Wikipedia Viewer using Wikipedia's API
* Build a Pinterest Clone using Masonry.js library
- Show Local Weather using Weather API and Geolocation
- Build a Wikipedia Viewer using Wikipedia's API
- Build a Pinterest Clone using Masonry.js library
and many more!
By the end of this section, you will have plenty of Take Home Projects under your belt. This will boost your confidence and prepare you for Take Home Project Interviews. Have fun and remember to use the [Read-Search-Ask](https://forum.freecodecamp.org/t/how-to-get-help-when-you-are-stuck/19514) method if you get stuck.

View File

@ -3,6 +3,7 @@ title: Introduction to the Data Analysis with Python Course Lectures
block: Data Analysis with Python Course
superBlock: Data Analysis with Python
---
## Introduction to the Data Analysis with Python Course Challenges
Learn Data Analysis with Python in this comprehensive tutorial. Data Analysis has been around for a long time, but up until a few years ago, it was practiced using closed, expensive and limited tools like Excel or Tableau. Python, SQL and other open libraries have changed Data Analysis forever.

View File

@ -3,19 +3,22 @@ title: Introduction to the Data Analysis with Python Projects
block: Data Analysis with Python Projects
superBlock: Data Analysis with Python
---
## Introduction to the Data Analysis with Python Projects
There are many ways to analyze data with Python! By completing these projects, you will demonstrate that you have a good foundational knowledge of data analysis with Python.
We are working to finish up the interactive Data Analysis instructional content. For now, here are some videos from freeCodeCamp that will help with the projects. You may also have to use other resources (just like you would have to do when learning new technologies in a job).
* [Python NumPy Video Course](https://www.youtube.com/watch?v=QUT1VHiLmmI) (1 hours)
* [Data Science Video Course](https://m.youtube.com/watch?v=ua-CiDNNj30) (6 hours)
- [Python NumPy Video Course](https://www.youtube.com/watch?v=QUT1VHiLmmI) (1 hours)
- [Data Science Video Course](https://m.youtube.com/watch?v=ua-CiDNNj30) (6 hours)
In this section you will develop the following projects:
* Mean-Variance-Standard Deviation Calculator
* Demographic Data Analyzer
* Medical Data Visualizer
* Page View Time Series Visualizer
* Sea Level Predictor
- Mean-Variance-Standard Deviation Calculator
- Demographic Data Analyzer
- Medical Data Visualizer
- Page View Time Series Visualizer
- Sea Level Predictor
Have fun and remember to use the [Read-Search-Ask](https://forum.freecodecamp.org/t/how-to-get-help-when-you-are-stuck-coding/19514) method if you get stuck.

View File

@ -2,6 +2,7 @@
title: Data Analysis with Python
superBlock: data-analysis-with-python
---
## Introduction to Data Analysis with Python
Learn the basics of data analysis with Python.

View File

@ -3,6 +3,7 @@ title: Introduction to the Numpy Lectures
block: Numpy
superBlock: Data Analysis with Python
---
## Introduction to the Numpy Challenges
Learn the basics of the NumPy library with the following lectures created by Keith Galli. They provide background information on how NumPy works and how it compares to Python's Built-in lists. They go through how to write code with NumPy, creating arrays, indexing, math, statistics, reshaping, and more!

View File

@ -3,6 +3,7 @@ title: Introduction to the D3 Dashboard
block: D3 Dashboard
superBlock: Data Visualization
---
## Introduction to the D3 Dashboard
<dfn>D3 Dashboard</dfn> Placeholder Introduction.

View File

@ -3,6 +3,7 @@ title: Introduction to the Data Visualization Projects
block: Data Visualization Projects
superBlock: Data Visualization
---
## Introduction to the Data Visualization Projects
These challenges let you test your data visualization skills and how to transfer and use data using AJAX technologies.

View File

@ -3,7 +3,7 @@ title: Introduction to the Data Visualization with D3 Challenges
block: Data Visualization with D3
superBlock: Data Visualization
---
## Introduction to the Data Visualization with D3 Challenges
D3.js, or D3, stands for Data Driven Documents. D3 is a JavaScript library to create dynamic and interactive data visualizations in the browser. It's built to work with common web standards, namely HTML, CSS, and Scalable Vector Graphics (SVG).<br><br>D3 takes input data and maps it into a visual representation of that data. It supports many different data formats. D3 lets you bind (or attach) the data to the Document Object Model (DOM). You use HTML or SVG elements with D3's built-in methods to transform the data into a visualization.<br><br>D3 gives you a lot of control over the presentation of data. This section covers the basic functionality and how to create visualizations with the D3 library.

View File

@ -2,6 +2,7 @@
title: Data Visualization
superBlock: data-visualization
---
## Introduction to Data Visualization
This is a stub introduction for Data Visualization

View File

@ -3,7 +3,7 @@ title: Introduction to the JSON APIs and AJAX Challenges
block: JSON APIs and Ajax
superBlock: Data Visualization
---
## Introduction to the JSON APIs and AJAX Challenges
Similar to how User Interfaces help people use programs, Application Programming Interfaces (APIs) help programs interact with other programs. APIs are tools that computers use to communicate with one another, in part to send and receive data. You can use API functionality in your page once you understand how to make requests and process data from it. Programmers often use AJAX technologies when working with APIs.<br><br>The term AJAX originated as an acronym for Asynchronous JavaScript And XML. It refers to a group of technologies that make asynchronous requests to a server to transfer data, then load any returned data into the page. An asynchronous process has a couple key properties. The browser does not stop loading a page to wait for the server's response. Also, the browser inserts updated data into part of the page without having to refresh the entire page.<br><br>User experience benefits from asynchronous processes in several ways. Pages load faster since the browser isn't waiting for the server to respond in the middle of a page render. Requests and transfers happen in the background, without interrupting what the user is doing. When the browser receives new data, only the necessary area of the page refreshes. These qualities especially enhance the user experience for single page applications.<br><br>The data transferred between the browser and server is often in a format called JavaScript Object Notation (JSON). JSON resembles JavaScript object literal syntax, except that it's transferred as a string. Once received, it can be converted into an object and used in a script.<br><br>This section covers how to transfer and use data using AJAX technologies with a freeCodeCamp API.

View File

@ -3,14 +3,16 @@ title: Introduction to the Front End Development Libraries Projects
block: Front End Development Libraries Projects
superBlock: Front End Development Libraries
---
## Introduction to the Front End Development Libraries Projects
It's now time to test out the frontend skills learned. This will help to bolster your skills, so don't hesitate to showcase your frontend skills in these projects.
In this section you will complete the following projects with Bootstrap, jQuery, Sass, React and Redux:
* A Random Quote Machine
* A Markdown Previewer
* A Drum Machine
* A JavaScript Calculator
* A 25 + 5 Clock
- A Random Quote Machine
- A Markdown Previewer
- A Drum Machine
- A JavaScript Calculator
- A 25 + 5 Clock
Have fun and remember to use the [Read-Search-Ask](https://forum.freecodecamp.org/t/how-to-get-help-when-you-are-stuck-coding/19514) method if you get stuck.

View File

@ -2,6 +2,7 @@
title: Information Security
superBlock: information-security
---
## Introduction to Information Security
This is a stub introduction for Information Security

View File

@ -3,15 +3,17 @@ title: Introduction to the Information Security Projects
block: Information Security Projects
superBlock: Information Security
---
## Introduction to the Information Security Projects
Now its time to put your newly learned skills to work! By working on these projects, you will have the opportunity of applying all the skills, principles, and concepts from the Information Security sections.
In this section you get the chance to:
* Build a Stock Price Checker
* Build an Anonymous Message Board
* Port Scanner
* Packet Capturer
* Secure Real Time Multiplayer Game
- Build a Stock Price Checker
- Build an Anonymous Message Board
- Port Scanner
- Packet Capturer
- Secure Real Time Multiplayer Game
When you are done, you will have plenty of Information Security projects under your belt along with a certification that you can show off to friends, family, and employers. Have fun and remember to use the [Read-Search-Ask](https://forum.freecodecamp.org/t/how-to-get-help-when-you-are-stuck/19514) method if you get stuck.

View File

@ -3,6 +3,7 @@ title: Introduction to Information Security with HelmetJS Challenges
block: Information Security with HelmetJS
superBlock: Information Security
---
## Introduction to Information Security with HelmetJS Challenges
HelmetJS is a type of middleware for Express-based applications that automatically sets HTTP headers to prevent sensitive information from unintentionally being passed between the server and client. While HelmetJS does not account for all situations, it does include support for common ones like Content Security Policy, XSS Filtering, and HTTP Strict Transport Security, among others. HelmetJS can be installed on an Express project from npm, after which each layer of protection can be configured to best fit the project.

View File

@ -3,6 +3,7 @@ title: Introduction to the Python for Penetration Testing Lectures
block: Python for Penetration Testing
superBlock: Information Security
---
## Introduction to the Python for Penetration Testing Challenges
<dfn>Python for Penetration Testing</dfn> Placeholder Introduction.

View File

@ -3,6 +3,7 @@ title: Introduction to Basic Algorithm Scripting
block: Basic Algorithm Scripting
superBlock: JavaScript Algorithms and Data Structures
---
## Introduction to Basic Algorithm Scripting
A computer algorithm is a sequence of steps that is followed to achieve a particular outcome. To write an algorithm, you must first understand a problem, and then solve it with coding.

View File

@ -3,6 +3,7 @@ title: Introduction to the Basic Data Structure Challenges
block: Basic Data Structures
superBlock: JavaScript Algorithms and Data Structures
---
## Introduction to the Basic Data Structure Challenges
Data can be stored and accessed in many different ways, both in JavaScript and other languages. This section will teach you how to manipulate arrays, as well as access and copy the information within them. It will also teach you how to manipulate and access the data within JavaScript objects, using both dot and bracket notation. When you're done with this section, you should understand the basic properties and differences between arrays and objects, as well as how to choose which to use for a given purpose.

View File

@ -4,6 +4,7 @@ block: Basic JavaScript RPG Game
superBlock: JavaScript Algorithms and Data Structures
isBeta: true
---
## Introduction to the Basic JavaScript RPG Game
This is a test for the new project-based curriculum.

View File

@ -3,6 +3,7 @@ title: Introduction to JavaScript
block: Basic JavaScript
superBlock: JavaScript Algorithms and Data Structures
---
## Introduction to JavaScript
JavaScript is a high-level programming language that all modern web browsers support. It is also one of the core technologies of the web, along with HTML and CSS that you may have learned previously. This section will cover basic JavaScript programming concepts, which range from variables and arithmetic to objects and loops.

View File

@ -3,10 +3,12 @@ title: Introduction to the Debugging Challenges
block: Debugging
superBlock: JavaScript Algorithms and Data Structures
---
## Introduction to the Debugging Challenges
Debugging is a valuable and (unfortunately) necessary tool for programmers. It follows the testing phase of checking if your code works as intended, and discovering it does not. Debugging is the process of finding exactly what isn't working and fixing it.
After spending time creating a brilliant block of code, it is tough realizing it may have errors. These issues generally come in three forms:
1. syntax errors that prevent a program from running
2. runtime errors when code fails to execute or has unexpected behavior
3. semantic (or logical) errors when code doesn't do what it's meant to.
@ -26,7 +28,7 @@ Here's an example of a runtime error - often detected while the program executes
```js
function loopy() {
while (true) {
console.log("Hello, world!");
console.log('Hello, world!');
}
}
// Calling loopy starts an infinite loop, which may crash your browser
@ -43,4 +45,3 @@ let myRectArea = calcAreaOfRect(2, 3);
```
Debugging is frustrating, but it helps to develop (and follow) a step-by-step approach to review your code. This means checking the intermediate values and types of variables to see if they are what they should be. You can start with a simple process of elimination.<br><br>For example, if function A works and returns what it's supposed to, then function B may have the issue. Or start checking values in a block of code from the middle to try to cut the search space in half. A problem in one spot indicates a bug in the first half of the code. If not, it's likely in the second.<br><br>This section will cover a couple helpful tools to find bugs, and some of the common forms they take. Fortunately, debugging is a learnable skill that just requires a little patience and practice to master.

View File

@ -3,6 +3,7 @@ title: Introduction to the ES6 Challenges
block: ES6
superBlock: JavaScript Algorithms and Data Structures
---
## Introduction to the ES6 Challenges
ECMAScript is a standardized version of JavaScript with the goal of unifying the language's specifications and features. As all major browsers and JavaScript-runtimes follow this specification, the term _ECMAScript_ is interchangeable with the term _JavaScript_.

View File

@ -3,6 +3,7 @@ title: Introduction to the Functional Programming Challenges
block: Functional Programming
superBlock: JavaScript Algorithms and Data Structures
---
## Introduction to the Functional Programming Challenges
Functional programming is an approach to software development based around the evaluation of functions. Like mathematics, functions in programming map input to output to produce a result. You can combine basic functions in many ways to build more and more complex programs.

View File

@ -3,6 +3,7 @@ title: Introduction to the Intermediate Algorithm Scripting Challenges
block: Intermediate Algorithm Scripting
superBlock: JavaScript Algorithms and Data Structures
---
## Introduction to the Intermediate Algorithm Scripting Challenges
The following challenges are part of FCC's Intermediate Algorithm Scripting Challenges. These should prepare you to complete the final challenges for the JavaScript Algorithms And Data Structures Certification.

View File

@ -4,6 +4,7 @@ block: Intermediate JavaScript Calorie Counter
superBlock: JavaScript Algorithms and Data Structures
isBeta: true
---
## Introduction to the Intermediate JavaScript Calorie Counter
This is a stub for the new project-based curriculum.

View File

@ -3,16 +3,18 @@ title: Introduction to the JavaScript Algorithms and Data Structures Projects
block: JavaScript Algorithms and Data Structures Projects
superBlock: JavaScript Algorithms and Data Structures
---
## Introduction to the JavaScript Algorithms and Data Structures Projects
Time to put your new JavaScript skills to work! These challenges will be similar to the algorithm scripting challenges but more difficult. This will allow you to prove how much you have learned.
In this section you will create the following small JavaScript programs:
* Palindrome Checker
* Roman Numeral Converter
* Caesars Cipher
* Telephone Number Validator
* Cash Register
- Palindrome Checker
- Roman Numeral Converter
- Caesars Cipher
- Telephone Number Validator
- Cash Register
Have fun and remember to use the [Read-Search-Ask](https://forum.freecodecamp.org/t/how-to-get-help-when-you-are-stuck-coding/19514) method if you get stuck.

View File

@ -3,7 +3,7 @@ title: Introduction to the Object Oriented Programming Challenges
block: Object Oriented Programming
superBlock: JavaScript Algorithms and Data Structures
---
## Introduction to the Object Oriented Programming Challenges
At its core, software development solves a problem or achieves a result with computation. The software development process first defines a problem, then presents a solution. Object oriented programming is one of several major approaches to the software development process.<br><br>As its name implies, object oriented programming organizes code into object definitions. These are sometimes called classes, and they group together data with related behavior. The data is an object's attributes, and the behavior (or functions) are methods.<br><br>The object structure makes it flexible within a program. Objects can transfer information by calling and passing data to another object's methods. Also, new classes can receive, or inherit, all the features from a base or parent class. This helps to reduce repeated code.<br><br>Your choice of programming approach depends on a few factors. These include the type of problem, as well as how you want to structure your data and algorithms. This section covers object oriented programming principles in JavaScript.

View File

@ -3,7 +3,7 @@ title: Introduction to the Regular Expression Challenges
block: Regular Expressions
superBlock: JavaScript Algorithms and Data Structures
---
## Introduction to the Regular Expression Challenges
Regular expressions are special strings that represent a search pattern. Also known as "regex" or "regexp", they help programmers match, search, and replace text. Regular expressions can appear cryptic because a few characters have special meaning. The goal is to combine the symbols and text into a pattern that matches what you want, but only what you want. This section will cover the characters, a few shortcuts, and the common uses for writing regular expressions.

View File

@ -3,6 +3,7 @@ title: Introduction to the How Neural Networks Work Lectures
block: How Neural Networks Work
superBlock: Machine Learning with Python
---
## Introduction to the How Neural Networks Work Challenges
Neural networks are at the core of what we are calling Artificial Intelligence today. They can seem impenetrable, and even mystical, if you are trying to understand them for the first time, but they don't have to.

View File

@ -2,6 +2,7 @@
title: Machine Learning with Python
superBlock: machine-learning-with-python
---
## Introduction to Machine Learning with Python
Learn the basics of Machine Learning with Python.

View File

@ -3,6 +3,7 @@ title: Introduction to the Machine Learning Projects
block: Machine Learning with Python Projects
superBlock: Machine Learning with Python
---
## Introduction to the Machine Learning Projects
Machine learning has many practical applications. By completing these projects, you will demonstrate that you have a good foundational knowledge of machine learning.
@ -10,10 +11,11 @@ Machine learning has many practical applications. By completing these projects,
We are still developing the interactive instructional content for the machine learning curriculum. For now, check out the videos in this [machine learning playlist on the freeCodeCamp YouTube channel](https://www.youtube.com/playlist?list=PLWKjhJtqVAblStefaz_YOVpDWqcRScc2s). You may also have to use other resources (just like you would have to do when learning new technologies in a job).
In this section you will develop the following projects:
* Rock Paper Scissors
* Cat and Dog Image Classifier
* Book Recommendation Engine using KNN
* Linear Regression Health Costs Calculator
* Neural Network SMS Text Classifier
- Rock Paper Scissors
- Cat and Dog Image Classifier
- Book Recommendation Engine using KNN
- Linear Regression Health Costs Calculator
- Neural Network SMS Text Classifier
Have fun and remember to use the [Read-Search-Ask](https://forum.freecodecamp.org/t/how-to-get-help-when-you-are-stuck-coding/19514) method if you get stuck.

View File

@ -3,6 +3,7 @@ title: Introduction to the TensorFlow Lectures
block: TensorFlow
superBlock: Machine Learning with Python
---
## Introduction to the TensorFlow Challenges
TensorFlow is an open source framework developed by the Google Brain team aimed to make the powers of machine learning and neural networking easier to use.

View File

@ -3,10 +3,11 @@ title: Introduction to the Advanced Node and Express Challenges
block: Advanced Node and Express
superBlock: Quality Assurance
---
## Introduction to Advanced Node and Express Challenges
*Authentication* is the process or action of verifying the identity of a user or process. Up to this point you have not been able to create an app utilizing this key concept.
_Authentication_ is the process or action of verifying the identity of a user or process. Up to this point you have not been able to create an app utilizing this key concept.
The most common and easiest way to use authentication middleware for Node.js is [Passport](http://passportjs.org/). It is easy to learn, light-weight, and extremely flexible allowing for many *strategies*, which we will talk about in later challenges. In addition to authentication we will also look at template engines which allow for use of *Pug* and web sockets which allow for real time communication between all your clients and your server. Working on these challenges will involve you writing your code on Replit on our starter project. After completing each challenge you can copy your public Replit URL (to the homepage of your app) into the challenge screen to test it! Optionally you may choose to write your project on another platform but it must be publicly visible for our testing.
The most common and easiest way to use authentication middleware for Node.js is [Passport](http://passportjs.org/). It is easy to learn, light-weight, and extremely flexible allowing for many _strategies_, which we will talk about in later challenges. In addition to authentication we will also look at template engines which allow for use of _Pug_ and web sockets which allow for real time communication between all your clients and your server. Working on these challenges will involve you writing your code on Replit on our starter project. After completing each challenge you can copy your public Replit URL (to the homepage of your app) into the challenge screen to test it! Optionally you may choose to write your project on another platform but it must be publicly visible for our testing.
Start this project on Replit using [this link](https://replit.com/github/freeCodeCamp/boilerplate-advancednode) or clone [this repository](https://github.com/freeCodeCamp/boilerplate-advancednode/) on GitHub! If you use Replit, remember to save the link to your project somewhere safe.

View File

@ -2,6 +2,7 @@
title: Quality Assurance
superBlock: quality-assurance
---
## Introduction to Quality Assurance
This is a stub introduction for Quality Assurance

View File

@ -3,6 +3,7 @@ title: Introduction to the Quality Assurance with Chai Challenges
block: Quality Assurance and Testing with Chai
superBlock: Quality Assurance
---
## Introduction to Quality Assurance with Chai Challenges
As your programs become more complex, you need to test them often to make sure any new code you add doesn't break the program's original functionality. Chai is a JavaScript testing library that helps you check that your program still behaves the way you expect it to after you make changes. Using Chai, you can write tests that describe your program's requirements and see if your program meets them.

View File

@ -3,15 +3,17 @@ title: Introduction to the Quality Assurance Projects
block: Quality Assurance Projects
superBlock: Quality Assurance
---
## Introduction to the Quality Assurance Projects
Now its time to put your newly learned skills to work! By working on these projects, you will have the opportunity of applying all the skills, principles, and concepts from the Quality Assurance sections.
In this section you get the chance to:
* Build a Metric-Imperial Converter
* Build an Issue Tracker
* Build a Personal Library
* Sudoku Solver
* American British Translator
- Build a Metric-Imperial Converter
- Build an Issue Tracker
- Build a Personal Library
- Sudoku Solver
- American British Translator
When you are done, you will have plenty of Quality Assurance projects under your belt along with a certification that you can show off to friends, family, and employers. Have fun and remember to use the [Read-Search-Ask](https://forum.freecodecamp.org/t/how-to-get-help-when-you-are-stuck/19514) method if you get stuck.

View File

@ -4,6 +4,7 @@ block: accessibility-quiz
superBlock: Responsive Web Design
isBeta: true
---
## Introduction to the Accessibility Quiz
This is a test for the new project-based curriculum.

View File

@ -3,6 +3,7 @@ title: Introduction to the Applied Accessibility Challenges
block: Applied Accessibility
superBlock: Responsive Web Design
---
## Introduction to the Applied Accessibility Challenges
"Accessibility" generally means having web content and a user interface that can be understood, navigated, and interacted with by a broad audience. This includes people with visual, auditory, mobility, or cognitive disabilities.

View File

@ -3,7 +3,7 @@ title: Introduction to the Applied Visual Design Challenges
block: Applied Visual Design
superBlock: Responsive Web Design
---
## Introduction to the Applied Visual Design Challenges
Visual Design in web development is a broad topic. It combines typography, color theory, graphics, animation, and page layout to help deliver a site's message. The definition of good design is a well-discussed subject, with many books on the theme.<br><br>At a basic level, most web content provides a user with information. The visual design of the page can influence its presentation and a user's experience. In web development, HTML gives structure and semantics to a page's content, and CSS controls the layout and appearance of it.<br><br>This section covers some of the basic tools developers use to create their own visual designs.

View File

@ -4,6 +4,7 @@ block: Basic CSS Cafe Menu
superBlock: Responsive Web Design
isBeta: true
---
## Introduction to the Basic CSS Cafe Menu
This is a test for the new project-based curriculum.

View File

@ -3,6 +3,7 @@ title: Introduction to Basic CSS
block: Basic CSS
superBlock: Responsive Web Design
---
## Introduction to Basic CSS
Cascading Style Sheets (CSS) tell the browser how to display the text and other content that you write in HTML.

View File

@ -3,15 +3,20 @@ title: Introduction to Basic HTML and HTML5
block: Basic HTML and HTML5
superBlock: Responsive Web Design
---
## Introduction to Basic HTML & HTML5
HTML, or HyperText Markup Language, is a markup language used to describe the structure of a web page. It uses a special syntax or notation to organize and give information about the page to the browser. Elements usually have opening and closing tags that surround and give meaning to content. For example, there are different tag options to place around text to show whether it is a heading, a paragraph, or a list.
For example:
```html
<h1>Top level heading: Maybe a page title</h1>
<p>A paragraph of text. Some information we would like to communicate to the viewer. This can be as long or short as we would like.</p>
<p>
A paragraph of text. Some information we would like to communicate to the
viewer. This can be as long or short as we would like.
</p>
<ol>
<li>Number one on the list</li>
@ -33,6 +38,7 @@ Becomes:
</ol>
---
The HyperText part of HTML comes from the early days of the web and its original use case. Pages usually contained static documents that contained references to other documents. These references contained hypertext links used by the browser to navigate to the reference document so the user could read the reference document without having to manually search for it.
As web pages and web applications grow more complex, the W3 Consortium updates the HTML specification to ensure that a webpage can be shown reliably on any browser. The latest version of HTML is HTML5.

View File

@ -4,6 +4,7 @@ block: Basic HTML Cat Photo App
superBlock: Responsive Web Design
isBeta: true
---
## Introduction to the Basic HTML Cat Photo App
This is a test for the new project-based curriculum.

View File

@ -3,7 +3,7 @@ title: Introduction to the CSS Flexbox Challenges
block: CSS Flexbox
superBlock: Responsive Web Design
---
## Introduction to the CSS Flexbox Challenges
A website's User Interface ("UI") has two components. First, there are the visual elements, such as colors, fonts, and images. Second, there is the placement or positioning of those elements. In Responsive Web Design, a UI layout must accommodate many different browsers and devices accessing the content.<br><br>CSS3 introduced Flexible Boxes, or flexbox, to create page layouts for a dynamic UI. It is a layout mode that arranges elements in a predictable way for different screen sizes and browsers. While somewhat new, all popular modern browsers support flexbox. This section covers how to use flexbox and the different layout options it offers.

View File

@ -3,7 +3,7 @@ title: Introduction to the CSS Grid Challenges
block: CSS Grid
superBlock: Responsive Web Design
---
## Introduction to the CSS Grid Challenges
<dfn>CSS Grid</dfn> helps you easily build complex web designs. It works by turning an HTML element into a grid container with rows and columns for you to place children elements where you want within the grid.

View File

@ -3,6 +3,7 @@ title: Introduction to the CSS Variables Skyline
block: CSS Variables Skyline
superBlock: Responsive Web Design
---
## Introduction to the CSS Variables Skyline
<dfn>CSS Variables Skyline</dfn> Placeholder Introduction.

View File

@ -2,6 +2,7 @@
title: Responsive Web Design
superBlock: responsive-web-design
---
## Introduction to Responsive Web Design
Welcome to Responsive Web Design!

View File

@ -3,10 +3,10 @@ title: Introduction to the Responsive Web Design Challenges
block: Responsive Web Design Principles
superBlock: Responsive Web Design
---
## Introduction to the Responsive Web Design Challenges
Today, there are many types of devices that can access the web. They range from large desktop computers to small mobile phones. These devices have different screen sizes, resolutions, and processing power.
Responsive Web Design is an approach to designing web content that responds to the constraints of different devices. The page structure and CSS rules should be flexible to accommodate these differences.
In general, design the page's CSS to your target audience. If you expect most of your traffic to be from mobile users, take a 'mobile-first' approach. Then add conditional rules for larger screen sizes. If your visitors are desktop users, then design for larger screens with conditional rules for smaller sizes.
CSS gives you the tools to write different style rules, then apply them depending on the device displaying the page. This section will cover the basic ways to use CSS for Responsive Web Design.

View File

@ -3,16 +3,18 @@ title: Introduction to the Responsive Web Design Projects
block: Responsive Web Design Projects
superBlock: Responsive Web Design
---
## Introduction to the Responsive Web Design Projects
Time to put your newly learnt skills to work! By working on projects you would have the opportunity of applying all the skills, principles and concepts you have learnt so far HTML, CSS, Visual Design, Accessibility, etc.
In this section you get the chance to:
* Build a Tribute Page
* Build a Survey Form
* Build a Product Landing Page
* Build a Technical Documentation Page
* Build a Personal Portfolio Webpage
- Build a Tribute Page
- Build a Survey Form
- Build a Product Landing Page
- Build a Technical Documentation Page
- Build a Personal Portfolio Webpage
By the end of this, you would have 5 responsive websites under your belt that you can show off to friends, family, employers, etc. Have fun and remember to use the [Read-Search-Ask](https://forum.freecodecamp.org/t/how-to-get-help-when-you-are-stuck-coding/19514) method if you get stuck.

View File

@ -2,6 +2,7 @@
title: Scientific Computing with Python
superBlock: scientific-computing-with-python
---
## Introduction to Scientific Computing with Python
Learn the basics of Python.

View File

@ -3,10 +3,9 @@ title: Introduction to Python for Everybody
block: Python for Everybody
superBlock: Scientific Computing with Python
---
## Introduction to Python for Everybody
Python for Everybody is a video course that teaches the basics of programming computers using Python 3.
The course was created by Dr. Charles Severance (a.k.a. Dr. Chuck). He is a Clinical Professor at the University of Michigan School of Information, where he teaches various technology-oriented courses including programming, database design, and Web development.

View File

@ -3,19 +3,22 @@ title: Introduction to the Scientific Computing with Python Projects
block: Scientific Computing with Python Projects
superBlock: Scientific Computing with Python
---
## Introduction to the Scientific Computing with Python Projects
Time to put your Python skills to the test! By completing these projects, you will demonstrate that you have a good foundational knowledge of Python.
We are working to finish up the interactive Python instructional content. For now, here are some videos on the freeCodeCamp.org YouTube channel that will teach you everything you need to know to complete these projects:
* [Python for Everybody Video Course](https://www.freecodecamp.org/news/python-for-everybody/) (14 hours)
* [Learn Python Video Course](https://www.freecodecamp.org/news/learn-python-basics-in-depth-video-course/) (4 hours)
- [Python for Everybody Video Course](https://www.freecodecamp.org/news/python-for-everybody/) (14 hours)
- [Learn Python Video Course](https://www.freecodecamp.org/news/learn-python-basics-in-depth-video-course/) (4 hours)
In this section you will develop the following projects:
* Arithmetic Formatter
* Time Calculator
* Budget App
* Polygon Area Calculator
* Probability Calculator
- Arithmetic Formatter
- Time Calculator
- Budget App
- Polygon Area Calculator
- Probability Calculator
Have fun and remember to use the [Read-Search-Ask](https://forum.freecodecamp.org/t/how-to-get-help-when-you-are-stuck-coding/19514) method if you get stuck.

View File

@ -1,10 +1,5 @@
{
"include": [
"./i18n/**/*",
"./plugins/**/*",
"./src/**/*",
"./utils/**/*"
],
"include": ["./i18n/**/*", "./plugins/**/*", "./src/**/*", "./utils/**/*"],
"compilerOptions": {
"target": "es2020",
"module": "es2020",
@ -18,10 +13,6 @@
"noEmit": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"types": [
"node",
"jest",
"@testing-library/jest-dom"
]
"types": ["node", "jest", "@testing-library/jest-dom"]
}
}

View File

@ -1,17 +1,18 @@
"project_id_env": "CROWDIN_PROJECT_ID"
"api_token_env": "CROWDIN_PERSONAL_TOKEN"
"base_path_env": "CROWDIN_BASE_PATH"
"base_url_env": "CROWDIN_BASE_URL"
'project_id_env': 'CROWDIN_PROJECT_ID'
'api_token_env': 'CROWDIN_PERSONAL_TOKEN'
'base_path_env': 'CROWDIN_BASE_PATH'
'base_url_env': 'CROWDIN_BASE_URL'
"preserve_hierarchy": true
'preserve_hierarchy': true
files: [
files:
[
{
"source" : "/client/i18n/locales/english/intro.json",
"translation" : "/client/i18n/locales/%language%/%original_file_name%"
'source': '/client/i18n/locales/english/intro.json',
'translation': '/client/i18n/locales/%language%/%original_file_name%'
},
{
"source" : "/client/i18n/locales/english/translations.json",
"translation" : "/client/i18n/locales/%language%/%original_file_name%"
'source': '/client/i18n/locales/english/translations.json',
'translation': '/client/i18n/locales/%language%/%original_file_name%'
}
]

View File

@ -1,19 +1,21 @@
"project_id_env": "CROWDIN_PROJECT_ID"
"api_token_env": "CROWDIN_PERSONAL_TOKEN"
"base_path_env": "CROWDIN_BASE_PATH"
"base_url_env": "CROWDIN_BASE_URL"
'project_id_env': 'CROWDIN_PROJECT_ID'
'api_token_env': 'CROWDIN_PERSONAL_TOKEN'
'base_path_env': 'CROWDIN_BASE_PATH'
'base_url_env': 'CROWDIN_BASE_URL'
"preserve_hierarchy": true
'preserve_hierarchy': true
files: [
files:
[
{
"source" : "/docs/*.md",
"translation" : "/docs/i18n/%language%/%original_file_name%",
"ignore" : [
"/docs/_coverpage.md",
"/docs/_navbar.md",
"/docs/_translations.md",
"/docs/README.md",
'source': '/docs/*.md',
'translation': '/docs/i18n/%language%/%original_file_name%',
'ignore':
[
'/docs/_coverpage.md',
'/docs/_navbar.md',
'/docs/_translations.md',
'/docs/README.md'
]
}
]

View File

@ -67,7 +67,6 @@ such rights in consideration of benefits the Licensor receives from
making the Licensed Material available under these terms and
conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
@ -139,7 +138,6 @@ Section 1 -- Definitions.
m. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
@ -222,7 +220,6 @@ Section 2 -- Scope.
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties.
Section 3 -- License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the
@ -289,7 +286,6 @@ following conditions.
Measures to, Adapted Material that restrict exercise of the
rights granted under the Adapter's License You apply.
Section 4 -- Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that
@ -305,6 +301,7 @@ apply to Your use of the Licensed Material:
Rights (but not its individual contents) is Adapted Material,
including for purposes of Section 3(b); and
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
@ -312,7 +309,6 @@ For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
@ -341,7 +337,6 @@ Section 5 -- Disclaimer of Warranties and Limitation of Liability.
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
Section 6 -- Term and Termination.
a. This Public License applies for the term of the Copyright and
@ -370,7 +365,6 @@ Section 6 -- Term and Termination.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
Section 7 -- Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different
@ -380,7 +374,6 @@ Section 7 -- Other Terms and Conditions.
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
Section 8 -- Interpretation.
a. For the avoidance of doubt, this Public License does not, and
@ -404,7 +397,6 @@ Section 8 -- Interpretation.
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
=======================================================================
Creative Commons is not a party to its public

View File

@ -5,4 +5,4 @@ services:
restart: unless-stopped
ports:
- '${CLIENT_PORT:-8000}:${CLIENT_PORT:-8000}'
command: ["-l", "${CLIENT_PORT:-8000}"]
command: ['-l', '${CLIENT_PORT:-8000}']

View File

@ -15,6 +15,7 @@ There are a few terms we use when discussing our curriculum content.
Using those terms, here is how the file structure would be defined:
<!-- prettier-ignore -->
```md
curriculum/
@ -64,7 +65,7 @@ When renaming a certification, you will likely want to rename the associated sup
Also, you will likely want to rename the certificate and the `{superBlock}-projects` block when you rename a superBlock since they all shares a name. To rename only a superBlock you need to:
1. Rename the superBlock folder in the `curriculum/challenges/english` directory.
1. Rename the superBlock folder in *all* other `curriculum/challenges/{language}` directories.
1. Rename the superBlock folder in _all_ other `curriculum/challenges/{language}` directories.
1. For each block within that superBlock, update the `superBlock` value in the `meta.json` file to its dashedName. You don't need to rename any folders here. Do that when renaming a block.
1. Rename the superblock folder in `client/src/pages/learn`.
1. Update the `index.md` file in the above folder, changing the `title` and `superBlock` values to the new name.
@ -81,7 +82,7 @@ Also, you will likely want to rename the certificate and the `{superBlock}-proje
When renaming a curriculum block, you need to:
1. Change the name of the block folder in the `curriculum/challenges/english/{superBlock}` directory.
1. Change the name of the same block folder in *all* of the other language directories to match. These must all be the same as the English structure or the build will error out.
1. Change the name of the same block folder in _all_ of the other language directories to match. These must all be the same as the English structure or the build will error out.
1. Change the name of the block folder in the `_meta` directory.
1. Update the `name` and `dashedName` property for that block's `meta.json` file.
1. Update the `client/utils/help-category-map.json` to use the new block name as the key.
@ -96,7 +97,7 @@ When renaming a single challenge file, you need to:
1. Change the name of the challenge file in the `curriculum/challenges/english` directory.
1. Change the name of the `title` and `dashedName` within that file.
1. Change the name of the file, and the `dashedName` in those files for *all* of the other language directories to match.
1. Change the name of the file, and the `dashedName` in those files for _all_ of the other language directories to match.
1. Update the name of the challenge in the relevant `meta.json` file. The challenge names here are not used in the build, but provide a user-friendly way to identify the challenge order.
1. If the challenge is a certificate project, update the YAML file in `curriculum/english/12-certificates/<superBlock>` to the new name.
1. If the challenge is a certificate project, update the `title` and `link` in `client/src/resources/cert-and-project-map.ts`

View File

@ -30,6 +30,7 @@ docker stop mailhog
to stop it.
When the installation completes, you can start [using MailHog](#using-mailhog).
</details>
<details><summary>Installing MailHog on macOS</summary>
@ -44,6 +45,7 @@ brew services start mailhog
The above commands will start a mailhog service in the background.
When the installation completes, you can start [using MailHog](#using-mailhog).
</details>
<details><summary>Installing MailHog on Windows</summary>
@ -55,6 +57,7 @@ When the download completes, click to open the file. A Windows firewall notifica
Close MailHog by closing the command prompt window. To start MailHog again, click on the MailHog executable (.exe) file that was downloaded initially - it is not necessary to download a new MailHog installation file.
Start [using MailHog](#using-mailhog).
</details>
<details><summary>Installing MailHog on Linux</summary>
@ -96,6 +99,7 @@ mailhog
```
Start [using MailHog](#using-mailhog).
</details>
## Using MailHog

View File

@ -8,7 +8,6 @@ The video challenge pages are created by members of the freeCodeCamp team. YouTu
You can help by creating multiple-choice questions related to video sections and adding the questions to the markdown files for the video challenges.
## Challenge Template
Below is a template of what the challenge markdown files look like.
@ -27,9 +26,7 @@ forumTopicId: 12345
Challenge description text, in markdown
```html
<div>
example code
</div>
<div>example code</div>
```
# --question--
@ -55,7 +52,6 @@ More answers
## --video-solution--
The number for the correct answer goes here.
````
## Creating questions for video challenges
@ -76,6 +72,7 @@ Pick a challenge markdown file from the options above.
First, find the videoId.
For example, in the following code from the header of a video challenge markdown file, the videoId is "nVAaxZ34khk". On GitHub, the information should be laid out in a table format.
```
---
id: 5e9a093a74c4063ca6f7c14d
@ -123,11 +120,13 @@ More answers
```
Add/Update the question text under the part that shows:
```
# --question--
## --text--
```
Add/Update answers (`Answer 1`, `Answer 2`, and so on) under `## --answers--`. Make sure to update the number under `## --video-solution--` with the correct answer number. You can add more possible answers using the same format. The question and answers can be surrounded with quotation marks.
### Question examples
@ -136,14 +135,16 @@ Add/Update answers (`Answer 1`, `Answer 2`, and so on) under `## --answers--`. M
# --question--
## --text--
What does this JavaScript code log to the console?
```js
console.log('hello world');
```
## --answers--
hello *world*
hello _world_
---
@ -156,11 +157,11 @@ hello world
---
## --video-solution--
3
````
````md
# --question--
## --text--

View File

@ -20,7 +20,7 @@ When opening a Pull Request(PR), you can use the below to determine the type, sc
**Type:**
| Type | When to select |
| :---- | :--------------------------------------------------------------------------- |
| :---- | :------------------------------------------------------------------------------- |
| fix | Changed or updated/improved functionality, tests, the verbiage of a lesson, etc. |
| feat | Only if you are adding new functionality, tests, etc. |
| chore | Changes that are not related to code, tests, or verbiage of a lesson. |
@ -158,14 +158,14 @@ When you are working on features for our upcoming curriculum `next-*` branches,
# git checkout -b backup-feat/add-numpy-video-question origin/feat/add-numpy-video-question
```
4. Start off with a clean slate:
3. Start off with a clean slate:
```console
git checkout -b <pr-branch-name> next-python-projects
git cherry-pick <commit-hash>
```
5. Resolve any conflicts, and cleanup, install run tests
4. Resolve any conflicts, and cleanup, install run tests
```console
npm run clean
@ -179,7 +179,7 @@ When you are working on features for our upcoming curriculum `next-*` branches,
```
6. If everything looks good push back to the PR
5. If everything looks good push back to the PR
```console
git push --force origin <pr-branch-name>

View File

@ -84,6 +84,7 @@ One really neat trick is that you can also create custom one-off templates just
```sh
npm run zip
```
## Other Reference and resources
### PostCSS Features Used

View File

@ -1,6 +1,7 @@
This page describes how to contribute to the freeCodeCamp tutorials and projects that are completed using the CodeRoad VS Code extension.
## How the tutorials work
The freeCodeCamp tutorials that use CodeRoad each have their own repo under the freeCodeCamp GitHub organization. They all start with `learn-`. For example, `https://github.com/freeCodeCamp/learn-bash-by-building-a-boilerplate/`.
Each tutorial repo has a `main` branch and a "version" branch, e.g. `v1.0.0`.
@ -20,11 +21,13 @@ In order to make changes to commits on a version branch, you would need to rebas
## How to contribute
### Prerequisites
Install the [CodeRoad CLI tools](https://www.npmjs.com/package/@coderoad/cli) with `npm install -g @coderoad/cli`.
There have been some issues with the latest version. If `coderoad --version` doesn't work after installing, downgrade to `0.7.0` with `npm install -g @coderoad/cli@0.7.0`.
### Working on `main`
This set of instructions is for PRs that only make minor changes on `main` to **existing lessons**. That mainly consists of typo, grammar, hint, and instructional changes or fixes in the `TUTORIAL.md` file.
For everything else, including adding or deleting lessons, follow the [working on a version branch instructions](#working-on-version-branch). You will not need to create a new version branch for this - you can create a PR following the instructions below.
@ -47,12 +50,14 @@ Follow these instructions to make a PR, keeping in mind that instructions usuall
- Make a PR
### Testing changes on `main`
If you want to test your changes to `main` after using the above instructions, follow these instructions:
- Follow the instructions on the [rdb-alpha repo](https://github.com/freeCodeCamp/rdb-alpha) to run a container
- Start the tutorial using the `tutorial.json` file on the new branch
### Reviewing PR's to `main`
If reviewing a PR that only changes `main` with instructional or grammar issues as described above, the changes in `TUTORIAL.md` should match the changes in `tutorial.json`.
The `tutorial.json` file should not have changes to commit hashes, or step/level ids. Startup or level commands or file watchers likely should not be changed either. There are exceptions if there's an issue with a step, but they should be treated with more caution.
@ -60,6 +65,7 @@ The `tutorial.json` file should not have changes to commit hashes, or step/level
Also, keep in mind that instructions usually use the lessons around them for context, so make sure they make sense.
### Working on version branch
> [!WARNING]
>
> Reminder: Never make or push changes to a version branch that is on one of the freeCodeCamp repos. Always create a new one
@ -86,10 +92,12 @@ Follow these instructions to create a new version:
- Leave it here for reviewers
### Testing changes to a version branch
- Follow the instructions on the [rdb-alpha repo](https://github.com/freeCodeCamp/rdb-alpha) to run a container
- Start the tutorial using the `tutorial.json` file on whatever fork the changes are on. Make sure to use the file on the `feat: version-X.X.Y` branch and not the `main` branch
### Pushing a new version
Before pushing a new version, view the new `feat/version-vX.X.Y` (will be merged to `main`) branch on the user's fork. Make sure there are additions to the `CHANGELOG.md` file that include the new changes, and the version in the two spots of `coderoad.yaml` matches the new version branch.
If you have write access to the freeCodeCamp repo, have verified the `CHANGELOG` and `coderoad.yaml` files, have tested the changes using the instructions above, and want to push a new version of a tutorial:
@ -114,13 +122,17 @@ If you have write access to the freeCodeCamp repo, have verified the `CHANGELOG`
- Finally, if any PRs for this version exists, close them
### How to revert to a previous version
- Create a new branch off the latest `main` with `git checkout -b revert/to-version-X.X.X`
- Revert all commits on this branch up to and including the commit of the version after the one you want to revert to. For example, you may have commits that look like this:
```
fix: typo
release: version 1.0.1
fix: typo
release: version 1.0.0
```
If you want to revert to v1.0.0, revert all the commits from `release: version 1.0.1` and after
- Create a PR. Give it a title of `revert: to version X.X.X`

24
package-lock.json generated
View File

@ -12055,15 +12055,6 @@
"integrity": "sha1-J/uRhTaQzOs65hAdnIrsxqZ6QCw=",
"dev": true
},
"eslint-plugin-prettier": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz",
"integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==",
"dev": true,
"requires": {
"prettier-linter-helpers": "^1.0.0"
}
},
"eslint-plugin-react": {
"version": "7.26.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.26.1.tgz",
@ -12645,12 +12636,6 @@
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"fast-diff": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
"integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
"dev": true
},
"fast-glob": {
"version": "3.2.5",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
@ -20365,15 +20350,6 @@
"integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==",
"dev": true
},
"prettier-linter-helpers": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
"integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
"dev": true,
"requires": {
"fast-diff": "^1.1.2"
}
},
"pretty-bytes": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",

View File

@ -56,19 +56,18 @@
"e2e:prd:run": "npm run build && start-test ':3000/status/ping|8000' cypress:dev:run",
"e2e:prd:watch": "npm run build && start-test ':3000/status/ping|8000' cypress:dev:watch",
"ensure-env": "cross-env DEBUG=fcc:* node ./tools/scripts/build/ensure-env.js",
"format": "npm-run-all -p format:*",
"format:css": "npm run prettier -- --write",
"format:js": "npm run lint:js -- --fix",
"format": "run-s format:eslint format:prettier",
"format:eslint": "eslint . --fix",
"format:prettier": "prettier --write .",
"hooks:install": "node node_modules/husky/husky.js install",
"hooks:uninstall": "node node_modules/husky/husky.js uninstall",
"lint": "npm-run-all ensure-env -p lint:*",
"lint:challenges": "cd ./curriculum && npm run lint",
"lint:css": "npm run prettier -- --check",
"lint:js": "eslint --max-warnings 0 .",
"lint:ts": "tsc -p client && tsc -p tools/ui-components",
"lint:translations": "cd ./client && npm run lint",
"lint:prettier": "prettier --list-different .",
"postinstall": "npm run bootstrap",
"prettier": "prettier \"**/*.css\"",
"seed": "cross-env DEBUG=fcc:* node ./tools/scripts/seed/seedAuthUser",
"seed:certified-user": "cross-env DEBUG=fcc:* node ./tools/scripts/seed/seedAuthUser certUser",
"serve:client": "cd ./client && npm run serve",
@ -89,11 +88,6 @@
"test-ui-components": "jest tools/ui-components",
"prepare": "husky install"
},
"lint-staged": {
"*.css": "prettier --write",
"*.(js|ts|tsx)": "eslint --max-warnings 0 --cache --fix",
"./curriculum/challenges/**/*.md": "node ./tools/scripts/lint/index.js"
},
"dependencies": {
"dotenv": "10.0.0",
"invariant": "2.2.4"
@ -121,7 +115,6 @@
"eslint-plugin-jest-dom": "3.9.2",
"eslint-plugin-jsx-a11y": "6.4.1",
"eslint-plugin-prefer-object-spread": "1.2.1",
"eslint-plugin-prettier": "3.4.1",
"eslint-plugin-react": "7.26.1",
"eslint-plugin-react-hooks": "2.5.1",
"eslint-plugin-testing-library": "4.12.4",

View File

@ -14,7 +14,11 @@
},
{
"groupName": "Monaco Editor",
"matchPackageNames": ["monaco-editor", "monaco-editor-webpack-plugin", "react-monaco-editor"]
"matchPackageNames": [
"monaco-editor",
"monaco-editor-webpack-plugin",
"react-monaco-editor"
]
},
{
"matchPackageNames": ["normalize-url"],
@ -22,9 +26,7 @@
},
{
"groupName": "CodeSee",
"matchPackagePrefixes": [
"@codesee/"
],
"matchPackagePrefixes": ["@codesee/"],
"automerge": true
}
],

View File

@ -28,7 +28,7 @@ Second hint with <code>code</code>
// more test code
```
Third *hint* with <code>code</code> and `inline code`
Third _hint_ with <code>code</code> and `inline code`
```js
// more test code
@ -43,8 +43,7 @@ if(let x of xs) {
```html
<html>
<body>
</body>
<body></body>
</html>
```
@ -62,15 +61,13 @@ body {
var x = 'y';
```
# --solutions--
![html-key]()
```html
<html>
<body>
</body>
<body></body>
</html>
```
@ -82,4 +79,5 @@ body {
```js
var x = 'y';
``
``;
```

View File

@ -54,7 +54,6 @@ const logoStyle = { paddingLeft: '30px' };
const titleStyle = { margin: '0', padding: '0' };
class App extends Component {
state = {
view: 'search',
@ -63,11 +62,11 @@ class App extends Component {
updateInfo() {
fetch(ENDPOINT_INFO)
.then(response => response.json())
.then((response) => response.json())
.then(({ ok, numPRs, prRange, lastUpdate }) => {
if (ok) {
const footerInfo = { numPRs, prRange, lastUpdate };
this.setState(prevState => ({ footerInfo }));
this.setState((prevState) => ({ footerInfo }));
}
})
.catch(() => {
@ -77,7 +76,7 @@ class App extends Component {
handleViewChange = ({ target: { id } }) => {
const view = id.replace('tabs-', '');
this.setState(prevState => ({ ...this.clearObj, view }));
this.setState((prevState) => ({ ...this.clearObj, view }));
if (view === 'reports' || view === 'search') {
this.updateInfo();
}
@ -95,26 +94,47 @@ class App extends Component {
return (
<>
<AppNavBar>
<a href="https://www.freecodecamp.org/" target="_blank" rel="noopener noreferrer" style={logoStyle}>
<a
href="https://www.freecodecamp.org/"
target="_blank"
rel="noopener noreferrer"
style={logoStyle}
>
<FreeCodeCampLogo />
</a>
<h1 style={titleStyle}>Contributor Tools</h1>
<ul className="app-menu">
<li>
<a href="https://github.com/freeCodeCamp/freeCodeCamp" target="_blank" rel="noopener noreferrer">GitHub</a>
<a
href="https://github.com/freeCodeCamp/freeCodeCamp"
target="_blank"
rel="noopener noreferrer"
>
GitHub
</a>
</li>
</ul>
</AppNavBar>
<PageContainer>
<Tabs view={view} onViewChange={handleViewChange} />
<Container>
{view === 'search' && <Search />}
{view === 'reports' && <Pareto />}
{view === 'boilerplates' &&
<Repos key='boilerplates' dataFilter={repo => repo._id.includes('boilerplate')} />}
{view === 'other' &&
<Repos key='other' dataFilter={repo => !repo._id.includes('boilerplate') && repo._id !== 'freeCodeCamp'} />}
{view === 'boilerplates' && (
<Repos
key="boilerplates"
dataFilter={(repo) => repo._id.includes('boilerplate')}
/>
)}
{view === 'other' && (
<Repos
key="other"
dataFilter={(repo) =>
!repo._id.includes('boilerplate') &&
repo._id !== 'freeCodeCamp'
}
/>
)}
</Container>
{footerInfo && <Footer footerInfo={footerInfo} />}
</PageContainer>

View File

@ -4,107 +4,107 @@ import React from 'react';
function freeCodeCampLogo() {
return (
<svg
aria-label='[freeCodeCamp Logo]'
aria-label="[freeCodeCamp Logo]"
height={24}
role='math'
version='1.1'
viewBox='0 0 210 24'
role="math"
version="1.1"
viewBox="0 0 210 24"
width={210}
xmlns='http://www.w3.org/2000/svg'
xmlnsXlink='http://www.w3.org/1999/xlink'
xmlns="http://www.w3.org/2000/svg"
xmlnsXlink="http://www.w3.org/1999/xlink"
>
<defs>
<path
d='m35.42 5.56 0.43 0.05 0.42 0.08 0.39 0.09 0.37 0.12 0.36 0.14 0.32 0.16 0.31 0.18 0.28 0.21 0.27 0.22 0.24 0.24 0.22 0.27 0.2 0.28 0.18 0.31 0.16 0.33 0.13 0.35 0.12 0.37 0.09 0.39 0.08 0.41 0.05 0.44 0.03 0.45 0.01 0.47v0.12 0.11l-0.01 0.1-0.04 0.2-0.04 0.18-0.03 0.08-0.07 0.15-0.04 0.06-0.05 0.06-0.04 0.06-0.06 0.05-0.05 0.05-0.06 0.03-0.06 0.04-0.07 0.03-0.08 0.02-0.07 0.02-0.16 0.02h-8.9v-0.07h-0.02v1.84l0.01 0.24 0.03 0.24 0.03 0.23 0.06 0.22 0.07 0.2 0.09 0.2 0.1 0.17 0.12 0.18 0.13 0.15 0.15 0.16 0.17 0.13 0.18 0.13 0.2 0.11 0.21 0.11 0.23 0.09 0.24 0.09 0.27 0.06 0.27 0.07 0.3 0.05 0.31 0.03 0.32 0.03 0.34 0.02 0.36 0.01h0.13l0.13-0.01h0.13l0.12-0.01h0.13l0.24-0.02 0.23-0.02 0.11-0.01 0.11-0.02 0.21-0.03 0.1-0.01 0.1-0.02 0.29-0.06 0.09-0.03 0.09-0.02 0.08-0.03 0.09-0.03 0.08-0.03 0.05-0.01 0.15-0.06 0.06-0.03 0.06-0.02 0.12-0.06 0.21-0.11 0.08-0.04 0.07-0.05 0.17-0.09 0.08-0.05 0.09-0.05 0.09-0.06 0.19-0.13 0.1-0.06 0.1-0.07 0.11-0.07 0.12-0.12 0.13-0.1 0.06-0.05 0.05-0.04 0.06-0.04 0.05-0.05 0.09-0.07 0.1-0.06 0.04-0.03 0.04-0.02 0.04-0.03 0.07-0.03 0.03-0.01 0.04-0.01 0.02-0.01 0.05-0.01h0.09l0.1 0.01 0.15 0.03 0.04 0.02 0.07 0.04 0.04 0.03 0.09 0.09 0.03 0.04 0.04 0.08 0.01 0.05 0.02 0.05 0.01 0.06 0.02 0.1v0.07 0.07 0.06l-0.01 0.07-0.01 0.06-0.01 0.07-0.06 0.2-0.03 0.06-0.04 0.07-0.03 0.07-0.04 0.07-0.05 0.07-0.05 0.06-0.1 0.14-0.13 0.13-0.13 0.14-0.16 0.14-0.09 0.06-0.08 0.08-0.15 0.1-0.15 0.11-0.32 0.2-0.17 0.09-0.18 0.09-0.18 0.08-0.19 0.07-0.19 0.08-0.21 0.07-0.42 0.12-0.22 0.05-0.23 0.05-0.47 0.09-0.5 0.06-0.52 0.04-0.27 0.01-0.28 0.01h-0.28-0.48l-0.47-0.03-0.45-0.04-0.42-0.07-0.41-0.07-0.38-0.09-0.36-0.11-0.34-0.13-0.31-0.15-0.3-0.16-0.27-0.18-0.26-0.2-0.22-0.21-0.21-0.23-0.19-0.25-0.16-0.26-0.14-0.29-0.13-0.29-0.1-0.32-0.07-0.34-0.06-0.35-0.03-0.37-0.01-0.39v-4.71l0.01-0.14 0.01-0.12 0.01-0.13 0.04-0.26 0.04-0.13 0.03-0.12 0.08-0.24 0.1-0.24 0.12-0.23 0.06-0.11 0.07-0.12 0.08-0.1 0.08-0.11 0.08-0.1 0.09-0.11 0.19-0.2 0.23-0.23 0.3-0.24 0.15-0.11 0.17-0.11 0.17-0.1 0.17-0.09 0.18-0.09 0.38-0.16 0.2-0.07 0.42-0.12 0.22-0.05 0.23-0.05 0.22-0.04 0.24-0.03 0.24-0.04 0.24-0.02 0.25-0.02 0.52-0.02h0.27l0.47 0.01 0.47 0.03zm-2.04 1.6-0.41 0.07-0.39 0.1-0.38 0.13-0.37 0.15-0.35 0.18-0.32 0.25-0.27 0.26-0.23 0.28-0.19 0.3-0.13 0.31-0.08 0.32-0.03 0.35v0.96h8.19l-0.09-0.98-0.25-0.83-0.43-0.69-0.6-0.53-0.76-0.38-0.95-0.23-1.11-0.07-0.43 0.01-0.42 0.04z'
id='k'
d="m35.42 5.56 0.43 0.05 0.42 0.08 0.39 0.09 0.37 0.12 0.36 0.14 0.32 0.16 0.31 0.18 0.28 0.21 0.27 0.22 0.24 0.24 0.22 0.27 0.2 0.28 0.18 0.31 0.16 0.33 0.13 0.35 0.12 0.37 0.09 0.39 0.08 0.41 0.05 0.44 0.03 0.45 0.01 0.47v0.12 0.11l-0.01 0.1-0.04 0.2-0.04 0.18-0.03 0.08-0.07 0.15-0.04 0.06-0.05 0.06-0.04 0.06-0.06 0.05-0.05 0.05-0.06 0.03-0.06 0.04-0.07 0.03-0.08 0.02-0.07 0.02-0.16 0.02h-8.9v-0.07h-0.02v1.84l0.01 0.24 0.03 0.24 0.03 0.23 0.06 0.22 0.07 0.2 0.09 0.2 0.1 0.17 0.12 0.18 0.13 0.15 0.15 0.16 0.17 0.13 0.18 0.13 0.2 0.11 0.21 0.11 0.23 0.09 0.24 0.09 0.27 0.06 0.27 0.07 0.3 0.05 0.31 0.03 0.32 0.03 0.34 0.02 0.36 0.01h0.13l0.13-0.01h0.13l0.12-0.01h0.13l0.24-0.02 0.23-0.02 0.11-0.01 0.11-0.02 0.21-0.03 0.1-0.01 0.1-0.02 0.29-0.06 0.09-0.03 0.09-0.02 0.08-0.03 0.09-0.03 0.08-0.03 0.05-0.01 0.15-0.06 0.06-0.03 0.06-0.02 0.12-0.06 0.21-0.11 0.08-0.04 0.07-0.05 0.17-0.09 0.08-0.05 0.09-0.05 0.09-0.06 0.19-0.13 0.1-0.06 0.1-0.07 0.11-0.07 0.12-0.12 0.13-0.1 0.06-0.05 0.05-0.04 0.06-0.04 0.05-0.05 0.09-0.07 0.1-0.06 0.04-0.03 0.04-0.02 0.04-0.03 0.07-0.03 0.03-0.01 0.04-0.01 0.02-0.01 0.05-0.01h0.09l0.1 0.01 0.15 0.03 0.04 0.02 0.07 0.04 0.04 0.03 0.09 0.09 0.03 0.04 0.04 0.08 0.01 0.05 0.02 0.05 0.01 0.06 0.02 0.1v0.07 0.07 0.06l-0.01 0.07-0.01 0.06-0.01 0.07-0.06 0.2-0.03 0.06-0.04 0.07-0.03 0.07-0.04 0.07-0.05 0.07-0.05 0.06-0.1 0.14-0.13 0.13-0.13 0.14-0.16 0.14-0.09 0.06-0.08 0.08-0.15 0.1-0.15 0.11-0.32 0.2-0.17 0.09-0.18 0.09-0.18 0.08-0.19 0.07-0.19 0.08-0.21 0.07-0.42 0.12-0.22 0.05-0.23 0.05-0.47 0.09-0.5 0.06-0.52 0.04-0.27 0.01-0.28 0.01h-0.28-0.48l-0.47-0.03-0.45-0.04-0.42-0.07-0.41-0.07-0.38-0.09-0.36-0.11-0.34-0.13-0.31-0.15-0.3-0.16-0.27-0.18-0.26-0.2-0.22-0.21-0.21-0.23-0.19-0.25-0.16-0.26-0.14-0.29-0.13-0.29-0.1-0.32-0.07-0.34-0.06-0.35-0.03-0.37-0.01-0.39v-4.71l0.01-0.14 0.01-0.12 0.01-0.13 0.04-0.26 0.04-0.13 0.03-0.12 0.08-0.24 0.1-0.24 0.12-0.23 0.06-0.11 0.07-0.12 0.08-0.1 0.08-0.11 0.08-0.1 0.09-0.11 0.19-0.2 0.23-0.23 0.3-0.24 0.15-0.11 0.17-0.11 0.17-0.1 0.17-0.09 0.18-0.09 0.38-0.16 0.2-0.07 0.42-0.12 0.22-0.05 0.23-0.05 0.22-0.04 0.24-0.03 0.24-0.04 0.24-0.02 0.25-0.02 0.52-0.02h0.27l0.47 0.01 0.47 0.03zm-2.04 1.6-0.41 0.07-0.39 0.1-0.38 0.13-0.37 0.15-0.35 0.18-0.32 0.25-0.27 0.26-0.23 0.28-0.19 0.3-0.13 0.31-0.08 0.32-0.03 0.35v0.96h8.19l-0.09-0.98-0.25-0.83-0.43-0.69-0.6-0.53-0.76-0.38-0.95-0.23-1.11-0.07-0.43 0.01-0.42 0.04z"
id="k"
/>
<path
d='m107.21 5.56 0.43 0.05 0.42 0.08 0.39 0.09 0.37 0.12 0.35 0.14 0.33 0.16 0.31 0.18 0.29 0.21 0.26 0.22 0.24 0.24 0.22 0.27 0.21 0.28 0.17 0.31 0.16 0.33 0.14 0.35 0.11 0.37 0.1 0.39 0.07 0.41 0.05 0.44 0.03 0.45 0.01 0.47v0.12l-0.01 0.11-0.02 0.2-0.02 0.1-0.02 0.09-0.03 0.09-0.02 0.08-0.03 0.07-0.04 0.08-0.04 0.06-0.1 0.12-0.1 0.1-0.13 0.07-0.13 0.05-0.08 0.02-0.16 0.02-8.92 0.01v1.76l0.01 0.24 0.02 0.24 0.04 0.23 0.06 0.22 0.07 0.2 0.08 0.2 0.11 0.17 0.11 0.18 0.14 0.15 0.15 0.16 0.17 0.13 0.18 0.13 0.19 0.11 0.22 0.11 0.23 0.09 0.24 0.09 0.26 0.06 0.28 0.07 0.3 0.05 0.31 0.03 0.32 0.03 0.34 0.02 0.36 0.01h0.13l0.13-0.01h0.13l0.25-0.01 0.24-0.02 0.22-0.02 0.12-0.01 0.11-0.02 0.31-0.04 0.2-0.04 0.19-0.04 0.09-0.03 0.09-0.02 0.09-0.03 0.08-0.03 0.13-0.04 0.04-0.02 0.06-0.02 0.05-0.02 0.06-0.03 0.05-0.02 0.07-0.03 0.2-0.1 0.14-0.08 0.08-0.05 0.08-0.04 0.08-0.05 0.18-0.1 0.18-0.12 0.2-0.13 0.1-0.07 0.11-0.07 0.06-0.06 0.07-0.06 0.05-0.05 0.07-0.05 0.05-0.05 0.06-0.04 0.11-0.09 0.05-0.03 0.05-0.04 0.04-0.03 0.05-0.03 0.04-0.03 0.04-0.02 0.04-0.03 0.07-0.03 0.12-0.04h0.02 0.09 0.05l0.06 0.01 0.09 0.02 0.05 0.01 0.12 0.06 0.12 0.12 0.03 0.04 0.04 0.08 0.01 0.05 0.02 0.05 0.02 0.11 0.01 0.05v0.07 0.13l-0.01 0.07-0.01 0.06-0.01 0.07-0.04 0.14-0.02 0.06-0.03 0.06-0.04 0.07-0.03 0.07-0.09 0.14-0.05 0.06-0.05 0.07-0.11 0.14-0.21 0.2-0.23 0.2-0.09 0.08-0.3 0.21-0.15 0.1-0.17 0.1-0.17 0.09-0.18 0.09-0.18 0.08-0.19 0.07-0.2 0.08-0.2 0.07-0.42 0.12-0.22 0.05-0.23 0.05-0.23 0.04-0.24 0.05-0.5 0.06-0.52 0.04-0.55 0.02h-0.28-0.49l-0.46-0.03-0.45-0.04-0.43-0.07-0.39-0.07-0.39-0.09-0.36-0.11-0.33-0.13-0.33-0.15-0.29-0.16-0.27-0.18-0.25-0.2-0.23-0.21-0.22-0.23-0.18-0.25-0.17-0.26-0.14-0.29-0.12-0.29-0.1-0.32-0.08-0.34-0.05-0.35-0.04-0.37-0.01-0.39v-4.58l0.01-0.13v-0.14l0.02-0.12 0.01-0.13 0.02-0.13 0.05-0.26 0.12-0.36 0.1-0.24 0.11-0.23 0.07-0.11 0.07-0.12 0.07-0.1 0.09-0.11 0.08-0.1 0.09-0.11 0.19-0.2 0.1-0.1 0.14-0.13 0.14-0.12 0.15-0.12 0.15-0.11 0.17-0.11 0.17-0.1 0.17-0.09 0.19-0.09 0.18-0.08 0.19-0.08 0.2-0.07 0.42-0.12 0.44-0.1 0.23-0.04 0.23-0.03 0.25-0.04 0.24-0.02 0.25-0.02 0.52-0.02h0.27l0.48 0.01 0.46 0.03zm-2.04 1.6-0.41 0.07-0.39 0.1-0.38 0.13-0.37 0.15-0.34 0.18-0.34 0.25-0.29 0.26-0.23 0.28-0.17 0.3-0.13 0.31-0.07 0.32-0.03 0.35v0.96h8.19l-0.09-0.98-0.25-0.83-0.43-0.69-0.6-0.53-0.76-0.38-0.95-0.23-1.11-0.07-0.43 0.01-0.42 0.04z'
id='j'
d="m107.21 5.56 0.43 0.05 0.42 0.08 0.39 0.09 0.37 0.12 0.35 0.14 0.33 0.16 0.31 0.18 0.29 0.21 0.26 0.22 0.24 0.24 0.22 0.27 0.21 0.28 0.17 0.31 0.16 0.33 0.14 0.35 0.11 0.37 0.1 0.39 0.07 0.41 0.05 0.44 0.03 0.45 0.01 0.47v0.12l-0.01 0.11-0.02 0.2-0.02 0.1-0.02 0.09-0.03 0.09-0.02 0.08-0.03 0.07-0.04 0.08-0.04 0.06-0.1 0.12-0.1 0.1-0.13 0.07-0.13 0.05-0.08 0.02-0.16 0.02-8.92 0.01v1.76l0.01 0.24 0.02 0.24 0.04 0.23 0.06 0.22 0.07 0.2 0.08 0.2 0.11 0.17 0.11 0.18 0.14 0.15 0.15 0.16 0.17 0.13 0.18 0.13 0.19 0.11 0.22 0.11 0.23 0.09 0.24 0.09 0.26 0.06 0.28 0.07 0.3 0.05 0.31 0.03 0.32 0.03 0.34 0.02 0.36 0.01h0.13l0.13-0.01h0.13l0.25-0.01 0.24-0.02 0.22-0.02 0.12-0.01 0.11-0.02 0.31-0.04 0.2-0.04 0.19-0.04 0.09-0.03 0.09-0.02 0.09-0.03 0.08-0.03 0.13-0.04 0.04-0.02 0.06-0.02 0.05-0.02 0.06-0.03 0.05-0.02 0.07-0.03 0.2-0.1 0.14-0.08 0.08-0.05 0.08-0.04 0.08-0.05 0.18-0.1 0.18-0.12 0.2-0.13 0.1-0.07 0.11-0.07 0.06-0.06 0.07-0.06 0.05-0.05 0.07-0.05 0.05-0.05 0.06-0.04 0.11-0.09 0.05-0.03 0.05-0.04 0.04-0.03 0.05-0.03 0.04-0.03 0.04-0.02 0.04-0.03 0.07-0.03 0.12-0.04h0.02 0.09 0.05l0.06 0.01 0.09 0.02 0.05 0.01 0.12 0.06 0.12 0.12 0.03 0.04 0.04 0.08 0.01 0.05 0.02 0.05 0.02 0.11 0.01 0.05v0.07 0.13l-0.01 0.07-0.01 0.06-0.01 0.07-0.04 0.14-0.02 0.06-0.03 0.06-0.04 0.07-0.03 0.07-0.09 0.14-0.05 0.06-0.05 0.07-0.11 0.14-0.21 0.2-0.23 0.2-0.09 0.08-0.3 0.21-0.15 0.1-0.17 0.1-0.17 0.09-0.18 0.09-0.18 0.08-0.19 0.07-0.2 0.08-0.2 0.07-0.42 0.12-0.22 0.05-0.23 0.05-0.23 0.04-0.24 0.05-0.5 0.06-0.52 0.04-0.55 0.02h-0.28-0.49l-0.46-0.03-0.45-0.04-0.43-0.07-0.39-0.07-0.39-0.09-0.36-0.11-0.33-0.13-0.33-0.15-0.29-0.16-0.27-0.18-0.25-0.2-0.23-0.21-0.22-0.23-0.18-0.25-0.17-0.26-0.14-0.29-0.12-0.29-0.1-0.32-0.08-0.34-0.05-0.35-0.04-0.37-0.01-0.39v-4.58l0.01-0.13v-0.14l0.02-0.12 0.01-0.13 0.02-0.13 0.05-0.26 0.12-0.36 0.1-0.24 0.11-0.23 0.07-0.11 0.07-0.12 0.07-0.1 0.09-0.11 0.08-0.1 0.09-0.11 0.19-0.2 0.1-0.1 0.14-0.13 0.14-0.12 0.15-0.12 0.15-0.11 0.17-0.11 0.17-0.1 0.17-0.09 0.19-0.09 0.18-0.08 0.19-0.08 0.2-0.07 0.42-0.12 0.44-0.1 0.23-0.04 0.23-0.03 0.25-0.04 0.24-0.02 0.25-0.02 0.52-0.02h0.27l0.48 0.01 0.46 0.03zm-2.04 1.6-0.41 0.07-0.39 0.1-0.38 0.13-0.37 0.15-0.34 0.18-0.34 0.25-0.29 0.26-0.23 0.28-0.17 0.3-0.13 0.31-0.07 0.32-0.03 0.35v0.96h8.19l-0.09-0.98-0.25-0.83-0.43-0.69-0.6-0.53-0.76-0.38-0.95-0.23-1.11-0.07-0.43 0.01-0.42 0.04z"
id="j"
/>
<path
d='m203.57 0.17c-0.12 0.12-0.24 0.29-0.24 0.45 0 0.29 0.34 0.69 0.97 1.33 2.63 2.53 3.95 5.62 3.94 9.35-0.01 4.13-1.4 7.45-4.1 10.01-0.57 0.51-0.8 0.91-0.8 1.25 0 0.17 0.12 0.34 0.23 0.51 0.11 0.12 0.34 0.23 0.51 0.23 0.62 0 1.5-0.73 2.64-2.17 2.22-2.72 3.22-5.73 3.28-9.82 0.05-4.1-1.23-6.88-3.75-9.75-0.9-1.03-1.66-1.56-2.17-1.56-0.17 0-0.35 0.06-0.51 0.17z'
id='b'
d="m203.57 0.17c-0.12 0.12-0.24 0.29-0.24 0.45 0 0.29 0.34 0.69 0.97 1.33 2.63 2.53 3.95 5.62 3.94 9.35-0.01 4.13-1.4 7.45-4.1 10.01-0.57 0.51-0.8 0.91-0.8 1.25 0 0.17 0.12 0.34 0.23 0.51 0.11 0.12 0.34 0.23 0.51 0.23 0.62 0 1.5-0.73 2.64-2.17 2.22-2.72 3.22-5.73 3.28-9.82 0.05-4.1-1.23-6.88-3.75-9.75-0.9-1.03-1.66-1.56-2.17-1.56-0.17 0-0.35 0.06-0.51 0.17z"
id="b"
/>
<path
d='m124.75 1.76c1.14 0.86 1.73 2.07 1.73 3.55 0 0.68-0.29 1.02-0.86 1.02-0.39 0-0.68-0.34-0.85-1.02-0.11-0.57-0.34-1.08-0.62-1.62-0.52-0.9-1.61-1.32-3.32-1.32-1.49 0-2.52 0.34-3.14 1.08-0.57 0.68-0.91 1.72-0.91 3.26v5.95c0 1.55 0.34 2.63 0.97 3.31 0.68 0.74 1.72 1.13 3.2 1.13 2.23 0 3.54-0.79 3.82-2.34 0.12-0.57 0.17-0.86 0.17-0.91 0.12-0.34 0.35-0.51 0.68-0.51 0.57 0 0.86 0.34 0.86 1.02 0 1.44-0.57 2.52-1.78 3.38-0.97 0.62-2.18 0.96-3.77 0.96-1.84 0-3.26-0.4-4.3-1.25-1.16-0.8-1.73-2.16-1.73-3.94v-7.16c0-3.77 1.95-5.61 5.95-5.61 1.61 0 2.86 0.34 3.9 1.02z'
id='n'
d="m124.75 1.76c1.14 0.86 1.73 2.07 1.73 3.55 0 0.68-0.29 1.02-0.86 1.02-0.39 0-0.68-0.34-0.85-1.02-0.11-0.57-0.34-1.08-0.62-1.62-0.52-0.9-1.61-1.32-3.32-1.32-1.49 0-2.52 0.34-3.14 1.08-0.57 0.68-0.91 1.72-0.91 3.26v5.95c0 1.55 0.34 2.63 0.97 3.31 0.68 0.74 1.72 1.13 3.2 1.13 2.23 0 3.54-0.79 3.82-2.34 0.12-0.57 0.17-0.86 0.17-0.91 0.12-0.34 0.35-0.51 0.68-0.51 0.57 0 0.86 0.34 0.86 1.02 0 1.44-0.57 2.52-1.78 3.38-0.97 0.62-2.18 0.96-3.77 0.96-1.84 0-3.26-0.4-4.3-1.25-1.16-0.8-1.73-2.16-1.73-3.94v-7.16c0-3.77 1.95-5.61 5.95-5.61 1.61 0 2.86 0.34 3.9 1.02z"
id="n"
/>
<path
d='m14.21 6.57c0-0.56 0.34-0.79 1.02-0.79h3.32c0.57 0 0.85 0.51 0.85 1.44 1.02-1.08 2.12-1.73 3.26-1.73 0.96 0 1.72 0.29 2.23 0.86 0.57 0.57 0.8 1.38 0.8 2.29 0 0.63-0.29 0.97-0.8 0.97-0.34 0-0.57-0.23-0.68-0.63-0.23-0.8-0.34-1.19-0.4-1.25-0.22-0.39-0.68-0.62-1.25-0.62-0.62 0-1.25 0.23-1.78 0.68-0.34 0.23-0.8 0.74-1.38 1.49v7.67h3.08c0.68 0 1.03 0.29 1.03 0.8 0 0.57-0.35 0.86-1.03 0.86h-7.33c-0.68 0-1.02-0.29-1.02-0.8 0-0.57 0.34-0.8 1.02-0.8h2.52v-0.07h0.02v-9.57h-2.46c-0.68 0-1.02-0.28-1.02-0.8z'
id='l'
d="m14.21 6.57c0-0.56 0.34-0.79 1.02-0.79h3.32c0.57 0 0.85 0.51 0.85 1.44 1.02-1.08 2.12-1.73 3.26-1.73 0.96 0 1.72 0.29 2.23 0.86 0.57 0.57 0.8 1.38 0.8 2.29 0 0.63-0.29 0.97-0.8 0.97-0.34 0-0.57-0.23-0.68-0.63-0.23-0.8-0.34-1.19-0.4-1.25-0.22-0.39-0.68-0.62-1.25-0.62-0.62 0-1.25 0.23-1.78 0.68-0.34 0.23-0.8 0.74-1.38 1.49v7.67h3.08c0.68 0 1.03 0.29 1.03 0.8 0 0.57-0.35 0.86-1.03 0.86h-7.33c-0.68 0-1.02-0.29-1.02-0.8 0-0.57 0.34-0.8 1.02-0.8h2.52v-0.07h0.02v-9.57h-2.46c-0.68 0-1.02-0.28-1.02-0.8z"
id="l"
/>
<path
d='m96.68 0.04 0.06 0.02 0.06 0.03 0.05 0.03 0.06 0.04 0.13 0.13 0.03 0.06 0.04 0.06 0.03 0.07 0.02 0.07 0.04 0.16 0.04 0.18 0.01 0.2v0.1 16.84 0.08l-0.01 0.07v0.07l-0.04 0.13-0.01 0.05-0.03 0.06-0.02 0.05-0.06 0.09-0.07 0.08-0.05 0.03-0.04 0.03-0.05 0.03-0.1 0.04-0.06 0.02-0.12 0.02-0.07 0.01h-0.11l-0.13-0.02-0.04-0.01-0.04-0.02-0.04-0.01-0.03-0.02-0.03-0.01-0.03-0.03-0.03-0.02-0.06-0.05-0.02-0.03-0.07-0.12-0.01-0.04-0.02-0.05-0.01-0.04-0.02-0.05v-0.05-0.08-0.04-0.04l-0.01-0.04v-0.04l-0.01-0.04v-0.04-0.04l-0.01-0.05v-0.04-0.05l-0.01-0.09v-0.06l-0.01-0.04v-0.06-0.11l-0.01-0.06v-0.13l-0.13 0.09-0.13 0.08-0.13 0.09-0.24 0.14-0.11 0.08-0.12 0.07-0.21 0.12-0.1 0.06-0.09 0.06-0.1 0.05-0.25 0.14-0.14 0.08-0.14 0.06-0.12 0.05-0.05 0.02-0.09 0.04-0.09 0.03-0.09 0.02-0.19 0.06-0.4 0.08-0.21 0.03-0.22 0.03-0.11 0.02-0.23 0.02h-0.12l-0.12 0.01h-0.11l-0.12 0.01h-0.46l-0.21-0.01-0.2-0.01-0.2-0.02-0.19-0.01-0.2-0.03-0.18-0.02-0.37-0.07-0.34-0.08-0.18-0.05-0.32-0.1-0.32-0.12-0.15-0.07-0.15-0.06-0.42-0.24-0.13-0.08-0.14-0.1-0.28-0.22-0.12-0.11-0.12-0.13-0.11-0.12-0.11-0.13-0.1-0.14-0.09-0.14-0.17-0.29-0.07-0.15-0.07-0.16-0.06-0.16-0.05-0.16-0.05-0.18-0.04-0.18-0.03-0.17-0.02-0.19-0.03-0.19-0.01-0.19v-5.21l0.01-0.19 0.03-0.18 0.02-0.18 0.03-0.18 0.08-0.34 0.05-0.16 0.06-0.16 0.06-0.15 0.08-0.15 0.07-0.15 0.18-0.28 0.2-0.26 0.1-0.12 0.24-0.24 0.26-0.22 0.14-0.1 0.39-0.24 0.15-0.07 0.28-0.14 0.31-0.12 0.15-0.05 0.33-0.1 0.33-0.08 0.72-0.12 0.37-0.03 0.38-0.02h0.45l0.25 0.02h0.12 0.13l0.12 0.02 0.12 0.01 0.22 0.02 0.22 0.04 0.11 0.01 0.21 0.04 0.1 0.02 0.09 0.02 0.28 0.08 0.09 0.03 0.09 0.04 0.08 0.03 0.09 0.03 0.08 0.04 0.09 0.03 0.09 0.04 0.1 0.05 0.17 0.09 0.29 0.16 0.09 0.05 0.29 0.19 0.2 0.14 0.09 0.07 0.4 0.32v-5.89l0.01-0.1v-0.2l0.04-0.18 0.01-0.08 0.03-0.08 0.02-0.07 0.03-0.07 0.03-0.06 0.04-0.06 0.04-0.04 0.04-0.05 0.04-0.04 0.05-0.04 0.1-0.06 0.06-0.02 0.13-0.03 0.06-0.01h0.14l0.07 0.01 0.14 0.03zm-5.7 7.19-0.26 0.03-0.26 0.02-0.25 0.05-0.24 0.05-0.23 0.05-0.42 0.16-0.19 0.09-0.18 0.1-0.2 0.15-0.2 0.16-0.17 0.17-0.15 0.17-0.14 0.19-0.11 0.2-0.1 0.2-0.08 0.23-0.05 0.23-0.04 0.23-0.01 0.26v4.52l0.01 0.26 0.03 0.25 0.05 0.23 0.07 0.23 0.09 0.21 0.12 0.2 0.13 0.19 0.16 0.17 0.17 0.16 0.2 0.14 0.22 0.14 0.19 0.09 0.42 0.16 0.22 0.07 0.22 0.06 0.24 0.06 0.25 0.04 0.26 0.04 0.27 0.03 0.56 0.02 0.47-0.01 0.44-0.04 0.43-0.06 0.21-0.04 0.2-0.06 0.38-0.12 0.17-0.07 0.14-0.1 0.16-0.11 0.15-0.11 0.16-0.12 0.17-0.12 0.16-0.13 0.18-0.13 0.17-0.15 0.18-0.15 0.36-0.32v-6.59l-0.21-0.16-0.21-0.14-0.2-0.14-0.2-0.13-0.19-0.12-0.18-0.11-0.17-0.11-0.16-0.09-0.3-0.14-0.13-0.06-0.19-0.07-0.38-0.12-0.2-0.05-0.4-0.08-0.21-0.03-0.21-0.02-0.21-0.01-0.43-0.01h-0.28l-0.27 0.01z'
id='c'
d="m96.68 0.04 0.06 0.02 0.06 0.03 0.05 0.03 0.06 0.04 0.13 0.13 0.03 0.06 0.04 0.06 0.03 0.07 0.02 0.07 0.04 0.16 0.04 0.18 0.01 0.2v0.1 16.84 0.08l-0.01 0.07v0.07l-0.04 0.13-0.01 0.05-0.03 0.06-0.02 0.05-0.06 0.09-0.07 0.08-0.05 0.03-0.04 0.03-0.05 0.03-0.1 0.04-0.06 0.02-0.12 0.02-0.07 0.01h-0.11l-0.13-0.02-0.04-0.01-0.04-0.02-0.04-0.01-0.03-0.02-0.03-0.01-0.03-0.03-0.03-0.02-0.06-0.05-0.02-0.03-0.07-0.12-0.01-0.04-0.02-0.05-0.01-0.04-0.02-0.05v-0.05-0.08-0.04-0.04l-0.01-0.04v-0.04l-0.01-0.04v-0.04-0.04l-0.01-0.05v-0.04-0.05l-0.01-0.09v-0.06l-0.01-0.04v-0.06-0.11l-0.01-0.06v-0.13l-0.13 0.09-0.13 0.08-0.13 0.09-0.24 0.14-0.11 0.08-0.12 0.07-0.21 0.12-0.1 0.06-0.09 0.06-0.1 0.05-0.25 0.14-0.14 0.08-0.14 0.06-0.12 0.05-0.05 0.02-0.09 0.04-0.09 0.03-0.09 0.02-0.19 0.06-0.4 0.08-0.21 0.03-0.22 0.03-0.11 0.02-0.23 0.02h-0.12l-0.12 0.01h-0.11l-0.12 0.01h-0.46l-0.21-0.01-0.2-0.01-0.2-0.02-0.19-0.01-0.2-0.03-0.18-0.02-0.37-0.07-0.34-0.08-0.18-0.05-0.32-0.1-0.32-0.12-0.15-0.07-0.15-0.06-0.42-0.24-0.13-0.08-0.14-0.1-0.28-0.22-0.12-0.11-0.12-0.13-0.11-0.12-0.11-0.13-0.1-0.14-0.09-0.14-0.17-0.29-0.07-0.15-0.07-0.16-0.06-0.16-0.05-0.16-0.05-0.18-0.04-0.18-0.03-0.17-0.02-0.19-0.03-0.19-0.01-0.19v-5.21l0.01-0.19 0.03-0.18 0.02-0.18 0.03-0.18 0.08-0.34 0.05-0.16 0.06-0.16 0.06-0.15 0.08-0.15 0.07-0.15 0.18-0.28 0.2-0.26 0.1-0.12 0.24-0.24 0.26-0.22 0.14-0.1 0.39-0.24 0.15-0.07 0.28-0.14 0.31-0.12 0.15-0.05 0.33-0.1 0.33-0.08 0.72-0.12 0.37-0.03 0.38-0.02h0.45l0.25 0.02h0.12 0.13l0.12 0.02 0.12 0.01 0.22 0.02 0.22 0.04 0.11 0.01 0.21 0.04 0.1 0.02 0.09 0.02 0.28 0.08 0.09 0.03 0.09 0.04 0.08 0.03 0.09 0.03 0.08 0.04 0.09 0.03 0.09 0.04 0.1 0.05 0.17 0.09 0.29 0.16 0.09 0.05 0.29 0.19 0.2 0.14 0.09 0.07 0.4 0.32v-5.89l0.01-0.1v-0.2l0.04-0.18 0.01-0.08 0.03-0.08 0.02-0.07 0.03-0.07 0.03-0.06 0.04-0.06 0.04-0.04 0.04-0.05 0.04-0.04 0.05-0.04 0.1-0.06 0.06-0.02 0.13-0.03 0.06-0.01h0.14l0.07 0.01 0.14 0.03zm-5.7 7.19-0.26 0.03-0.26 0.02-0.25 0.05-0.24 0.05-0.23 0.05-0.42 0.16-0.19 0.09-0.18 0.1-0.2 0.15-0.2 0.16-0.17 0.17-0.15 0.17-0.14 0.19-0.11 0.2-0.1 0.2-0.08 0.23-0.05 0.23-0.04 0.23-0.01 0.26v4.52l0.01 0.26 0.03 0.25 0.05 0.23 0.07 0.23 0.09 0.21 0.12 0.2 0.13 0.19 0.16 0.17 0.17 0.16 0.2 0.14 0.22 0.14 0.19 0.09 0.42 0.16 0.22 0.07 0.22 0.06 0.24 0.06 0.25 0.04 0.26 0.04 0.27 0.03 0.56 0.02 0.47-0.01 0.44-0.04 0.43-0.06 0.21-0.04 0.2-0.06 0.38-0.12 0.17-0.07 0.14-0.1 0.16-0.11 0.15-0.11 0.16-0.12 0.17-0.12 0.16-0.13 0.18-0.13 0.17-0.15 0.18-0.15 0.36-0.32v-6.59l-0.21-0.16-0.21-0.14-0.2-0.14-0.2-0.13-0.19-0.12-0.18-0.11-0.17-0.11-0.16-0.09-0.3-0.14-0.13-0.06-0.19-0.07-0.38-0.12-0.2-0.05-0.4-0.08-0.21-0.03-0.21-0.02-0.21-0.01-0.43-0.01h-0.28l-0.27 0.01z"
id="c"
/>
<path
d='m195.66 12.04c-0.99-0.25 3.06-5.03-4.13-10.75 0 0 0.94 3-3.81 9.69-4.76 6.68 2.11 10.66 2.11 10.66s-3.22-1.72 0.53-7.84c0.67-1.11 1.55-2.11 2.64-4.38 0 0 0.96 1.37 0.46 4.32-0.75 4.47 3.27 3.19 3.33 3.25 1.41 1.65-1.16 4.56-1.32 4.65s7.34-4.5 2.01-11.42c-0.36 0.36-0.83 2.08-1.82 1.82z'
id='e'
d="m195.66 12.04c-0.99-0.25 3.06-5.03-4.13-10.75 0 0 0.94 3-3.81 9.69-4.76 6.68 2.11 10.66 2.11 10.66s-3.22-1.72 0.53-7.84c0.67-1.11 1.55-2.11 2.64-4.38 0 0 0.96 1.37 0.46 4.32-0.75 4.47 3.27 3.19 3.33 3.25 1.41 1.65-1.16 4.56-1.32 4.65s7.34-4.5 2.01-11.42c-0.36 0.36-0.83 2.08-1.82 1.82z"
id="e"
/>
<path
d='m135.26 5.37 0.19 0.01 0.18 0.02 0.18 0.01 0.18 0.02 0.34 0.04 0.16 0.02 0.16 0.04 0.15 0.02 0.14 0.04 0.15 0.03 0.28 0.08 0.26 0.08 0.36 0.15 0.12 0.06 0.11 0.05 0.1 0.06 0.11 0.06 0.12 0.08 0.1 0.09 0.11 0.09 0.2 0.2 0.18 0.22 0.16 0.24 0.07 0.12 0.14 0.26 0.12 0.29 0.05 0.14 0.04 0.15 0.05 0.16 0.04 0.15 0.03 0.17 0.02 0.16 0.04 0.36 0.01 0.18 0.02 0.18v6.1 0.08 0.08l0.02 0.28 0.01 0.07 0.02 0.12 0.02 0.06 0.01 0.06 0.03 0.11 0.02 0.05 0.06 0.14 0.03 0.04 0.02 0.04 0.03 0.04 0.06 0.07 0.08 0.08 0.02 0.01v0.01h0.03l0.01 0.02 0.05 0.02 0.02 0.01 0.05 0.02 0.03 0.02 0.04 0.01 0.11 0.04 0.12 0.05 0.1 0.04 0.04 0.01 0.05 0.02 0.05 0.03 0.09 0.03 0.07 0.03 0.02 0.02 0.03 0.02 0.05 0.04 0.02 0.02 0.02 0.03 0.02 0.02 0.04 0.06 0.03 0.06 0.01 0.04 0.01 0.03 0.02 0.08v0.04l0.01 0.04 0.01 0.05v0.05l0.01 0.05v0.21l-0.02 0.05v0.04l-0.01 0.05-0.01 0.04-0.02 0.04-0.01 0.04-0.02 0.03-0.03 0.04-0.05 0.06-0.02 0.03-0.04 0.02-0.11 0.06-0.08 0.04-0.1 0.02-0.1 0.01h-0.06-0.11-0.02-0.01l-0.03-0.01h-0.02-0.02l-0.1-0.02-0.03-0.02h-0.03l-0.06-0.02-0.11-0.03-0.12-0.03-0.05-0.01-0.04-0.01-0.05-0.02-0.21-0.07-0.07-0.02-0.07-0.03-0.24-0.08-0.1-0.04-0.05-0.01-0.04-0.02-0.05-0.01-0.04-0.01-0.04-0.02-0.03-0.01-0.07-0.02-0.07-0.03-0.03-0.01-0.01-0.01-0.02-0.01h-0.03-0.04l-0.03-0.02-0.03-0.01-0.04-0.01-0.02-0.02-0.06-0.04-0.03-0.03-0.02-0.03-0.03-0.03-0.02-0.03-0.02-0.04-0.03-0.04-0.02-0.04-0.01-0.04-0.03-0.04-0.02-0.05-0.03-0.09-0.06-0.21-0.02-0.06-0.23 0.16-0.22 0.15-0.1 0.07-0.2 0.12-0.1 0.07-0.34 0.22-0.08 0.04-0.07 0.05-0.21 0.12-0.06 0.04-0.16 0.08-0.05 0.02-0.09 0.04-0.04 0.01-0.06 0.04-0.07 0.02-0.15 0.05-0.4 0.1-0.08 0.01-0.18 0.03-0.09 0.01-0.09 0.02-0.28 0.03-0.2 0.02h-0.1l-0.11 0.01h-0.1-0.49-0.16l-0.16-0.01-0.31-0.02-0.3-0.03-0.15-0.02-0.15-0.03-0.28-0.05-0.27-0.06-0.14-0.04-0.13-0.04-0.12-0.04-0.13-0.05-0.24-0.09-0.12-0.06-0.11-0.05-0.11-0.06-0.11-0.07-0.11-0.06-0.1-0.07-0.24-0.16-0.22-0.19-0.1-0.1-0.09-0.1-0.1-0.1-0.24-0.33-0.14-0.24-0.06-0.12-0.06-0.13-0.05-0.12-0.05-0.13-0.08-0.27-0.06-0.28-0.04-0.3-0.02-0.3v-0.32l0.01-0.15 0.01-0.16 0.02-0.14 0.05-0.3 0.07-0.28 0.05-0.14 0.11-0.26 0.12-0.26 0.15-0.24 0.16-0.22 0.09-0.11 0.1-0.11 0.2-0.2 0.11-0.09 0.23-0.18 0.13-0.08 0.33-0.24 0.24-0.13 0.26-0.13 0.13-0.05 0.26-0.11 0.14-0.05 0.42-0.12 0.15-0.03 0.14-0.04 0.15-0.02 0.15-0.03 0.16-0.02 0.15-0.01 0.16-0.02 0.48-0.03h0.3l0.13 0.01h0.14l0.29 0.02 0.14 0.02 0.15 0.02 0.14 0.02 0.16 0.02 0.14 0.02 0.15 0.04 0.16 0.02 0.15 0.03 0.32 0.08 0.49 0.12 0.16 0.05 0.51 0.15 0.36 0.12 0.17 0.06v-2.01-0.12l-0.01-0.11-0.01-0.1-0.01-0.12-0.02-0.09-0.02-0.11-0.04-0.1-0.03-0.1-0.03-0.09-0.05-0.09-0.04-0.09-0.11-0.16-0.06-0.09-0.06-0.07-0.07-0.08-0.15-0.14-0.08-0.07-0.18-0.12-0.1-0.06-0.2-0.1-0.11-0.06-0.07-0.03-0.16-0.06-0.34-0.11-0.26-0.06-0.1-0.02-0.09-0.01-0.1-0.02-0.09-0.01-0.3-0.03-0.1-0.02h-0.1l-0.11-0.01-0.1-0.01h-0.11-0.1-0.47l-0.25 0.01-0.24 0.01-0.23 0.02-0.42 0.06-0.2 0.03-0.19 0.04-0.17 0.05-0.17 0.06-0.16 0.05-0.15 0.07-0.14 0.07-0.13 0.07-0.12 0.09-0.12 0.08-0.1 0.1-0.09 0.1-0.09 0.11-0.08 0.11-0.06 0.11-0.06 0.13-0.05 0.13-0.04 0.14-0.03 0.14-0.01 0.07-0.02 0.06-0.04 0.22-0.02 0.09-0.01 0.05-0.01 0.04-0.01 0.03v0.04l-0.02 0.06-0.01 0.06-0.01 0.04v0.02l-0.01 0.02v0.01 0.01 0.03l-0.02 0.03-0.03 0.07-0.01 0.02-0.05 0.06-0.01 0.02-0.03 0.02-0.05 0.05-0.02 0.01-0.02 0.02-0.03 0.01-0.03 0.02-0.09 0.03-0.04 0.01-0.06 0.02h-0.04-0.04l-0.03 0.01h-0.15l-0.06-0.01-0.13-0.02-0.06-0.01-0.15-0.06-0.1-0.06-0.04-0.04-0.04-0.03-0.08-0.08-0.03-0.05-0.05-0.09-0.03-0.06-0.01-0.06-0.04-0.12-0.01-0.06v-0.07l-0.01-0.08v-0.17l0.01-0.1v-0.1l0.02-0.1 0.01-0.1 0.04-0.2 0.05-0.2 0.03-0.1 0.03-0.09 0.08-0.2 0.05-0.1 0.09-0.19 0.18-0.28 0.06-0.09 0.07-0.09 0.22-0.27 0.08-0.09 0.1-0.11 0.22-0.2 0.12-0.09 0.26-0.18 0.14-0.08 0.15-0.08 0.16-0.08 0.15-0.06 0.17-0.07 0.18-0.06 0.18-0.05 0.38-0.1 0.2-0.04 0.42-0.08 0.44-0.05 0.46-0.04 0.24-0.01h0.25l0.25-0.01h0.2l0.2 0.01h0.2zm-2.41 7.31-0.68 0.24-0.54 0.35-0.38 0.44-0.23 0.54-0.07 0.64 0.02 0.34 0.06 0.31 0.11 0.3 0.15 0.27 0.2 0.25 0.25 0.2 0.29 0.17 0.25 0.13 0.28 0.12 0.3 0.09 0.32 0.08 0.34 0.05 0.36 0.03 0.38 0.01 0.34-0.01 0.32-0.02 0.32-0.04 0.31-0.07 0.3-0.07 0.3-0.11 0.29-0.13 0.2-0.12 0.22-0.15 0.25-0.16 0.26-0.18 0.28-0.21 0.3-0.22 0.31-0.23v-2.41l-0.54-0.16-0.53-0.14-0.53-0.11-0.52-0.09-0.51-0.07-0.49-0.04-0.48-0.01-0.98 0.05-0.83 0.14z'
id='m'
d="m135.26 5.37 0.19 0.01 0.18 0.02 0.18 0.01 0.18 0.02 0.34 0.04 0.16 0.02 0.16 0.04 0.15 0.02 0.14 0.04 0.15 0.03 0.28 0.08 0.26 0.08 0.36 0.15 0.12 0.06 0.11 0.05 0.1 0.06 0.11 0.06 0.12 0.08 0.1 0.09 0.11 0.09 0.2 0.2 0.18 0.22 0.16 0.24 0.07 0.12 0.14 0.26 0.12 0.29 0.05 0.14 0.04 0.15 0.05 0.16 0.04 0.15 0.03 0.17 0.02 0.16 0.04 0.36 0.01 0.18 0.02 0.18v6.1 0.08 0.08l0.02 0.28 0.01 0.07 0.02 0.12 0.02 0.06 0.01 0.06 0.03 0.11 0.02 0.05 0.06 0.14 0.03 0.04 0.02 0.04 0.03 0.04 0.06 0.07 0.08 0.08 0.02 0.01v0.01h0.03l0.01 0.02 0.05 0.02 0.02 0.01 0.05 0.02 0.03 0.02 0.04 0.01 0.11 0.04 0.12 0.05 0.1 0.04 0.04 0.01 0.05 0.02 0.05 0.03 0.09 0.03 0.07 0.03 0.02 0.02 0.03 0.02 0.05 0.04 0.02 0.02 0.02 0.03 0.02 0.02 0.04 0.06 0.03 0.06 0.01 0.04 0.01 0.03 0.02 0.08v0.04l0.01 0.04 0.01 0.05v0.05l0.01 0.05v0.21l-0.02 0.05v0.04l-0.01 0.05-0.01 0.04-0.02 0.04-0.01 0.04-0.02 0.03-0.03 0.04-0.05 0.06-0.02 0.03-0.04 0.02-0.11 0.06-0.08 0.04-0.1 0.02-0.1 0.01h-0.06-0.11-0.02-0.01l-0.03-0.01h-0.02-0.02l-0.1-0.02-0.03-0.02h-0.03l-0.06-0.02-0.11-0.03-0.12-0.03-0.05-0.01-0.04-0.01-0.05-0.02-0.21-0.07-0.07-0.02-0.07-0.03-0.24-0.08-0.1-0.04-0.05-0.01-0.04-0.02-0.05-0.01-0.04-0.01-0.04-0.02-0.03-0.01-0.07-0.02-0.07-0.03-0.03-0.01-0.01-0.01-0.02-0.01h-0.03-0.04l-0.03-0.02-0.03-0.01-0.04-0.01-0.02-0.02-0.06-0.04-0.03-0.03-0.02-0.03-0.03-0.03-0.02-0.03-0.02-0.04-0.03-0.04-0.02-0.04-0.01-0.04-0.03-0.04-0.02-0.05-0.03-0.09-0.06-0.21-0.02-0.06-0.23 0.16-0.22 0.15-0.1 0.07-0.2 0.12-0.1 0.07-0.34 0.22-0.08 0.04-0.07 0.05-0.21 0.12-0.06 0.04-0.16 0.08-0.05 0.02-0.09 0.04-0.04 0.01-0.06 0.04-0.07 0.02-0.15 0.05-0.4 0.1-0.08 0.01-0.18 0.03-0.09 0.01-0.09 0.02-0.28 0.03-0.2 0.02h-0.1l-0.11 0.01h-0.1-0.49-0.16l-0.16-0.01-0.31-0.02-0.3-0.03-0.15-0.02-0.15-0.03-0.28-0.05-0.27-0.06-0.14-0.04-0.13-0.04-0.12-0.04-0.13-0.05-0.24-0.09-0.12-0.06-0.11-0.05-0.11-0.06-0.11-0.07-0.11-0.06-0.1-0.07-0.24-0.16-0.22-0.19-0.1-0.1-0.09-0.1-0.1-0.1-0.24-0.33-0.14-0.24-0.06-0.12-0.06-0.13-0.05-0.12-0.05-0.13-0.08-0.27-0.06-0.28-0.04-0.3-0.02-0.3v-0.32l0.01-0.15 0.01-0.16 0.02-0.14 0.05-0.3 0.07-0.28 0.05-0.14 0.11-0.26 0.12-0.26 0.15-0.24 0.16-0.22 0.09-0.11 0.1-0.11 0.2-0.2 0.11-0.09 0.23-0.18 0.13-0.08 0.33-0.24 0.24-0.13 0.26-0.13 0.13-0.05 0.26-0.11 0.14-0.05 0.42-0.12 0.15-0.03 0.14-0.04 0.15-0.02 0.15-0.03 0.16-0.02 0.15-0.01 0.16-0.02 0.48-0.03h0.3l0.13 0.01h0.14l0.29 0.02 0.14 0.02 0.15 0.02 0.14 0.02 0.16 0.02 0.14 0.02 0.15 0.04 0.16 0.02 0.15 0.03 0.32 0.08 0.49 0.12 0.16 0.05 0.51 0.15 0.36 0.12 0.17 0.06v-2.01-0.12l-0.01-0.11-0.01-0.1-0.01-0.12-0.02-0.09-0.02-0.11-0.04-0.1-0.03-0.1-0.03-0.09-0.05-0.09-0.04-0.09-0.11-0.16-0.06-0.09-0.06-0.07-0.07-0.08-0.15-0.14-0.08-0.07-0.18-0.12-0.1-0.06-0.2-0.1-0.11-0.06-0.07-0.03-0.16-0.06-0.34-0.11-0.26-0.06-0.1-0.02-0.09-0.01-0.1-0.02-0.09-0.01-0.3-0.03-0.1-0.02h-0.1l-0.11-0.01-0.1-0.01h-0.11-0.1-0.47l-0.25 0.01-0.24 0.01-0.23 0.02-0.42 0.06-0.2 0.03-0.19 0.04-0.17 0.05-0.17 0.06-0.16 0.05-0.15 0.07-0.14 0.07-0.13 0.07-0.12 0.09-0.12 0.08-0.1 0.1-0.09 0.1-0.09 0.11-0.08 0.11-0.06 0.11-0.06 0.13-0.05 0.13-0.04 0.14-0.03 0.14-0.01 0.07-0.02 0.06-0.04 0.22-0.02 0.09-0.01 0.05-0.01 0.04-0.01 0.03v0.04l-0.02 0.06-0.01 0.06-0.01 0.04v0.02l-0.01 0.02v0.01 0.01 0.03l-0.02 0.03-0.03 0.07-0.01 0.02-0.05 0.06-0.01 0.02-0.03 0.02-0.05 0.05-0.02 0.01-0.02 0.02-0.03 0.01-0.03 0.02-0.09 0.03-0.04 0.01-0.06 0.02h-0.04-0.04l-0.03 0.01h-0.15l-0.06-0.01-0.13-0.02-0.06-0.01-0.15-0.06-0.1-0.06-0.04-0.04-0.04-0.03-0.08-0.08-0.03-0.05-0.05-0.09-0.03-0.06-0.01-0.06-0.04-0.12-0.01-0.06v-0.07l-0.01-0.08v-0.17l0.01-0.1v-0.1l0.02-0.1 0.01-0.1 0.04-0.2 0.05-0.2 0.03-0.1 0.03-0.09 0.08-0.2 0.05-0.1 0.09-0.19 0.18-0.28 0.06-0.09 0.07-0.09 0.22-0.27 0.08-0.09 0.1-0.11 0.22-0.2 0.12-0.09 0.26-0.18 0.14-0.08 0.15-0.08 0.16-0.08 0.15-0.06 0.17-0.07 0.18-0.06 0.18-0.05 0.38-0.1 0.2-0.04 0.42-0.08 0.44-0.05 0.46-0.04 0.24-0.01h0.25l0.25-0.01h0.2l0.2 0.01h0.2zm-2.41 7.31-0.68 0.24-0.54 0.35-0.38 0.44-0.23 0.54-0.07 0.64 0.02 0.34 0.06 0.31 0.11 0.3 0.15 0.27 0.2 0.25 0.25 0.2 0.29 0.17 0.25 0.13 0.28 0.12 0.3 0.09 0.32 0.08 0.34 0.05 0.36 0.03 0.38 0.01 0.34-0.01 0.32-0.02 0.32-0.04 0.31-0.07 0.3-0.07 0.3-0.11 0.29-0.13 0.2-0.12 0.22-0.15 0.25-0.16 0.26-0.18 0.28-0.21 0.3-0.22 0.31-0.23v-2.41l-0.54-0.16-0.53-0.14-0.53-0.11-0.52-0.09-0.51-0.07-0.49-0.04-0.48-0.01-0.98 0.05-0.83 0.14z"
id="m"
/>
<path
d='m0.97 5.8h1.84v-1.61c0-2.8 1.44-4.19 4.24-4.19 1.14 0 2.12 0.23 2.86 0.63 0.96 0.57 1.5 1.5 1.5 2.58 0 0.73-0.29 1.02-0.8 1.02-0.34 0-0.68-0.23-0.86-0.63-0.22-0.73-0.45-1.13-0.56-1.32-0.34-0.4-1.03-0.63-2.01-0.63-1.72 0-2.57 0.85-2.57 2.58v1.55h3.31c0.74 0 1.08 0.29 1.08 0.79 0 0.57-0.34 0.8-1.08 0.8h-3.31v10.48c0 0.62-0.29 0.96-0.8 0.96-0.57 0-0.8-0.34-0.8-0.96v-10.46h-2.04c-0.63 0-0.97-0.28-0.97-0.79 0-0.58 0.34-0.8 0.97-0.8z'
id='a'
d="m0.97 5.8h1.84v-1.61c0-2.8 1.44-4.19 4.24-4.19 1.14 0 2.12 0.23 2.86 0.63 0.96 0.57 1.5 1.5 1.5 2.58 0 0.73-0.29 1.02-0.8 1.02-0.34 0-0.68-0.23-0.86-0.63-0.22-0.73-0.45-1.13-0.56-1.32-0.34-0.4-1.03-0.63-2.01-0.63-1.72 0-2.57 0.85-2.57 2.58v1.55h3.31c0.74 0 1.08 0.29 1.08 0.79 0 0.57-0.34 0.8-1.08 0.8h-3.31v10.48c0 0.62-0.29 0.96-0.8 0.96-0.57 0-0.8-0.34-0.8-0.96v-10.46h-2.04c-0.63 0-0.97-0.28-0.97-0.79 0-0.58 0.34-0.8 0.97-0.8z"
id="a"
/>
<path
d='m78.8 5.55 0.61 0.08 0.56 0.12 0.52 0.15 0.48 0.18 0.43 0.22 0.38 0.25 0.34 0.29 0.29 0.32 0.25 0.35 0.21 0.39 0.16 0.42 0.11 0.45 0.07 0.49 0.02 0.51v4.71l-0.02 0.52-0.07 0.48-0.11 0.46-0.15 0.42-0.2 0.38-0.24 0.35-0.29 0.32-0.33 0.29-0.38 0.25-0.42 0.22-0.47 0.19-0.51 0.15-0.55 0.11-0.6 0.09-0.64 0.05-0.68 0.02-0.72-0.01-0.68-0.04-0.63-0.08-0.58-0.11-0.53-0.15-0.48-0.18-0.43-0.22-0.39-0.25-0.34-0.29-0.3-0.32-0.25-0.36-0.21-0.38-0.15-0.43-0.11-0.46-0.07-0.49-0.02-0.53v-4.71l0.02-0.51 0.07-0.49 0.11-0.45 0.16-0.42 0.2-0.39 0.26-0.35 0.29-0.32 0.34-0.29 0.39-0.25 0.43-0.22 0.47-0.18 0.52-0.15 0.56-0.12 0.61-0.08 0.65-0.06 0.7-0.01 0.69 0.01 0.65 0.06zm-2.67 1.61-0.53 0.1-0.47 0.13-0.42 0.17-0.37 0.21-0.31 0.24-0.25 0.28-0.2 0.32-0.14 0.35-0.09 0.39-0.02 0.42v4.71l0.02 0.42 0.09 0.39 0.14 0.36 0.21 0.31 0.26 0.28 0.31 0.24 0.37 0.2 0.43 0.17 0.49 0.12 0.55 0.09 0.6 0.04h0.66 0.64l0.59-0.04 0.54-0.08 0.48-0.12 0.42-0.16 0.37-0.2 0.31-0.23 0.26-0.28 0.2-0.32 0.14-0.36 0.09-0.4 0.03-0.43v-4.71l-0.03-0.42-0.09-0.39-0.14-0.35-0.2-0.32-0.27-0.28-0.31-0.24-0.38-0.21-0.44-0.17-0.49-0.13-0.55-0.1-0.62-0.05-0.67-0.02-0.63 0.02-0.58 0.05z'
id='i'
d="m78.8 5.55 0.61 0.08 0.56 0.12 0.52 0.15 0.48 0.18 0.43 0.22 0.38 0.25 0.34 0.29 0.29 0.32 0.25 0.35 0.21 0.39 0.16 0.42 0.11 0.45 0.07 0.49 0.02 0.51v4.71l-0.02 0.52-0.07 0.48-0.11 0.46-0.15 0.42-0.2 0.38-0.24 0.35-0.29 0.32-0.33 0.29-0.38 0.25-0.42 0.22-0.47 0.19-0.51 0.15-0.55 0.11-0.6 0.09-0.64 0.05-0.68 0.02-0.72-0.01-0.68-0.04-0.63-0.08-0.58-0.11-0.53-0.15-0.48-0.18-0.43-0.22-0.39-0.25-0.34-0.29-0.3-0.32-0.25-0.36-0.21-0.38-0.15-0.43-0.11-0.46-0.07-0.49-0.02-0.53v-4.71l0.02-0.51 0.07-0.49 0.11-0.45 0.16-0.42 0.2-0.39 0.26-0.35 0.29-0.32 0.34-0.29 0.39-0.25 0.43-0.22 0.47-0.18 0.52-0.15 0.56-0.12 0.61-0.08 0.65-0.06 0.7-0.01 0.69 0.01 0.65 0.06zm-2.67 1.61-0.53 0.1-0.47 0.13-0.42 0.17-0.37 0.21-0.31 0.24-0.25 0.28-0.2 0.32-0.14 0.35-0.09 0.39-0.02 0.42v4.71l0.02 0.42 0.09 0.39 0.14 0.36 0.21 0.31 0.26 0.28 0.31 0.24 0.37 0.2 0.43 0.17 0.49 0.12 0.55 0.09 0.6 0.04h0.66 0.64l0.59-0.04 0.54-0.08 0.48-0.12 0.42-0.16 0.37-0.2 0.31-0.23 0.26-0.28 0.2-0.32 0.14-0.36 0.09-0.4 0.03-0.43v-4.71l-0.03-0.42-0.09-0.39-0.14-0.35-0.2-0.32-0.27-0.28-0.31-0.24-0.38-0.21-0.44-0.17-0.49-0.13-0.55-0.1-0.62-0.05-0.67-0.02-0.63 0.02-0.58 0.05z"
id="i"
/>
<path
d='m181.88 0.18c0.12 0.11 0.23 0.28 0.23 0.45 0 0.29-0.34 0.68-0.97 1.32-2.62 2.53-3.94 5.62-3.93 9.36 0.01 4.12 1.4 7.44 4.1 10.01 0.56 0.5 0.8 0.9 0.8 1.24 0 0.17-0.12 0.35-0.23 0.51-0.11 0.12-0.34 0.24-0.51 0.24-0.63 0-1.5-0.74-2.64-2.18-2.22-2.72-3.22-5.72-3.28-9.82-0.05-4.1 1.23-6.88 3.75-9.75 0.9-1.02 1.66-1.56 2.17-1.56 0.17 0 0.34 0.06 0.51 0.18z'
id='f'
d="m181.88 0.18c0.12 0.11 0.23 0.28 0.23 0.45 0 0.29-0.34 0.68-0.97 1.32-2.62 2.53-3.94 5.62-3.93 9.36 0.01 4.12 1.4 7.44 4.1 10.01 0.56 0.5 0.8 0.9 0.8 1.24 0 0.17-0.12 0.35-0.23 0.51-0.11 0.12-0.34 0.24-0.51 0.24-0.63 0-1.5-0.74-2.64-2.18-2.22-2.72-3.22-5.72-3.28-9.82-0.05-4.1 1.23-6.88 3.75-9.75 0.9-1.02 1.66-1.56 2.17-1.56 0.17 0 0.34 0.06 0.51 0.18z"
id="f"
/>
<path
d='m149.59 6.94c0.45-0.57 0.85-0.92 1.25-1.08 0.39-0.23 0.96-0.34 1.6-0.34 1.96 0 2.98 0.96 2.98 2.85v9.29c0 0.79-0.28 1.14-0.85 1.14s-0.8-0.35-0.8-1.14v-8.7c0-1.19-0.51-1.83-1.49-1.83-0.74 0-1.5 0.45-2.12 1.32v9.29c0 0.79-0.29 1.13-0.8 1.13s-0.8-0.34-0.8-1.13v-8.59c0-1.33-0.56-1.95-1.61-1.95-0.68 0-1.32 0.46-2 1.33v9.22c0 0.8-0.29 1.14-0.86 1.14s-0.79-0.34-0.79-1.14v-11.38c0-0.57 0.22-0.8 0.68-0.8 0.23 0 0.45 0.17 0.57 0.51 0.11 0.15 0.17 0.44 0.17 0.78 0.53-0.57 0.87-0.91 1.02-1.03 0.34-0.22 0.8-0.34 1.44-0.34 0.91 0 1.72 0.46 2.41 1.45z'
id='g'
d="m149.59 6.94c0.45-0.57 0.85-0.92 1.25-1.08 0.39-0.23 0.96-0.34 1.6-0.34 1.96 0 2.98 0.96 2.98 2.85v9.29c0 0.79-0.28 1.14-0.85 1.14s-0.8-0.35-0.8-1.14v-8.7c0-1.19-0.51-1.83-1.49-1.83-0.74 0-1.5 0.45-2.12 1.32v9.29c0 0.79-0.29 1.13-0.8 1.13s-0.8-0.34-0.8-1.13v-8.59c0-1.33-0.56-1.95-1.61-1.95-0.68 0-1.32 0.46-2 1.33v9.22c0 0.8-0.29 1.14-0.86 1.14s-0.79-0.34-0.79-1.14v-11.38c0-0.57 0.22-0.8 0.68-0.8 0.23 0 0.45 0.17 0.57 0.51 0.11 0.15 0.17 0.44 0.17 0.78 0.53-0.57 0.87-0.91 1.02-1.03 0.34-0.22 0.8-0.34 1.44-0.34 0.91 0 1.72 0.46 2.41 1.45z"
id="g"
/>
<path
d='m49.79 5.56 0.44 0.05 0.41 0.08 0.4 0.09 0.37 0.12 0.35 0.14 0.33 0.16 0.31 0.18 0.28 0.21 0.27 0.22 0.24 0.24 0.22 0.27 0.2 0.28 0.18 0.31 0.16 0.33 0.13 0.35 0.11 0.37 0.1 0.39 0.07 0.41 0.06 0.44 0.03 0.45 0.01 0.47v0.12l-0.01 0.11-0.01 0.1-0.03 0.2-0.02 0.09-0.03 0.09-0.02 0.08-0.08 0.15-0.03 0.06-0.1 0.12-0.05 0.05-0.06 0.05-0.05 0.03-0.07 0.04-0.07 0.03-0.14 0.04-0.08 0.01-0.09 0.01h-8.89v-0.07h-0.02v1.84l0.01 0.24 0.02 0.24 0.04 0.23 0.06 0.22 0.06 0.2 0.09 0.2 0.1 0.17 0.12 0.18 0.14 0.15 0.15 0.16 0.16 0.13 0.18 0.13 0.2 0.11 0.22 0.11 0.22 0.09 0.25 0.09 0.26 0.06 0.28 0.07 0.29 0.05 0.31 0.03 0.33 0.03 0.34 0.02 0.36 0.01h0.13l0.13-0.01h0.12l0.13-0.01h0.12l0.24-0.02 0.23-0.02 0.11-0.01 0.12-0.02 0.31-0.04 0.1-0.02 0.09-0.02 0.1-0.02 0.09-0.02 0.1-0.03 0.09-0.02 0.16-0.06 0.09-0.03 0.04-0.01 0.05-0.02 0.06-0.02 0.05-0.02 0.05-0.03 0.06-0.02 0.06-0.03 0.07-0.03 0.14-0.07 0.14-0.08 0.08-0.05 0.08-0.04 0.08-0.05 0.18-0.1 0.08-0.06 0.19-0.13 0.1-0.06 0.11-0.07 0.1-0.07 0.13-0.12 0.13-0.1 0.05-0.05 0.06-0.04 0.05-0.04 0.06-0.05 0.09-0.07 0.09-0.06 0.05-0.03 0.04-0.02 0.04-0.03 0.07-0.03 0.09-0.03 0.05-0.01h0.09l0.1 0.01 0.15 0.03 0.04 0.02 0.07 0.04 0.04 0.03 0.09 0.09 0.03 0.04 0.04 0.08 0.02 0.1 0.02 0.06v0.05l0.01 0.05v0.07l0.01 0.07-0.01 0.06v0.07l-0.01 0.06-0.01 0.07-0.07 0.2-0.03 0.06-0.06 0.14-0.09 0.14-0.05 0.06-0.11 0.14-0.12 0.13-0.14 0.14-0.16 0.14-0.08 0.06-0.08 0.08-0.15 0.1-0.15 0.11-0.32 0.2-0.17 0.09-0.18 0.09-0.18 0.08-0.19 0.07-0.2 0.08-0.2 0.07-0.21 0.06-0.22 0.06-0.44 0.1-0.47 0.09-0.5 0.06-0.52 0.04-0.55 0.02h-0.28-0.49l-0.47-0.03-0.44-0.04-0.43-0.07-0.4-0.07-0.38-0.09-0.36-0.11-0.34-0.13-0.32-0.15-0.29-0.16-0.27-0.18-0.26-0.2-0.23-0.21-0.21-0.23-0.19-0.25-0.16-0.26-0.14-0.29-0.12-0.29-0.1-0.32-0.08-0.34-0.06-0.35-0.03-0.37-0.01-0.39v-4.71l0.01-0.14 0.01-0.12 0.06-0.39 0.03-0.13 0.03-0.12 0.05-0.12 0.08-0.24 0.06-0.12 0.11-0.23 0.07-0.11 0.07-0.12 0.07-0.1 0.08-0.11 0.09-0.1 0.09-0.11 0.18-0.2 0.1-0.1 0.14-0.13 0.29-0.24 0.32-0.22 0.17-0.1 0.36-0.18 0.38-0.16 0.2-0.07 0.42-0.12 0.44-0.1 0.23-0.04 0.23-0.03 0.24-0.04 0.24-0.02 0.26-0.02 0.52-0.02h0.26l0.48 0.01 0.46 0.03zm-2.04 1.6-0.4 0.07-0.4 0.1-0.38 0.13-0.36 0.15-0.35 0.18-0.34 0.25-0.28 0.26-0.23 0.28-0.17 0.3-0.13 0.31-0.08 0.32-0.02 0.35v0.96h8.18l-0.08-0.98-0.26-0.83-0.42-0.69-0.6-0.53-0.77-0.38-0.94-0.23-1.11-0.07-0.44 0.01-0.42 0.04z'
id='h'
d="m49.79 5.56 0.44 0.05 0.41 0.08 0.4 0.09 0.37 0.12 0.35 0.14 0.33 0.16 0.31 0.18 0.28 0.21 0.27 0.22 0.24 0.24 0.22 0.27 0.2 0.28 0.18 0.31 0.16 0.33 0.13 0.35 0.11 0.37 0.1 0.39 0.07 0.41 0.06 0.44 0.03 0.45 0.01 0.47v0.12l-0.01 0.11-0.01 0.1-0.03 0.2-0.02 0.09-0.03 0.09-0.02 0.08-0.08 0.15-0.03 0.06-0.1 0.12-0.05 0.05-0.06 0.05-0.05 0.03-0.07 0.04-0.07 0.03-0.14 0.04-0.08 0.01-0.09 0.01h-8.89v-0.07h-0.02v1.84l0.01 0.24 0.02 0.24 0.04 0.23 0.06 0.22 0.06 0.2 0.09 0.2 0.1 0.17 0.12 0.18 0.14 0.15 0.15 0.16 0.16 0.13 0.18 0.13 0.2 0.11 0.22 0.11 0.22 0.09 0.25 0.09 0.26 0.06 0.28 0.07 0.29 0.05 0.31 0.03 0.33 0.03 0.34 0.02 0.36 0.01h0.13l0.13-0.01h0.12l0.13-0.01h0.12l0.24-0.02 0.23-0.02 0.11-0.01 0.12-0.02 0.31-0.04 0.1-0.02 0.09-0.02 0.1-0.02 0.09-0.02 0.1-0.03 0.09-0.02 0.16-0.06 0.09-0.03 0.04-0.01 0.05-0.02 0.06-0.02 0.05-0.02 0.05-0.03 0.06-0.02 0.06-0.03 0.07-0.03 0.14-0.07 0.14-0.08 0.08-0.05 0.08-0.04 0.08-0.05 0.18-0.1 0.08-0.06 0.19-0.13 0.1-0.06 0.11-0.07 0.1-0.07 0.13-0.12 0.13-0.1 0.05-0.05 0.06-0.04 0.05-0.04 0.06-0.05 0.09-0.07 0.09-0.06 0.05-0.03 0.04-0.02 0.04-0.03 0.07-0.03 0.09-0.03 0.05-0.01h0.09l0.1 0.01 0.15 0.03 0.04 0.02 0.07 0.04 0.04 0.03 0.09 0.09 0.03 0.04 0.04 0.08 0.02 0.1 0.02 0.06v0.05l0.01 0.05v0.07l0.01 0.07-0.01 0.06v0.07l-0.01 0.06-0.01 0.07-0.07 0.2-0.03 0.06-0.06 0.14-0.09 0.14-0.05 0.06-0.11 0.14-0.12 0.13-0.14 0.14-0.16 0.14-0.08 0.06-0.08 0.08-0.15 0.1-0.15 0.11-0.32 0.2-0.17 0.09-0.18 0.09-0.18 0.08-0.19 0.07-0.2 0.08-0.2 0.07-0.21 0.06-0.22 0.06-0.44 0.1-0.47 0.09-0.5 0.06-0.52 0.04-0.55 0.02h-0.28-0.49l-0.47-0.03-0.44-0.04-0.43-0.07-0.4-0.07-0.38-0.09-0.36-0.11-0.34-0.13-0.32-0.15-0.29-0.16-0.27-0.18-0.26-0.2-0.23-0.21-0.21-0.23-0.19-0.25-0.16-0.26-0.14-0.29-0.12-0.29-0.1-0.32-0.08-0.34-0.06-0.35-0.03-0.37-0.01-0.39v-4.71l0.01-0.14 0.01-0.12 0.06-0.39 0.03-0.13 0.03-0.12 0.05-0.12 0.08-0.24 0.06-0.12 0.11-0.23 0.07-0.11 0.07-0.12 0.07-0.1 0.08-0.11 0.09-0.1 0.09-0.11 0.18-0.2 0.1-0.1 0.14-0.13 0.29-0.24 0.32-0.22 0.17-0.1 0.36-0.18 0.38-0.16 0.2-0.07 0.42-0.12 0.44-0.1 0.23-0.04 0.23-0.03 0.24-0.04 0.24-0.02 0.26-0.02 0.52-0.02h0.26l0.48 0.01 0.46 0.03zm-2.04 1.6-0.4 0.07-0.4 0.1-0.38 0.13-0.36 0.15-0.35 0.18-0.34 0.25-0.28 0.26-0.23 0.28-0.17 0.3-0.13 0.31-0.08 0.32-0.02 0.35v0.96h8.18l-0.08-0.98-0.26-0.83-0.42-0.69-0.6-0.53-0.77-0.38-0.94-0.23-1.11-0.07-0.44 0.01-0.42 0.04z"
id="h"
/>
<path
d='m67.34 1.76c1.14 0.86 1.73 2.07 1.73 3.55 0 0.68-0.29 1.02-0.86 1.02-0.4 0-0.68-0.34-0.85-1.02-0.12-0.57-0.34-1.08-0.62-1.62-0.52-0.9-1.61-1.32-3.32-1.32-1.5 0-2.52 0.34-3.14 1.08-0.57 0.68-0.92 1.72-0.92 3.26v5.95c0 1.55 0.35 2.63 0.97 3.31 0.68 0.74 1.73 1.13 3.21 1.13 2.23 0 3.54-0.79 3.82-2.34 0.11-0.57 0.17-0.86 0.17-0.91 0.11-0.34 0.34-0.51 0.68-0.51 0.57 0 0.86 0.34 0.86 1.02 0 1.44-0.58 2.52-1.79 3.38-0.96 0.62-2.18 0.96-3.77 0.96-1.83 0-3.25-0.4-4.3-1.25-1.21-0.8-1.72-2.16-1.72-3.94v-7.16c0-3.77 1.93-5.61 5.95-5.61 1.61 0 2.86 0.34 3.9 1.02z'
id='o'
d="m67.34 1.76c1.14 0.86 1.73 2.07 1.73 3.55 0 0.68-0.29 1.02-0.86 1.02-0.4 0-0.68-0.34-0.85-1.02-0.12-0.57-0.34-1.08-0.62-1.62-0.52-0.9-1.61-1.32-3.32-1.32-1.5 0-2.52 0.34-3.14 1.08-0.57 0.68-0.92 1.72-0.92 3.26v5.95c0 1.55 0.35 2.63 0.97 3.31 0.68 0.74 1.73 1.13 3.21 1.13 2.23 0 3.54-0.79 3.82-2.34 0.11-0.57 0.17-0.86 0.17-0.91 0.11-0.34 0.34-0.51 0.68-0.51 0.57 0 0.86 0.34 0.86 1.02 0 1.44-0.58 2.52-1.79 3.38-0.96 0.62-2.18 0.96-3.77 0.96-1.83 0-3.25-0.4-4.3-1.25-1.21-0.8-1.72-2.16-1.72-3.94v-7.16c0-3.77 1.93-5.61 5.95-5.61 1.61 0 2.86 0.34 3.9 1.02z"
id="o"
/>
<path
d='m158.79 5.43 0.12 0.04 0.03 0.02 0.03 0.01 0.03 0.03 0.06 0.04 0.03 0.03 0.03 0.02 0.1 0.14 0.06 0.08 0.02 0.05 0.02 0.04 0.01 0.04 0.02 0.09 0.01 0.04 0.02 0.04 0.01 0.05 0.01 0.04 0.02 0.04 0.01 0.05 0.05 0.12 0.02 0.05 0.03 0.08 0.01 0.05 0.03 0.12 0.02 0.04 0.02 0.08 0.25-0.12 0.49-0.23 0.24-0.11 0.23-0.1 0.46-0.18 0.22-0.08 0.21-0.08 0.21-0.07 0.2-0.06 0.2-0.07 0.2-0.05 0.38-0.09 0.19-0.04 0.34-0.06 0.17-0.02 0.32-0.02h0.16l0.46 0.01 0.44 0.03 0.43 0.04 0.39 0.06 0.38 0.09 0.36 0.1 0.33 0.12 0.31 0.14 0.29 0.15 0.27 0.17 0.25 0.2 0.22 0.2 0.21 0.23 0.18 0.24 0.16 0.26 0.14 0.28 0.12 0.3 0.09 0.31 0.08 0.33 0.06 0.35 0.03 0.36 0.01 0.38v4.76l-0.01 0.19-0.01 0.18-0.01 0.17-0.03 0.18-0.02 0.17-0.08 0.32-0.05 0.16-0.05 0.15-0.12 0.3-0.08 0.14-0.07 0.14-0.09 0.14-0.09 0.13-0.09 0.12-0.1 0.13-0.11 0.12-0.12 0.12-0.11 0.12-0.26 0.22-0.24 0.18-0.26 0.16-0.14 0.07-0.13 0.07-0.15 0.07-0.15 0.06-0.15 0.05-0.32 0.11-0.33 0.08-0.17 0.04-0.36 0.06-0.36 0.04-0.19 0.02-0.2 0.01h-0.19-0.44l-0.24-0.01-0.24-0.02-0.23-0.01-0.46-0.06-0.22-0.04-0.44-0.09-0.21-0.06-0.21-0.05-0.21-0.07-0.21-0.08-0.4-0.16-0.2-0.1-0.19-0.1-0.2-0.1-0.19-0.11-0.19-0.12-0.36-0.26v5.49l-0.02 0.2-0.01 0.09-0.02 0.09-0.06 0.24-0.03 0.07-0.04 0.07-0.03 0.05-0.04 0.06-0.08 0.1-0.1 0.08-0.06 0.02-0.05 0.03-0.06 0.02-0.06 0.01-0.07 0.01h-0.14-0.06l-0.07-0.02-0.05-0.02-0.06-0.02-0.11-0.06-0.04-0.04-0.05-0.04-0.08-0.1-0.04-0.06-0.03-0.06-0.02-0.07-0.03-0.08-0.04-0.16-0.02-0.1-0.01-0.09-0.01-0.11v-0.1-16.31-0.1l0.01-0.09 0.01-0.1 0.01-0.09 0.01-0.08 0.02-0.08 0.03-0.07 0.02-0.08 0.05-0.12 0.04-0.06 0.03-0.05 0.04-0.05 0.04-0.03 0.05-0.04 0.04-0.03 0.05-0.03 0.11-0.03 0.06-0.01h0.09l0.03 0.01h0.03zm4.49 1.74-0.46 0.04-0.22 0.03-0.21 0.03-0.21 0.05-0.38 0.1-0.36 0.14-0.15 0.07-0.16 0.08-0.15 0.1-0.17 0.11-0.16 0.12-0.17 0.14-0.17 0.15-0.18 0.16-0.18 0.18-0.2 0.19-0.2 0.2v6.54h0.06v-0.03l0.47 0.28 0.45 0.25 0.45 0.24 0.42 0.19 0.41 0.18 0.4 0.14 0.38 0.12 0.36 0.09 0.35 0.07 0.34 0.04 0.32 0.02 0.28-0.01 0.27-0.01 0.26-0.03 0.24-0.03 0.25-0.04 0.23-0.05 0.22-0.06 0.21-0.07 0.2-0.08 0.19-0.09 0.17-0.1 0.21-0.13 0.18-0.15 0.17-0.15 0.14-0.16 0.12-0.17 0.1-0.19 0.08-0.19 0.06-0.2 0.05-0.22 0.02-0.22 0.01-0.23v-4.75l-0.01-0.28-0.03-0.26-0.05-0.23-0.07-0.23-0.09-0.21-0.11-0.2-0.14-0.18-0.15-0.17-0.18-0.15-0.2-0.15-0.22-0.12-0.18-0.09-0.19-0.09-0.2-0.06-0.21-0.07-0.22-0.05-0.24-0.05-0.24-0.04-0.26-0.03-0.27-0.02-0.28-0.01-0.29-0.01-0.25 0.01h-0.26z'
id='d'
d="m158.79 5.43 0.12 0.04 0.03 0.02 0.03 0.01 0.03 0.03 0.06 0.04 0.03 0.03 0.03 0.02 0.1 0.14 0.06 0.08 0.02 0.05 0.02 0.04 0.01 0.04 0.02 0.09 0.01 0.04 0.02 0.04 0.01 0.05 0.01 0.04 0.02 0.04 0.01 0.05 0.05 0.12 0.02 0.05 0.03 0.08 0.01 0.05 0.03 0.12 0.02 0.04 0.02 0.08 0.25-0.12 0.49-0.23 0.24-0.11 0.23-0.1 0.46-0.18 0.22-0.08 0.21-0.08 0.21-0.07 0.2-0.06 0.2-0.07 0.2-0.05 0.38-0.09 0.19-0.04 0.34-0.06 0.17-0.02 0.32-0.02h0.16l0.46 0.01 0.44 0.03 0.43 0.04 0.39 0.06 0.38 0.09 0.36 0.1 0.33 0.12 0.31 0.14 0.29 0.15 0.27 0.17 0.25 0.2 0.22 0.2 0.21 0.23 0.18 0.24 0.16 0.26 0.14 0.28 0.12 0.3 0.09 0.31 0.08 0.33 0.06 0.35 0.03 0.36 0.01 0.38v4.76l-0.01 0.19-0.01 0.18-0.01 0.17-0.03 0.18-0.02 0.17-0.08 0.32-0.05 0.16-0.05 0.15-0.12 0.3-0.08 0.14-0.07 0.14-0.09 0.14-0.09 0.13-0.09 0.12-0.1 0.13-0.11 0.12-0.12 0.12-0.11 0.12-0.26 0.22-0.24 0.18-0.26 0.16-0.14 0.07-0.13 0.07-0.15 0.07-0.15 0.06-0.15 0.05-0.32 0.11-0.33 0.08-0.17 0.04-0.36 0.06-0.36 0.04-0.19 0.02-0.2 0.01h-0.19-0.44l-0.24-0.01-0.24-0.02-0.23-0.01-0.46-0.06-0.22-0.04-0.44-0.09-0.21-0.06-0.21-0.05-0.21-0.07-0.21-0.08-0.4-0.16-0.2-0.1-0.19-0.1-0.2-0.1-0.19-0.11-0.19-0.12-0.36-0.26v5.49l-0.02 0.2-0.01 0.09-0.02 0.09-0.06 0.24-0.03 0.07-0.04 0.07-0.03 0.05-0.04 0.06-0.08 0.1-0.1 0.08-0.06 0.02-0.05 0.03-0.06 0.02-0.06 0.01-0.07 0.01h-0.14-0.06l-0.07-0.02-0.05-0.02-0.06-0.02-0.11-0.06-0.04-0.04-0.05-0.04-0.08-0.1-0.04-0.06-0.03-0.06-0.02-0.07-0.03-0.08-0.04-0.16-0.02-0.1-0.01-0.09-0.01-0.11v-0.1-16.31-0.1l0.01-0.09 0.01-0.1 0.01-0.09 0.01-0.08 0.02-0.08 0.03-0.07 0.02-0.08 0.05-0.12 0.04-0.06 0.03-0.05 0.04-0.05 0.04-0.03 0.05-0.04 0.04-0.03 0.05-0.03 0.11-0.03 0.06-0.01h0.09l0.03 0.01h0.03zm4.49 1.74-0.46 0.04-0.22 0.03-0.21 0.03-0.21 0.05-0.38 0.1-0.36 0.14-0.15 0.07-0.16 0.08-0.15 0.1-0.17 0.11-0.16 0.12-0.17 0.14-0.17 0.15-0.18 0.16-0.18 0.18-0.2 0.19-0.2 0.2v6.54h0.06v-0.03l0.47 0.28 0.45 0.25 0.45 0.24 0.42 0.19 0.41 0.18 0.4 0.14 0.38 0.12 0.36 0.09 0.35 0.07 0.34 0.04 0.32 0.02 0.28-0.01 0.27-0.01 0.26-0.03 0.24-0.03 0.25-0.04 0.23-0.05 0.22-0.06 0.21-0.07 0.2-0.08 0.19-0.09 0.17-0.1 0.21-0.13 0.18-0.15 0.17-0.15 0.14-0.16 0.12-0.17 0.1-0.19 0.08-0.19 0.06-0.2 0.05-0.22 0.02-0.22 0.01-0.23v-4.75l-0.01-0.28-0.03-0.26-0.05-0.23-0.07-0.23-0.09-0.21-0.11-0.2-0.14-0.18-0.15-0.17-0.18-0.15-0.2-0.15-0.22-0.12-0.18-0.09-0.19-0.09-0.2-0.06-0.21-0.07-0.22-0.05-0.24-0.05-0.24-0.04-0.26-0.03-0.27-0.02-0.28-0.01-0.29-0.01-0.25 0.01h-0.26z"
id="d"
/>
</defs>
<use fill='#ffffff' xlinkHref='#k' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#k' />
<use fill='#ffffff' xlinkHref='#j' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#j' />
<use fill='#ffffff' xlinkHref='#b' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#b' />
<use fill='#ffffff' xlinkHref='#n' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#n' />
<use fill='#ffffff' xlinkHref='#l' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#l' />
<use fill='#ffffff' xlinkHref='#c' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#c' />
<use fill='#ffffff' xlinkHref='#e' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#e' />
<use fill='#ffffff' xlinkHref='#m' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#m' />
<use fill='#ffffff' xlinkHref='#a' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#a' />
<use fill='#ffffff' xlinkHref='#i' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#i' />
<use fill='#ffffff' xlinkHref='#f' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#f' />
<use fill='#ffffff' xlinkHref='#g' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#g' />
<use fill='#ffffff' xlinkHref='#h' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#h' />
<use fill='#ffffff' xlinkHref='#o' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#o' />
<use fill='#ffffff' xlinkHref='#d' />
<use fillOpacity={0} stroke='#000000' strokeOpacity={0} xlinkHref='#d' />
<use fill="#ffffff" xlinkHref="#k" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#k" />
<use fill="#ffffff" xlinkHref="#j" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#j" />
<use fill="#ffffff" xlinkHref="#b" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#b" />
<use fill="#ffffff" xlinkHref="#n" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#n" />
<use fill="#ffffff" xlinkHref="#l" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#l" />
<use fill="#ffffff" xlinkHref="#c" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#c" />
<use fill="#ffffff" xlinkHref="#e" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#e" />
<use fill="#ffffff" xlinkHref="#m" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#m" />
<use fill="#ffffff" xlinkHref="#a" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#a" />
<use fill="#ffffff" xlinkHref="#i" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#i" />
<use fill="#ffffff" xlinkHref="#f" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#f" />
<use fill="#ffffff" xlinkHref="#g" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#g" />
<use fill="#ffffff" xlinkHref="#h" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#h" />
<use fill="#ffffff" xlinkHref="#o" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#o" />
<use fill="#ffffff" xlinkHref="#d" />
<use fillOpacity={0} stroke="#000000" strokeOpacity={0} xlinkHref="#d" />
</svg>
);
}

View File

@ -14,7 +14,7 @@ const List = styled.div`
const filenameTitle = { fontWeight: '600' };
const FilenameResults = ({ searchValue, results, rateLimitMessage }) => {
const elements = results.map(result => {
const elements = results.map((result) => {
const { filename, prs: prObjects } = result;
const prs = prObjects.map(({ number, username, title }, index) => {
return <ListItem number={number} username={username} prTitle={title} />;
@ -33,17 +33,16 @@ const FilenameResults = ({ searchValue, results, rateLimitMessage }) => {
});
const showResults = () => {
if (!rateLimitMessage) {
return (results.length ? <h3>Results for: {searchValue}</h3> : null) && elements;
return (
(results.length ? <h3>Results for: {searchValue}</h3> : null) &&
elements
);
} else {
return rateLimitMessage;
}
};
return (
<FullWidthDiv>
{showResults()}
</FullWidthDiv>
);
return <FullWidthDiv>{showResults()}</FullWidthDiv>;
};
export default FilenameResults;

View File

@ -7,7 +7,13 @@ const Container = styled.label`
}
`;
const FilterOption = ({ group, children, value, selectedOption, onOptionChange }) => {
const FilterOption = ({
group,
children,
value,
selectedOption,
onOptionChange
}) => {
return (
<Container>
<input
@ -20,5 +26,5 @@ const FilterOption = ({ group, children, value, selectedOption, onOptionChange }
{children}
</Container>
);
}
};
export default FilterOption;

View File

@ -11,8 +11,8 @@ const Info = styled.div`
padding: 2px;
`;
const Footer = props => {
const localTime = lastUpdate => {
const Footer = (props) => {
const localTime = (lastUpdate) => {
const newTime = new Date(lastUpdate);
return newTime.toLocaleString();
};

View File

@ -32,7 +32,7 @@ class Pareto extends React.Component {
componentDidMount() {
fetch(ENDPOINT_PARETO)
.then(response => response.json())
.then((response) => response.json())
.then(({ ok, rateLimitMessage, pareto }) => {
if (ok) {
if (!pareto.length) {
@ -43,13 +43,13 @@ class Pareto extends React.Component {
});
}
this.setState(prevState => ({
this.setState((prevState) => ({
data: pareto,
all: [...pareto],
options: this.createOptions(pareto)
}));
} else if (rateLimitMessage) {
this.setState(prevState => ({
this.setState((prevState) => ({
rateLimitMessage
}));
}
@ -58,7 +58,7 @@ class Pareto extends React.Component {
const pareto = [
{ filename: 'Nothing to show in Pareto Report', count: 0, prs: [] }
];
this.setState(prevState => ({ data: pareto }));
this.setState((prevState) => ({ data: pareto }));
});
}
@ -74,9 +74,9 @@ class Pareto extends React.Component {
return seen;
}, {});
return options;
}
};
handleFileTypeOptionChange = changeEvent => {
handleFileTypeOptionChange = (changeEvent) => {
let { all, selectedLanguage, options } = this.state;
const selectedFileType = changeEvent.target.value;
@ -90,52 +90,73 @@ class Pareto extends React.Component {
if (selectedLanguage === 'all') {
condition = articleType === selectedFileType;
} else if (!options[selectedFileType][selectedLanguage]) {
condition = articleType === selectedFileType
condition = articleType === selectedFileType;
selectedLanguage = 'all';
} else {
condition = articleType === selectedFileType && language === selectedLanguage
condition =
articleType === selectedFileType && language === selectedLanguage;
}
}
return condition;
});
this.setState(prevState => ({ data, selectedFileType, selectedLanguage }));
}
this.setState((prevState) => ({
data,
selectedFileType,
selectedLanguage
}));
};
handleLanguageOptionChange = changeEvent => {
handleLanguageOptionChange = (changeEvent) => {
const { all, selectedFileType } = this.state;
const selectedLanguage = changeEvent.target.value;
let data = [...all].filter(({ filename }) => {
const { articleType, language } = this.getFilenameOptions(filename);
let condition;
if (selectedLanguage === 'all') {
condition = articleType === selectedFileType
condition = articleType === selectedFileType;
} else {
condition = language === selectedLanguage && articleType === selectedFileType
condition =
language === selectedLanguage && articleType === selectedFileType;
}
return condition;
});
this.setState(prevState => ({ data, selectedLanguage }));
}
this.setState((prevState) => ({ data, selectedLanguage }));
};
getFilenameOptions = filename => {
getFilenameOptions = (filename) => {
const filenameReplacement = filename.replace(
/^curriculum\/challenges\//, 'curriculum/'
/^curriculum\/challenges\//,
'curriculum/'
);
const regex = /^(docs|curriculum|guide)(?:\/)(english|arabic|chinese|portuguese|russian|spanish)?\/?/;
const regex =
/^(docs|curriculum|guide)(?:\/)(english|arabic|chinese|portuguese|russian|spanish)?\/?/;
// need an array to pass to labelsAdder
// eslint-disable-next-line
const [_, articleType, language] = filenameReplacement.match(regex) || [];
return { articleType, language };
}
};
render() {
const { data, options, selectedFileType, selectedLanguage, rateLimitMessage } = this.state;
const {
data,
options,
selectedFileType,
selectedLanguage,
rateLimitMessage
} = this.state;
const elements = rateLimitMessage
? rateLimitMessage
: data.map(entry => {
: data.map((entry) => {
const { filename, count, prs } = entry;
const prsList = prs.map(({ number, username, title }) => {
return <ListItem key={number} number={number} username={username} prTitle={title} />;
return (
<ListItem
key={number}
number={number}
username={username}
prTitle={title}
/>
);
});
const fileOnMain = `https://github.com/freeCodeCamp/freeCodeCamp/blob/main/${filename}`;
return (
@ -153,7 +174,9 @@ class Pareto extends React.Component {
);
});
let fileTypeOptions = Object.keys(options).map(articleType => articleType);
let fileTypeOptions = Object.keys(options).map(
(articleType) => articleType
);
const typeOptions = ['all', ...fileTypeOptions].map((type) => (
<FilterOption
key={type}
@ -170,7 +193,7 @@ class Pareto extends React.Component {
if (selectedFileType !== 'all') {
let languages = Object.keys(options[selectedFileType]);
languages = ['all', ...languages.sort()];
languageOptions = languages.map(language => (
languageOptions = languages.map((language) => (
<FilterOption
key={language}
name="language"
@ -184,25 +207,22 @@ class Pareto extends React.Component {
}
return (
<FullWidthDiv>
{fileTypeOptions.length > 0 &&
<strong>Filter Options</strong>
}
{fileTypeOptions.length > 0 && <strong>Filter Options</strong>}
<Options>
{fileTypeOptions.length > 0 &&
{fileTypeOptions.length > 0 && (
<>
<fieldset>
<legend>File Type:</legend>
<div>{typeOptions}</div>
</fieldset>
</>
}
{
languageOptions &&
)}
{languageOptions && (
<fieldset>
<legend>Language:</legend>
<div>{languageOptions}</div>
</fieldset>
}
)}
</Options>
{rateLimitMessage
? rateLimitMessage

View File

@ -34,17 +34,16 @@ const PrResults = ({ searchValue, results, rateLimitMessage }) => {
const showResults = () => {
if (!rateLimitMessage) {
return (results.length ? <h3>Results for PR# {searchValue}</h3> : null) && elements;
return (
(results.length ? <h3>Results for PR# {searchValue}</h3> : null) &&
elements
);
} else {
return rateLimitMessage;
}
};
return (
<FullWidthDiv style={{ width: '100%' }}>
{showResults()}
</FullWidthDiv>
);
return <FullWidthDiv style={{ width: '100%' }}>{showResults()}</FullWidthDiv>;
};
export default PrResults;

View File

@ -22,12 +22,12 @@ class Repos extends React.Component {
this.state = {
data: [],
rateLimitMessage: ''
}
};
}
componentDidMount() {
fetch(ENDPOINT_ALL_REPOS)
.then(response => response.json())
.then((response) => response.json())
.then(({ ok, rateLimitMessage, allRepos }) => {
if (ok) {
const repos = allRepos.filter(this.props.dataFilter);
@ -38,20 +38,18 @@ class Repos extends React.Component {
});
}
this.setState(prevState => ({
this.setState((prevState) => ({
data: repos
}));
} else if (rateLimitMessage) {
this.setState(prevState => ({
this.setState((prevState) => ({
rateLimitMessage
}));
}
})
.catch(() => {
const repos = [
{ repoName: 'No repos with open PRs', prs: [] }
];
this.setState(prevState => ({ data: repos }));
const repos = [{ repoName: 'No repos with open PRs', prs: [] }];
this.setState((prevState) => ({ data: repos }));
});
}
@ -60,11 +58,21 @@ class Repos extends React.Component {
const elements = rateLimitMessage
? rateLimitMessage
: data.map(entry => {
: data.map((entry) => {
const { _id: repoName, prs } = entry;
const prsList = prs.map(({ _id: number, username, title, prLink }) => {
return <ListItem key={number} number={number} username={username} prTitle={title} prLink={prLink} />;
});
const prsList = prs.map(
({ _id: number, username, title, prLink }) => {
return (
<ListItem
key={number}
number={number}
username={username}
prTitle={title}
prLink={prLink}
/>
);
}
);
return (
<Result key={repoName}>

View File

@ -11,14 +11,14 @@ class Search extends Component {
searchValue: '',
selectedOption: 'pr',
results: [],
message: '',
message: ''
};
clearObj = { searchValue: '', results: [] };
inputRef = React.createRef();
handleInputEvent = event => {
handleInputEvent = (event) => {
const {
type,
key,
@ -28,10 +28,10 @@ class Search extends Component {
if (type === 'change') {
if (this.state.selectedOption === 'pr') {
if (Number(searchValue) || searchValue === '') {
this.setState(prevState => ({ searchValue, results: [] }));
this.setState((prevState) => ({ searchValue, results: [] }));
}
} else {
this.setState(prevState => ({ searchValue, results: [] }));
this.setState((prevState) => ({ searchValue, results: [] }));
}
} else if (type === 'keypress' && key === 'Enter') {
this.searchPRs(searchValue);
@ -47,14 +47,14 @@ class Search extends Component {
}
};
handleOptionChange = changeEvent => {
handleOptionChange = (changeEvent) => {
const selectedOption = changeEvent.target.value;
this.setState(prevState => ({ selectedOption, ...this.clearObj }));
this.setState((prevState) => ({ selectedOption, ...this.clearObj }));
this.inputRef.current.focus();
};
searchPRs = value => {
searchPRs = (value) => {
const { selectedOption } = this.state;
const fetchUrl =
@ -63,18 +63,18 @@ class Search extends Component {
: `${ENDPOINT_SEARCH}/?value=${value}`;
fetch(fetchUrl)
.then(response => response.json())
.then((response) => response.json())
.then(({ ok, message, results, rateLimitMessage }) => {
if (ok) {
this.setState(prevState => ({ message, results }));
this.setState((prevState) => ({ message, results }));
} else if (rateLimitMessage) {
this.setState(prevState => ({
this.setState((prevState) => ({
rateLimitMessage
}));
}
})
.catch(() => {
this.setState(prevState => this.clearObj);
this.setState((prevState) => this.clearObj);
});
};
@ -90,7 +90,8 @@ class Search extends Component {
handleOptionChange,
state
} = this;
const { searchValue, message, results, selectedOption, rateLimitMessage } = state;
const { searchValue, message, results, selectedOption, rateLimitMessage } =
state;
return (
<>
@ -118,10 +119,18 @@ class Search extends Component {
<button onClick={handleButtonClick}>Search</button>
{message}
{selectedOption === 'pr' && (
<PrResults searchValue={searchValue} results={results} rateLimitMessage={rateLimitMessage} />
<PrResults
searchValue={searchValue}
results={results}
rateLimitMessage={rateLimitMessage}
/>
)}
{selectedOption === 'filename' && (
<FilenameResults searchValue={searchValue} results={results} rateLimitMessage={rateLimitMessage} />
<FilenameResults
searchValue={searchValue}
results={results}
rateLimitMessage={rateLimitMessage}
/>
)}
</>
);

Some files were not shown because too many files have changed in this diff Show More