From 86ce67dbf1a4362b7858ee82365d57e026adbc22 Mon Sep 17 00:00:00 2001 From: borb Date: Mon, 7 Jul 2025 20:01:21 +0300 Subject: [PATCH] add web and http slides - change numbering - add snippets for html and css - add images --- .vscode/markdown.code-snippets | 20 + 1-web-introduction-slides.html | 317 ++++++++++++++++ 1-web-introduction.md | 252 +++++++++++++ 2-http-slides.html | 351 ++++++++++++++++++ 2-http.md | 185 +++++++++ 1-web-and-html.md => 3-html.md | 155 -------- 2-css.md => 4-css.md | 0 3-bootstrap.md => 5-bootstrap.md | 0 ...html-and-dom.md => 6-js-in-html-and-dom.md | 0 imgs/1-introduction-to-the-internet_1.png | Bin 0 -> 67707 bytes imgs/http-protocol.svg | 90 +++++ imgs/third-party-apis.svg | 77 ++++ imgs/web-apis.svg | 105 ++++++ 13 files changed, 1397 insertions(+), 155 deletions(-) create mode 100644 1-web-introduction-slides.html create mode 100644 1-web-introduction.md create mode 100644 2-http-slides.html create mode 100644 2-http.md rename 1-web-and-html.md => 3-html.md (68%) rename 2-css.md => 4-css.md (100%) rename 3-bootstrap.md => 5-bootstrap.md (100%) rename 4-js-in-html-and-dom.md => 6-js-in-html-and-dom.md (100%) create mode 100644 imgs/1-introduction-to-the-internet_1.png create mode 100644 imgs/http-protocol.svg create mode 100644 imgs/third-party-apis.svg create mode 100644 imgs/web-apis.svg diff --git a/.vscode/markdown.code-snippets b/.vscode/markdown.code-snippets index ea039a6..a795786 100644 --- a/.vscode/markdown.code-snippets +++ b/.vscode/markdown.code-snippets @@ -49,6 +49,26 @@ ], "description": "TypeScript code block" }, + "html code block" : { + "scope": "markdown", + "prefix": "html", + "body": [ + "```html", + "$0", + "```" + ], + "description": "HTML code block" + }, + "css code block" : { + "scope": "markdown", + "prefix": "css", + "body": [ + "```css", + "$0", + "```" + ], + "description": "CSS code block" + }, "inline code" : { "scope": "markdown", "prefix": "c", diff --git a/1-web-introduction-slides.html b/1-web-introduction-slides.html new file mode 100644 index 0000000..77fe2d2 --- /dev/null +++ b/1-web-introduction-slides.html @@ -0,0 +1,317 @@ +1. Introduction to the Web
+

Introduction to the Web

+
+
+

Contents

+
    +
  1. Web and the Internet
  2. +
  3. Frontend and backend
  4. +
  5. Anatomy of a website
  6. +
  7. Web APIs
  8. +
+
+
+

Web and the Internet

+
+
+

What is the Internet?

+
+
+
    +
  • World Wide Web is not the Internet +
      +
    • Internet: connected networks that use the TCP/IP protocol +
        +
      • made out of billions of computers, cables and antennae directing data to the right direction
      • +
      +
    • +
    • World Wide Web: URL-based information system
    • +
    +
  • +
+
+
+

+
+
+
    +
  • WWW is a big part of the Internet but it consists of other kinds of traffic, too: +
      +
    • Email
    • +
    • VoIP (Skype, Discord, etc)
    • +
    • File transfer between computers (FTP)
    • +
    • remote connections to other computers
    • +
    +
  • +
  • In other words, the Internet is an infrastructure and WWW is served via it
  • +
+
+
+

What is the Web?

+
+
+
    +
  • World wide web (www) is the part of the Internet where browsers fetch and show websites
  • +
  • WWW makes sites and applications accessible to all kinds of devices: +
      +
    • mobile phones, computers, smart watches, TVs...
    • +
    • For the websites to appear on all the different devices similarly, strict rules are needed
    • +
    +
  • +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BrowserEngine
ChromeBlink
EdgeBlink
FirefoxGecko
SafariWebKit
+
+
+
+
+

Frontend vs Backend

+
    +
  • Web development is split into frontend and backend
  • +
  • Frontend is the website users can actually see +
      +
    • Visual elements of a website or app the user can interact with
    • +
    +
  • +
  • Backend is the invisible part +
      +
    • "Server side" where user's data is stored
    • +
    • Backend is not interacted with directly, but gives and modifies its stored data based on user requests
    • +
    +
  • +
  • Full stack development refers to working on both backend and frontend!
  • +
+
+
+

What is a server or "the cloud"

+
+
+
    +
  • A server or "the cloud" is just another computer, or multiple ones +
      +
    • Server software is constantly running on it
    • +
    • Your own computer could be a server!
    • +
    +
  • +
  • If you need to save an image, post a comment on a news website, or just load a website, you send a request to a server
  • +
  • Server then gives an appropriate response based on the request
  • +
+
+
+

+
+
+
+
+

Backend

+
+
+
    +
  • Backend handles e.g., +
      +
    • saving and fetching user data from a database
    • +
    • user authentication and connecting multiple users together (chat apps!)
    • +
    +
  • +
  • Databases are used with query languages like SQL
  • +
  • Backend software can be written with various different programming languages +
      +
    • even with JavaScript! See: Express
    • +
    +
  • +
  • Simple websites don't require a dedicated backend
  • +
+
+
+

+
+
+
+
+

Anatomy of a website

+
+
+

Building blocks of a website

+
    +
  • Historically, websites looked something like this + +
  • +
  • Nowadays, a website can even be a full-blown application! + +
  • +
  • Old and new sites alike are written in HTML, which describes the structure of the site
  • +
  • In mid-90s, plain HTML was extended with CSS to implement styling
  • +
  • The third building block of a website is JavaScript, or JS, which is used to add interactivity
  • +
+
+
+

HTML

+
+
+ +
<body>
+<h1>This is a Heading</h1>
+<p>This is a paragraph.</p>
+</body>
+
+
+
+

+
+
+
+
+

CSS

+
+
+
    +
  • CSS stands for Cascading style sheets
  • +
  • CSS defines the look of the website
  • +
  • It tells the fonts, sizes, colors and locations of elements
  • +
  • Can be used to animate elements
  • +
+
body {
+  background-color: lightblue;
+}
+h1 {
+  color: white;
+  text-align: center;
+}
+p {
+  font-family: verdana;
+}
+
+
+ +
+
+
+

JavaScript

+
    +
  • With a dedicated programming language, JavaScript, your website can become interactive
  • +
  • It allows you to add functionality to buttons, send data to / fetch data from a server in real time
  • +
+
+
+

+
+
+

+
+
+
+
+

Web APIs

+
+
+

What is a Web API

+
    +
  • API (Application Programming Interface) defines a way of communicating between applications
  • +
  • A Web API defines how a client can communicate with a web server
  • +
  • With the help of APIs, you don't need to create all functionality yourself
  • +
  • Each program that wants to communicate to the outside world defines their own interface
  • +
  • There are some architectural models like REST (Representational State Transfer) that exist to generalize API design
  • +
+
+
+

Client-side and Server-side APIs

+
    +
  • Client-side APIs — called on the web browser (client side): +
      +
    • Browser APIs, built into the browser itself and extend its functionality +
        +
      • For instance, the geolocation API returns coordinates where the browser is located
      • +
      +
    • +
    • Third-party APIs, for retrieving data from somewhere on the Web
    • +
    +
  • +
  • Server-side APIs — called on the server: +
      +
    • For communicating between servers or the client
    • +
    • Consist of multiple exposed endpoints with a defined request-response system
    • +
    +
  • +
+
+
+

API communication

+
+

+
+
+
+

Third party APIs

+
    +
  • Many services have public APIs that anyone can use
  • +
  • Some services require users to have an API key
  • +
+
+

+
+
\ No newline at end of file diff --git a/1-web-introduction.md b/1-web-introduction.md new file mode 100644 index 0000000..221d2e2 --- /dev/null +++ b/1-web-introduction.md @@ -0,0 +1,252 @@ +--- +marp: true +paginate: true +math: mathjax +theme: buutti +title: 1. Introduction to the Web +--- + +# Introduction to the Web + + + + +## Contents + +1) Web and the Internet +2) Frontend and backend +3) Anatomy of a website +4) Web APIs + +## Web and the Internet + +### What is the Internet? + +
+
+ +* World Wide Web is not the Internet + * Internet: connected networks that use the TCP/IP protocol + * made out of billions of computers, cables and antennae directing data to the right direction + * World Wide Web: URL-based information system + +
+
+ +![](imgs/1-web-and-html_0.png) + +
+
+ +* WWW is a big part of the Internet but it consists of other kinds of traffic, too: + * Email + * VoIP (Skype, Discord, etc) + * File transfer between computers (FTP) + * remote connections to other computers +* In other words, the Internet is an infrastructure and WWW is served via it + +### What is the Web? + +
+
+ +* World wide web (www) is the part of the Internet where browsers fetch and show websites +* WWW makes sites and applications accessible to all kinds of devices: + * mobile phones, computers, smart watches, TVs... + * For the websites to appear on all the different devices similarly, strict rules are needed + +
+
+ +| | Browser | Engine | +|---------------------------------------------|---------------|---------| +| ![w:80](imgs/1-web-and-html_3.png) | **Chrome** | Blink | +| ![w:80](imgs/1-web-and-html_4.png) | **Edge** | Blink | +| ![w:80](imgs/1-web-and-html_1.png) | **Firefox** | Gecko | +| ![w:80](imgs/1-web-and-html_2.png) | **Safari** | WebKit | + +
+
+ +## Frontend vs Backend + +* Web development is split into [**_frontend_** and **_backend_**](https://en.wikipedia.org/wiki/Frontend_and_backend) +* Frontend is the website users can actually see + * Visual elements of a website or app the user can interact with +* Backend is the invisible part + * "Server side" where user's data is stored + * Backend is not interacted with directly, but gives and modifies its stored data based on user requests +* _**Full stack development**_ refers to working on both backend and frontend! + +### What is a server or "the cloud" + +
+
+ +* A server or "the cloud" is just another computer, or multiple ones + * Server software is constantly running on it + * Your own computer could be a server! +* If you need to save an image, post a comment on a news website, or just load a website, you send a **_request_** to a server +* Server then gives an appropriate **_response_** based on the request + +
+
+ +![](imgs/1-web-and-html_5.png) + +
+
+ +### Backend + +
+
+ +* Backend handles e.g., + * saving and fetching user data from a **_database_** + * user authentication and connecting multiple users together (chat apps!) +* Databases are used with _**query languages**_ like **_SQL_** +* Backend software can be written with various different programming languages + * even with JavaScript! See: [Express](https://expressjs.com/) +* Simple websites don't require a dedicated backend + +
+
+ +![](imgs/1-web-and-html_6.png) + +
+
+ +## Anatomy of a website + +### Building blocks of a website + +* Historically, websites looked something like this + * [https://web.archive.org/web/19970129232848/http://www.iltalehti.fi/](https://web.archive.org/web/19970129232848/http://www.iltalehti.fi/) +* Nowadays, a website can even be a full-blown application! + * [https://open.spotify.com/](https://open.spotify.com/) +* Old and new sites alike are written in **_HTML_**, which describes the **_structure_** of the site +* In mid-90s, plain HTML was extended with **_CSS_** to implement **_styling_** +* The third building block of a website is JavaScript, or **_JS_**, which is used to add **_interactivity_** + +### HTML + +
+
+ +* HTML stands for **_Hypertext markup language_** +* HTML defines the structure of a website +* It tells what text, images and containers the website has +* You might have seen raw html if your browser has failed due to a slow connection $\Rightarrow$ +* [motherfuckingwebsite.com](https://motherfuckingwebsite.com/) +* http://catb.org/~esr/open-source.html + +```html + +

This is a Heading

+

This is a paragraph.

+ +``` + +
+
+ +![w:340](imgs/1-web-and-html_8.png) + +
+
+ +### CSS + +
+
+ +* CSS stands for **_Cascading style sheets_** +* CSS defines the ***look*** of the website +* It tells the fonts, sizes, colors and locations of elements +* Can be used to animate elements + +```css +body { + background-color: lightblue; +} +h1 { + color: white; + text-align: center; +} +p { + font-family: verdana; +} +``` + + +
+
+ +![](imgs/1-web-and-html_9.png) + +* [bettermotherfuckingwebsite.com](http://bettermotherfuckingwebsite.com/) +* https://www.emuurom.com/ + +
+
+ + + +### JavaScript + +* With a dedicated programming language, JavaScript, your website can become interactive +* It allows you to add functionality to buttons, send data to / fetch data from a server in real time + +
+
+ +![w:300](imgs/1-web-and-html_10.png) + +
+
+ +![w:350](imgs/1-web-and-html_11.png) + +
+
+ +## Web APIs + +### What is a Web API + +* ***API (Application Programming Interface)*** defines a way of communicating between applications +* A Web API defines how a client can communicate with a web server +* With the help of APIs, you don't need to create all functionality yourself +* Each program that wants to communicate to the outside world defines their own interface +* There are some architectural models like **_REST (Representational State Transfer)_** that exist to generalize API design + +### Client-side and Server-side APIs + +* [Client-side APIs](https://developer.mozilla.org/en-US/docs/Learn_web_development/Extensions/Client-side_APIs/Introduction) — called on the web browser (client side): + * Browser APIs, built into the browser itself and extend its functionality + * For instance, the geolocation API returns coordinates where the browser is located + * Third-party APIs, for retrieving data from somewhere on the Web +* Server-side APIs — called on the server: + * For communicating between servers or the client + * Consist of multiple exposed ***endpoints*** with a defined request-response system + +### API communication + +
+ +![w:800](imgs/web-apis.svg) + +
+ +## Third party APIs + +* Many services have public APIs that anyone can use +* Some services require users to have an [API key](https://en.wikipedia.org/wiki/API_key) + +
+ +![w:900](imgs/third-party-apis.svg) + +
\ No newline at end of file diff --git a/2-http-slides.html b/2-http-slides.html new file mode 100644 index 0000000..1c91053 --- /dev/null +++ b/2-http-slides.html @@ -0,0 +1,351 @@ +2. HTTP
+

HTTP

+
+
+

Contents

+
    +
  1. What is HTTP?
  2. +
  3. HTTP Requests
  4. +
  5. HTTP Responses
  6. +
  7. IP address and ports
  8. +
+
+
+

What is HTTP?

+
    +
  • HTTP (Hypertext Transfer Protocol) is a TCP/IP based communication protocol, which provides a standardized way for computers to communicate with each other
  • +
  • The communication happens between a client (browser, application…) and a server +
      +
    • The client sends a request, and the server returns a response
    • +
    +
  • +
  • HTTP is connectionless: +
      +
    • The client and server are only aware of each other during the request-response phase
    • +
    • After that, each new request is sent through a new connection
    • +
    +
  • +
+
+
+

But what is TCP/IP?

+
    +
  • It is known as the Internet protocol suite
  • +
  • Framework used for organizing communication protocols over the Internet +
      +
    • TCP = Transmission Control Protocol +
        +
      • Controlled stream of bytes between applications communicating via an IP network
      • +
      +
    • +
    • IP = Internet Protocol +
        +
      • Delivering packets from host to destination with IP addresses
      • +
      +
    • +
    +
  • +
+
+
+

HTTP structure

+
+
+

+
+
+
    +
  • The HTTP protocol acts as a communication bus between the web client (e.g. web browser) and the web server
  • +
  • There can be multiple clients connected to the server simultaneously
  • +
  • The clients are not connected to each other but only to the server
  • +
+
+
+
+
+

HTTP requests

+
    +
  • HTTP defines a set of request methods
  • +
  • The most common requests are GET, POST, PUT and DELETE +
      +
    • These are needed to create a basic CRUD app (Create, Read, Update, Delete)
    • +
    +
  • +
  • More requests are listed in the mdn web docs
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HTTP MethodUsageExample Use
GETRetrieve contentBrowser fetching a webpage
POSTAdd new dataSubmitting a form to create a new account
PUTUpdate existing dataUpdating user profile information
DELETERemove existing dataDeleting a user account
+
+
+

Note: URI vs URL

+
    +
  • The website address is more formally known as the URL (uniform resource locator) +
      +
    • https://maps.google.com
    • +
    • https://maps.google.com/maps?q=Oulu (includes a query)
    • +
    +
  • +
  • It is a subset of an URI (uniform resource identifier) +
      +
    • This identifies a resource on a webpage
    • +
    +
  • +
+
+
+

HTTP request format

+
    +
  • Request line: <request method> <request URI> +
      +
    • Example: GET https://example.com/products
    • +
    +
  • +
  • Headers (optional) +
      +
    • Example: Date: Mon, 07 Sep 2020 08:39:33 GMT
    • +
    • Example: Content-Type: application/json
    • +
    +
  • +
  • Body (optional) +
      +
    • Example in the JSON format:
      {
      +  "date": "2020-09-08T11:39:34.2837813+03:00",
      +  "temperatureC": 11,
      +  "temperatureF": 51,
      +  "summary": "Cool"
      +}
      +
      +
    • +
    +
  • +
+
+
+

HTTP request examples

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodURIHeadersBody
GEThttp://server.com/
GEThttp://server.com/10
POSThttp://server.com/usersContent-Type: application/json{"name": "Dan"}
PUThttp://server.com/users/2Content-Type: application/json{"name": "Danny"}
DELETEhttp://server.com/users/2
+
+
+

HTTP response format

+
    +
  • HTTP responses have the following format: +
      +
    • Status line: <HTTP version> <status code> <reason phrase> +
        +
      • Example:HTTP/1.1 200 OK
      • +
      +
    • +
    • Headers (optional) +
        +
      • Date: Mon, 07 Sep 2020 08:39:33 GMT
      • +
      • Content-Type: application/json
      • +
      +
    • +
    • Body (optional)
      {
      +  "date": "2020-09-08T11:39:34.2837813+03:00",
      +  "temperatureC": 11,
      +  "temperatureF": 51,
      +  "summary": "Cool"
      +}
      +
      +
    • +
    +
  • +
+
+
+

HTTP status codes

+
    +
  • The status line of HTTP a response sent by an API should accurately describe the status of what happened on the server after each request: +
      +
    • Did the operation succeed? (2xx status codes)
    • +
    • Was there an error with the request? (4xx status codes) +
        +
      • E.g., the request line was malformed, or the server doesn't support it
      • +
      +
    • +
    • Did a server-side exception occur? (5xx status codes) +
        +
      • This is never the client's fault!
      • +
      +
    • +
    +
  • +
+
+
+

Status codes for a CRUD app

+
    +
  • Your APIs should use the following status codes for responses to CRUD operations
  • +
  • See Restfulapi.net and Wikipedia HTTP status code listings
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
2xx SUCCESS4xx CLIENT ERROR5xx SERVER ERROR
200 - OK400 - Bad Request500 - Internal Server Error
201 - Created401 - Unauthorized
204 - No Content403 - Forbidden
404 - Not Found
409 - Conflict
+
+
+

IP and ports

+
+
+

IP addresses

+
    +
  • Every node, or host on a computer network needs an IP (Internet Protocol) address +
      +
    • These can be public or private
    • +
    • Serves two functions: identifies and provides the location of the host
    • +
    +
  • +
  • The old 32-bit IPv4 addresses are of the form 192.0.2.1
  • +
  • The 128-bit IPv6 addresses are of the form 2001:0db8:0000:0000:0000:8a2e:0370:7334 (can be shortened to 2001:db8::8a2e:370:7334)
  • +
+
+
+

Port numbers

+ +
    +
  • The IP address is often followed by a port number separated by a colon: 192.0.2.1:8080
  • +
  • The port number (16-bit unsigned integer) defines the port through which communication to your application happens
  • +
  • Ports allow multiple applications to be located on the same host
  • +
  • The client connects to this port in some server (defined by an IP address), so the client and the server are able to communicate
  • +
  • Computers have several different ports at their disposal
  • +
+
+
+

Reserved ports

+
+
+
    +
  • Some of them are reserved and your application might not be able to assign those ports to itself
  • +
  • Ports from 0 to 1023 are system ports +
      +
    • There are restrictions in manually assigning applications to use them
    • +
    +
  • +
  • Generally, ports from 1024 to 65535 are available for the user to assign for applications
  • +
+
+
+

+
+
+
+

Note: older version in the backend-basics repo

\ No newline at end of file diff --git a/2-http.md b/2-http.md new file mode 100644 index 0000000..d5a1dca --- /dev/null +++ b/2-http.md @@ -0,0 +1,185 @@ +--- +marp: true +paginate: true +math: mathjax +theme: buutti +title: 2. HTTP +--- + +# HTTP + + + + +## Contents + +1) What is HTTP? +2) HTTP Requests +3) HTTP Responses +4) IP address and ports + + +## What is HTTP? + +* **_HTTP_** (Hypertext Transfer Protocol) is a TCP/IP based communication protocol, which provides a standardized way for computers to communicate with each other +* The communication happens between a client (browser, application…) and a server + * The client sends a **_request_**, and the server returns a **_response_** +* HTTP is *__connectionless__*: + * The client and server are only aware of each other during the request-response phase + * After that, each new request is sent through a new connection + +### But what is TCP/IP? + +* It is known as the [Internet protocol suite](https://en.wikipedia.org/wiki/Internet_protocol_suite) +* Framework used for organizing communication protocols over the Internet + * TCP = Transmission Control Protocol + * Controlled stream of bytes between applications communicating via an IP network + * IP = Internet Protocol + * Delivering packets from host to destination with IP addresses + +### HTTP structure + +
+
+ +![w:700](imgs/http-protocol.svg) + +
+
+ +* The HTTP protocol acts as a communication bus between the web client (e.g. web browser) and the web server +* There can be multiple clients connected to the server simultaneously +* The clients are not connected to each other but only to the server + +
+
+ +## HTTP requests + +* HTTP defines a set of request methods +* The most common requests are `GET`, `POST`, `PUT` and `DELETE` + * These are needed to create a basic CRUD app *(Create, Read, Update, Delete)* +* More requests are listed in the [mdn web docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods) + +| HTTP Method | Usage | Example Use | +|-------------|:---------------------|:------------------------------------------| +| `GET` | Retrieve content | Browser fetching a webpage | +| `POST` | Add new data | Submitting a form to create a new account | +| `PUT` | Update existing data | Updating user profile information | +| `DELETE` | Remove existing data | Deleting a user account | + +### Note: URI vs URL + +* The website address is more formally known as the ***URL (uniform resource locator)*** + * `https://maps.google.com` + * `https://maps.google.com/maps?q=Oulu` (includes a ***query***) +* It is a subset of an ***URI (uniform resource identifier)*** + * This identifies a resource on a webpage + +### HTTP request format + +* Request line: ` ` + * Example: `GET https://example.com/products` +* Headers (optional) + * Example: `Date: Mon, 07 Sep 2020 08:39:33 GMT` + * Example: `Content-Type: application/json` +* Body (optional) + * Example in the JSON format: + ```json + { + "date": "2020-09-08T11:39:34.2837813+03:00", + "temperatureC": 11, + "temperatureF": 51, + "summary": "Cool" + } + ``` + +### HTTP request examples + +| Method | URI | Headers | Body | +|:---------|:--------------------------------|:---------------------------------|:--------------------| +| `GET` | `http://server.com/` | | | +| `GET` | `http://server.com/10` | | | +| `POST` | `http://server.com/users` | `Content-Type: application/json` | `{"name": "Dan"}` | +| `PUT` | `http://server.com/users/2` | `Content-Type: application/json` | `{"name": "Danny"}` | +| `DELETE` | `http://server.com/users/2` | | | + + +## HTTP response format + +* HTTP responses have the following format: + * Status line: ` ` + * Example:`HTTP/1.1 200 OK` + * Headers (optional) + * `Date: Mon, 07 Sep 2020 08:39:33 GMT` + * `Content-Type: application/json` + * Body (optional) + ```json + { + "date": "2020-09-08T11:39:34.2837813+03:00", + "temperatureC": 11, + "temperatureF": 51, + "summary": "Cool" + } + ``` + +### HTTP status codes + +* The status line of HTTP a response sent by an API should accurately describe the status of what happened on the server after each request: + * Did the operation succeed? (`2xx` status codes) + * Was there an error with the request? (`4xx` status codes) + * E.g., the request line was malformed, or the server doesn't support it + * Did a server-side exception occur? (`5xx` status codes) + * This is never the client's fault! + +### Status codes for a CRUD app + +* Your APIs should use the following status codes for responses to CRUD operations +* See [Restfulapi.net](https://restfulapi.net/http-status-codes/) and [Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) HTTP status code listings + +| `2xx SUCCESS` | `4xx CLIENT ERROR` | `5xx SERVER ERROR` | +|:-------------------|:---------------------|:------------------------------| +| `200 - OK` | `400 - Bad Request` | `500 - Internal Server Error` | +| `201 - Created` | `401 - Unauthorized` | | +| `204 - No Content` | `403 - Forbidden` | | +| | `404 - Not Found` | | +| | `409 - Conflict` | | + +## IP and ports + +### IP addresses + +* Every node, or ***host*** on a computer network needs an IP (Internet Protocol) address + * These can be public or private + * Serves two functions: identifies and provides the location of the host +* The old 32-bit IPv4 addresses are of the form `192.0.2.1` +* The 128-bit IPv6 addresses are of the form `2001:0db8:0000:0000:0000:8a2e:0370:7334` (can be shortened to `2001:db8::8a2e:370:7334`) + +### Port numbers + + + +* The IP address is often followed by a ***port*** number separated by a colon: `192.0.2.1:8080` +* The port number (16-bit unsigned integer) defines the port through which communication to your application happens +* Ports allow multiple applications to be located on the same host +* The client connects to this port in some server (defined by an IP address), so the client and the server are able to communicate +* Computers have several different ports at their disposal + +### Reserved ports + +
+
+ +* Some of them are reserved and your application might not be able to assign those ports to itself +* Ports from 0 to 1023 are ***system ports*** + * There are restrictions in manually assigning applications to use them +* Generally, ports from 1024 to 65535 are available for the user to assign for applications + +
+
+ +![](imgs/1-introduction-to-the-internet_1.png) + +
+
+ diff --git a/1-web-and-html.md b/3-html.md similarity index 68% rename from 1-web-and-html.md rename to 3-html.md index 1b7fe62..33aaf90 100644 --- a/1-web-and-html.md +++ b/3-html.md @@ -1,158 +1,3 @@ -# Web & HTML - -1. Websites and The Internet - -A short overview of the Internet and WWW - -Anatomy of a website (or web app) - -HTML, CSS, JS - -2. HTML basics - -Setting up - -tags: p, h1, img src, a href, div - -boilerplate - -3. Chrome Dev Tools - -4. HTML continued - -Title, span, text-align, br.. - -User input - -Tables - -5. CSS basics - -Websites and the Internet - -# A short overview of the Internet and WWW - -© Buutti Oy, All Rights Reserved - -# What is the Internet? - -* Web != the Internet -* Internet: connected networks that use the TCP/IP protocol - * made out of billions of computers, cables and antennae directing data to the right direction. -* World Wide Web: URL-based information system. - * a big part of the Internet but it consists of other kinds of traffic, too: - * Email - * VoIP (Skype/Teamspeak) - * File transfers between computers - * remote connections to other computers -* In other words, the internet is an infrastructure and WWW -* is served via it - -![](imgs/1-web-and-html_0.png) - -# What is the Web? - -* World wide web (www) is the part of the Internet where browsers fetch and show websites - * Browsers ( _rendering engine_ in parentheses) - * Chrome (Blink) - * Firefox (Gecko) - * Edge (Blink) - * Safari (WebKit) -* WWW makes sites and applications accessible to all kinds of devices: - * mobile phones, computers, smart watches, TVs... - * For the websites to appear on all the different devices similarly, we need strict rules - -![](imgs/1-web-and-html_1.png) - -![](imgs/1-web-and-html_2.png) - -![](imgs/1-web-and-html_3.png) - -![](imgs/1-web-and-html_4.png) - -# Back-end vs Front-end - -* Web development is split into _Back-end_ and _Front-end_ -* Front-end is the website users can actually see - * visual elements of a website or app the user can interact with -* Back-end is the invisible part - * "server side" where user's data is stored - * back-end is not interacted with directly, but gives and modifies its stored data based on user requests -* _Full stack development_ refers to working on both back-end and front-end! - -# What is a server or "the Cloud" - -* A Server or "the cloud" is just another computer - * server software is constantly running - * Your own computer could be a server! -* If you need to save an image, post a comment on a news website, or just load a website, you send a _request _ to a server -* Server then gives an appropriate _response_ based on the request - -![](imgs/1-web-and-html_5.png) - -# Backend - -![](imgs/1-web-and-html_6.png) - -* Backend handles e.g., - * saving and fetching user data from a _database_ - * user authentication and connecting multiple users together (chat apps!) -* Databases are used with _query languages_ like _SQL_ -* Back-end software can be written with various different programming languages - * even with JavaScript! See: [Express](https://expressjs.com/) -* Simple websites don't require a dedicated back-end - -![](imgs/1-web-and-html_7.png) - -# Anatomy of a website -HTML, CSS and JS - -# Anatomy of a website - -* Historically, websites looked something like this - * [https://web.archive.org/web/19970129232848/http://www.iltalehti.fi/](https://web.archive.org/web/19970129232848/http://www.iltalehti.fi/) -* Nowadays, a website can even be a full-blown application! - * [https://open.spotify.com/](https://open.spotify.com/) -* old and new sites alike are written in _HTML_ __, __ which describes the _structure _ of the site -* In mid-90s, plain HTML was extended with _CSS_ _ _ to implement _styling_ -* The third building block of a website is JavaScript, or _JS,_ which is used to add _interactivity_ - -# HTML - -![](imgs/1-web-and-html_8.png) - -HTML stands for _Hypertext markup language_ - -HTML defines the structure of a website - -It tells what text, images and containers the website has - -You might have seen raw html if your browser has failed due to a slow connection -> - -[https://motherfuckingwebsite.com/](https://motherfuckingwebsite.com/) - -# CSS - -CSS stands for _Cascading style sheets_ - -CSS defines the __look __ of the website - -It tells what sizes, colors and where everything is - -[http://bettermotherfuckingwebsite.com/](http://bettermotherfuckingwebsite.com/) - -![](imgs/1-web-and-html_9.png) - -# JavaScript - -With a dedicated programming language, JavaScript, your website can become interactive - -It allows you to do computations, send data to a server or fetch new data in real time - -![](imgs/1-web-and-html_10.png) - -![](imgs/1-web-and-html_11.png) - # HTML basics # Setting up diff --git a/2-css.md b/4-css.md similarity index 100% rename from 2-css.md rename to 4-css.md diff --git a/3-bootstrap.md b/5-bootstrap.md similarity index 100% rename from 3-bootstrap.md rename to 5-bootstrap.md diff --git a/4-js-in-html-and-dom.md b/6-js-in-html-and-dom.md similarity index 100% rename from 4-js-in-html-and-dom.md rename to 6-js-in-html-and-dom.md diff --git a/imgs/1-introduction-to-the-internet_1.png b/imgs/1-introduction-to-the-internet_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a710d499c19f45c75cc92892324ed0a795d61698 GIT binary patch literal 67707 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
  • feZ^8d| zicW5NCXTq|NucitP5Ew`bli>=+?ss(N&z zzBp8r4mHUF3dl@t6s3+pB)G`wlP4p4Fb{S2FB34%Viye7+61FurpU?LHo6F1dxc8r zg9QG>NbanU7$J-Wl;R$9u{y0NHen}B$@(-HzAHA%Xw;YqIQ{WIx3pGGkd~Hs_v1qw zMr!t9Ph(?NiM`)7CKV>l@h_aM8Wv~H6iqPD^W+KJu(S!%h+rbCVjqrvQDMhE*cM$= zvB^5B4vt#u;uMB)`qvX~|lBUZoB)X<2P<78#~w;}T#dhoW9!$%gJ z-e&_JnhV(-TRzZ}VhFE;JNQU7V|+Zij*FeNDf(p13;@Vx#Q2ot*vQL*X#tBeA%()V zt!b^f_#b2#E{PrM><43ITSvqsI>KA#X=#xqz3n3ZDE>`M*2sYmWj!0KsOM6S5@F8~ zO892n^T7$Z9RWLn=J?nNhE9YIdeM5C>Wi59dt$)_np&b?RxO)L8!`enr3G^{f^A5y zdo;SE4Z0X9@=4dE%4Tny5Gls*{KRH8Jo$y!2B(Krn1{%^VGhms!`WJ!`=c@`GwGBO9^gqGJ&+nRLfV@d!7{uIn!kX6jLkr zLIvX=U!AS7b0WRgDCGj{!vav=h1u7$H=G3`xnJsTDIr5WkWCdqop1?FVS60y+>e_8 zSm!}A_8DkVG&m9LVtmfC1@GqIck+DMWIL-yS9u~K82RD+GCqskiwf=R?zKZ(LsvcVEtygVtu``{y*TV2 zztU-m)m67>IwIld8)Aj@gu$Cl3|pQZh7cBG+NolW1>99#i3e{)pt8?TJ&Q$Wx%%r~ z^_9b5s*M^KvKWyM^YZK}Ez!HYcia)H`_p>wc*FcW_n8MU?W(pkxI*L%|MrFp)b>gt zrSI6O20+SKg#OBqN_o>q#=AWxX1c& z+9^uqWqkG0>mCRjXGBexZ;nL8cke}Ea7aIk9f`PdI@fhnUp_7g{bxBt_acf&+t!QO zlDmFR)3U@O-2Jk7QuCC4G}78+Y5F(sUQC#b`~FCaeS5}HLxkOtp1o@_+F3`)TTPGM z?Msy-K@WD-q&4Sv|GG})3vf=|%+b{GRnHhZ&-b_cn>}Y|ch8)^GLso@$ekYc)sUhgs9#J0KSL6j4x$&kksQJyRNA^qb3XE z?up58>q10#G z4!p8MwzChtFgNw;;mB2?QXW!b;U4Mx-RN-gcW8*BG3RNm?%`nZrUm#G$!NZX6L-rJEbK26(~d$g>$R?#%>qgsY9anhMwk$7dJr^Bz^0)sbFdX zr=r4r1WA0DcNS64HNgM6aweJoUghrW&cQi zES;Bzc;C+XuqRcm9;fZuE#uxXAgF_u*wP6GAR)5grkay)+^>(HsN!QYDS$EO_{XYI zlPV8=NrBmI?BY2bqBvKYa&BS6B(B}(^

    F;*Ob2Tot}1mxy;lCTFp^t4m6RC%5>| z8{=_{6|Nl=VW;cgpUxRu&D}Y{X*TxJ1|Qo3*%>^SBoC+QR|TstjP~25ve_Vh&%3P= zaPaRHL;%y~w+q>p>SA+Us_SI@A|`2yAEG=CY1%;Uy+aB78TxKWUaC8orU za?-Q6m+E5TgJ36IqNH`-i9fLqZRtz&HO-uF^nVu?KlKNFZMVii;MVu94%7azBp9_~ zQb87+Pd8YSrG-`k$%E(q*wcJT>`;B#{x(ydirh80x%XjFGZsF~FV!X}6=}Pj#97wf zv;-540sNeH`cu6Ux>8!++RIDl6vl|q*!$=%p?#mJOK}&z*+Y?tBt7WdgbiD|;D61- zER?kWN`SD89gcn>ydi~on1ja(=y(X;)%L3^q5_hB#0qQ%tm>|Um1EnYAgFa~M}%V9 z7XV_ikA|RXH)gyIKdTQ5ZCH_}OMoPxHu^aW#!dC}avP3}$fQe?#E_JCzNPb{=a;+k z2}IUcwJe;Kcqg0G+_~7lVqBSP8wrC&CH9=SzPbS6ms>GMvU?8*}5UhqJZs71(z@L5MC0;eTaD>0aypyJ|1K30aZ0sfn#jlsyR8vB zyM5|FroF*14w6Ph>EUDZup#>7#(BGa$0x+g?{lFLT=U4{O62TRM~1VL&jGFcKsfi) zS3yeQ$|(KfpcN8iy)2#TP@kIBL+^s9Ctg|H&3~YdKg6|Z;4d@%P1)YX z4D&Zhhlahfp#d=hV!Bul&lrboA8o_enCLtR8E7hKiNyTF>y9%GXT0Me_72WCBPqgg zk;2*wwy|iEwwV6CV@s@?HJmWq65I$`Xi%SQOQtjdcGn+sTtvP&X9pi;;8C_g`@-p>sL2bNuBb)x~#AUdJE<^=U@5i6g%&pNEts##t z|5*P*b@OcD2p#3xweu*J*;1i`{YrGA7R0QERy3Lxa2cQ(hUOI?N`S|z{uWawLE!}Y z>REg{YG@3JEIglieATgcg#E8ilvO91LiWnsWR`gT*A{EGW0u5Trv($<=3v-z^`+**9Dq#45a>* zfVf9zvNeyGAhxupx~Jzswx}_xZc%Z*G-E3z!mAX@=d5<<9mG0T$Tuk5&oX{3cb@xO zJ-XS2V2FaKiX9|#XL`1+{Pp6P0-m$(dDw3-LTd?Nf9*frd8w?6bJ2WHMhk=a<@9Oe z`YjKTi7jF;`@Vrc-ehgdF$GTat`D5|^(H0*bN-igc+t<&AtkweWJE9SocG3hVko`x zzR%Y)Qw2TNE9>AL$^jEh8g$s(ORflrdbGXXTbOYFF zkEW}KHq(tlUk?-3c-Mn9-(gzmzxB*KL5k1d3cFb!P@Md%)a;JZr3~+SY{tF-#dIan zc?*28^*UMMewB4YyBh2vJQ|pHaI4Qj9N{v%5<1wA1!f~+jLH%Dkh>+}yU0tk$hk{` z*BaOpM}8=!&2GlFmW}TfML}fY_Q~4}DXzVNIjNEmgLP~EC%6<2lEXpf{rn%K@bVI$ ze*HV=dN$?V;cDw~;|F5utln}FwmfFOh0o#^NHX6vlpTamTG+zKiDeb~ zy}QbphtG^r-eJp?nnlWue`M@9Ga*X#CfoB(xtwgJI2B#!IG0~u5r0LrV}PCQGt@dG z=+-T%?R8!d-jl%mXcvtuz2#Z47?nxgususgbPsqxxGqAmz%4(Do!!ozt&i=3@mC;E2FW|T{m+_g5s@65;nWci9t{h#*7}s4>Mus~jFWz}+5MjIG z(JrrH$wqW8J76Mly9)m+`2JN}|0&1#Us7AcRQ?IlVxGF-GDF!wBfN(`gxo|nUVVTz z%#{e(HU786YyUg;Fx3OU&MWN-kq%6+9`qOO(`XyU`s@#9JRG&y-&j5uSdLlul%yc4 zbfatc9%6i?u>3#4$ZyP+8oEJf5&MtXwnk`w%6xWmT+-!AD!=#Np>)=atRqI(BJj)s)Xo%iJ2%MHmF@#CxSYiqxPFayDBlU|oy0C5d?j@r z$o`mCb<~9~b{XN6NM^R11)#t;q@MjxgxS2gb!^OnyfEhJ&PuC zRjs^#5}H*nthHfVcj_5IQBj7gr>||F16%mg#pY*Uql^OO4&5l?{wT{^7{>%~7Oj6w z{8o&sW71Nv_g&-jyQ;?Z_59|xw7-!_{T3G;HSR8X)bN`i(XCDRVKzDmq>2F6k5fj^T-XZUyOzN&h99fNhn|| z#>U_&&DA@gs`vO^iSo`)jM60p4VEf}kGfDwHUs!{Q=4i*Dkjn-q!ir}fW67Z;6o`8 zB2APtLPg=(cRS{ZcrI|KNNl|S=a}gq=d{Lyni+LeSa)V{r(nTb z8ymzCXfAqL|6S>-1^waU4Jsi8KQF|*oPQE?I*@$qfX^!1agB|l=e_~kX;~+}*lHk+ z(6h+PFlD2_k(gpvuJ;(3ZIynkDl~dbuU0Jyl1?e#8;Q(D7s_ed(%fiYa=Tpe^BE1O zEHS7QFWOy2&ORMe!H|ysmkxPYx5si-F~4hBD&SloJ)hS{WW5*{(mvjNs%scC4OUeT zo?@jm7l_P+zG(jzgNQ?U&CfT5^zA+7=}@8k%CW}Af*kJ&QIq$~m*e5R_woW$YB$xK zRdLTl#BN=?QlPsKFfD8b}I>h`HGB^XTC-d3)!{X;FC-%WGdjnjRd-QgFxN7K`x}bgZB- zDm!D@-X=B;8ti%X+n1(bb2+L=z;lu(TD_M5tpt?jkOb)C#6vZ!%pm5@U5S#jBN<>4V=Ld+%mhg4b49S*hvB>U(}3JP%$-2Krp2@=@p{B*je`F7pq+888q3e63pgl#;2)k#L18vYvEYKp z=fZ684`TC`Q5x6&QY7JgXHS_dnPV^CQSnd72NuZ(j%?Li#dr(6LgJk~l^AoV4I&Kr z&J4;;8lXnXxO_6ob4DGb6iUEC`P1&IKm?oI(f><_-zYW9%}-C0F1ln2z%bn+^a&)RpYP{$$(@#ks(k_)Bj3T;Qk3=%y)pmOEB++Co#6wqVXA`1>xP?+s7psW= zH8)(-N?H1SRmX#Xd1et~zxMIcczP~H5k4I8{+^^DLCRs(J2`7DQ#`b4<1&B!x?uEN zO&qk8r6!I=Jauqs#^Em|%MMF`Zfrz!l_7ckwHTnmMAKf?(2bc{otX~&^?3a@K!ri< zI89?qwL{gL^de;NXpj9AV$@qTHxk`HJw+-!D53y&CWYb6Fbz|9C3O+3B)`$2ykC(F z=jA`AcKCE_MmijZBw+1}G@ZsQ&(GlJe|fB zk)OgNufPBz$&>YHGWoj0hE>2*w2ze*|@(xelPX`gao*g4(OPhL_oTdQvTq zL@2ulrb!&U`))A?BriN=p8ekq1rq&+k2!_C0u)!99x5Uc6SBGtEhBT|ct9{UbIZS4 zAq(0XwFoKn#=XRHvHuFOlY-_}k*CQ0#8p}ItaQ1mb8K9d{n|KY%RKC1$wK-J$oKwK z1DurZmP|ydPCr8o#rfI8Z27#&|6D`##9sw5 zXwaU7ZFk?6M_$Jr8r^KmT>j93LMa4i7Ml9NmGu?>cR2cMD~6x%^KlC~ zBA+4CW7rY7B@tSbKAhg=&Shl$ysmG39}T~8I8j&-;maT7bN=q(2v>KenHy>2%l#D<)$N83j+EqS|%3R+U6seZHX0p|@J zu0-B8B^lW*g4tF6V|uS1jtr^}fiXHQQxlyPLFL&*Jy=l zD43(3xAE-fpGPj{-H5!{%}W-_yIT?uczOLoYC5Gw<6U2Ls`*KJ=`C4UH>gahB2Yd- zp~f`}jZg3+9EE1*N)u-nHsenXl}`H;v;=Dn$!S-3MV34ssR33OHc9n=v#xg0yjX=L zgrkXCF^*;JQOd59S6~N6JP7WqvdVZ2@KwR^k1Gof8h@1D7pk``crXh{5|>?l)8Yds z-%9kyJVcl@%deU08>c|>-Dp#mukq2HUHU3Bl^Dn6Mz$KG($G0S*%kbq%1V!2xuW~9iI}m=%BQrt2qwq9$)~C z6v6n2dt=+*R7%SryRDnm9lG4<8Tr=qu_=K`-o1*^(;LvjH3IKoDLNsjV`bQ9Z1J%Z zkpqq3aLI6_H^Sj8dkAOQa97o~L77D);r8m!-r?lSPhuRotR2DRS0_LwPvWiZfW@UVkd#bPNOELgWf ztSEOi$Ea#m{i{YRlA>@k3Pe)ME$&)kwnGe7o!AgZ`NT}0KGP8A-H&HK5e&VsY^^yp zYjvyhS6v`F0SCm*qVS(rJjH{CD!*=xL$2Z@So49RJOG28)ccsQ3%#KODMIU(WmM>A z-EKlDPEf98sm938__Cx|^DI$2MBTR6&yvl9dv;(WpLcBPy~7Hw7nS=krylq@QeSbZ zq*|~(+kDt7f=Pmv)x$Xvg4qUxY7Cw98dQ{_q?+(o;hE4Q?Ic}G*sJ7(7%}Yv9Qo(+ zOp_ABg3d#A+0ioqQ>)DFOJg!AU`Q}mpbq=FX^zMz$*$nrhR}+OM4O~Qst4Vw-wGJb z<`dFNp+Ywv#;sMml$izH8Q@)+kH?=5N!)e!-PGYU;T`Fs@uIG~(u9l3X2QQ}xK?%# z?ckEFIGtuM1J!6~*%x?pb7pTjXyP?ygI;TK^sk)qk3XrMoL7epYJD?-9NnE*zP_0oYSua+tA7lkS)<0ha?jUcR9}=BSP3siD<>jQ(4n+>W+~re7`6>il1BHi$RBcQu7B0yR zw(!mkCTpDbn^gu6eEQBjn0Wnr-cJF`btJx^!lw0gh#}AB2{hE=$fJiX7jvgbBMoz5 zU*U%?6`LNo)XQNou~3EL8)xib;+O0G3CXSGuCZKQ|_J#2_kcTP9l6LB1RsvtY5-P(HuAN*GI%kQj))^KD61a36@!tvyyn;r`P9|R=TJ7w2r`#;ID~KMsfD~9j|iny4^=ICBena zMH_`cg@>SxYAi?A11W=iuKdAgY;(Ias`o#@%%<-|yx+clj>H)Rg79*`5#H;1U z)%X^r0)z@B)1?I^(@zF2@v{z-UQ$YD;c8OA!X(G=y)Ze-UJQ|lR>~1M8(`}hE1`|3?qeH9 z|f3CeIz4;xkAOUub zN~V=*1hhYWUnJb*%mkZU?RhOX(4=MyV569!{k|*tN^B?A9)Z1IRLyVbrVsenuV(n0^n>~G+x5AOMo`-K)jUt|Batl$v{rOd7C0=!G)G{~f&<3Fw%MZi__zj$3X(E5MyQsRGJ4nVFVfnqptEg~%R zGu5DMC?ud?2oyGf+R>ZcDh1}6qF6y|kn$bD_Z?T$W%sJuJq6}Z0fp`plVJ~Y29_+i(2 zukVxHV&+09^h?ESMGRVDpkt0`;tFp_x~*|svbn}?Pi!DH!oXgKeZ`ULA2D8z&&E;R zm<_29{D`0fjf%`cI6+$|rbG7hft4nrq|7@RtF7sY0nw@G6_1ZF z_N9GoApY~;^E%>T84D=s&Eim_K#n`ez=x5#O9lyh&Jc$;u_iO?!(8XQ@KhA>tfpGw&(B{ zfr)pr${sVNT)94Ge>J79JXX`x*WWclvOtF|Dh}_j95%4;~6@0_``7DkNKQ)%8p4GDJI+;m8qfFa$NQl z^WmuWH8{gImwIfVi{7^c`AL>BM1u`jtlq>=^~<(vD!IgX7;)D7yyU=j<&5w!oU zFuE9G0vkhw|3dp+E@kt;eYdF3HniIPczKGqX+tNK9~6NREuq$U|2yv!Tn1j8jVT@+x(%;9>w z7233~7bJkzEnoYvXufDh(r#mZHq=g1&?4V{GXF+Rouq-`s$Bp|b0BeEEu;i=uF4Ca zkn5P&T;a}aC5oa%L2$P-a%Bp*LaZsb?raci9_JArXNA@wLwOdZDV0@JX~i{Wi1UFC z2YJ&Cwg9WQNT+sR2<5JtOgg9duGATyD_vx;#K?0Ed<)zRM0LiD({JvF8TV{*u5189Rk^TSy8<>e^WX*EPC5A?NkanFFKuOd zj&3qc@J7Z+Y1vSG*C4FbhL^|D&$Ex?BLsIOw?FqaPvv5e6xdTNHH4OzVD}x+&V>U( zXqjtcsCHMpL~EFEv%hug0^KB7f3BhXN;2xuWMy*%y4d>oR%7X;%Vu9_A(RxK@6`0} zrkBVHeS;I)J3}`>Q26$8l4Ch1Fop?36r9~kiXzl)A&1UP6Xi!7BZ$rGek*zRYV6i3 z2-6uRvw$K#qV9v%ck;z*cWhfw6u5(OW$mp3Jg0uUIP^wX10Naif^%)6*U2+ zHA*9KeBC$3-0E;HGmX8A+q_*kb(x0em%b5Nkcb`H=t>%-Saqaid}MbKpAo3*U)`uE zJ5K3a*mTnmKo6GK9=lu(4Q+cebya!f*9M>exHA#`eE#o{&IVavIr*RX~CTL9Iqry4fGau5f?;n{37ucT@NDMI@v<;oY%tedtUhFg$q->b;9UqQKWM;04dbK@ z#jqa^E9)!y)_bAAfPd2F zfVGt}__I73j(#U z0Xyb70tEFbt|weFS#-BtDlR>vaa61k9VLaS*0hN;w_AYkws=pRuk+3J1(V;A^{mZI zk+}^faR)B4s57tkeg!G@Gd1p_^*qGZDH@pgpBzVsv3jy<~o z+i*}?3Y#pRK|3bI-f&2lK=W5`{-}i;40wlzGlFr*7|(!VVrWpu^lVT)j9P*cMvRN? zrY}a8-4q%i4`#z9nCtkWVB9+5Yu6ZtaR(%;!7vS=2Ss`S$@~l)c9?h`fNzADsOSHe zd@L1`=@&urPff2pc^hWW)+X0j_N(!*k%^ew65_Hm9a|12!$RRjla6-6{^%%T^C8+Z zNRn_GzDp86=ZiE21f*x4lC*N3Hc2Yan6S`xsYX2)rURa5a4NH&y0zf2B(W)WVn%S? zbUFlF1&N8>xTyaG7FmZHFU)w_a}^#eK89bL9RRvlIu}Dls4K&14m|2QK0$gN!a~(Z z)(BumB*r(+#AWKn^Ec|fCzusH7^<`6L8S6#81YEQ1bSnh)WtTKSTu+ubv&sYa~gtA z7Zp<*66TRAQrWNVX~Xo5-*ZZ(!v!EOtz)%XdQ`9`D`|5ijIs$2_9Zfgqwi?hA49mH z2HJ>X<1CfZ!aK(Bvu(8JDaM#Lx6rWeH&TT0h{}aH0p>)_JP;{9cF3d$kH)tPfgA{l zSHZ=EeG|JcM)VH2&Va;@-S|iZR7Udp@N4$tWSf}01*SMEq9%G#P{BM>>h8@7c0~Z< zsZE{7A{q*xam~3Mj?m5{6HLk)cv)5cKd`KW$4$GTa>Op|%+2KV0cV2=@itVzwAo!A zg2e!$#0rkjIT6Ngo;SDA)&s9fcbWqjEhl^Oyf8fEiG`B=U z>Dr<4x>80(mZf&;g%Pf9jB{56JPQuei^QqNk%&Bre>i>VS5kgnP6&MR5lHIr0W0nE zBC)z@P3gwx37DkpW@mQcUeNGa&KSLvZzAeO$b#!9%wL%dw>JRP^aX+E7MS_;%)cFy zJXJq&{t*v*-JPQT3wiwtp(ze`1=~+$H|D@}6aSZbXOyTfgAPevIodTBeGJVHc;bM| zUT_o}g-g01EUa#S#St3B^5t7LUt5nmT41b8Gn=Q@foSt6v0(6dVjX&E!wT;{-?jz)j z?#e*awm}Niv11*N^mmyvfo6p#!;oq_jxq4+2dmjUa=2F+#Gjn++73qHB5)+QNA}Qw z!LS={PWSD3Cs_!@ZdiMc#iv&}PfXBR{710hh_OfnDD%21R819VIzRb$pmY+kqC|zd zknMkDo+Gb%plTMXu9&zwR}42dW&PhVwnk?CQ&mp#>zsNqco-;o$++A@KmV`Rxk8|I z?*GS_{r@};|J#$U2%M?XlM#lGof||?j0JaI84EkY!KACo$5I3^yOG*GVG|0hi2S^W z-?~b8xJfPkCeB>`0k3Jh!g>!TyA1yQeOB5ey(XD^WU+=Lto!f6-M=^f)NxIu>EXTc z_LSPD)alB9pI~XF8d3BMO-ZyNrU`PE6wsE#xI4BS6(45|pFpa2a=?AO%%g3~%HY^l z?qBk4JzDV5<94XDd;$Dp{lj~3)j!sNtN4Oqpt3p6Pwk0h*1ehFhbK2}Pp?LoED==F z9Yq-RrjDfNlA5FKDRcHVZrEdEu*p5Nk%HnHVqhN2b_m{{!R{8knQl2OdxvgYfx*(x zgfKET3=Hm#JpRCKoG}r^`L;(Gb}YLW#QA38C+qExD>fgR&Og{U&t~t_MtcYhkwaz= zju}%S>4#ki=OwqRUCZm+!9$d-c>=OvfYa@v+-mq=WOltBzW)|CKfMP`>c8h_z$Hr; zPXvO5!vm?DByBPcZM!4`eh7v$EsE7{*Yt~AMBaPvivj?NI3Ud{D}c7~!Q?IBJJHU)d12Q(W(HFO#E(3d6~iN;UrPsz zZoVD;>CcO{B>Yf)+G|{r^zSlW~nT1oc?D6Jn=~;Ri)Z- zHJNERkg$(aA@t#LS*gTJm-TAK7~HzIgNXM`^oWFqGie03VGLpm?6xb-TIwp}s_3k* z2qN)YbCNqK2@fH!yO~TT!VB`L#_YEQQ^!w^M71@8qy6`41#JW|`F!Y#+{V6%{^`NR z_8BLl^*HoZF6$(egy1?~QoXgg01zi^t>YcKzx$8gplyhcWap}TST~XYwc)( zW4TE*yfsv`NxhTG2+B2on$<#u2CF+LZ5Lt~XB`i0MHw}Vu=MykQQ#*{8F^~sA`B%@ zJ>?l$Jc@#b+O&DN9etyHZgXRD)oEsY=4*yf8+F8m4n78Q*rFd& z?&*k-Xtl%D^W^u;=rLUoOP7k;n;SjV-yU~3Wup?n?lYQm?vX4Y2PSs8ABT8ykk4Fo zMHcFeq59N|U-Ft?l&EXwlR!KAI6h7P?B0^YIT`9*wIIq_UBkeceK44w^R`Tq9(hJ_ zFi=X?vt?hAt4Q#1(sNZ(Q8o=6&s;@V+k-|`=J<1f!$JPdwU;^W^t}pFx$7Du`mp^4 zht0wkO!K6Gj#p<rSHfiB0|<481{$X^aGG$@)Gb|G3muqGaZO# zlW4ai3o&x)ny)JIo#ms$UN)+nk4B%Oe{j1hyYVl;Ftc&S>#R8E9x((~OgFV^0 zFb^4$;l9IT=M7)~NopCn@h<_P0};J>n#oSGqf|b}+ng#_7p-|~$%T>?ha@v;aX6i= zQ3Z*TcV-zHJ>}susIbnw(V~tvl?-QgF&VEf7;$6O8mUM;Sf0^kl59J2_44d_N5DZJ zza8v9<)LrT#Xv?WFkkeHcyK@2K8`zLQ%6T3=80R?ve{ktQIyQWeHz-d{&@p9p%B^b zM}|SM%l#8!H~FX!Z@4FJiHW)BW7bNZ;TUeZF{ZMDWO95h)H#1^$Dm+cFu+SU8$X)s z!k>`Zh9yw@v^J%(+O{MXUaY=z#Q8|;2l}OMv>3ks%QuUMu0u5**NpPDVrX5M+c@<% zX=j|mf-)77Z$Wj+th~O9;u$d|m`~G1ux}pF0UUv88pKOl%RoaLj=+VpeF^Y|OX7*S zXt(@Y!%$zcSYEQNE!FNVE?46O5q%Li9w2(A70&U@L&~mhxFfkAU<~1cof>>?XPBw- z7oTMCvEPW6LGn9`OLO26k6+q4CvW`}n^$S#yS0qJyqweXdg&r=^5fa^s0&MBatHC8 zjI&dAZ_^IdUmeEtKKFA?l|Uw>DHyx;2l`}ycpLjS>UVJ~MMepR5LG`W+QZMp*wK(V zC%N5~)0$I!Kp7>*MnxPIGlFtO`=Dw+YR)$k>aoKOkW6bJJ8&9wl~2yS!h$Ve(_b!k zjjMHske6bgM4<7(aG=QCd*u5y8kF+ekt!urpzg*)<8Ii*E6?bv+371sPzDr7&7}8J zaphL65FoC_Zf`j3M;gwMi{a6U6Ez;1b_6Xtp)@fqX2f%hlX(0# z^q@rzQg>U{aE-4i|gx$6B3l=aMZnZHqx9>h^Fwe0dPp;V!^>oda*2* zVY|x67QcNv9qee`Pbmu>m-dROD&C zIpgjs4GQtnC_~GqBpF;&?#8EJ=029|rtyR&ynO;WMT+VBZh>C5k2ZHM1i8nB)?kuF z0Wsi%VS=5;y(u-9Nq_hP2(F1wAr+>oC2jY{hLga%IBn+S%&BdbD|1uOP!7aOW!f7x z!a|**?b15fhrCMRQhq2gQtxwTl2I>>l;S=?LPPK^=C%3C{VMB(ZoRzvb{zpXAmfKw zXLM;qr)=_d%&bmgncM!a}bzwVj4%Wx(q5=1R=_xW3|+aiN$xZ2bdYDPi3?mg#Nc z#axaAm}G3A^t3@%B5YnrYNFd}RHjRB64$9b!-Ha3%f2SFm4ssSCbXK7eQeD;nA7j( za50?NMc^4BvGx+l z4V{$kC$*v+WAjjSNei}lI=sd&S`t7_zvT}3r|C={0ZDuMARJc_SI_Wp?VF0l`bk)* z?&ry?Vf9Edd^F_b`6gXP57B7@Cr?EF7U~(?9<7*d&E15UC+rE@V#_!oH!ikLxhk0X z&ts5usg!9eBZ#dpdeXxSO z?S`PCJU+CB4&c~0Lw6Av!j6l*&joV#kM!A4ot8}i8|tDCJ?wm?Vu z=|18HsIr0^PNphW${Z6h$sxV@JJ3*}Y9jBC1xE0z?<&dKUa*(5rV?O45~pBx8||V} zPoh&n@`5^&N&L2R)RAs#TFU~aFvmM@T?dRZcP4@_&`qpiw zD;Bqx`izICS7L|@Br<2F`}6Tv+8cYFrY3@aU)GB!03l3;NN!k?vN!_w5fpK?H z@=qF>y@qjwDI`7e{z$6=-?SKj(3zHI$-^1%MGZ1d=zwVAX zs(5aLB*D9Vbm;ck2)%12h&s|&aM{_DMC?iZ%3p55nT5p(3RgXVFSP_j=&6W=NpsE>GCOfbBOTPQWNu~Jbx2J zKN$FlzlW)%d;OKw{~Jg6|Lz1}boo!G#$2e~BfAke-FBslb(;7;L6b-zX!5^y-T&?| z_#e=R6XqRK_W-M%wB~QF8>b;Nfg3WR1kV6;$t)hI>~a}r&nzd0`IP2GlmUsfN0;~h zt@DuKMbtY_H*w8VwT)Djh1jB{#2YAvn$wVOUvkqQ&wa7hph{u>r_*{(35V#5$!Lsi z10HAjgRWW)uS_qlO=IQ{5jStU(O{F}yGIMR&F^kU8;|4+IacnkSnotch+pOHKbWR| zjyjpn{t2EJiBQb)n~k!AcLkPEDAp$(Wewk14)}N$EINwX92iKLZPSMnjV|eR{e=jc)+Y++@kF=lBH53v+cFED6|}Xy-H2b5A5^7_B{8*zYv%L+OK9 z!&^jGddRACm&IaDno-=$b+3OK)xP+WX9}k~?Er`ble4fYrda>xf>fL2q5X4jzPS8@ zXwTsbE+ci;UEh;i$!oE_Va?hG%gX|fChn?SpEHp6Hqpl1?QBCQIcd6ehez>Sy%u?W z5RBq0Yy$D*AZb7my;tx)gOloqxSr9--QlgAMr=oSk)7+6UqafeYk*T1Uy3QybtS}) zs|Loud|aqNjcBWyl-{!3*2q@eGCDS2*uLU|Ar~8iZY=u@=g4XhVbX8$p}?sMAq&YB z2?f7gtX_{9G(6rrp*{Sj?)!}Nk;uF*2{1JjK2YYFz8mCx1Aq;V&A(vdtMrOd3u7>@ zn3SYh-c^wzi1pI!jM#lHcTEh$YYd2281FSZgIGHm6Q=Ks|=tqHTe>|?ii6v z+T}tOL73k74^aXC#~0H)FgnV4&b$@Zh??8=yH>962au+-aNmCuehjDLmTAmR!?m$!Vc=`D3Gr5?^}zjvLrdjJ%B_G&gRFq_aO{Lgk2pwsaUicb?MQ}m=_{^39V=~#OVyY;LQUC+ zG-<3Vy7(QRJREYo0S)bg725)ax*rInEB6LCozs>yheS)gQIb)7lTE+5Ogo%MrhP6h zp~xD$nvmwK&$e$(0L|QYhOv4b%%+9fpcaSPx%pKq=7u()K$^Qkomx_J-WWMZQ(|R) zXi}fwmF{+H+==%7MBr6auJsa0ZE|igzKvE$H|M@ljNqOifwQf+;)mGutT&ykv4^H4 z$_ZekP-{g2I%4sEuUznX(|nQ2v7eu*1;bK#f8CxFxW6saSW>(!Q2kxC)aFpJ1#1tIZ)s%`;e6i1}sb50{L~hI(z8_3+ zKN}2Kmi*D3V|xMjDUG(|T=fCTA_rx6F3yUyDiK96S-bb#gb$|RYq!FS$lK%YQsBfG z-r2ie|8H!752L$t4>&2BBl{|ONT#*6;ceQAlBGqDV)!*4r+`oz)No z;X;oiURK0dySed#)2R+GLkV*^7r}2W>hHIxE($+M*@x~|*=+cy8~e-0_**FF`z(ue zRJ{b2>VycoZwlmMwReKb%o3 z;sNl?N|@2e$$g#k8RIt!^Z3x!pR8juU&*Q%xS1!SXJY;A+0s7ks%e6 z#+!Wn6YL)!nu`i-cS{J43x5eHM;hE}88F(uoK8h^h{k0FA&L@4sP(A|nKguv^I-0HqtKB=Ve37IV->Hc+msv*AJZu>X; ztm_uqpG!3Dkm~7E?K3C|b6L-QLgn;}rmUat?^EWerA36|y9;@!Z3M2kIFuv69iQ^&f_`@bnIXO_D&a=vtqOhN_B`E2MFfrsrq0&Fqq?OSL`Z|RI2(qttmQ+b& z*8Fg>gUv)O2!Krrm<{tVO|KhSR2dT?(f`Y(>qE5VRK9pdd$=n)|JT}U*)w#@yxL3o z<%EJvlqQ<6r=)kL_(bdToF0Skfx}Sb8^<@kH+Z(yupuPosK>N|ReldcX|iz-mI=F} zB@lVjI5Cv45n$FFona9%c*nM=!`#mA!t$<%FSwetRrTU+c+j~2@gA{J0?U|lv+MJA zUJHxKd{P_pQeL~|<0x+6ya%!|dY^!AHl>y#dMDS!h3!*(C}!_hWZP-X5?1TqgnK`%W-dj^M^B+|-Q0(6O+iN}R`8=x%FtEO)?_p=e`l5?_f0^@w zY{je6qDt1^v_YA&R^PdUY~xev%=z3o85reIf*xAK05XGs020p+R# zAR^Dd>_+fxaidpDtxHF^Vd9^jp(l=X87kz2l^5NpF0KXz(1UqPCmeO=jPO*UDI06% z-8qw5)#5j=$#su(c=ioUtk>mP@q>%KUV4~%HS=%K1qFDXF6~7qk_Gno zmksT98~jF+@&6Q=?AeU@s&BYa7n=;Cw$>{R9mfKvsf{;hc2keHbASAuVuS2Y3&!Tr z5Psd1C=!fDoL5}Q6{rmLv^AqqI)4x0M;|2n<#OAQT15zYnDBPS!)az7xnNh%=>;>* zG<^5#rU&n)^|sqhjD2!l+{7NlQ^d&~6Az-{VUCJXR3hYN{o^nZ*i#_2w5Sory^dG)<7*9E~X@OjY@!l@On= z)GdvJVzbg1lcV2gZ_&5&dp9oA0M_wx<5Pin=`NR-qWuwhf7q$M$8LLl)bWp$ci3TV zUcli(CLBG+%pa>0PS|PeUt3LZ95;Y4Gt1lQ>c;~q1EvVIVN1EO6E*V_S78vLsrj%T zGM%2={0IXzyLt9Ga+`IX|5O6=8xnfV--slxD3;{z=iu!?vMPuwJvAF4cKO8aN&NkAnUB_ zBe+5mw=wCPl0#!C9e_4c7eP`jn{q@~hn~Zr)C+;s<;`7|QQpb%z)=fc%j~WVE+hV&!MauyUIPk*+TCfbCGbONC zAPg@|8Op3Ml#=tVf9Hs})|ltD?$UI5e`pA-se*6RE*Bqz!vQZ=n8F&7ty;s2j)wBs z%bqc6o}e4*5-f%%*xiLkCtz-yPRtdM%q&+dE7l69^^QEDv%8g!23@3x| z4{k>CJ@P@!I*GoghB2};3;)hqzgi?V;@$d5NR7y5wK3;U-xI+$yh&qY%P=f+vHD&W zh{fu( z9N=(I=R_H7bHs^_X{VgCRxstJzz@y7zqSsu2Qt3eJtuNU?qF80Xh*}3MHZg}17462 z`#zRj{a_c1DK#9v2-fWJt1k~2WTpbO4(s(SZ65H5DOP8e0urRm?sJQ%057rjftyht zKt^W7;5QBBnHG3AxL`DKWAPc;y{xbkI|p6*dC{h>*i^sAz36aGIO$GhJ>sM)OH(3-~M#6Yx+tHkTLu0{QNkmxm?8#((3-;c$f{iRG0+ zvZYrf%jm~+K~qE7oU*Lcy~L^9N^JDZ(iH~E%yopINj)Zr&#}(4z8*F}m)h#9T6aFf z@s2gio~fiib0|rVo5Q1@z}H^b%*-P{&i9;1dWRF!?Hm-)vZS05(M{tlfK;A|PCl~> zK8IvX+6m2 zM2_vn)eK+B$r~Cqf#T^nvEuh{hA=|_5{KW{e0Kik+N{XKf!1NJjy zFZ@Kp$oY+@&sXjS!H2Z5`@O#v#3?YNcn~@F`zkc~cVItr-T83hLBaTF*DYl$ps20kVY{xou8;B_1RSXacA3!XK zQ3Rgm7=QBlC7x{+ITy>7%roiS2LYyVi6Jk^IlOR*_y0UtH07k5+F8>QfA}dv%$lj+c{eT zc;10`d>m%=oat=vU`cgiH7MEV*zOi0kh8FLey`-8(3$t(!Bzj^rNenG7~aSi$?yh} zQoi5vOD&$yT5XlL(gmqg2xK<=fhPke6-_H>yQ>P#qVSC9a$E(o8GObs5?I9@!SR{& zFTvMIZ}2YPx}E6{Gzr)Y^22%f#m#;CKh_}{k#~DDG;jMvM>17USAK{=&Y;Bi&EcHj zUMHGeHe1_VV~M2*)aW?^$GYd@(GHWE`;E6OjWX|q7(FUad?xz+(94=SWrlcWwvupk zez3A=F(xlYc%=1Tskv|5ikJsrgj{IwBdT}@8Rnv7rbs7pK_}R?jLbkruT{Eem8oX( z3&>tgIC-%7IwqiR5#l27u%96uXFvE#8}xVky(bkhqrl@7HBx79p z3*7)CgulBttf~Ijz?^@R&Hg`dA^{NQgP-{(aUD&uE7^y!B!Ii2Qp%8Vc$e$saX9jk?90J+1>N+|;!j&w!z4m5jij5Nj= zxnuARv3sAdkz^=_pQu}ltSAk2w`Tc#p2fGnKc)Zg^bWZar*mHZdlHHCdxPP1aK;y0 zgpku5VT!D(EZ1+9#aQ~$EZuRxgEVP=9Io9<0OR>jHxWVS2WB={7XtHJ=QX(Nm+-mT z?o~9dv`6K;_zvGV%$68453~K5XNG z!f;VC;HsS5Y8vjzIQO~ndqOO1Xg}ds;;Ow}Qd(H>BWScX4zMZ76+}r`jfiJLKaE|SX4dVBnkmUYyCfaLnSx5<>kZ4frhh!Mk?BMDb1B*iDIaSXr01{oV<1zM0c-(&Mg}^(O-}dadM7VE( z_qqtv?Ez)m@Txm!M;AX_!wqpsZHCBVgyWSTOl*`w6X>i>QnPx59e5t42aZoe; zDF-eUPmt_kejnZV+mt#vU7_E?WJ+%LwnyXO+-be znHy)4ETW-WF-wn5QaMg*q>OdakFNUVPfDM27!CcQXpPl%r80Pm#6ppf+Q~i706AbD z-y=S(#?ZS)br@a=8;TzAFj#l|Iesw~Fj3%>U5#0K{ItG3={jHlkB4E)L&4P~G!)$Mtu|n{C7s3LVt^VRz zOZAVAKw7}7vFh^4kym$}!emwmM|h_t2!?7gBopvUO~WlvZ;&#tXXc&M!vz(Av={! zyiho%&vs^9bGdyMJQi(5aF*S3y`F5j4{x&90HkR^kGh8<`68B^8@>>9qT{Vaf1jf?W zsarNf4AW1yX5@z+{*sGq;6M8(oERa|W0tzhfZ0S&nSdHHd+3NuyhPq zahf8=CxgE0!sxn~Yl{1x>&3nOJc$}K=2Vc}O%!pmd&vMER2zu$s=VU}lJ0u1GaBId z7;!6W(WMU^1|dS)(_>4pV)6J~!R^$xi}1Cw3FOnOS{8m%&Fk*|A%M=a$Nl?x2!K4C zz9`N)jdaJu^a^jTU#pWjsmSm%LQIS8aRKt;L~WC_j;49~b2p!99X6UQO+YdiIO)xz zO+iq-1gnc-oHRpsllI^@pU5Pz?Ey8ZpdQW!=E$|JHMN2b{-|#GR0p+S%gIT7}ZUDgX`A>sRQ_f-`y<#DqfLZ_ng^;DeNP*^L9xZsf zDhMZ8TRpki;!%xIF0f``A zFUU)ZngeovJ?Z}%KwwmWx5AW!uiMChiN8rMdrywb3*PigF>x=VrAHmM$qDyM3}ofE zwCm)bnmi&?Lagn|4?Vkxo>c63Qm@#UMFjGylq-{XRSXMt6)!2`#y~6Yn8Exf<-iv+ zJ`T*?SSZg)qIzEJx`e7mNbKcZh^@Y2bK57DSh$X6u0l2N*wvGDNDE~ zyeIvr1Wba*dxxEZ7`1wGFoVr$Ymb6@4u@7ZdW%IeislP?-<(MdX#H89N6|>&#ndpq zRbO}j;H{192JqQNmJB4ceytD4y}AxO<){DCTuCQ88Z3W9`yS^f0w$sR`S|Idv}Gmz z&$VMSd1aBB@u(wiA;4IgZHPy)FmWq|1IIBR-CT1U;E0AuK`OlFXe!1oCuq}eWO#?| zoZocF)-}4Ro4Wk1^f5WIdVY4yV1$r;VEkw%p>7(e{Hq;ZB3;%2=zUmjxliye0LZ^W zaV6PiE-$h8duBqG_Di`HkiY_88tkRCbAGJ+Qo&Y=lVewAeDb)rH+KA0`|ka{A~<_1 zWwV-_eISw(3~|$^QEUXeIG?nYz1^R%7vbsp9*f;0XAPXGm*MO^Xbv))A3i^l7L+MM zd`Zg(>TspD)|YFJPj^x-z^9w?LCED9yY@329PC%wvxKHWYga2;$wDPVJf#(RR=RFG z8f;-n$|%c4RDyG*w31J@wDyv3o>2{!QprUa9PgR={pTE?bTQ#_PoiNHi(^1nVtdmj zMO&XQW%1(OMK_Ig*82*&^bRlO+;EB40y(cHRe&y_pF1CzlplJ%7~)aQXo>a!NPV`K zQMU5;PjtJy2X)U#Hqo*Jr84<}O%cJcnAM;r&u88Z#nhjEc;R|S1-r1)I}2}rG>!Vs z9m%n83Vp{9koemd+m3lXCrCvX-)VuqU2!z0!U~-NaNsNc%Ypww?nPFHY4V_kI%%$9 z@Oz*RF8ddUo?;``(h~I;Tl&`0W<~XJFj0+`v4=bIZ$bXQHOT(=f%E_SNPE0ych^+( zX0CM8$YLt#YlvFCiPFk18S@=~wHtedH3&G$aXR{Eg6(h%>~%WwDmJIl&@3{Rr48qN z)Q3(r!yz(8qy@ZgbL)J7yB+PLbm|D2u2D@fv|h;L(b8|gdVJxH<&+QHLmGSI5*Fo> zng895&#CL3{K85ifq2|~pQqu)iyW)xHp>tv{paAnggb_1%1(w*qIghkQUe0CW|*8~HT>e7>7&y_SpY=w(?51g!(nR#d))-y-(b}K;gojJIaI}r>e^3K5F@Wetn-HwLOX{Yv z=i{v%R`{s^&7b)A3buBI7AyjQEBMhz8s^%(!B}Sb5r;c)p}IpqA~t%k_El!jGJwz1 z^mYh+lnh!n^g^mdZ=C1a(To=Bcc#LQmn!o{jJuSe_kC@F-9}fQXv9N9^)HJ$LC2E^ zYi4dujE!n*JJHHY@A@V>%YX`ZB1jgEcN7SyDaN`f_mZ_E0cr4TwnW`cy7PFu(iAKO z*m+2eYAW+H^VyKbsaEE^JkVL65F^8~DTdP&-!UrGwJ18#wq}zifBzI}_+}^-@`k7> z!O(W*;-pL$v}VD$BpliH)Xr?27JP>skjq&e-DjDL{+~d6fjdEmW~v_aI;5Sscvq^X zsR6+0i3D#qA0E`BiS%+BrVfma--f+P7nba^(lT&A6MM+alyOr_=I;K9?M;@9$F_@4FZn>*EzzDS>czgd(lQ-ie}S3F6NAEeMyJUwS-=v|pl#W1 zC0_*Q*tJ7Y&&NBMyCiQTmES93h}=sk+1L&+F)7YfuSFzxcUeDD0v6f&HRJg_a{^)P z_#)s<#9Qa01lp6bR|}W@K(s-zW2^hS(sL=FX)*J1N%dYL5RQcu1G4s-bc7ijA0}ES zcQ=cC``))Udem$4FI}(Vf&p7BJ3__8d;YeHd5>jJ#@)8bF{>2qyMSf)b1~vuOiPo$ zo@?^Lzr)7v*Tw^h^3_g&mEsMao&3%D)4Mt~E-+*N8lGG7`-6?&KLNqY(UN3;N9rbX~N%!-{ zx~y)p{Tx}IgX=rLZTL(7R%x>7G|}DoD|@65qYxSuxh%yN;4KSh2JgO1#sjHdUcAsW zbIs1@^PyG=@AlUZ_LPBykd2Mj3Qtd72#s2Zoe)XTV4nr0#EpHz1J|!V{4-arv<0aN z9Gb()^?-d{y$!Aht=G^xHGGid`q91Wd~!WXNTr>Xdv^{QsWr>vYd-f3T^TA}5-tR+ z^g(=r>H_eMu;hyA(W3d)Mfzuq`uvry8bp1k5h}*7jh8 z6msR6r>NkJT5+&C7nrEhZ=$}Ef=-V;@KOKmFTK4dT-Lh_7Tb%i8Q4NNC#p^CqjdX5 z88R3nQnD*yI|v7w4O;82oQ3km)6hY$SKnu)~OucH-PLKWHr$l7eJ*6NzG;Pb9`))8$eA%1o&y z1myxLC*4){nT+XP3WF|InDV=g=3y@y1a!cm;(u;yJkY;PLz6)O_OhH{3npbs8{axg!v{`PaPG z@ywwpgPe+pd)5}cGGn!}G2+A%^-wXP4V5G3SJrzKf~`_g&{z-Ou{p)?MYlOrV-DQhc7yz*KgVETGfc7@H5+CLr3^YzJ`i&An8`YQXZjk3%!a;x;KjTo-d) z9Q`v*dOEHiei`s}+n#_DLV8aA=(oFNhS_jgh?r%OJ&qk#d-1=6un$AvOdO#bZbWwtOFAF$Y7-kG^Nk4c(fkC zVXpvWeURWbQbOUC9O8M(ad&caI(%(CKo8^ph?ILy#{XA?MZ;hRAFYp>rJXpO=|z@w zKHfU1L@fn5g*fa*6SCohcpp@&5!<4?LekVF^KW2ZB9P`QM~p_grBe%b1fs)4fMg}N zhL!0(jDgwj_3Rs?A|ACAx1iQOhrj^tn8_G)2 zIv+suSCM#fuNGWYM6EWOscEKFA=|)>KC`u4q=)l@`?c{X8Ic3d4oL3XtY$i3kEWc9 z`1Isr`L{SoYtb50FM)VBUNY>fd5@Ea#_->b?(@@h#{n$5Jkv`B!I8j*#)(WSj`M79 zK?O07aXHoCcJ~}i6#_k3%85YPNX?*{L!KpIY;yDKJ-;u$JQUrU^GMO!k@#b|SrDvh zVHGokHDxXUsIGuf2ZTv|1|iqS$#4*J1+2a}?&tK(P53O)QGglb+IFjK1%TO$GRDj@ z77j0CVR+AiXujhi!@@@s+21ZFjBuKasM^(}rs)0H6#Mb&xzHKCj~@d=_2)~jLm7oZ zSo}2*wDevP%E^UI@Fk02=?!gWWPk_VLQLpeIvNU1FWsXs>K;5zAa9&3SftXvVe4zOcyj&Vt`ypBe<#3SnV~#b z$2tEX`kU;uj`Jp5ppyx>m*ePs8f#=}5vJ&lyYgw;J`KshicYq|HJkgSsnmN$%A2+sHCgi;hHM0(dR zEsxXuTnS)wKxJDj-1H3m^Ua&dIOILKC4CYL_~8-eOw}0M*%8jCS&{ zLS8!Xp@;1J&V;!ar``?oZx4TzP+3jxbFhLVPT;) zgIy%K2Hp^40{5yQ1ptfpaI*zClL_`W;wL;C&X6^!MnUa)2m24Mn@}S`L!FI{Y1nEX z{pP!^%48jjWy-UF|A;k%Tem;b8I1Lhw;HL&^#6Yv zOM@3rE{HidTm1#CBK^LJL&3{M)b%V=DQ<{wf@mG&#&t>M4FBF!2ETWh2b#*dTW_DF z+y`|ot@KpOltjC)x>)#zS;84Z z78kffNdZsV?F-R|>RPOs6$YJDTq~5iWv@sMLLD1&PYeamRA4q;kESfT*jv94zmpO2 zk4<=c-xL|JObdOH{Qg&Dm#&MHs6Xm7CfQj#@Imi<@7)FouygA?}sAeGazY4F2c1yNs??t16F%MTvk4?!MEN`MOza^}lE*E&qUivj>lnmF(Id z$fzunW#EVpk{oIP!@fyEyt$?5J7+EZaU{iBM|a6XSqBFpZ8nvN zv>mZbLVu_&YFq#XLG{g-;6iN||Jf-!B|THP3<||+Y{I7^Jky(aW*aI0Pvr7(_!edD zHyvZOvnzbwmj~qEKqM!roADyI$3N|HZ*R)#GwW4p<8MY}&(&Vd%D3ZQ{^6UD7X409 zmk2%RFXn5Ft=mR#E7WXj2$$W3x1s6ab*>VUTqi=I?|gUWje6f^;au9xZ^`2YdW55J zf}};LdTAp4u;xc)NtA<%a4Dn6=x+w~WJ!F@qLIU78BpXL+pQbdGRBNaSwRv`Y)Lx} z6kVIdD0Q5w+#iD|8V7daoXTMzq!>Jzr+gb4E;H7KTOQ+UwW2gT3Z?4gguaxl5vD_DdmXJIwWwzdf0aC zsWzR3UMuE-9v-@A4hC^BGby5~&!Lh04KZtVYjyBwNS$j@Cdmg=!1p~j6yZIg;C9G# zDqJ_0chv6Ne~YIE7J<8}(Yl*@L5vG~%|$t*;1AN6vs8S++@=HS;1;%7x{rDC;6l$` zIuta=wkW=*c|^q(rGVc!P?pzHGnv=bOl_LUWg5G;wond{JvU5SZQW z$6j@=&pi4^efW4g>Mwy=NLVsW4c?uQGAc?{6D?i#g}XU1O6imp4$+!0b9*^vLCx+E~oxe55BRE zl9gfn?F)x0M5cU!j$aK-`!g9b>y|r~0!Kzp+sQLo#)?Sl>74a%ej@S6>vbT_eeoZ>V zII6_aCQ-qAlNOs9p0=GN$aKPSA-GRr%Uku?xkI}g7_It8&8M38QGubcoz=uck&t9f z_?q{o-w@%?+wOMBpnsBI?NQ4@Oa8UyzqfxJ42(OXqEUoP#%8cj< z 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 z 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 UFNr&N9{@i}a;mar(xyTG11TQ!EC2ui literal 0 HcmV?d00001 diff --git a/imgs/http-protocol.svg b/imgs/http-protocol.svg new file mode 100644 index 0000000..cb25a3b --- /dev/null +++ b/imgs/http-protocol.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + Web Client + + + + + + + + + + + + Web Client + + + + + + + + + + + + Web Client + + + + + + + + + + + + + + + + + + + + + + + + HTTP Protocol + + + Server + side + script + + + + + + + + + Web Server + + + + + + + + + + + + Database + + + + + diff --git a/imgs/third-party-apis.svg b/imgs/third-party-apis.svg new file mode 100644 index 0000000..ca303c5 --- /dev/null +++ b/imgs/third-party-apis.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + Application 1 + (User) + + + + + + Receive data + + + Send request + + + + + + + + + + + + + + + + + + + + + API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/imgs/web-apis.svg b/imgs/web-apis.svg new file mode 100644 index 0000000..1d6d947 --- /dev/null +++ b/imgs/web-apis.svg @@ -0,0 +1,105 @@ + + + + + + + + + + + Application 1 + (User) + + + + + + + + + + + + Application 1 + (User) + + + + + + + + + + + + Application 1 + (User) + + + + + + Send request + + + Receive data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + API + + + + + + + + + + + + Application + + + + +