From 46e9407c60650fefd0c0a3358da22d81dabe6f09 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 23 May 2019 14:58:34 +0200 Subject: [PATCH] Update URLs to point to new documentation site --- .github/CONTRIBUTING.md | 14 +--- ARCHITECTURE.md | 45 ------------ CHANGELOG.md | 10 +-- FAQ.md | 2 +- README.md | 14 ++-- support/doc/api/openapi.yaml | 4 +- support/doc/api/quickstart.md | 2 +- support/doc/development/client/code.md | 67 ------------------ .../development/client/components-tree.png | Bin 22104 -> 0 bytes .../development/client/components-tree.svg | 2 - .../development/client/components-tree.xml | 1 - support/doc/development/server/code.md | 58 --------------- .../server/peertube-architecture-server.xml | 1 - .../doc/development/server/upload-video.png | Bin 34643 -> 0 bytes 14 files changed, 18 insertions(+), 202 deletions(-) delete mode 100644 ARCHITECTURE.md delete mode 100644 support/doc/development/client/code.md delete mode 100644 support/doc/development/client/components-tree.png delete mode 100644 support/doc/development/client/components-tree.svg delete mode 100644 support/doc/development/client/components-tree.xml delete mode 100644 support/doc/development/server/code.md delete mode 100644 support/doc/development/server/peertube-architecture-server.xml delete mode 100644 support/doc/development/server/upload-video.png diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index b3847b8d7..b88027042 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -9,8 +9,6 @@ Interested in contributing? Awesome! * [Write documentation](#write-documentation) * [Develop](#develop) * [Improve the website](#improve-the-website) - * [Troubleshooting](#troubleshooting) - * [Tutorials](#tutorials) ## Translate @@ -101,7 +99,7 @@ You can get a complete PeerTube development setup with Gitpod, a free one-click ### Server side -You can find a documentation of the server code/architecture [here](/support/doc/development/server/code.md). +You can find a documentation of the server code/architecture [here](https://docs.joinpeertube.org/#/contribute-architecture?id=server-code). To develop on the server-side: @@ -116,7 +114,7 @@ restart. ### Client side You can find a documentation of the server code/architecture -[here](/support/doc/development/client/code.md). +[here](https://docs.joinpeertube.org/#/contribute-architecture?id=client-code). To develop on the client side: @@ -193,11 +191,3 @@ $ npm run mocha -- --exit --require ts-node/register/type-check --bail server/te Instance configurations are in `config/test-{1,2,3,4,5,6}.yaml`. Note that only instance 2 has transcoding enabled. - -### Troubleshooting - -Please check out the issues and [list of common errors](https://docs.joinpeertube.org/lang/en/devdocs/troubleshooting.html). - -### Tutorials - -Please check out the related section in the [development documentation](https://docs.joinpeertube.org/lang/en/devdocs/index.html#tutorials). Contribute tutorials at [framagit.org/framasoft/peertube/documentation](https://framagit.org/framasoft/peertube/documentation). diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md deleted file mode 100644 index f3254d2d6..000000000 --- a/ARCHITECTURE.md +++ /dev/null @@ -1,45 +0,0 @@ -# Architecture - -## Vocabulary - - - **Fediverse:** several servers following one another, several users - following each other. Designates federated communities in general. - - **Vidiverse:** same as Fediverse, but federating videos specifically. - - **Instance:** a server which runs PeerTube in the fediverse. - - **Origin instance:** the instance on which the video was uploaded and which - is seeding (through the WebSeed protocol) the video. - - **Cache instance:** an instance that decided to make available a WebSeed - of its own for a video originating from another instance. It sends a `ptCache` - activity to notify the origin instance, which will then update its list of - WebSeeds for the video. - - **Following:** the action of a PeerTube instance which will follow another - instance (subscribe to its videos). - -## Base - -### Communications - * All the communication between the instances are signed with [Linked Data - Signatures](https://w3c-dvcg.github.io/ld-signatures/) with the private key - of the account that authored the action. - * We use the [ActivityPub](https://www.w3.org/TR/activitypub/) protocol (only - server-server for now). Object models could be found in - [shared/models/activitypub - directory](/shared/models/activitypub). - * All the requests are retried several times if they fail. - -### Instance - * An instance has a websocket tracker which is responsible for all videos - uploaded by its users. - * An instance has an administrator that can follow other instances. - * An instance can be configured to follow back automatically. - * An instance can blacklist other instances (only used in "follow back" - mode). - * An instance cannot choose which other instances follow it, but it can - decide to **reject all** followers. - * After having uploaded a video, the instance seeds it (WebSeed protocol). - * If a user wants to watch a video, they ask its instance the magnet URI and - the frontend adds the torrent (with WebTorrent), creates the HTML5 video - player and streams the file into it. - * A user watching a video seeds it too (BitTorrent). Thus another user who is - watching the same video can get the data from the origin server and other - users watching it. diff --git a/CHANGELOG.md b/CHANGELOG.md index 62b1b057a..172509269 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -224,8 +224,8 @@ and update your [.env](https://github.com/Chocobozzz/PeerTube/blob/develop/suppo ### Maintenance - * Improve REST API documentation: https://docs.joinpeertube.org/api.html ([@rigelk](https://github.com/rigelk)) - * Add basic ActivityPub documentation: https://docs.joinpeertube.org/lang/en/devdocs/federation.html ([@rigelk](https://github.com/rigelk)) + * Improve REST API documentation ([@rigelk](https://github.com/rigelk)) + * Add basic ActivityPub documentation ([@rigelk](https://github.com/rigelk)) * Add CLI option to run PeerTube without client ([@rigelk](https://github.com/rigelk)) * Add manpage to peertube CLI ([@rigelk](https://github.com/rigelk)) * Make backups of files in optimize-old-videos script ([@Nutomic](https://github.com/nutomic)) @@ -310,8 +310,8 @@ and update your [.env](https://github.com/Chocobozzz/PeerTube/blob/develop/suppo ### Maintenance - * Improve REST API documentation: https://docs.joinpeertube.org/api.html ([@rigelk](https://github.com/rigelk)) - * Add basic ActivityPub documentation: https://docs.joinpeertube.org/lang/en/devdocs/federation.html ([@rigelk](https://github.com/rigelk)) + * Improve REST API documentation ([@rigelk](https://github.com/rigelk)) + * Add basic ActivityPub documentation ([@rigelk](https://github.com/rigelk)) * Add CLI option to run PeerTube without client ([@rigelk](https://github.com/rigelk)) * Add manpage to peertube CLI ([@rigelk](https://github.com/rigelk)) * Make backups of files in optimize-old-videos script ([@Nutomic](https://github.com/nutomic)) @@ -525,7 +525,7 @@ This release could contain bugs. Don't expect a stable v1.1.0 until December :) ### Features - * Video redundancy system (experimental, see [the doc](https://docs.joinpeertube.org/lang/en/devdocs/architecture.html#redundancy-between-instances)) + * Video redundancy system (experimental) * Add peertube script (see [the doc](/support/doc/tools.md#cli-wrapper)) ([@rigelk](https://github.com/rigelk)) * Improve download modal ([@rigelk](https://github.com/rigelk)) * Add redirect after login ([@BO41](https://github.com/BO41)) diff --git a/FAQ.md b/FAQ.md index 7d8be96a7..1a3b1847b 100644 --- a/FAQ.md +++ b/FAQ.md @@ -58,7 +58,7 @@ is named "Framatube". Yes, the origin server always seeds videos uploaded on it thanks to [Webseed](http://www.bittorrent.org/beps/bep_0019.html). -It can also be helped by other servers using [redundancy](https://docs.joinpeertube.org/lang/en/devdocs/architecture.html#redundancy-between-instances). +It can also be helped by other servers using [redundancy](https://docs.joinpeertube.org/#/contribute-architecture?id=redundancy-between-instances). ## What is WebSeed? diff --git a/README.md b/README.md index a5060cf0d..b30de208b 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ Be it as a user or an instance administrator, you can decide what your experienc

Communities that help each other

-In addition to visitors using WebTorrent to share the load among them, instances can help each other by caching one another's videos. This way even small instances have a way to show content to a wider audience, as they will be shouldered by friend instances (more about that in our redundancy guide). +In addition to visitors using WebTorrent to share the load among them, instances can help each other by caching one another's videos. This way even small instances have a way to show content to a wider audience, as they will be shouldered by friend instances (more about that in our redundancy guide).

Content creators can get help from their viewers in the simplest way possible: a support button showing a message linking to their donation accounts or really anything else. No more pay-per-view and advertisements that hurt visitors and incentivize alter creativity (more about that in our FAQ). @@ -153,7 +153,7 @@ Feel free to reach out if you have any questions or ideas! :speech_balloon: See the [production guide](/support/doc/production.md), which is the recommended way. -See the [community packages](https://docs.joinpeertube.org/lang/en/docs/install.html), which cover various platforms (including [YunoHost](https://install-app.yunohost.org/?app=peertube) and [Docker](/support/doc/docker.md)). +See the [community packages](https://docs.joinpeertube.org/#/install-unofficial), which cover various platforms (including [YunoHost](https://install-app.yunohost.org/?app=peertube) and [Docker](/support/doc/docker.md)). :book: Documentation ---------------------------------------------------------------- @@ -162,13 +162,13 @@ If you have a question, please try to find the answer in the [FAQ](/FAQ.md) firs ### User documentation -See the [user documentation](https://docs.joinpeertube.org/lang/en/userdocs/). +See the [user documentation](https://docs.joinpeertube.org/#/use-setup-account). ### Admin documentation See [how to create your own instance](#package-create-your-own-instance). -See the more general [admin documentation](https://docs.joinpeertube.org/lang/en/docs/). +See the more general [admin documentation](https://docs.joinpeertube.org/#/admin-following-instances). #### Tools @@ -178,13 +178,13 @@ See the more general [admin documentation](https://docs.joinpeertube.org/lang/en ### Technical documentation -See the [architecture blueprint](https://docs.joinpeertube.org/lang/en/devdocs/architecture.html) for a more detailed explanation of the architectural choices. +See the [architecture blueprint](https://docs.joinpeertube.org/#/contribute-architecture) for a more detailed explanation of the architectural choices. See our REST API documentation: * OpenAPI 3.0.0 schema: [/support/doc/api/openapi.yaml](/support/doc/api/openapi.yaml) - * Spec explorer: [docs.joinpeertube.org/api.html](http://docs.joinpeertube.org/api.html) + * Spec explorer: [docs.joinpeertube.org/#/api-rest-reference.html](https://docs.joinpeertube.org/#/api-rest-reference.html) -See our [ActivityPub documentation](https://docs.joinpeertube.org/lang/en/devdocs/federation.html). +See our [ActivityPub documentation](https://docs.joinpeertube.org/#/api-activitypub). :heart: Supports of our crowdfunding ---------------------------------------------------------------- diff --git a/support/doc/api/openapi.yaml b/support/doc/api/openapi.yaml index 9963e1d26..3c7688a7c 100644 --- a/support/doc/api/openapi.yaml +++ b/support/doc/api/openapi.yaml @@ -38,7 +38,7 @@ info: } ``` externalDocs: - url: https://docs.joinpeertube.org/api.html + url: https://docs.joinpeertube.org/#/api-rest-reference.html tags: - name: Accounts description: > @@ -1739,7 +1739,7 @@ components: - Have an account with sufficient authorization levels - - [Generate](https://docs.joinpeertube.org/lang/en/devdocs/rest.html) a + - [Generate](https://docs.joinpeertube.org/#/api-rest-getting-started) a Bearer Token - Make Authenticated Requests diff --git a/support/doc/api/quickstart.md b/support/doc/api/quickstart.md index 00874a1c9..2222be741 100644 --- a/support/doc/api/quickstart.md +++ b/support/doc/api/quickstart.md @@ -47,7 +47,7 @@ $ curl -H 'Authorization: Bearer 90286a0bdf0f7315d9d3fe8dabf9e1d2be9c97d0' https ``` -### List videos +## List videos ```bash $ curl https://peertube.example.com/api/v1/videos diff --git a/support/doc/development/client/code.md b/support/doc/development/client/code.md deleted file mode 100644 index 235116e78..000000000 --- a/support/doc/development/client/code.md +++ /dev/null @@ -1,67 +0,0 @@ -# Client code documentation - -The client is a HTML/CSS/JavaScript web application (single page application -> SPA) developed with [TypeScript](https://www.typescriptlang.org/)/[Angular](https://angular.io/). - - -## Technologies - - * [TypeScript](https://www.typescriptlang.org/) -> Language - * [Angular](https://angular.io) -> JavaScript framework - * [SASS](http://sass-lang.com/) -> CSS framework - * [Webpack](https://webpack.js.org/) -> Source builder (compile TypeScript, SASS files, bundle them...) - * [Bootstrap](http://getbootstrap.com/) -> CSS framework - * [WebTorrent](https://webtorrent.io/) -> JavaScript library to make P2P in the browser - * [VideoJS](http://videojs.com/) -> JavaScript player framework - - -## Files - -The client files are in the `client` directory. The Webpack 2 configurations files are in `client/config` and the source files in `client/src`. -The client modules description are in the [client/package.json](/client/package.json). There are many modules that are used to compile the web application in development or production mode. -Here is the description of the useful `client` files directory: - - tslint.json -> TypeScript linter rules - tsconfig.json -> TypeScript configuration for the compilation - .bootstraprc -> Bootstrap configuration file (which module we need) - config -> Webpack configuration files - src - |__ app -> TypeScript files for Angular application - |__ assets -> static files (images...) - |__ sass -> SASS files that are global for the application - |__ standalone -> files outside the Angular application (embed HTML page...) - |__ index.html -> root HTML file for our Angular application - |__ main.ts -> Main TypeScript file that boostraps our Angular application - |__ polyfills.ts -> Polyfills imports (ES 2015...) - -Details of the Angular application file structure. It tries to follow [the official Angular styleguide](https://angular.io/docs/ts/latest/guide/style-guide.html). - - app - |__ +admin -> Admin components (followers, users...) - |__ account -> Account components (password change...) - |__ core -> Core components/services - |__ header -> Header components (logo, search...) - |__ login -> Login component - |__ menu -> Menu component (on the left) - |__ shared -> Shared components/services (search component, REST services...) - |__ signup -> Signup form - |__ videos -> Video components (list, watch, upload...) - |__ app.component.{html,scss,ts} -> Main application component - |__ app-routing.module.ts -> Main Angular routes - |__ app.module.ts -> Angular root module that imports all submodules we need - -## Conventions - -Uses [TSLint](https://palantir.github.io/tslint/) for TypeScript linting and [Angular styleguide](https://angular.io/docs/ts/latest/guide/style-guide.html). - -## Concepts - -In a Angular application, we create components that we put together. Each component is defined by an HTML structure, a TypeScript file and optionally a SASS file. -If you are not familiar with Angular I recommend you to read the [quickstart guide](https://angular.io/docs/ts/latest/quickstart.html). - -## Components tree - -![Components tree](/support/doc/development/client/components-tree.svg) - -## Newcomers - -The main client component is `app.component.ts`. You can begin to look at this file. Then you could navigate in the different submodules to see how components are built. diff --git a/support/doc/development/client/components-tree.png b/support/doc/development/client/components-tree.png deleted file mode 100644 index 09582d742b9fc0d3035b9af910f260bfcace6e54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22104 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

I%lfJ@Cu@+)H{xr3;YwQog3 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 gb_ptsNnGLop -
App component
App component
Videos 
Videos 
Edit (upload/update)

Edit (upload/update)<div><br></div>
List
List
Watch
Watch
Account
Account
Login
Login
Admin
Admin
Follows
Follows
Video abuses
Video abuses
Users
Users
About
About
Page Not Found
<div>Page Not Found</div>
My Account
<div>My Account</div>
Video Channels
Video Channels
\ No newline at end of file diff --git a/support/doc/development/client/components-tree.xml b/support/doc/development/client/components-tree.xml deleted file mode 100644 index 5a37c48bc..000000000 --- a/support/doc/development/client/components-tree.xml +++ /dev/null @@ -1 +0,0 @@ -7Zpbb5swFMc/TaTtZQLMLY9d1nYP2zSp2u3RwQ54dTAypkn36WeDSSCmVdcR3FTpQwXHN/z7G59zHGZgsd5ec1hknxnCdOY5aDsDH2aeFzuB/K8M943Bd93GkHKCGlPHcEP+YG10tLUiCJe9ioIxKkjRNyYsz3EiejbIOdv0q60Y7Y9awBQbhpsEUtP6gyCRaasbzvcFHzFJMz107EVNwRImtylnVa7Hm3lgVf81xWvY9qUnWmYQsU3HBC5nYMEZE83VervAVKFtsTXtrh4o3T03x7l4SgNPT6gU9+3cMZIo9C3jImMpyyG93Fvf1/PDqgdH3mViTeWlKy/xloifyvwu0He/2pJc8PtOkbr9pTsoBeTiQqkmDTnLcWu7IpTqOjhHbY2EwrIkSWPUVdQQv7EQ93opwUowado//ifGCl1vxXKhq7nq3kSmKZas4omG4ulFCHmKdS1NTuHqNNOYrzFbYzlHWYFjCgW5668sqBdouqu3F0leaJ2GNQPOWbNnahZb08w9a/ZMzSJrmnlnzZ6pGbCmWTymZk/F9rC2gxyeRTSaiKAfvFKCPpiKYGiF4CO7yBR0/f+kq5t+ZUQO7Dk6k5jPdbCjEwm3DX7aLppn0K0ONNo9xtNkG3XreEyOl/RSTLWt6LHvIK10pxdFUWdw60K6Na1eDz6lMt1TkDcZEfimgPU8NjLh7KM+dFor6fcWjDJe9wOwiwIc1X6Ts1vcKZmHEYDhY27uDnOBt4+6MF0K/P5CbRO8TSd9bG1ZN3N0RmA76obz8Ko7hWAEmGs8tBWMtKHrOYD8Z80Ca5qN6wVe27vk29IFGP7jO0GYlTMvhGvlEPJlWewmdgQ3giCOV8mQGwmTGC9XI7mR+CDeaaOSKfyIbzC+REQFY2+qgjKIZPuqQFDgt5I6lQO/R+ROXqainnxjWvJDi2zWq3csgQIcI39IoNhbgnAkPx8c+vkofBcYEsUDCgUjKBQYCn0i5fFCp2mQ+laRhgbSH1Ak2YkzNcLRSZlGBtOLJJE+8tRXauBa3J1j891nKclPHOnu1wwbSHdBzznYa3/O6gZ77Wq3EIV70whz6pnTkGiuLdHARMcQr1A0YC3fnZuuGq2P6VUmSaNsZlHtrtlBesUoVd+knDZU9zCkBAbU+VBAGY3A1DWY1um/6nZZlfjk0Xr22AIzqfxWYn7qSA8DyyGkg/nPGEgHEqAlq15A+mPwG6D8INLQt3k4ZZ4ADpxCfVUf9nnOF6aOra7q7/Be6CnUfykRRTaVMM8JB5T4rB53l/a/Qg3mjk0NzB2mdYiLDOY5pkfcvyfB6zoTngzI2/03t823A/vvmsHlXw== \ No newline at end of file diff --git a/support/doc/development/server/code.md b/support/doc/development/server/code.md deleted file mode 100644 index 3894c2542..000000000 --- a/support/doc/development/server/code.md +++ /dev/null @@ -1,58 +0,0 @@ -# Server code documentation - -The server is a web server developed with [TypeScript](https://www.typescriptlang.org/)/[Express](http://expressjs.com). - - -## Technologies - - * [TypeScript](https://www.typescriptlang.org/) -> Language - * [PostgreSQL](https://www.postgresql.org/) -> Database - * [Redis](https://redis.io/) -> Job queue/cache - * [Express](http://expressjs.com) -> Web server framework - * [Sequelize](http://docs.sequelizejs.com/en/v3/) -> SQL ORM - * [WebTorrent](https://webtorrent.io/) -> BitTorrent tracker and torrent creation - * [Mocha](https://mochajs.org/) -> Test framework - - -## Files - -The server main file is [server.ts](/server.ts). -The server modules description are in the [package.json](/package.json) at the project root. -All other server files are in the [server](/server) directory: - - server.ts -> app initialization, main routes configuration (static routes...) - config -> server YAML configurations (for tests, production...) - scripts -> Scripts files for npm run - server - |__ controllers -> API routes/controllers files - |__ helpers -> functions used by different part of the project (logger, utils...) - |__ initializers -> functions used at the server startup (installer, database, constants...) - |__ lib -> library function (WebTorrent, OAuth2, ActivityPub...) - |__ middlewares -> middlewares for controllers (requests validators, requests pagination...) - |__ models -> Sequelize models for each SQL tables (videos, users, accounts...) - |__ tests -> API tests and real world simulations (to test the decentralized feature...) - - -## Conventions - -Uses [JavaScript Standard Style](http://standardjs.com/). - -## Architecture - -The server is composed by: - - * a REST API (relying on the Express framework) documented on http://docs.joinpeertube.org/api.html - * a WebTorrent Tracker (slightly custom version of [webtorrent/bittorrent-tracker](https://github.com/webtorrent/bittorrent-tracker#server)) - -A video is seeded by the server with the [WebSeed](http://www.bittorrent.org/beps/bep_0019.html) protocol (HTTP). - -![Architecture scheme](/support/doc/development/server/upload-video.png) - -When a user uploads a video, the REST API creates the torrent file and then adds it to its database. - -If a user wants to watch the video, the tracker will indicate all other users that are watching the video + the HTTP url for the WebSeed. - -## Newcomers - -The server entrypoint is [server.ts](/server.ts). Looking at this file is a good start. -Then you can try to understand the [controllers](/server/controllers): they are the entrypoints of each API request. diff --git a/support/doc/development/server/peertube-architecture-server.xml b/support/doc/development/server/peertube-architecture-server.xml deleted file mode 100644 index 3299307a1..000000000 --- a/support/doc/development/server/peertube-architecture-server.xml +++ /dev/null @@ -1 +0,0 @@ -3VpRc5s4EP41nmkekgGEwH6M3aS9md5Mpnbby6MA2dBgxIHs2P31J4EECGGbxLhNzu1MYLXC0re7364Wj8BsvfuUoTT8mwQ4HllGsBuBjyPLMm3LGvH/RrAvJeOxWQpWWRQIpVowj35hITSEdBMFOFcUKSExjVJV6JMkwT5VZCjLyLOqtiSx+q0pWmFNMPdRrEt/RAENxS4sp5Z/xtEqlN9sOpNyxEP+0yojm0R838gCy+JTDq+RfJbYaB6igDw3ROBuBGYZIbS8Wu9mOObYStjKefcHRqt1ZzihfSaAcsIWxRssV1ysi+4lFsVuMNc3R2D6HEYUz1Pk89FnZn0mC+k6FsPLKI5nJCZZMVfuHUxzmpEn3Bgxig8b0VcsNrHFGcW7hkjs4BMma0yzPVMRo7YAUzgbELfPteVcqRI2rGZPhBAJb1lVT64RYxcCtG4AbQ3AbznOmMQcFsixj32/C0hvDG04EJCmpSLpmjqUlU4TSmcAJOEhJAd2yd+CJJzAP4ckGGuI4YDxm7glGQ3JiiQovqul0xpTQ8UP7yL6DxffQHH3KJQYPNm+HLKgvH8U03KKMnrLuZgJEpJgKbuP+MLFAwKp4ccozyO/FAoV/pifmNK9SBBoQwkT1ev/QkgqrUwSKtRM85gNc7LJfIGKIG22qhWWWsJuHLCjhs5wjGi0VRPGWUwinawOgFmGEWV5kC0xxEUOzIr9sIwWMaNZTsxWPQ2iLbtc8cvbIKi1tyyHkmIWz8SIIg/l1SS2msY8zV+Ym1PVDTKcR7+QVyhw26UkSmixXTgdwY9MguJolXBTsiWywAVTHi4RS6q3YmAdBUHhazHycDytUmVXwjhtT+nlWlBWZYFYrZJau4LVuDEhtJR4vRa83tvK4uEPHJWGClkuc+ZabTeo1tDLMyaaY3y9my+Y5PbhL81yL2PDAOJxYHex4djygOMMw4aTsZqg3Q4ydOCFyNC5PBmaKhm6ChkabTKsqa7Jh+Yb4EOZpJqEODgfFlPZNtG+oSDYRA+kncyfjuJCjtuqa1v6zhge02cX5QpeG5J2V+Gs03H+lBfHD17GpBhn/O7DD+x9Xcyuupl4GtFFxfJpRnwSv0tydoYi52vGzsBUCcR6Q+QsY6bhCczAlQ01n1hkDFpe1/bKwy9jc2wyPne72HziuAANxOaOc5rOJ5dic0ODaBA2tw7SeXXzWNH+eyhtTdk2aVC5/SaoHMDW0cgelpqBXkffY+qHVV3sx1FJryhNY0aBNCLJu+RYyTwDFMAGtNQEe+2Y55GsXJB0xL28b7HAICQM9B7BILTgHq7y/j+08MdOvGbHiVfGJgOOhY446eYdefRDYTCLfYnxMy//0nCz9hIUxfnNzc2B+urMDMti0+ruHgWO58CBMixo9eE6D0zuhbpHpt7SlFB6NYqlgPugAqfz74bIgeu88M5bpmDZ6a4elE+Z42yrVELl49SvYGLvBW0K1S4iCptGFKL+XN3lIIRpL+MijEOmh5OB7A5PdrJNo8PscIjKytXM/rChdTdpk8YEcbqsG0v8JDPHOLjqCE9lrl/0sfhUqtbFJ2LzMhz+Lnga6jwN+tZvjZMTdCdqWpcvQi5b40G3dWBzjtR42uzW+xz7EhWDqb9u4PUYM3GHM38hK56LLpFPIP/XlU+c4jMMr1iGWnJXJNIgFjDpIBZzkITiaFB/K8iEP7emk3bsd0XgS19LaG8legWfrcfepGfoNQCFR4j63KJaDZC2kcq9iDnHmmTqY9qVebl/7TGvCDaJ6KV7sH0puZcXgA4G7ukFQ5HrOSci+Hsgfw/JFHQE9Ntoa7fz5Mm2NrxwW9vSqLrunTDv4ERmGaLs4xXg58Xi4UrztPfQPJH5f5AG9dh1Fbtcn9k8GbY5oh/ovosK/vQpuyrYZzJTc9VLHa6xc+Bw7U68oX4tBEGPw3XXKesVtRC7rX/LVZqu/sEcuPsP \ No newline at end of file diff --git a/support/doc/development/server/upload-video.png b/support/doc/development/server/upload-video.png deleted file mode 100644 index 7edc06792cdb2cf20849238771b38ed7e2ef3ef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34643 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 -- 2.25.1