From 659f9d407b0e0ef714eed994dd8d83a05572c4cc Mon Sep 17 00:00:00 2001 From: Tanner Nelson Date: Fri, 3 Mar 2017 16:14:50 +0100 Subject: [PATCH 1/8] add 2.0 docs --- {auth => 2.0/docs/auth}/middleware.md | 0 {auth => 2.0/docs/auth}/protect.md | 0 {auth => 2.0/docs/auth}/request.md | 0 {auth => 2.0/docs/auth}/user.md | 0 {deploy => 2.0/docs/deploy}/nginx.md | 0 {deploy => 2.0/docs/deploy}/supervisor.md | 0 {fluent => 2.0/docs/fluent}/driver.md | 0 {fluent => 2.0/docs/fluent}/model.md | 0 {fluent => 2.0/docs/fluent}/query.md | 0 {fluent => 2.0/docs/fluent}/relation.md | 0 .../docs/getting-started}/hello-world.md | 76 ++-- .../getting-started}/install-swift-3-macos.md | 8 +- .../getting-started/install-swift-3-ubuntu.md | 122 ++++++ .../docs/getting-started}/install-toolbox.md | 36 +- .../docs/getting-started}/manual.md | 47 ++- 2.0/docs/getting-started/xcode.md | 39 ++ {guide => 2.0/docs/guide}/commands.md | 0 {guide => 2.0/docs/guide}/config.md | 0 {guide => 2.0/docs/guide}/controllers.md | 0 {guide => 2.0/docs/guide}/droplet.md | 0 {guide => 2.0/docs/guide}/folder-structure.md | 0 {guide => 2.0/docs/guide}/hash.md | 0 {guide => 2.0/docs/guide}/json.md | 0 {guide => 2.0/docs/guide}/leaf.md | 0 {guide => 2.0/docs/guide}/middleware.md | 0 {guide => 2.0/docs/guide}/provider.md | 0 {guide => 2.0/docs/guide}/sessions.md | 0 {guide => 2.0/docs/guide}/validation.md | 0 {guide => 2.0/docs/guide}/views.md | 0 {http => 2.0/docs/http}/body.md | 0 {http => 2.0/docs/http}/client.md | 0 {http => 2.0/docs/http}/cors.md | 0 {http => 2.0/docs/http}/request.md | 0 {http => 2.0/docs/http}/responder.md | 0 .../docs/http}/response-representable.md | 0 {http => 2.0/docs/http}/response.md | 0 {http => 2.0/docs/http}/server.md | 0 2.0/docs/images/droplet-color.svg | 30 ++ 2.0/docs/images/droplet-white.svg | 18 + README.md => 2.0/docs/index.md | 68 +++- {routing => 2.0/docs/routing}/basic.md | 0 {routing => 2.0/docs/routing}/collection.md | 0 {routing => 2.0/docs/routing}/controller | 0 {routing => 2.0/docs/routing}/group.md | 0 {routing => 2.0/docs/routing}/parameters.md | 0 .../docs/routing}/query-parameters.md | 0 2.0/docs/stylesheets/extra.css | 48 +++ {testing => 2.0/docs/testing}/basic.md | 0 {testing => 2.0/docs/testing}/modules.md | 0 {websockets => 2.0/docs/websockets}/custom.md | 0 .../docs/websockets}/droplet.md | 0 2.0/mkdocs.yml | 76 ++++ 2.0/vapor-material/404.html | 4 + 2.0/vapor-material/__init__.py | 0 2.0/vapor-material/assets/images/favicon.ico | Bin 0 -> 1150 bytes 2.0/vapor-material/assets/images/favicon.png | Bin 0 -> 1056 bytes .../images/icons/bitbucket-670608a71a.svg | 1 + .../assets/images/icons/github-1da075986e.svg | 1 + .../assets/images/icons/gitlab-5ad3f9f9e5.svg | 1 + .../javascripts/application-f6cd941c96.js | 1 + .../javascripts/modernizr-56ade86843.js | 1 + .../application-892b79c5c5.palette.css | 1 + .../stylesheets/application-e5b48ab351.css | 1 + 2.0/vapor-material/base.html | 158 ++++++++ 2.0/vapor-material/main.html | 1 + 2.0/vapor-material/partials/footer.html | 58 +++ 2.0/vapor-material/partials/header.html | 46 +++ 2.0/vapor-material/partials/language.html | 9 + 2.0/vapor-material/partials/nav-item.html | 54 +++ 2.0/vapor-material/partials/nav.html | 24 ++ 2.0/vapor-material/partials/search.html | 15 + 2.0/vapor-material/partials/social.html | 9 + 2.0/vapor-material/partials/source.html | 25 ++ 2.0/vapor-material/partials/tabs-item.html | 25 ++ 2.0/vapor-material/partials/tabs.html | 13 + 2.0/vapor-material/partials/toc-item.html | 14 + 2.0/vapor-material/partials/toc.html | 15 + README.es.md | 86 ----- README.zh-hant.md | 77 ---- couscous.yml | 179 --------- getting-started/install-swift-3-ubuntu.md | 98 ----- getting-started/xcode.md | 45 --- template/default.twig | 199 ---------- template/images/droplet.svg | 9 - template/screenshot.png | Bin 245289 -> 0 bytes template/scripts/highlight.pack.js | 2 - template/styles/main.css | 316 ---------------- template/styles/main.css.map | 7 - template/styles/main.sass | 351 ------------------ template/styles/vapor-code.css | 71 ---- 90 files changed, 948 insertions(+), 1537 deletions(-) rename {auth => 2.0/docs/auth}/middleware.md (100%) rename {auth => 2.0/docs/auth}/protect.md (100%) rename {auth => 2.0/docs/auth}/request.md (100%) rename {auth => 2.0/docs/auth}/user.md (100%) rename {deploy => 2.0/docs/deploy}/nginx.md (100%) rename {deploy => 2.0/docs/deploy}/supervisor.md (100%) rename {fluent => 2.0/docs/fluent}/driver.md (100%) rename {fluent => 2.0/docs/fluent}/model.md (100%) rename {fluent => 2.0/docs/fluent}/query.md (100%) rename {fluent => 2.0/docs/fluent}/relation.md (100%) rename {getting-started => 2.0/docs/getting-started}/hello-world.md (54%) rename {getting-started => 2.0/docs/getting-started}/install-swift-3-macos.md (82%) create mode 100644 2.0/docs/getting-started/install-swift-3-ubuntu.md rename {getting-started => 2.0/docs/getting-started}/install-toolbox.md (53%) rename {getting-started => 2.0/docs/getting-started}/manual.md (53%) create mode 100644 2.0/docs/getting-started/xcode.md rename {guide => 2.0/docs/guide}/commands.md (100%) rename {guide => 2.0/docs/guide}/config.md (100%) rename {guide => 2.0/docs/guide}/controllers.md (100%) rename {guide => 2.0/docs/guide}/droplet.md (100%) rename {guide => 2.0/docs/guide}/folder-structure.md (100%) rename {guide => 2.0/docs/guide}/hash.md (100%) rename {guide => 2.0/docs/guide}/json.md (100%) rename {guide => 2.0/docs/guide}/leaf.md (100%) rename {guide => 2.0/docs/guide}/middleware.md (100%) rename {guide => 2.0/docs/guide}/provider.md (100%) rename {guide => 2.0/docs/guide}/sessions.md (100%) rename {guide => 2.0/docs/guide}/validation.md (100%) rename {guide => 2.0/docs/guide}/views.md (100%) rename {http => 2.0/docs/http}/body.md (100%) rename {http => 2.0/docs/http}/client.md (100%) rename {http => 2.0/docs/http}/cors.md (100%) rename {http => 2.0/docs/http}/request.md (100%) rename {http => 2.0/docs/http}/responder.md (100%) rename {http => 2.0/docs/http}/response-representable.md (100%) rename {http => 2.0/docs/http}/response.md (100%) rename {http => 2.0/docs/http}/server.md (100%) create mode 100644 2.0/docs/images/droplet-color.svg create mode 100644 2.0/docs/images/droplet-white.svg rename README.md => 2.0/docs/index.md (69%) rename {routing => 2.0/docs/routing}/basic.md (100%) rename {routing => 2.0/docs/routing}/collection.md (100%) rename {routing => 2.0/docs/routing}/controller (100%) rename {routing => 2.0/docs/routing}/group.md (100%) rename {routing => 2.0/docs/routing}/parameters.md (100%) rename {routing => 2.0/docs/routing}/query-parameters.md (100%) create mode 100644 2.0/docs/stylesheets/extra.css rename {testing => 2.0/docs/testing}/basic.md (100%) rename {testing => 2.0/docs/testing}/modules.md (100%) rename {websockets => 2.0/docs/websockets}/custom.md (100%) rename {websockets => 2.0/docs/websockets}/droplet.md (100%) create mode 100644 2.0/mkdocs.yml create mode 100644 2.0/vapor-material/404.html create mode 100644 2.0/vapor-material/__init__.py create mode 100644 2.0/vapor-material/assets/images/favicon.ico create mode 100644 2.0/vapor-material/assets/images/favicon.png create mode 100644 2.0/vapor-material/assets/images/icons/bitbucket-670608a71a.svg create mode 100644 2.0/vapor-material/assets/images/icons/github-1da075986e.svg create mode 100644 2.0/vapor-material/assets/images/icons/gitlab-5ad3f9f9e5.svg create mode 100644 2.0/vapor-material/assets/javascripts/application-f6cd941c96.js create mode 100644 2.0/vapor-material/assets/javascripts/modernizr-56ade86843.js create mode 100644 2.0/vapor-material/assets/stylesheets/application-892b79c5c5.palette.css create mode 100644 2.0/vapor-material/assets/stylesheets/application-e5b48ab351.css create mode 100644 2.0/vapor-material/base.html create mode 100644 2.0/vapor-material/main.html create mode 100644 2.0/vapor-material/partials/footer.html create mode 100644 2.0/vapor-material/partials/header.html create mode 100644 2.0/vapor-material/partials/language.html create mode 100644 2.0/vapor-material/partials/nav-item.html create mode 100644 2.0/vapor-material/partials/nav.html create mode 100644 2.0/vapor-material/partials/search.html create mode 100644 2.0/vapor-material/partials/social.html create mode 100644 2.0/vapor-material/partials/source.html create mode 100644 2.0/vapor-material/partials/tabs-item.html create mode 100644 2.0/vapor-material/partials/tabs.html create mode 100644 2.0/vapor-material/partials/toc-item.html create mode 100644 2.0/vapor-material/partials/toc.html delete mode 100644 README.es.md delete mode 100644 README.zh-hant.md delete mode 100644 couscous.yml delete mode 100644 getting-started/install-swift-3-ubuntu.md delete mode 100644 getting-started/xcode.md delete mode 100644 template/default.twig delete mode 100644 template/images/droplet.svg delete mode 100644 template/screenshot.png delete mode 100644 template/scripts/highlight.pack.js delete mode 100644 template/styles/main.css delete mode 100644 template/styles/main.css.map delete mode 100644 template/styles/main.sass delete mode 100644 template/styles/vapor-code.css diff --git a/auth/middleware.md b/2.0/docs/auth/middleware.md similarity index 100% rename from auth/middleware.md rename to 2.0/docs/auth/middleware.md diff --git a/auth/protect.md b/2.0/docs/auth/protect.md similarity index 100% rename from auth/protect.md rename to 2.0/docs/auth/protect.md diff --git a/auth/request.md b/2.0/docs/auth/request.md similarity index 100% rename from auth/request.md rename to 2.0/docs/auth/request.md diff --git a/auth/user.md b/2.0/docs/auth/user.md similarity index 100% rename from auth/user.md rename to 2.0/docs/auth/user.md diff --git a/deploy/nginx.md b/2.0/docs/deploy/nginx.md similarity index 100% rename from deploy/nginx.md rename to 2.0/docs/deploy/nginx.md diff --git a/deploy/supervisor.md b/2.0/docs/deploy/supervisor.md similarity index 100% rename from deploy/supervisor.md rename to 2.0/docs/deploy/supervisor.md diff --git a/fluent/driver.md b/2.0/docs/fluent/driver.md similarity index 100% rename from fluent/driver.md rename to 2.0/docs/fluent/driver.md diff --git a/fluent/model.md b/2.0/docs/fluent/model.md similarity index 100% rename from fluent/model.md rename to 2.0/docs/fluent/model.md diff --git a/fluent/query.md b/2.0/docs/fluent/query.md similarity index 100% rename from fluent/query.md rename to 2.0/docs/fluent/query.md diff --git a/fluent/relation.md b/2.0/docs/fluent/relation.md similarity index 100% rename from fluent/relation.md rename to 2.0/docs/fluent/relation.md diff --git a/getting-started/hello-world.md b/2.0/docs/getting-started/hello-world.md similarity index 54% rename from getting-started/hello-world.md rename to 2.0/docs/getting-started/hello-world.md index 908189e0..3cc68555 100644 --- a/getting-started/hello-world.md +++ b/2.0/docs/getting-started/hello-world.md @@ -1,16 +1,13 @@ ---- -currentMenu: getting-started-hello-world ---- - # Hello, World -This section assumes you have installed Swift 3 and the Vapor Toolbox and have verified they are working. +This section assumes you have installed Swift 3.1 and the Vapor Toolbox and have verified they are working. -> Note: If you don't want to use the Toolbox, follow the [manual guide](manual.md). +!!! tip + Note: If you don't want to use the Toolbox, follow the [manual guide](manual.md). ## New Project -Let's start by creating a new project called Hello, World +Let's start by creating a new project called "Hello, World". ```sh vapor new Hello @@ -40,20 +37,22 @@ Hello └── App └── main.swift ``` +!!! tip + The `vapor new` command creates a new project with examples and comments about how to use the framework. You can delete these if you want. -Note: The `vapor new` command creates a new project with examples and comments about how to use the framework. You can delete these if you want. +## Code -## Droplet +### Droplet Look for the following line in the `main.swift` file. ```swift -let drop = Droplet() +let drop = try Droplet() ``` This is where the one and only `Droplet `for this example will be created. The `Droplet` class has a plethora of useful functions on it, and is used extensively. -## Routing +### Routing Right after the creation of `drop`, add the following code snippet. @@ -69,11 +68,12 @@ All route closures are passed an instance of [Request](../http/request.md) that This route simply returns a string, but anything that is [ResponseRepresentable](../http/response-representable.md) can be returned. Learn more in the [Routing](../routing/basic.md) section of the guide. -Note: Xcode autocomplete may add extraneous type information to your closure's input arguments. This can be deleted to keep the code clean. If you'd like to keep the type information add `import HTTP` to the top of the file. +!!! tip + Xcode autocomplete may add extraneous type information to your closure's input arguments. This can be deleted to keep the code clean. If you'd like to keep the type information add `import HTTP` to the top of the file. -## Running +### Serving -At the bottom of the main file, make sure to serve your `Droplet`. +At the bottom of the main file, make sure to run your `Droplet`. ```swift drop.run() @@ -81,7 +81,9 @@ drop.run() Save the file, and switch back to the terminal. -## Compiling +## Compile & Run + +### Building A big part of what makes Vapor so great is Swift's state of the art compiler. Let's fire it up. Make sure you are in the root directory of the project and run the following command. @@ -89,45 +91,51 @@ A big part of what makes Vapor so great is Swift's state of the art compiler. Le vapor build ``` -Note: `vapor build` runs `swift build` in the background. +!!! note + `vapor build` runs `swift build` in the background. The Swift Package Manager will first start by downloading the appropriate dependencies from git. It will then compile and link these dependencies together. When the process has completed, you will see `Building Project [Done]` -Note: If you see a message like `unable to execute command: Killed`, you need to increase your swap space. This can happen if you are running on a machine with limited memory. +!!! tip + If you see a message like `unable to execute command: Killed`, you need to increase your swap space. This can happen if you are running on a machine with limited memory. -## Run +#### Release + +Building your application in release mode takes longer, but increases performance. + +```sh +vapor build --release +``` + +### Serving Boot up the server by running the following command. -```swift +```sh vapor run serve ``` You should see a message `Server starting...`. You can now visit `http://localhost:8080/hello` in your browser. -Note: Certain port numbers require super user access to bind. Simply run `sudo vapor run` to allow access. If you decide to run on a port besides `80`, make sure to direct your browser accordingly. +!!! note + Certain port numbers require super user access to bind. Simply run `sudo vapor run` to allow access. If you decide to run on a port besides `80`, make sure to direct your browser accordingly. -## Note for sudo usage +#### Production -On some Linux based systems, you might get an error while using sudo. In that case, if you need to run the server as root, at first switch the user using this command: - -``` -sudo -i -``` -Then either add the previously installed path of Swift to the root users $PATH variable. - -``` -PATH=$PATH:/your_path_to_swift -# Example command can be like this -# PATH=$PATH:/swift-3.0/usr/bin -# In this case /swift-3.0/usr/bin is the location of my swift installation. +Serving your application in the production environment increases its security and performance. +```sh +vapor run serve --env=production ``` +Debug errors will be silenced while in the production environment, so make sure to check your logs for errors. -## Hello, World +!!! warning + If you compiled your application with `--release`, make sure to add that flag to the `vapor run` command as well. e.g., `vapor run serve --env=production --release`. + +### Hello, World You should see the following output in your browser window. diff --git a/getting-started/install-swift-3-macos.md b/2.0/docs/getting-started/install-swift-3-macos.md similarity index 82% rename from getting-started/install-swift-3-macos.md rename to 2.0/docs/getting-started/install-swift-3-macos.md index 817ab369..695a02f7 100644 --- a/getting-started/install-swift-3-macos.md +++ b/2.0/docs/getting-started/install-swift-3-macos.md @@ -1,10 +1,6 @@ ---- -currentMenu: getting-started-install-swift-3-macos ---- +# Install Swift 3.1: macOS -# Install Swift 3: macOS - -To use Swift 3 on macOS, you just need to have Xcode 8 installed. +To use Swift 3.1 on macOS, you just need to have Xcode 8 installed. ## Install Xcode diff --git a/2.0/docs/getting-started/install-swift-3-ubuntu.md b/2.0/docs/getting-started/install-swift-3-ubuntu.md new file mode 100644 index 00000000..885c0d66 --- /dev/null +++ b/2.0/docs/getting-started/install-swift-3-ubuntu.md @@ -0,0 +1,122 @@ +# Install Swift 3.1: Ubuntu + +Installing Swift 3.1 on Ubuntu only takes a couple of minutes. + +## Quick + +Don't want to type? Run the following script to quickly install Swift 3.1. + +```sh +curl -sL swift.vapor.sh/ubuntu | bash +``` + +!!! note + The install script adds Swift to your `~/.bashrc` profile automatically. + +## Manual + +To install manually, you just need to install Swift's dependencies with `apt-get` and download the Swift toolchain. + +### Version + +Swift 3.1 supports the following Ubuntu versions: + +- 14.04 LTS (Trusty Tahr) +- 16.04 LTS (Xenial Xerus) +- 16.10 (Yakkety Yak) + +To check which version of Ubuntu you have, run: + +```bash +lsb_release -a +``` + +### Dependencies + +Depending on your version of Ubuntu, you may need some additional tools for the compiler. We'll err on the safe side and install everything you should need + +```sh +sudo apt-get update +sudo apt-get install clang libicu-dev binutils git libpython2.7-dev libcurl3 +``` + +### Download + +Download the Swift 3.1 toolchain for your Ubuntu version. + +```sh +# Ubuntu 14.04 +wget https://swift.org/builds/swift-3.1-release/ubuntu1404/swift-3.1-RELEASE/swift-3.1-RELEASE-ubuntu14.04.tar.gz + +# Ubuntu 16.04 +wget https://swift.org/builds/swift-3.1-release/ubuntu1604/swift-3.1-RELEASE/swift-3.1-RELEASE-ubuntu16.04.tar.gz + +# Ubuntu 16.10 +wget https://swift.org/builds/swift-3.1-release/ubuntu1610/swift-3.1-RELEASE/swift-3.1-RELEASE-ubuntu16.10.tar.gz +``` + +### Decompress + +After Swift has downloaded, decompress it. + +```sh +# Ubuntu 14.04 +tar zxf swift-3.1-RELEASE-ubuntu14.04.tar.gz + +# Ubuntu 16.04 +tar zxf swift-3.1-RELEASE-ubuntu16.04.tar.gz + +# Ubuntu 16.10 +tar zxf swift-3.1-RELEASE-ubuntu16.10.tar.gz +``` + +### Install + +Move Swift 3.1 to a safe, permanent place on your computer. We'll use `/swift-3.1`, but feel free to choose wherever you like. + +```sh +# Ubuntu 14.04 +mv swift-3.1-RELEASE-ubuntu14.04 /swift-3.1 + +# Ubuntu 16.04 +mv swift-3.1-RELEASE-ubuntu16.04 /swift-3.1 + +# Ubuntu 16.10 +mv swift-3.1-RELEASE-ubuntu16.10 /swift-3.1 +``` + +!!! warning + You may need to use `sudo`. + +### Export + +Edit your bash profile using your text editor of choice. + +```sh +vim ~/.bashrc +``` + +Add the following line: + +```sh +export PATH=/swift-3.1/usr/bin:"${PATH}" +``` + +!!! warning + If you moved Swift 3.1 to a folder other than `/swift-3.1`, your path will be different. + +## Check + +Double check the installation was successful by running: + +```sh +curl -sL check.vapor.sh | bash +``` + +## Toolbox + +You can now move on to [Install Toolbox](install-toolbox.md) + +## Swift.org + +Check out [Swift.org](https://swift.org)'s guide to [using downloads](https://swift.org/download/#using-downloads) if you need more detailed instructions for installing Swift 3.1. diff --git a/getting-started/install-toolbox.md b/2.0/docs/getting-started/install-toolbox.md similarity index 53% rename from getting-started/install-toolbox.md rename to 2.0/docs/getting-started/install-toolbox.md index 506825f4..14a4579f 100644 --- a/getting-started/install-toolbox.md +++ b/2.0/docs/getting-started/install-toolbox.md @@ -1,16 +1,13 @@ ---- -currentMenu: getting-started-install-toolbox ---- - # Install Toolbox Vapor's command line interface provides shortcuts and assistance for common tasks. -![Vapor Toolbox](https://cloud.githubusercontent.com/assets/1342803/17454691/97e549e2-5b6d-11e6-979a-f0cd6b6f1b0a.png) +Vapor Toolbox -> If you do not want to install the Toolbox, checkout the [Manual](manual.md) quickstart. +!!! tip + If you do not want to install the Toolbox, checkout the [Manual](manual.md) quickstart. -### Install +## Install Run the following script to install the [Toolbox](https://github.com/vapor/toolbox). @@ -18,7 +15,8 @@ Run the following script to install the [Toolbox](https://github.com/vapor/toolb curl -sL toolbox.vapor.sh | bash ``` -> Note: You must have the correct version of Swift 3 installed. +!!! warning + Vapor Toolbox is written in Swift, so you must have Swift 3.1 installed. See the earlier steps of Getting Started for instructions on installing Swift. ### Verify @@ -31,7 +29,7 @@ vapor --help Now that you have installed the Toolbox, you can create your first Vapor project following the [Hello, World guide](hello-world.md). -### Updating +## Updating The toolbox can update itself. This may be useful if you experience any issues in the future. @@ -39,7 +37,7 @@ The toolbox can update itself. This may be useful if you experience any issues i vapor self update ``` -### Templates +## Templates The toolbox can create a project from the Vapor basic-template or any other git repo. @@ -47,11 +45,15 @@ The toolbox can create a project from the Vapor basic-template or any other git vapor new [--template=] ``` -The toolbox will build an absolute URL based on what you pass as the template option. If you do not specify a template option, the project will be built from the Vapor basic-template. +### Options + +The toolbox will build an absolute URL based on what you pass as the template option. + +- `--template=light` clones `http://github.com/vapor/light-template`. +- `--template=user/repo` clones `http://github.com/user/repo`. +- `--template=http://example.com/repo-path` clones the full url given. + +!!! note + If you do not specify a template option, the project will be built from Vapor's [basic template](https://github.com/vapor/basic-template). + -```sh -Default(no template option specified) => https://github.com/vapor/basic-template -http(s)://example.com/repo-path => http(s)://example.com/repo-path -user/repo => https://github.com/user/repo -light => https://github.com/vapor/light-template -``` diff --git a/getting-started/manual.md b/2.0/docs/getting-started/manual.md similarity index 53% rename from getting-started/manual.md rename to 2.0/docs/getting-started/manual.md index ba91aa2b..72d1892e 100644 --- a/getting-started/manual.md +++ b/2.0/docs/getting-started/manual.md @@ -1,16 +1,11 @@ ---- -currentMenu: getting-started-manual ---- - # Manual Quickstart Learn how to create a Vapor project _without_ the Toolbox using just Swift 3 and the Swift Package Manager. -> If you'd prefer to use the Toolbox, learn how to install it [here](install-toolbox.md). +This document assumes that you have Swift 3.1 installed. -This document assumes that you have Swift 3 installed. - -> Note: If you've installed the Toolbox, follow the toolbox guide [here](hello-world.md). +!!! tip + If you'd prefer to use the Toolbox, learn how to install it [here](install-toolbox.md). If you've installed the Toolbox, follow the toolbox guide [here](hello-world.md). ## Check @@ -24,7 +19,8 @@ curl -sL check.vapor.sh | bash Open your terminal -> For our example, we'll be using the Desktop folder. +!!! note + For our example, we'll be using the Desktop folder. ```bash cd ~/Desktop @@ -42,7 +38,7 @@ Your folder should look like this: └── Tests ``` -## Edit `Package.swift` +### Edit `Package.swift` Open your `Package.swift` file: @@ -52,7 +48,7 @@ open Package.swift And add Vapor as a dependency. Here's how your file will look. -#### Package.swift +### Package.swift ```swift import PackageDescription @@ -60,39 +56,50 @@ import PackageDescription let package = Package( name: "Hello", dependencies: [ - .Package(url: "https://github.com/vapor/vapor.git", majorVersion: 1, minor: 1) + .Package(url: "https://github.com/vapor/vapor.git", majorVersion: 2) ] ) ``` -> We try to keep this document up to date, however, you can view latest releases [here](https://github.com/vapor/vapor/releases) +!!! warning + We try to keep this document up to date, however, you can view latest releases [here](https://github.com/vapor/vapor/releases). -## Edit `main.swift` +### Edit `main.swift` A simple hello world: -``` +```swift import Vapor let drop = Droplet() -drop.get("/hello") { _ in +drop.get("hello") { req in return "Hello Vapor" } drop.run() ``` -## Build and Run +## Compile & Run The first `build` command can take a while to fetch dependencies. -``` +```bash swift build -.build/debug/Hello +.build/debug/Hello serve ``` -> If different, replace `Hello` above with the name of your executable. +!!! warning + If different, replace `Hello` above with the name of your executable (as defined in `Package.swift`). + +### Production + +Compiling in Swift's release mode and setting Vapor's environment to production will make your app more secure and performant. + +```sh +swift build --configuraiton release +.build/release/Hello serve --env=production +``` ## View diff --git a/2.0/docs/getting-started/xcode.md b/2.0/docs/getting-started/xcode.md new file mode 100644 index 00000000..aac056dc --- /dev/null +++ b/2.0/docs/getting-started/xcode.md @@ -0,0 +1,39 @@ +# Xcode + +The first thing you'll probably notice about Vapor and Swift Package Manager projects in general is that they don't include an Xcode project. In fact, when SPM generates packages, the `.xcodeproj` file is `.gitignore`d by default. + +This means we don't have to worry about `.pbxproj` conflicts, and it's easy for different platforms to utilize their own editors. + +## Generate Project + +### Vapor Toolbox + +To generate a new Xcode project for a project, use: + +```sh +vapor xcode +``` + +!!! tip + If you'd like to automatically open the Xcode project, use `vapor xcode -y` + +### Manual + +To generate a new Xcode project manually. + +```sh +swift package generate-xcodeproj +``` + +Open the project and continue normally. + +## Flags + +For some packages with underlying C dependencies, users will need to pass linker flags during **build** and **project generation**. Make sure to consult the guides associated with those dependencies. For example, MySQL: + +``` +swift package generate-xcodeproj -Xswiftc -I/usr/local/include/mysql -Xlinker -L/usr/local/lib +``` + +!!! tip + The Vapor Toolbox automatically detects and adds linker flags required for Vapor packages. diff --git a/guide/commands.md b/2.0/docs/guide/commands.md similarity index 100% rename from guide/commands.md rename to 2.0/docs/guide/commands.md diff --git a/guide/config.md b/2.0/docs/guide/config.md similarity index 100% rename from guide/config.md rename to 2.0/docs/guide/config.md diff --git a/guide/controllers.md b/2.0/docs/guide/controllers.md similarity index 100% rename from guide/controllers.md rename to 2.0/docs/guide/controllers.md diff --git a/guide/droplet.md b/2.0/docs/guide/droplet.md similarity index 100% rename from guide/droplet.md rename to 2.0/docs/guide/droplet.md diff --git a/guide/folder-structure.md b/2.0/docs/guide/folder-structure.md similarity index 100% rename from guide/folder-structure.md rename to 2.0/docs/guide/folder-structure.md diff --git a/guide/hash.md b/2.0/docs/guide/hash.md similarity index 100% rename from guide/hash.md rename to 2.0/docs/guide/hash.md diff --git a/guide/json.md b/2.0/docs/guide/json.md similarity index 100% rename from guide/json.md rename to 2.0/docs/guide/json.md diff --git a/guide/leaf.md b/2.0/docs/guide/leaf.md similarity index 100% rename from guide/leaf.md rename to 2.0/docs/guide/leaf.md diff --git a/guide/middleware.md b/2.0/docs/guide/middleware.md similarity index 100% rename from guide/middleware.md rename to 2.0/docs/guide/middleware.md diff --git a/guide/provider.md b/2.0/docs/guide/provider.md similarity index 100% rename from guide/provider.md rename to 2.0/docs/guide/provider.md diff --git a/guide/sessions.md b/2.0/docs/guide/sessions.md similarity index 100% rename from guide/sessions.md rename to 2.0/docs/guide/sessions.md diff --git a/guide/validation.md b/2.0/docs/guide/validation.md similarity index 100% rename from guide/validation.md rename to 2.0/docs/guide/validation.md diff --git a/guide/views.md b/2.0/docs/guide/views.md similarity index 100% rename from guide/views.md rename to 2.0/docs/guide/views.md diff --git a/http/body.md b/2.0/docs/http/body.md similarity index 100% rename from http/body.md rename to 2.0/docs/http/body.md diff --git a/http/client.md b/2.0/docs/http/client.md similarity index 100% rename from http/client.md rename to 2.0/docs/http/client.md diff --git a/http/cors.md b/2.0/docs/http/cors.md similarity index 100% rename from http/cors.md rename to 2.0/docs/http/cors.md diff --git a/http/request.md b/2.0/docs/http/request.md similarity index 100% rename from http/request.md rename to 2.0/docs/http/request.md diff --git a/http/responder.md b/2.0/docs/http/responder.md similarity index 100% rename from http/responder.md rename to 2.0/docs/http/responder.md diff --git a/http/response-representable.md b/2.0/docs/http/response-representable.md similarity index 100% rename from http/response-representable.md rename to 2.0/docs/http/response-representable.md diff --git a/http/response.md b/2.0/docs/http/response.md similarity index 100% rename from http/response.md rename to 2.0/docs/http/response.md diff --git a/http/server.md b/2.0/docs/http/server.md similarity index 100% rename from http/server.md rename to 2.0/docs/http/server.md diff --git a/2.0/docs/images/droplet-color.svg b/2.0/docs/images/droplet-color.svg new file mode 100644 index 00000000..11c540fb --- /dev/null +++ b/2.0/docs/images/droplet-color.svg @@ -0,0 +1,30 @@ + + + Vapor + The Vapor droplet logo in pink and blue. + + + + + + + + + + \ No newline at end of file diff --git a/2.0/docs/images/droplet-white.svg b/2.0/docs/images/droplet-white.svg new file mode 100644 index 00000000..9f645196 --- /dev/null +++ b/2.0/docs/images/droplet-white.svg @@ -0,0 +1,18 @@ + + + Vapor + The Vapor droplet logo in white. + + + + \ No newline at end of file diff --git a/README.md b/2.0/docs/index.md similarity index 69% rename from README.md rename to 2.0/docs/index.md index 04303d78..52790263 100644 --- a/README.md +++ b/2.0/docs/index.md @@ -1,33 +1,57 @@ # Vapor Documentation -[![Stack Overflow](https://img.shields.io/stackexchange/stackoverflow/t/vapor.svg)](http://stackoverflow.com/questions/tagged/vapor) - This is the documentation for Vapor, a Web Framework for Swift that works on iOS, macOS, and Ubuntu; and all of the packages that Vapor offers. Vapor is the most used web framework for Swift. It provides a beautifully expressive and easy to use foundation for your next website or API. -To view the framework's source code and code documentation, visit [Vapor's GitHub](https://github.com/vapor/vapor). +## Where To Start -Read this in [正體中文](https://github.com/vapor/documentation/blob/master/README.zh-hant.md) +If this is your first time using Vapor, head to the [Getting Started](getting-started/install-swift-3-macos.md) section to install Swift and create your first app. -## How To Read +### Viewing Mediums -You can read this guide by clicking through the folders and markdown files on [GitHub](https://github.com/vapor/documentation) or through the rendered [GitHub Pages](https://vapor.github.io/documentation/). +You can read this guide by clicking through the folders and markdown files on [GitHub](https://github.com/vapor/documentation) or through the rendered [website](https://docs.vapor.codes). -## API +## Other Sources + +Here are some other great places to find information about Vapor. + +### API Auto-generated API documentation is located at [api.vapor.codes](http://api.vapor.codes). +### Stack Overflow + +View or ask questions related to Vapor on Stack Overflow using the [`vapor`](http://stackoverflow.com/questions/tagged/vapor) tag. + +### GitHub + +#### Source Code + +To view the framework's source code and code documentation, visit [Vapor's GitHub](https://github.com/vapor/vapor). + +#### Issues + +To view open bug reports and feature requests, or to create one, visit the [issues](https://github.com/vapor/vapor/issues) tab on [Vapor's GitHub](https://github.com/vapor/vapor). + ## Packages -Here are a list of all the packages and modules included with Vapor (also useable individually). +Vapor is a modular framework built for a modular language. Code is split up into modules which are grouped to form packages. Packages can be added to your project by adding the package's Git url to your `Package.swift` file. Once a package is included, all of its modules will be available to `import`. You can read more about packages and modules in the Swift Package Manager [conceptual overview](https://swift.org/package-manager/). + +Below is a list of packages and modules that come with or can be used by Vapor projects. Packages will have a link to their respective GitHub page. + +### Included + +Here is a list of all the packages and modules included with Vapor. + +!!! tip + While these packages are included in Vapor by default, they can also be used individually. - [Vapor](https://github.com/vapor/vapor): Swift's most used web framework. - Auth: User authentication and persistance. - Sessions: Secure, ephemeral cookie based data storage. - Cookies: HTTP cookies. - Routing: Advanced router with type-safe parameterization. -- [Fluent](https://github.com/vapor/fluent): Models, relationships, and querying for NoSQL and SQL databases. - [Engine](https://github.com/vapor/engine): Core transport layers. - HTTP: Pure Swift HTTP client and server. - URI: Pure Swift URI parsing and serializing. @@ -36,8 +60,7 @@ Here are a list of all the packages and modules included with Vapor (also useabl - [Multipart](https://github.com/vapor/multipart): Fast, streaming, non-blocking multipart parser and serializer. - Multipart: Parses and serializes `multipart/mixed`. - FormData: Parses and serializes `multipart/form-data`. -- [Leaf](https://github.com/vapor/leaf): An extensible templating language. -- [JSON](https://github.com/vapor/json): Maps Jay JSON to Vapor types. +- [JSON](https://github.com/vapor/json): Conveniences for working with JSON in Swift. - [Console](https://github.com/vapor/console): Swift wrapper for console IO and commands. - [TLS](https://github.com/vapor/tls): Swift wrapper for CLibreSSL's new TLS. - [Crypto](https://github.com/vapor/crypto): Cryptography from LibreSSL and Swift. @@ -51,16 +74,24 @@ Here are a list of all the packages and modules included with Vapor (also useabl - [Core](https://github.com/vapor/core): Core extensions, type-aliases, and functions that facilitate common tasks. - [Socks](https://github.com/vapor/socks): Swift C Socket API wrapper. -## Providers & Other +### Extras -Here are a list of providers and third party packages that work great with Vapor. +These are officially supported packages for Vapor that are not included by default. +- [Fluent](https://github.com/vapor/fluent): Models, relationships, and querying for NoSQL and SQL databases. - [MySQL](https://github.com/vapor/mysql): Robust MySQL interface for Swift. - [MySQL Driver](https://github.com/vapor/mysql-driver): MySQL driver for Fluent. - [MySQL Provider](https://github.com/vapor/mysql-provider): MySQL provider for Vapor. -- [SQLite](https://github.com/vapor/sqlite): SQLite 3 wrapper for Swift - - [SQLite Driver](https://github.com/vapor/sqlite-driver): SQLite driver for Fluent. - - [SQLite Provider](https://github.com/vapor/sqlite-provider): SQLite provider for Vapor. +- [Leaf](https://github.com/vapor/leaf): An extensible templating language. +- [Redbird](https://github.com/vapor/redbird): Pure-Swift Redis client implemented from the original protocol spec.. + - [Redis Provider](https://github.com/vapor/redis-provider): Redis cache provider for Vapor. +- [JWT](https://github.com/vapor/jwt): JSON Web Tokens in Swift. + - [JWT Provider](https://github.com/vapor/jwt-provider): JWT conveniences for Vapor. + +### Third Party + +These are packages created by community members that work great with Vapor. + - [PostgreSQL](https://github.com/vapor/postgresql): Robust PostgreSQL interface for Swift. - [PostgreSQL Driver](https://github.com/vapor/postgresql-driver): PostgreSQL driver for Fluent. - [PostgreSQL Provider](https://github.com/vapor/postgresql-provider): PostgreSQL provider for Vapor. @@ -68,12 +99,9 @@ Here are a list of providers and third party packages that work great with Vapor - [Mongo Driver](https://github.com/vapor/mongo-driver): MongoKitten driver for Fluent. - [Mongo Provider](https://github.com/vapor/mongo-provider): MongoKitten provider for Vapor. - [MainecoonVapor](https://github.com/OpenKitten/MainecoonVapor): MongoKitten ORM for Vapor. -- [Redbird](https://github.com/vapor/redbird): Pure-Swift Redis client implemented from the original protocol spec.. - - [Redis Provider](https://github.com/vapor/redis-provider): Redis cache provider for Vapor. - [Kitura Provider](https://github.com/vapor/kitura-provider): Use IBM's Kitura HTTP server in Vapor. - [SwiftyBeaver](https://github.com/SwiftyBeaver/SwiftyBeaver-Vapor): Adds the powerful logging of SwiftyBeaver to Vapor. - [APNS](https://github.com/matthijs2704/vapor-apns): Simple APNS Library for Vapor (Swift). -- [JWT](https://github.com/siemensikkema/vapor-jwt): JWT implementation for Vapor. - [VaporS3Signer](https://github.com/JustinM1/VaporS3Signer): Generate V4 Auth Header/Pre-Signed URL for AWS S3 REST API - [Flock](https://github.com/jakeheis/Flock): Automated deployment of Swift projects to servers - [VaporFlock](https://github.com/jakeheis/VaporFlock): Use Flock to deploy Vapor applications @@ -84,4 +112,4 @@ Here are a list of providers and third party packages that work great with Vapor ## Authors -[Tanner Nelson](mailto:tanner@qutheory.io), [Logan Wright](mailto:logan@qutheory.io), and the hundreds of members of Vapor. +[Tanner Nelson](mailto:tanner@vapor.codes), [Logan Wright](mailto:logan@vapor.codes), and the hundreds of members of Vapor. diff --git a/routing/basic.md b/2.0/docs/routing/basic.md similarity index 100% rename from routing/basic.md rename to 2.0/docs/routing/basic.md diff --git a/routing/collection.md b/2.0/docs/routing/collection.md similarity index 100% rename from routing/collection.md rename to 2.0/docs/routing/collection.md diff --git a/routing/controller b/2.0/docs/routing/controller similarity index 100% rename from routing/controller rename to 2.0/docs/routing/controller diff --git a/routing/group.md b/2.0/docs/routing/group.md similarity index 100% rename from routing/group.md rename to 2.0/docs/routing/group.md diff --git a/routing/parameters.md b/2.0/docs/routing/parameters.md similarity index 100% rename from routing/parameters.md rename to 2.0/docs/routing/parameters.md diff --git a/routing/query-parameters.md b/2.0/docs/routing/query-parameters.md similarity index 100% rename from routing/query-parameters.md rename to 2.0/docs/routing/query-parameters.md diff --git a/2.0/docs/stylesheets/extra.css b/2.0/docs/stylesheets/extra.css new file mode 100644 index 00000000..27fff6f2 --- /dev/null +++ b/2.0/docs/stylesheets/extra.css @@ -0,0 +1,48 @@ +.md-header { + box-shadow: 0px 0px 8px #657590!important; +} + +.md-main__inner { + padding-top: 0; +} + +.md-nav__button img { + width: 90%; +} + +.md-logo { + padding: 6px; +} + +.md-sidebar__inner .md-logo { + width: 60px!important; +} + +.md-header-nav__title { + line-height: 4.6rem; +} + +@media only screen and (min-width:75em) { + .md-header-nav__button img { + width: 28px!important; + height: 28px!important; + } + + .md-main__inner { + padding-top: 1rem; + } +} + +@media only screen and (min-width:100em) { + .md-header-nav__button img { + width: 32px!important; + height: 32px!important; + } +} + +@media only screen and (min-width:125em) { + .md-header-nav__button img { + width: 38px!important; + height: 38px!important; + } +} diff --git a/testing/basic.md b/2.0/docs/testing/basic.md similarity index 100% rename from testing/basic.md rename to 2.0/docs/testing/basic.md diff --git a/testing/modules.md b/2.0/docs/testing/modules.md similarity index 100% rename from testing/modules.md rename to 2.0/docs/testing/modules.md diff --git a/websockets/custom.md b/2.0/docs/websockets/custom.md similarity index 100% rename from websockets/custom.md rename to 2.0/docs/websockets/custom.md diff --git a/websockets/droplet.md b/2.0/docs/websockets/droplet.md similarity index 100% rename from websockets/droplet.md rename to 2.0/docs/websockets/droplet.md diff --git a/2.0/mkdocs.yml b/2.0/mkdocs.yml new file mode 100644 index 00000000..517f405d --- /dev/null +++ b/2.0/mkdocs.yml @@ -0,0 +1,76 @@ +site_name: 'Vapor Docs' +copyright: 'Copyright © 2017 Qutheory, LLC' +markdown_extensions: + - admonition + - codehilite(guess_lang=false) + - footnotes + - meta + - toc(permalink=true) + +pages: +- Overview: 'index.md' +- Getting started: + - 'Install Swift 3.1: macOS': 'getting-started/install-swift-3-macos.md' + - 'Install Swift 3.1: Ubuntu': 'getting-started/install-swift-3-ubuntu.md' + - 'Install Toolbox': 'getting-started/install-toolbox.md' + - 'Hello, World': 'getting-started/hello-world.md' + - 'Manual': 'getting-started/manual.md' + - 'Xcode': 'getting-started/xcode.md' +- Guide: + - 'Droplet': 'guide/droplet.md' + - 'Folder Structure': 'guide/folder-structure.md' + - 'JSON': 'guide/json.md' + - 'Config': 'guide/config.md' + - 'Views': 'guide/views.md' + - 'Leaf': 'guide/leaf.md' + - 'Controllers': 'guide/controllers.md' + - 'Middleware': 'guide/middleware.md' + - 'Validation': 'guide/validation.md' + - 'Provider': 'guide/provider.md' + - 'Sessions': 'guide/sessions.md' + - 'Hash': 'guide/hash.md' + - 'Commands': 'guide/commands.md' +- Routing: + - 'Basic': 'routing/basic.md' + - 'Route Parameters': 'routing/parameters.md' + - 'Query Parameters': 'routing/query-parameters.md' + - 'Group': 'routing/group.md' + - 'Collection': 'routing/collection.md' +- Fluent: + - 'Driver': 'fluent/driver.md' + - 'Model': 'fluent/model.md' + - 'Query': 'fluent/query.md' + - 'Relation': 'fluent/relation.md' +- Auth: + - 'User': 'auth/user.md' + - 'Middleware': 'auth/middleware.md' + - 'Request': 'auth/request.md' + - 'Protect': 'auth/protect.md' +- HTTP: + - 'Request': 'http/request.md' + - 'Response': 'http/response.md' + - 'Body': 'http/body.md' + - 'ResponseRepresentable': 'http/response-representable.md' + - 'Responder': 'http/responder.md' + - 'Client': 'http/client.md' + - 'Server': 'http/server.md' + - 'CORS': 'http/cors.md' +theme: 'material' +theme_dir: 'vapor-material' +repo_url: https://github.com/vapor/documentation +extra_css: + - 'stylesheets/extra.css' +edit_uri: edit/master/2.0/docs/ +extra: + logo: 'images/droplet-white.svg' + social: + - type: 'twitter' + link: 'https://twitter.com/@codevapor' + - type: 'slack' + link: 'http://vapor.team/' + font: + text: 'Roboto Slab' + code: 'Source Code Pro' +google_analytics: + - 'UA-76177358-4' + - 'auto' diff --git a/2.0/vapor-material/404.html b/2.0/vapor-material/404.html new file mode 100644 index 00000000..52beb3b8 --- /dev/null +++ b/2.0/vapor-material/404.html @@ -0,0 +1,4 @@ +{% extends "base.html" %} +{% block content %} +

404 - Not found

+{% endblock %} diff --git a/2.0/vapor-material/__init__.py b/2.0/vapor-material/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/2.0/vapor-material/assets/images/favicon.ico b/2.0/vapor-material/assets/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e85006a3ce1c6fd81faa6d5a13095519c4a6fc96 GIT binary patch literal 1150 zcmd6lF-yZh9L1kl>(HSEK`2y^4yB6->f+$wD)=oNY!UheIt03Q=;qj=;8*Bap_4*& za8yAl;wmmx5Yyi^7dXN-WYdJ-{qNqpcez|5t#Fr0qTSYcPTG`I2PBk8r$~4kg^0zN zCJe(rhix3do!L$bZ+IuZ{i08x=JR3=e+M4pv0KsKA??{u_*EFfo|`p&t`Vf=jn{)F z1fKk9hWsmYwqWAP^JO*5u*R;*L&dX3H$%S7oB$f0{ISh{QVXuncnzN67WQH2`lip7 zhX+VI$6x$1+$8gMjh4+1l0N#8_0Fh=N#EwpKk{SeE!)SHFB@xQFX3y+8sF#_@!bDW eIdI-IC`$c%>bk?KbPeN9RHtL<1^)v~#xMt8oB^@` literal 0 HcmV?d00001 diff --git a/2.0/vapor-material/assets/images/favicon.png b/2.0/vapor-material/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..23ccc2bac7294c857add8e40e27c5c4e4d8e6397 GIT binary patch literal 1056 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtq=#3k+XOiwE+VlDyqr z82-2SpV<%OaTa()76WMyFm^kcZO6dCc)`=fF~sBe-K+5#y@fJtAI{&lymfQKwqr2~ zCt6K)HCrDwC3%)PcB-t_tS?fYGKKrp)FS6~VQY2-dr2vsGT6H4XK{CbKb{VJ-6tv z`N9hwdeTYJqKX$@btNXswa09W3h1oa`Ppu!-h_6i%XU`FHRJBQXsHYS-&uU7;_VF9 zi;tq%ZKmpJo-4eR{QHdlyzhSHe|5Ca6`qmJT~+kSH1Aj3MvLQuvDYTKxJ6l9wvAqK zdB%3mo~lLnWlsN#UBy#ZvCMI+dDW-(9mfxMwN=FL4x8V)&NX(mep&BcE0cuQgBr{k zMYq~dDC{l1G$|*PvpMZ7$Ce!_D;)kEbzRNEq#HKP%p&W6WcS1^_evK#EnL4YO1*LE zxvKXGnaz)#_V2y0Qcm;sool(PwM;A)`5)Wj{E=t_3#|VxqKu$ENSsedl>&so{FHT&Co_$S0K>llS_qPdW8u zfu7wmU%#m*4m!l~B?(S#KA6L&Kd7c7#Uj`TLO``fq|8Q!QsPte^E5# z=BH$)RpQpLY2GwPpawUP4aNCsCFO}lsSKXEiRr1niRqci*$QTQ=6V*omI^>CO>_-R zbq$Ra0u9X+GD=Dctn~HE%ggmLL8^fms9G<-DE&^`TcCjq5+D;pGD>rktgKw}lS^|` z^Gd9&0)R@384Q>I->r|P25hI5RYq!NdPWI@p`{T&Ls2VGjX07yP&MJ1DJ2;oC70JI zasZV`A}R6B%uOw+EJ$SlyGp+xFWr7qm>-%sz9B$W42C8arlw{F#^#o8MbqyAmGC2( z6P#I<%3$E+G-Z+98=zDel2mArCqr6hPAbs*`nh=}Ir-`OX^CZ-$@zK3`iO|pPc|G%zu?NJ~mFH!-tJvPd-q+M1H42h^bla^IYl8-X@3c)I$ztaD0e0sse~ BmzDqk literal 0 HcmV?d00001 diff --git a/2.0/vapor-material/assets/images/icons/bitbucket-670608a71a.svg b/2.0/vapor-material/assets/images/icons/bitbucket-670608a71a.svg new file mode 100644 index 00000000..7d95cb22 --- /dev/null +++ b/2.0/vapor-material/assets/images/icons/bitbucket-670608a71a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2.0/vapor-material/assets/images/icons/github-1da075986e.svg b/2.0/vapor-material/assets/images/icons/github-1da075986e.svg new file mode 100644 index 00000000..3cacb2e0 --- /dev/null +++ b/2.0/vapor-material/assets/images/icons/github-1da075986e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2.0/vapor-material/assets/images/icons/gitlab-5ad3f9f9e5.svg b/2.0/vapor-material/assets/images/icons/gitlab-5ad3f9f9e5.svg new file mode 100644 index 00000000..b036a9b5 --- /dev/null +++ b/2.0/vapor-material/assets/images/icons/gitlab-5ad3f9f9e5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2.0/vapor-material/assets/javascripts/application-f6cd941c96.js b/2.0/vapor-material/assets/javascripts/application-f6cd941c96.js new file mode 100644 index 00000000..d7eae4d6 --- /dev/null +++ b/2.0/vapor-material/assets/javascripts/application-f6cd941c96.js @@ -0,0 +1 @@ +window.app=function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=94)}([function(t,e,n){"use strict";var r=n(30)("wks"),o=n(22),i=n(1).Symbol,a="function"==typeof i;(t.exports=function(t){return r[t]||(r[t]=a&&i[t]||(a?i:o)("Symbol."+t))}).store=r},function(t,e,n){"use strict";var r=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},function(t,e,n){"use strict";var r=n(11);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,e,n){"use strict";var r=n(12),o=n(29);t.exports=n(5)?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){"use strict";var r=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},function(t,e,n){"use strict";t.exports=!n(25)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e,n){"use strict";var r={}.hasOwnProperty;t.exports=function(t,e){return r.call(t,e)}},function(t,e,n){"use strict";t.exports={}},function(t,e,n){"use strict";var r=n(1),o=n(3),i=n(6),a=n(22)("src"),s="toString",c=Function[s],u=(""+c).split(s);n(4).inspectSource=function(t){return c.call(t)},(t.exports=function(t,e,n,s){var c="function"==typeof n;c&&(i(n,"name")||o(n,"name",e)),t[e]!==n&&(c&&(i(n,a)||o(n,a,t[e]?""+t[e]:u.join(String(e)))),t===r?t[e]=n:s?t[e]?t[e]=n:o(t,e,n):(delete t[e],o(t,e,n)))})(Function.prototype,s,function(){return"function"==typeof this&&this[a]||c.call(this)})},function(t,e,n){"use strict";var r={}.toString;t.exports=function(t){return r.call(t).slice(8,-1)}},function(t,e,n){"use strict";var r=n(14);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};t.exports=function(t){return"object"===(void 0===t?"undefined":r(t))?null!==t:"function"==typeof t}},function(t,e,n){"use strict";var r=n(2),o=n(43),i=n(63),a=Object.defineProperty;e.f=n(5)?Object.defineProperty:function(t,e,n){if(r(t),e=i(e,!0),r(n),o)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={createElement:function(t,e){var n=document.createElement(t);e&&Array.prototype.forEach.call(Object.keys(e),function(t){n.setAttribute(t,e[t])});for(var r=function t(e){Array.prototype.forEach.call(e,function(e){"string"==typeof e||"number"==typeof e?n.textContent+=e:Array.isArray(e)?t(e):n.appendChild(e)})},o=arguments.length,i=Array(o>2?o-2:0),a=2;a0?o:r)(t)}},function(t,e,n){"use strict";var r=n(45),o=n(16);t.exports=function(t){return r(o(t))}},function(t,e,n){"use strict";var r=0,o=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+o).toString(36))}},function(t,e,n){"use strict";t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,n){"use strict";var r=n(1),o=n(4),i=n(3),a=n(8),s=n(10),c="prototype",u=function t(e,n,u){var l,f,h,d,p=e&t.F,v=e&t.G,m=e&t.S,y=e&t.P,g=e&t.B,w=v?r:m?r[n]||(r[n]={}):(r[n]||{})[c],b=v?o:o[n]||(o[n]={}),_=b[c]||(b[c]={});v&&(u=n);for(l in u)f=!p&&w&&void 0!==w[l],h=(f?w:u)[l],d=g&&f?s(h,r):y&&"function"==typeof h?s(Function.call,h):h,w&&a(w,l,h,e&t.U),b[l]!=h&&i(b,l,d),y&&_[l]!=h&&(_[l]=h)};r.core=o,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,t.exports=u},function(t,e,n){"use strict";t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){"use strict";t.exports=n(1).document&&document.documentElement},function(t,e,n){"use strict";var r=n(28),o=n(24),i=n(8),a=n(3),s=n(6),c=n(7),u=n(48),l=n(18),f=n(54),h=n(0)("iterator"),d=!([].keys&&"next"in[].keys()),p="keys",v="values",m=function(){return this};t.exports=function(t,e,n,y,g,w,b){u(n,e,y);var _,E,S,x=function(t){if(!d&&t in C)return C[t];switch(t){case p:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},k=e+" Iterator",T=g==v,O=!1,C=t.prototype,A=C[h]||C["@@iterator"]||g&&C[g],M=A||x(g),L=g?T?x("entries"):M:void 0,P="Array"==e?C.entries||A:A;if(P&&(S=f(P.call(new t)),S!==Object.prototype&&(l(S,k,!0),r||s(S,h)||a(S,h,m))),T&&A&&A.name!==v&&(O=!0,M=function(){return A.call(this)}),r&&!b||!d&&!O&&C[h]||a(C,h,M),c[e]=M,c[k]=m,g)if(_={values:T?M:x(v),keys:w?M:x(p),entries:L},b)for(E in _)E in C||i(C,E,_[E]);else o(o.P+o.F*(d||O),e,_);return _}},function(t,e,n){"use strict";t.exports=!1},function(t,e,n){"use strict";t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){"use strict";var r=n(1),o="__core-js_shared__",i=r[o]||(r[o]={});t.exports=function(t){return i[t]||(i[t]={})}},function(t,e,n){"use strict";var r,o,i,a=n(10),s=n(44),c=n(26),u=n(17),l=n(1),f=l.process,h=l.setImmediate,d=l.clearImmediate,p=l.MessageChannel,v=0,m={},y="onreadystatechange",g=function(){var t=+this;if(m.hasOwnProperty(t)){var e=m[t];delete m[t],e()}},w=function(t){g.call(t.data)};h&&d||(h=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return m[++v]=function(){s("function"==typeof t?t:Function(t),e)},r(v),v},d=function(t){delete m[t]},"process"==n(9)(f)?r=function(t){f.nextTick(a(g,t,1))}:p?(o=new p,i=o.port2,o.port1.onmessage=w,r=a(i.postMessage,i,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(t){l.postMessage(t+"","*")},l.addEventListener("message",w,!1)):r=y in u("script")?function(t){c.appendChild(u("script"))[y]=function(){c.removeChild(this),g.call(t)}}:function(t){setTimeout(a(g,t,1),0)}),t.exports={set:h,clear:d}},function(t,e,n){"use strict";var r=n(20),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var o=function(){function t(t,e){for(var n=0;n-1?e:t}function d(t,e){e=e||{};var n=e.body;if(t instanceof d){if(t.bodyUsed)throw new TypeError("Already read");this.url=t.url,this.credentials=t.credentials,e.headers||(this.headers=new o(t.headers)),this.method=t.method,this.mode=t.mode,n||null==t._bodyInit||(n=t._bodyInit,t.bodyUsed=!0)}else this.url=String(t);if(this.credentials=e.credentials||this.credentials||"omit",!e.headers&&this.headers||(this.headers=new o(e.headers)),this.method=h(e.method||this.method||"GET"),this.mode=e.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n)}function p(t){var e=new FormData;return t.trim().split("&").forEach(function(t){if(t){var n=t.split("="),r=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");e.append(decodeURIComponent(r),decodeURIComponent(o))}}),e}function v(t){var e=new o;return t.split(/\r?\n/).forEach(function(t){var n=t.split(":"),r=n.shift().trim();if(r){var o=n.join(":").trim();e.append(r,o)}}),e}function m(t,e){e||(e={}),this.type="default",this.status="status"in e?e.status:200,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in e?e.statusText:"OK",this.headers=new o(e.headers),this.url=e.url||"",this._initBody(t)}if(!t.fetch){var y={searchParams:"URLSearchParams"in t,iterable:"Symbol"in t&&"iterator"in Symbol,blob:"FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(t){return!1}}(),formData:"FormData"in t,arrayBuffer:"ArrayBuffer"in t};if(y.arrayBuffer)var g=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],w=function(t){return t&&DataView.prototype.isPrototypeOf(t)},b=ArrayBuffer.isView||function(t){return t&&g.indexOf(Object.prototype.toString.call(t))>-1};o.prototype.append=function(t,r){t=e(t),r=n(r);var o=this.map[t];this.map[t]=o?o+","+r:r},o.prototype.delete=function(t){delete this.map[e(t)]},o.prototype.get=function(t){return t=e(t),this.has(t)?this.map[t]:null},o.prototype.has=function(t){return this.map.hasOwnProperty(e(t))},o.prototype.set=function(t,r){this.map[e(t)]=n(r)},o.prototype.forEach=function(t,e){for(var n in this.map)this.map.hasOwnProperty(n)&&t.call(e,this.map[n],n,this)},o.prototype.keys=function(){var t=[];return this.forEach(function(e,n){t.push(n)}),r(t)},o.prototype.values=function(){var t=[];return this.forEach(function(e){t.push(e)}),r(t)},o.prototype.entries=function(){var t=[];return this.forEach(function(e,n){t.push([n,e])}),r(t)},y.iterable&&(o.prototype[Symbol.iterator]=o.prototype.entries);var _=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];d.prototype.clone=function(){return new d(this,{body:this._bodyInit})},f.call(d.prototype),f.call(m.prototype),m.prototype.clone=function(){return new m(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new o(this.headers),url:this.url})},m.error=function(){var t=new m(null,{status:0,statusText:""});return t.type="error",t};var E=[301,302,303,307,308];m.redirect=function(t,e){if(E.indexOf(e)===-1)throw new RangeError("Invalid status code");return new m(null,{status:e,headers:{location:t}})},t.Headers=o,t.Request=d,t.Response=m,t.fetch=function(t,e){return new Promise(function(n,r){var o=new d(t,e),i=new XMLHttpRequest;i.onload=function(){var t={status:i.status,statusText:i.statusText,headers:v(i.getAllResponseHeaders()||"")};t.url="responseURL"in i?i.responseURL:t.headers.get("X-Request-URL"),n(new m("response"in i?i.response:i.responseText,t))},i.onerror=function(){r(new TypeError("Network request failed"))},i.ontimeout=function(){r(new TypeError("Network request failed"))},i.open(o.method,o.url,!0),"include"===o.credentials&&(i.withCredentials=!0),"responseType"in i&&y.blob&&(i.responseType="blob"),o.headers.forEach(function(t,e){i.setRequestHeader(e,t)}),i.send(void 0===o._bodyInit?null:o._bodyInit)})},t.fetch.polyfill=!0}}("undefined"!=typeof self?self:void 0)},function(t,e,n){"use strict";(function(t){function r(e){new a.a.Event.Listener(document,"DOMContentLoaded",function(){if(!(document.body instanceof HTMLElement))throw new ReferenceError;i.a.attach(document.body),Modernizr.addTest("ios",function(){return!!navigator.userAgent.match(/(iPad|iPhone|iPod)/g)});var e=document.querySelectorAll("table:not([class])");if(Array.prototype.forEach.call(e,function(e){var n=t.createElement("div",{class:"md-typeset__scrollwrap"},t.createElement("div",{class:"md-typeset__table"}));e.nextSibling?e.parentNode.insertBefore(n,e.nextSibling):e.parentNode.appendChild(n),n.children[0].appendChild(e)}),Modernizr.ios){var n=document.querySelectorAll("[data-md-scrollfix]");Array.prototype.forEach.call(n,function(t){t.addEventListener("touchstart",function(){var e=t.scrollTop;0===e?t.scrollTop=1:e+t.offsetHeight===t.scrollHeight&&(t.scrollTop=e-1)})})}}).listen(),new a.a.Event.MatchMedia("(min-width: 1220px)",new a.a.Event.Listener(window,["scroll","resize","orientationchange"],new a.a.Header.Shadow("[data-md-component=container]"))),document.querySelector("[data-md-component=tabs]")&&new a.a.Event.Listener(window,["scroll","resize","orientationchange"],new a.a.Tabs.Toggle("[data-md-component=tabs]")).listen(),new a.a.Event.MatchMedia("(min-width: 1220px)",new a.a.Event.Listener(window,["scroll","resize","orientationchange"],new a.a.Sidebar.Position("[data-md-component=navigation]"))),new a.a.Event.MatchMedia("(min-width: 960px) and (max-width: 1219px)",new a.a.Event.Listener(window,["scroll","resize","orientationchange"],new a.a.Sidebar.Position("[data-md-component=toc]"))),new a.a.Event.MatchMedia("(min-width: 1220px)",new a.a.Event.Listener(window,["scroll","resize","orientationchange"],new a.a.Sidebar.Position("[data-md-component=toc]"))),new a.a.Event.MatchMedia("(min-width: 960px)",new a.a.Event.Listener(window,"scroll",new a.a.Nav.Blur("[data-md-component=toc] [href]")));var n=document.querySelectorAll("[data-md-component=collapsible]");Array.prototype.forEach.call(n,function(t){new a.a.Event.MatchMedia("(min-width: 1220px)",new a.a.Event.Listener(t.previousElementSibling,"click",new a.a.Nav.Collapse(t)))}),new a.a.Event.MatchMedia("(max-width: 1219px)",new a.a.Event.Listener("[data-md-component=navigation] [data-md-toggle]","change",new a.a.Nav.Scrolling("[data-md-component=navigation] nav"))),new a.a.Event.MatchMedia("(max-width: 959px)",new a.a.Event.Listener("[data-md-toggle=search]","change",new a.a.Search.Lock("[data-md-toggle=search]"))),new a.a.Event.Listener("[data-md-component=query]",["focus","keyup"],new a.a.Search.Result("[data-md-component=result]",function(){return fetch(e.url.base+"/mkdocs/search_index.json",{credentials:"same-origin"}).then(function(t){return t.json()}).then(function(t){return t.docs.map(function(t){return t.location=e.url.base+t.location,t})})})).listen(),new a.a.Event.MatchMedia("(max-width: 1219px)",new a.a.Event.Listener("[data-md-component=overlay]","touchstart",function(t){return t.preventDefault()})),new a.a.Event.MatchMedia("(max-width: 959px)",new a.a.Event.Listener("[data-md-component=navigation] [href^='#']","click",function(){var t=document.querySelector("[data-md-toggle=drawer]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t.checked&&(t.checked=!1,t.dispatchEvent(new CustomEvent("change")))})),new a.a.Event.Listener("[data-md-toggle=search]","change",function(t){setTimeout(function(t){if(!(t instanceof HTMLInputElement))throw new ReferenceError;if(t.checked){var e=document.querySelector("[data-md-component=query]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.focus()}},400,t.target)}).listen(),new a.a.Event.MatchMedia("(min-width: 960px)",new a.a.Event.Listener("[data-md-component=query]","focus",function(){var t=document.querySelector("[data-md-toggle=search]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t.checked||(t.checked=!0,t.dispatchEvent(new CustomEvent("change")))})),new a.a.Event.MatchMedia("(min-width: 960px)",new a.a.Event.Listener(document.body,"click",function(){var t=document.querySelector("[data-md-toggle=search]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t.checked&&(t.checked=!1,t.dispatchEvent(new CustomEvent("change")))})),new a.a.Event.Listener(window,"keyup",function(t){if(27===(t.keyCode||t.which)){var e=document.querySelector("[data-md-toggle=search]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){e.checked=!1,e.dispatchEvent(new CustomEvent("change"));var n=document.querySelector("[data-md-component=query]");if(!(n instanceof HTMLInputElement))throw new ReferenceError;n.focus()}}}).listen(),new a.a.Event.MatchMedia("(min-width: 960px)",new a.a.Event.Listener("[data-md-toggle=search]","click",function(t){return t.stopPropagation()})),new a.a.Event.MatchMedia("(min-width: 960px)",new a.a.Event.Listener("[data-md-component=search]","click",function(t){return t.stopPropagation()})),function(){var t=document.querySelector("[data-md-source]");if(!t)return Promise.resolve([]);if(!(t instanceof HTMLAnchorElement))throw new ReferenceError;switch(t.dataset.mdSource){case"github":return new a.a.Source.Adapter.GitHub(t).fetch();default:return Promise.resolve([])}}().then(function(t){var e=document.querySelectorAll("[data-md-source]");Array.prototype.forEach.call(e,function(e){new a.a.Source.Repository(e).initialize(t)})})}Object.defineProperty(e,"__esModule",{value:!0});var o=n(70),i=n.n(o),a=n(73);n.d(e,"initialize",function(){return r})}).call(e,n(13))},function(t,e,n){"use strict";var r=n(0)("unscopables"),o=Array.prototype;void 0==o[r]&&n(3)(o,r,{}),t.exports=function(t){o[r][t]=!0}},function(t,e,n){"use strict";t.exports=function(t,e,n,r){if(!(t instanceof e)||void 0!==r&&r in t)throw TypeError(n+": incorrect invocation!");return t}},function(t,e,n){"use strict";var r=n(21),o=n(32),i=n(61);t.exports=function(t){return function(e,n,a){var s,c=r(e),u=o(c.length),l=i(a,u);if(t&&n!=n){for(;u>l;)if(s=c[l++],s!=s)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}}},function(t,e,n){"use strict";var r=n(10),o=n(47),i=n(46),a=n(2),s=n(32),c=n(64),u={},l={},f=t.exports=function(t,e,n,f,h){var d,p,v,m,y=h?function(){return t}:c(t),g=r(n,f,e?2:1),w=0;if("function"!=typeof y)throw TypeError(t+" is not iterable!");if(i(y)){for(d=s(t.length);d>w;w++)if(m=e?g(a(p=t[w])[0],p[1]):g(t[w]),m===u||m===l)return m}else for(v=y.call(t);!(p=v.next()).done;)if(m=o(v,g,p.value,e),m===u||m===l)return m};f.BREAK=u,f.RETURN=l},function(t,e,n){"use strict";t.exports=!n(5)&&!n(25)(function(){return 7!=Object.defineProperty(n(17)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){"use strict";t.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},function(t,e,n){"use strict";var r=n(9);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e,n){"use strict";var r=n(7),o=n(0)("iterator"),i=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||i[o]===t)}},function(t,e,n){"use strict";var r=n(2);t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(e){var i=t.return;throw void 0!==i&&r(i.call(t)),e}}},function(t,e,n){"use strict";var r=n(52),o=n(29),i=n(18),a={};n(3)(a,n(0)("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=r(a,{next:o(1,n)}),i(t,e+" Iterator")}},function(t,e,n){"use strict";var r=n(0)("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(t){}t.exports=function(t,e){if(!e&&!o)return!1;var n=!1;try{var i=[7],a=i[r]();a.next=function(){return{done:n=!0}},i[r]=function(){return a},t(i)}catch(t){}return n}},function(t,e,n){"use strict";t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e,n){"use strict";var r=n(1),o=n(31).set,i=r.MutationObserver||r.WebKitMutationObserver,a=r.process,s=r.Promise,c="process"==n(9)(a);t.exports=function(){var t,e,n,u=function(){var r,o;for(c&&(r=a.domain)&&r.exit();t;){o=t.fn,t=t.next;try{o()}catch(r){throw t?n():e=void 0,r}}e=void 0,r&&r.enter()};if(c)n=function(){a.nextTick(u)};else if(i){var l=!0,f=document.createTextNode("");new i(u).observe(f,{characterData:!0}),n=function(){f.data=l=!l}}else if(s&&s.resolve){var h=s.resolve();n=function(){h.then(u)}}else n=function(){o.call(r,u)};return function(r){var o={fn:r,next:void 0};e&&(e.next=o),t||(t=o,n()),e=o}}},function(t,e,n){"use strict";var r=n(2),o=n(53),i=n(23),a=n(19)("IE_PROTO"),s=function(){},c="prototype",u=function(){var t,e=n(17)("iframe"),r=i.length,o="<",a=">";for(e.style.display="none",n(26).appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(o+"script"+a+"document.F=Object"+o+"/script"+a),t.close(),u=t.F;r--;)delete u[c][i[r]];return u()};t.exports=Object.create||function(t,e){var n;return null!==t?(s[c]=r(t),n=new s,s[c]=null,n[a]=t):n=u(),void 0===e?n:o(n,e)}},function(t,e,n){"use strict";var r=n(12),o=n(2),i=n(56);t.exports=n(5)?Object.defineProperties:function(t,e){o(t);for(var n,a=i(e),s=a.length,c=0;s>c;)r.f(t,n=a[c++],e[n]);return t}},function(t,e,n){"use strict";var r=n(6),o=n(62),i=n(19)("IE_PROTO"),a=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=o(t),r(t,i)?t[i]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?a:null}},function(t,e,n){"use strict";var r=n(6),o=n(21),i=n(41)(!1),a=n(19)("IE_PROTO");t.exports=function(t,e){var n,s=o(t),c=0,u=[];for(n in s)n!=a&&r(s,n)&&u.push(n);for(;e.length>c;)r(s,n=e[c++])&&(~i(u,n)||u.push(n));return u}},function(t,e,n){"use strict";var r=n(55),o=n(23);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e,n){"use strict";var r=n(8);t.exports=function(t,e,n){for(var o in e)r(t,o,e[o],n);return t}},function(t,e,n){"use strict";var r=n(1),o=n(12),i=n(5),a=n(0)("species");t.exports=function(t){var e=r[t];i&&e&&!e[a]&&o.f(e,a,{configurable:!0,get:function(){return this}})}},function(t,e,n){"use strict";var r=n(2),o=n(14),i=n(0)("species");t.exports=function(t,e){var n,a=r(t).constructor;return void 0===a||void 0==(n=r(a)[i])?e:o(n)}},function(t,e,n){"use strict";var r=n(20),o=n(16);t.exports=function(t){return function(e,n){var i,a,s=String(o(e)),c=r(n),u=s.length;return c<0||c>=u?t?"":void 0:(i=s.charCodeAt(c),i<55296||i>56319||c+1===u||(a=s.charCodeAt(c+1))<56320||a>57343?t?s.charAt(c):i:t?s.slice(c,c+2):(i-55296<<10)+(a-56320)+65536)}}},function(t,e,n){"use strict";var r=n(20),o=Math.max,i=Math.min;t.exports=function(t,e){return t=r(t),t<0?o(t+e,0):i(t,e)}},function(t,e,n){"use strict";var r=n(16);t.exports=function(t){return Object(r(t))}},function(t,e,n){"use strict";var r=n(11);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){"use strict";var r=n(15),o=n(0)("iterator"),i=n(7);t.exports=n(4).getIteratorMethod=function(t){if(void 0!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){"use strict";var r=n(39),o=n(50),i=n(7),a=n(21);t.exports=n(27)(Array,"Array",function(t,e){this._t=a(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,o(1)):"keys"==e?o(0,n):"values"==e?o(0,t[n]):o(0,[n,t[n]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(t,e,n){"use strict";var r=n(15),o={};o[n(0)("toStringTag")]="z",o+""!="[object z]"&&n(8)(Object.prototype,"toString",function(){return"[object "+r(this)+"]"},!0)},function(t,e,n){"use strict";var r,o,i,a=n(28),s=n(1),c=n(10),u=n(15),l=n(24),f=n(11),h=n(14),d=n(40),p=n(42),v=n(59),m=n(31).set,y=n(51)(),g="Promise",w=s.TypeError,b=s.process,_=s[g],b=s.process,E="process"==u(b),S=function(){},x=!!function(){try{var t=_.resolve(1),e=(t.constructor={})[n(0)("species")]=function(t){t(S,S)};return(E||"function"==typeof PromiseRejectionEvent)&&t.then(S)instanceof e}catch(t){}}(),k=function(t,e){return t===e||t===_&&e===i},T=function(t){var e;return!(!f(t)||"function"!=typeof(e=t.then))&&e},O=function(t){return k(_,t)?new C(t):new o(t)},C=o=function(t){var e,n;this.promise=new t(function(t,r){if(void 0!==e||void 0!==n)throw w("Bad Promise constructor");e=t,n=r}),this.resolve=h(e),this.reject=h(n)},A=function(t){try{t()}catch(t){return{error:t}}},M=function(t,e){if(!t._n){t._n=!0;var n=t._c;y(function(){for(var r=t._v,o=1==t._s,i=0,a=function(e){var n,i,a=o?e.ok:e.fail,s=e.resolve,c=e.reject,u=e.domain;try{a?(o||(2==t._h&&j(t),t._h=1),a===!0?n=r:(u&&u.enter(),n=a(r),u&&u.exit()),n===e.promise?c(w("Promise-chain cycle")):(i=T(n))?i.call(n,s,c):s(n)):c(r)}catch(t){c(t)}};n.length>i;)a(n[i++]);t._c=[],t._n=!1,e&&!t._h&&L(t)})}},L=function(t){m.call(s,function(){var e,n,r,o=t._v;if(P(t)&&(e=A(function(){E?b.emit("unhandledRejection",o,t):(n=s.onunhandledrejection)?n({promise:t,reason:o}):(r=s.console)&&r.error&&r.error("Unhandled promise rejection",o)}),t._h=E||P(t)?2:1),t._a=void 0,e)throw e.error})},P=function t(e){if(1==e._h)return!1;for(var n,r=e._a||e._c,o=0;r.length>o;)if(n=r[o++],n.fail||!t(n.promise))return!1;return!0},j=function(t){m.call(s,function(){var e;E?b.emit("rejectionHandled",t):(e=s.onrejectionhandled)&&e({promise:t,reason:t._v})})},N=function(t){var e=this;e._d||(e._d=!0,e=e._w||e,e._v=t,e._s=2,e._a||(e._a=e._c.slice()),M(e,!0))},R=function t(e){var n,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===e)throw w("Promise can't be resolved itself");(n=T(e))?y(function(){var o={_w:r,_d:!1};try{n.call(e,c(t,o,1),c(N,o,1))}catch(t){N.call(o,t)}}):(r._v=e,r._s=1,M(r,!1))}catch(t){N.call({_w:r,_d:!1},t)}}};x||(_=function(t){d(this,_,g,"_h"),h(t),r.call(this);try{t(c(R,this,1),c(N,this,1))}catch(t){N.call(this,t)}},r=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},r.prototype=n(57)(_.prototype,{then:function(t,e){var n=O(v(this,_));return n.ok="function"!=typeof t||t,n.fail="function"==typeof e&&e,n.domain=E?b.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&M(this,!1),n.promise},catch:function(t){return this.then(void 0,t)}}),C=function(){var t=new r;this.promise=t,this.resolve=c(R,t,1),this.reject=c(N,t,1)}),l(l.G+l.W+l.F*!x,{Promise:_}),n(18)(_,g),n(58)(g),i=n(4)[g],l(l.S+l.F*!x,g,{reject:function(t){var e=O(this);return(0,e.reject)(t),e.promise}}),l(l.S+l.F*(a||!x),g,{resolve:function(t){if(t instanceof _&&k(t.constructor,this))return t;var e=O(this);return(0,e.resolve)(t),e.promise}}),l(l.S+l.F*!(x&&n(49)(function(t){_.all(t).catch(S)})),g,{all:function(t){var e=this,n=O(e),r=n.resolve,o=n.reject,i=A(function(){var n=[],i=0,a=1;p(t,!1,function(t){var s=i++,c=!1;n.push(void 0),a++,e.resolve(t).then(function(t){c||(c=!0,n[s]=t,--a||r(n))},o)}),--a||r(n)});return i&&o(i.error),n.promise},race:function(t){var e=this,n=O(e),r=n.reject,o=A(function(){p(t,!1,function(t){e.resolve(t).then(n.resolve,r)})});return o&&r(o.error),n.promise}})},function(t,e,n){"use strict";var r=n(60)(!0);n(27)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},function(t,e,n){"use strict";for(var r=n(65),o=n(8),i=n(1),a=n(3),s=n(7),c=n(0),u=c("iterator"),l=c("toStringTag"),f=s.Array,h=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],d=0;d<5;d++){var p,v=h[d],m=i[v],y=m&&m.prototype;if(y){y[u]||a(y,u,f),y[l]||a(y,l,v),s[v]=f;for(p in r)y[p]||o(y,p,r[p],!0)}}},function(t,e,n){"use strict";var r,o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};!function(){function i(t,e){function n(t,e){return function(){return t.apply(e,arguments)}}var r;if(e=e||{},this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=e.touchBoundary||10,this.layer=t,this.tapDelay=e.tapDelay||200,this.tapTimeout=e.tapTimeout||700,!i.notNeeded(t)){for(var o=["onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel"],a=this,c=0,u=o.length;c=0,s=navigator.userAgent.indexOf("Android")>0&&!a,c=/iP(ad|hone|od)/.test(navigator.userAgent)&&!a,u=c&&/OS 4_\d(_\d)?/.test(navigator.userAgent),l=c&&/OS [6-7]_\d/.test(navigator.userAgent),f=navigator.userAgent.indexOf("BB10")>0;i.prototype.needsClick=function(t){switch(t.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(t.disabled)return!0;break;case"input":if(c&&"file"===t.type||t.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(t.className)},i.prototype.needsFocus=function(t){switch(t.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!s;case"input":switch(t.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!t.disabled&&!t.readOnly;default:return/\bneedsfocus\b/.test(t.className)}},i.prototype.sendClick=function(t,e){var n,r;document.activeElement&&document.activeElement!==t&&document.activeElement.blur(),r=e.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(t),!0,!0,window,1,r.screenX,r.screenY,r.clientX,r.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,t.dispatchEvent(n)},i.prototype.determineEventType=function(t){return s&&"select"===t.tagName.toLowerCase()?"mousedown":"click"},i.prototype.focus=function(t){var e;c&&t.setSelectionRange&&0!==t.type.indexOf("date")&&"time"!==t.type&&"month"!==t.type?(e=t.value.length,t.setSelectionRange(e,e)):t.focus()},i.prototype.updateScrollParent=function(t){var e,n;if(e=t.fastClickScrollParent,!e||!e.contains(t)){n=t;do{if(n.scrollHeight>n.offsetHeight){e=n,t.fastClickScrollParent=n;break}n=n.parentElement}while(n)}e&&(e.fastClickLastScrollTop=e.scrollTop)},i.prototype.getTargetElementFromEventTarget=function(t){return t.nodeType===Node.TEXT_NODE?t.parentNode:t},i.prototype.onTouchStart=function(t){var e,n,r;if(t.targetTouches.length>1)return!0;if(e=this.getTargetElementFromEventTarget(t.target),n=t.targetTouches[0],c){if(r=window.getSelection(),r.rangeCount&&!r.isCollapsed)return!0;if(!u){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return t.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(e)}}return this.trackingClick=!0,this.trackingClickStart=t.timeStamp,this.targetElement=e,this.touchStartX=n.pageX,this.touchStartY=n.pageY,t.timeStamp-this.lastClickTimen||Math.abs(e.pageY-this.touchStartY)>n},i.prototype.onTouchMove=function(t){return!this.trackingClick||((this.targetElement!==this.getTargetElementFromEventTarget(t.target)||this.touchHasMoved(t))&&(this.trackingClick=!1,this.targetElement=null),!0)},i.prototype.findControl=function(t){return void 0!==t.control?t.control:t.htmlFor?document.getElementById(t.htmlFor):t.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},i.prototype.onTouchEnd=function(t){var e,n,r,o,i,a=this.targetElement;if(!this.trackingClick)return!0;if(t.timeStamp-this.lastClickTimethis.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=t.timeStamp,n=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,l&&(i=t.changedTouches[0],a=document.elementFromPoint(i.pageX-window.pageXOffset,i.pageY-window.pageYOffset)||a,a.fastClickScrollParent=this.targetElement.fastClickScrollParent),r=a.tagName.toLowerCase(),"label"===r){if(e=this.findControl(a)){if(this.focus(a),s)return!1;a=e}}else if(this.needsFocus(a))return t.timeStamp-n>100||c&&window.top!==window&&"input"===r?(this.targetElement=null,!1):(this.focus(a),this.sendClick(a,t),c&&"select"===r||(this.targetElement=null,t.preventDefault()),!1);return!(!c||u||(o=a.fastClickScrollParent,!o||o.fastClickLastScrollTop===o.scrollTop))||(this.needsClick(a)||(t.preventDefault(),this.sendClick(a,t)),!1)},i.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},i.prototype.onMouse=function(t){return!this.targetElement||(!!t.forwardedTouchEvent||(!t.cancelable||(!(!this.needsClick(this.targetElement)||this.cancelNextClick)||(t.stopImmediatePropagation?t.stopImmediatePropagation():t.propagationStopped=!0,t.stopPropagation(),t.preventDefault(),!1))))},i.prototype.onClick=function(t){var e;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===t.target.type&&0===t.detail||(e=this.onMouse(t),e||(this.targetElement=null),e)},i.prototype.destroy=function(){var t=this.layer;s&&(t.removeEventListener("mouseover",this.onMouse,!0),t.removeEventListener("mousedown",this.onMouse,!0),t.removeEventListener("mouseup",this.onMouse,!0)),t.removeEventListener("click",this.onClick,!0),t.removeEventListener("touchstart",this.onTouchStart,!1),t.removeEventListener("touchmove",this.onTouchMove,!1),t.removeEventListener("touchend",this.onTouchEnd,!1),t.removeEventListener("touchcancel",this.onTouchCancel,!1)},i.notNeeded=function(t){var e,n,r,o;if(void 0===window.ontouchstart)return!0;if(n=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!s)return!0;if(e=document.querySelector("meta[name=viewport]")){if(e.content.indexOf("user-scalable=no")!==-1)return!0;if(n>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(f&&(r=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),r[1]>=10&&r[2]>=3&&(e=document.querySelector("meta[name=viewport]")))){if(e.content.indexOf("user-scalable=no")!==-1)return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===t.style.msTouchAction||"manipulation"===t.style.touchAction||(o=+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1],!!(o>=27&&(e=document.querySelector("meta[name=viewport]"),e&&(e.content.indexOf("user-scalable=no")!==-1||document.documentElement.scrollWidth<=window.outerWidth)))||("none"===t.style.touchAction||"manipulation"===t.style.touchAction))},i.attach=function(t,e){return new i(t,e)},"object"===o(n(34))&&n(34)?(r=function(){return i}.call(e,n,e,t),void 0!==r&&(t.exports=r)):void 0!==t&&t.exports?(t.exports=i.attach,t.exports.FastClick=i):window.FastClick=i}()},function(t,e,n){"use strict";var r,o,i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};!function(a){var s=!1;if(r=a,o="function"==typeof r?r.call(e,n,e,t):r,void 0!==o&&(t.exports=o),s=!0,"object"===i(e)&&(t.exports=a(),s=!0),!s){var c=window.Cookies,u=window.Cookies=a();u.noConflict=function(){return window.Cookies=c,u}}}(function(){function t(){for(var t=0,e={};t1){if(i=t({path:"/"},r.defaults,i),"number"==typeof i.expires){var s=new Date;s.setMilliseconds(s.getMilliseconds()+864e5*i.expires),i.expires=s}try{a=JSON.stringify(o),/^[\{\[]/.test(a)&&(o=a)}catch(t){}return o=n.write?n.write(o,e):encodeURIComponent(String(o)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),e=encodeURIComponent(String(e)),e=e.replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent),e=e.replace(/[\(\)]/g,escape),document.cookie=[e,"=",o,i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}e||(a={});for(var c=document.cookie?document.cookie.split("; "):[],u=/(%[0-9A-Z]{2})+/g,l=0;ln.idx?n=n.next:(r+=e.val*n.val,e=e.next,n=n.next);return r},i.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},i.SortedSet=function(){this.length=0,this.elements=[]},i.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},i.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(i===t)return o;it&&(n=o),r=n-e,o=e+Math.floor(r/2),i=this.elements[o]}return i===t?o:-1},i.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,r=n-e,o=e+Math.floor(r/2),i=this.elements[o];r>1;)it&&(n=o),r=n-e,o=e+Math.floor(r/2),i=this.elements[o];return i>t?o:io-1||r>a-1)break;s[n]!==c[r]?s[n]c[r]&&r++:(e.add(s[n]),n++,r++)}return e},i.SortedSet.prototype.clone=function(){var t=new i.SortedSet;return t.elements=this.toArray(),t.length=t.elements.length,t},i.SortedSet.prototype.union=function(t){var e,n,r;this.length>=t.length?(e=this,n=t):(e=t,n=this),r=e.clone();for(var o=0,i=n.toArray();o0&&(r=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=r},i.Index.prototype.search=function(t){var e=this.pipeline.run(this.tokenizerFn(t)),n=new i.Vector,r=[],o=this._fields.reduce(function(t,e){return t+e.boost},0);return e.some(function(t){return this.tokenStore.has(t)},this)?(e.forEach(function(t,e,a){var s=1/a.length*this._fields.length*o,c=this,u=this.tokenStore.expand(t).reduce(function(e,r){var o=c.corpusTokens.indexOf(r),a=c.idf(r),u=1,l=new i.SortedSet;if(r!==t){var f=Math.max(3,r.length-t.length);u=1/Math.log(f)}o>-1&&n.insert(o,s*a*u);for(var h=c.tokenStore.get(r),d=Object.keys(h),p=d.length,v=0;v=this.height_;t!==this.active_&&(this.header_.dataset.mdState=(this.active_=t)?"shadow":"")}},{key:"reset",value:function(){this.header_.dataset.mdState="",this.height_=0,this.active_=!1}}]),t}();e.a=i},function(t,e,n){"use strict";var r=n(79),o=n(80),i=n(81);e.a={Blur:r.a,Collapse:o.a,Scrolling:i.a}},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var o=function(){function t(t,e){for(var n=0;n0&&(this.els_[n-1].dataset.mdState="blur"),this.index_=n;else for(var r=this.index_;r>=0;r--){if(!(this.anchors_[r].offsetTop-80>t)){this.index_=r;break}r>0&&(this.els_[r-1].dataset.mdState="")}this.offset_=t,this.dir_=e}}},{key:"reset",value:function(){Array.prototype.forEach.call(this.els_,function(t){t.dataset.mdState=""}),this.index_=0,this.offset_=window.pageYOffset}}]),t}();e.a=i},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var o=function(){function t(t,e){for(var n=0;nn){for(;" "!==t[n]&&--n>0;);return t.substring(0,n)+"..."}return t}},{key:"update",value:function(e){var n=this;if("focus"!==e.type||this.index_){if("keyup"===e.type){var r=e.target;if(!(r instanceof HTMLInputElement))throw new ReferenceError;for(;this.list_.firstChild;)this.list_.removeChild(this.list_.firstChild);var o=this.index_.search(r.value);o.forEach(function(e){var r=n.docs_[e.ref],o=r.location.split("#"),i=a(o,1),s=i[0];s=s.replace(/^(\/?\.{2})+/g,""),n.list_.appendChild(t.createElement("li",{class:"md-search-result__item"},t.createElement("a",{href:r.location,title:r.title,class:"md-search-result__link","data-md-rel":s===document.location.pathname?"anchor":""},t.createElement("article",{class:"md-search-result__article"},t.createElement("h1",{class:"md-search-result__title"},r.title),t.createElement("p",{class:"md-search-result__teaser"},n.truncate_(r.text,140))))))});var s=this.list_.querySelectorAll("[data-md-rel=anchor]");Array.prototype.forEach.call(s,function(t){t.addEventListener("click",function(e){var n=document.querySelector("[data-md-toggle=search]");if(!(n instanceof HTMLInputElement))throw new ReferenceError;n.checked&&(n.checked=!1,n.dispatchEvent(new CustomEvent("change"))),e.preventDefault(),setTimeout(function(){document.location.href=t.href},100)})}),this.meta_.textContent=o.length+" search result"+(1!==o.length?"s":"")}}else{var c=function(t){n.index_=i()(function(){this.field("title",{boost:10}),this.field("text"),this.ref("location")}),n.docs_=t.reduce(function(t,e){return n.index_.add(e),t[e.location]=e,t},{})};setTimeout(function(){return"function"==typeof n.data_?n.data_().then(c):c(n.data_)},250)}}}]),e}();e.a=c}).call(e,n(13))},function(t,e,n){"use strict";var r=n(86);e.a={Position:r.a}},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var o=function(){function t(t,e){for(var n=0;n=this.offset_?"lock"!==this.el_.dataset.mdState&&(this.el_.dataset.mdState="lock"):"lock"===this.el_.dataset.mdState&&(this.el_.dataset.mdState="")}},{key:"reset",value:function(){this.el_.dataset.mdState="",this.el_.style.height="",this.height_=0}}]),t}();e.a=i},function(t,e,n){"use strict";var r=n(88),o=n(91);e.a={Adapter:r.a,Repository:o.a}},function(t,e,n){"use strict";var r=n(90);e.a={GitHub:r.a}},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var o=n(71),i=n.n(o),a=function(){function t(t,e){for(var n=0;n1e4?(t/1e3).toFixed(0)+"k":t>1e3?(t/1e3).toFixed(1)+"k":""+t}},{key:"hash_",value:function(t){var e=0;if(0===t.length)return e;for(var n=0,r=t.length;n=this.offset_;t!==this.active_&&(this.el_.dataset.mdState=(this.active_=t)?"hidden":"")}},{key:"reset",value:function(){this.el_.dataset.mdState="",this.active_=!1}}]),t}();e.a=i},function(t,e,n){n(35),n(36),n(37),t.exports=n(38)}]); \ No newline at end of file diff --git a/2.0/vapor-material/assets/javascripts/modernizr-56ade86843.js b/2.0/vapor-material/assets/javascripts/modernizr-56ade86843.js new file mode 100644 index 00000000..cffa5835 --- /dev/null +++ b/2.0/vapor-material/assets/javascripts/modernizr-56ade86843.js @@ -0,0 +1 @@ +!function(e,n,t){function r(e,n){return typeof e===n}function o(){var e,n,t,o,i,s,f;for(var a in w)if(w.hasOwnProperty(a)){if(e=[],n=w[a],n.name&&(e.push(n.name.toLowerCase()),n.options&&n.options.aliases&&n.options.aliases.length))for(t=0;t.md-nav__link,[data-md-color-primary=red] .md-nav__link:active{color:#ef5350}[data-md-color-primary=red] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=pink]{background-color:#e91e63}[data-md-color-primary=pink] .md-typeset a{color:#e91e63}[data-md-color-primary=pink] .md-header{background-color:#e91e63}[data-md-color-primary=pink] .md-nav__item--active>.md-nav__link,[data-md-color-primary=pink] .md-nav__link:active{color:#e91e63}[data-md-color-primary=pink] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=purple]{background-color:#ab47bc}[data-md-color-primary=purple] .md-typeset a{color:#ab47bc}[data-md-color-primary=purple] .md-header{background-color:#ab47bc}[data-md-color-primary=purple] .md-nav__item--active>.md-nav__link,[data-md-color-primary=purple] .md-nav__link:active{color:#ab47bc}[data-md-color-primary=purple] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=deep-purple]{background-color:#7e57c2}[data-md-color-primary=deep-purple] .md-typeset a{color:#7e57c2}[data-md-color-primary=deep-purple] .md-header{background-color:#7e57c2}[data-md-color-primary=deep-purple] .md-nav__item--active>.md-nav__link,[data-md-color-primary=deep-purple] .md-nav__link:active{color:#7e57c2}[data-md-color-primary=deep-purple] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=indigo]{background-color:#3f51b5}[data-md-color-primary=indigo] .md-typeset a{color:#3f51b5}[data-md-color-primary=indigo] .md-header{background-color:#3f51b5}[data-md-color-primary=indigo] .md-nav__item--active>.md-nav__link,[data-md-color-primary=indigo] .md-nav__link:active{color:#3f51b5}[data-md-color-primary=indigo] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=blue]{background-color:#2196f3}[data-md-color-primary=blue] .md-typeset a{color:#2196f3}[data-md-color-primary=blue] .md-header{background-color:#2196f3}[data-md-color-primary=blue] .md-nav__item--active>.md-nav__link,[data-md-color-primary=blue] .md-nav__link:active{color:#2196f3}[data-md-color-primary=blue] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=light-blue]{background-color:#03a9f4}[data-md-color-primary=light-blue] .md-typeset a{color:#03a9f4}[data-md-color-primary=light-blue] .md-header{background-color:#03a9f4}[data-md-color-primary=light-blue] .md-nav__item--active>.md-nav__link,[data-md-color-primary=light-blue] .md-nav__link:active{color:#03a9f4}[data-md-color-primary=light-blue] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=cyan]{background-color:#00bcd4}[data-md-color-primary=cyan] .md-typeset a{color:#00bcd4}[data-md-color-primary=cyan] .md-header{background-color:#00bcd4}[data-md-color-primary=cyan] .md-nav__item--active>.md-nav__link,[data-md-color-primary=cyan] .md-nav__link:active{color:#00bcd4}[data-md-color-primary=cyan] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=teal]{background-color:#009688}[data-md-color-primary=teal] .md-typeset a{color:#009688}[data-md-color-primary=teal] .md-header{background-color:#009688}[data-md-color-primary=teal] .md-nav__item--active>.md-nav__link,[data-md-color-primary=teal] .md-nav__link:active{color:#009688}[data-md-color-primary=teal] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=green]{background-color:#4caf50}[data-md-color-primary=green] .md-typeset a{color:#4caf50}[data-md-color-primary=green] .md-header{background-color:#4caf50}[data-md-color-primary=green] .md-nav__item--active>.md-nav__link,[data-md-color-primary=green] .md-nav__link:active{color:#4caf50}[data-md-color-primary=green] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=light-green]{background-color:#7cb342}[data-md-color-primary=light-green] .md-typeset a{color:#7cb342}[data-md-color-primary=light-green] .md-header{background-color:#7cb342}[data-md-color-primary=light-green] .md-nav__item--active>.md-nav__link,[data-md-color-primary=light-green] .md-nav__link:active{color:#7cb342}[data-md-color-primary=light-green] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=lime]{background-color:#c0ca33}[data-md-color-primary=lime] .md-typeset a{color:#c0ca33}[data-md-color-primary=lime] .md-header{background-color:#c0ca33}[data-md-color-primary=lime] .md-nav__item--active>.md-nav__link,[data-md-color-primary=lime] .md-nav__link:active{color:#c0ca33}[data-md-color-primary=lime] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=yellow]{background-color:#f9a825}[data-md-color-primary=yellow] .md-typeset a{color:#f9a825}[data-md-color-primary=yellow] .md-header{background-color:#f9a825}[data-md-color-primary=yellow] .md-nav__item--active>.md-nav__link,[data-md-color-primary=yellow] .md-nav__link:active{color:#f9a825}[data-md-color-primary=yellow] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=amber]{background-color:#ffb300}[data-md-color-primary=amber] .md-typeset a{color:#ffb300}[data-md-color-primary=amber] .md-header{background-color:#ffb300}[data-md-color-primary=amber] .md-nav__item--active>.md-nav__link,[data-md-color-primary=amber] .md-nav__link:active{color:#ffb300}[data-md-color-primary=amber] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=orange]{background-color:#fb8c00}[data-md-color-primary=orange] .md-typeset a{color:#fb8c00}[data-md-color-primary=orange] .md-header{background-color:#fb8c00}[data-md-color-primary=orange] .md-nav__item--active>.md-nav__link,[data-md-color-primary=orange] .md-nav__link:active{color:#fb8c00}[data-md-color-primary=orange] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=deep-orange]{background-color:#ff7043}[data-md-color-primary=deep-orange] .md-typeset a{color:#ff7043}[data-md-color-primary=deep-orange] .md-header{background-color:#ff7043}[data-md-color-primary=deep-orange] .md-nav__item--active>.md-nav__link,[data-md-color-primary=deep-orange] .md-nav__link:active{color:#ff7043}[data-md-color-primary=deep-orange] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=brown]{background-color:#795548}[data-md-color-primary=brown] .md-typeset a{color:#795548}[data-md-color-primary=brown] .md-header{background-color:#795548}[data-md-color-primary=brown] .md-nav__item--active>.md-nav__link,[data-md-color-primary=brown] .md-nav__link:active{color:#795548}[data-md-color-primary=brown] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=grey]{background-color:#757575}[data-md-color-primary=grey] .md-typeset a{color:#757575}[data-md-color-primary=grey] .md-header{background-color:#757575}[data-md-color-primary=grey] .md-nav__item--active>.md-nav__link,[data-md-color-primary=grey] .md-nav__link:active{color:#757575}[data-md-color-primary=grey] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=blue-grey]{background-color:#546e7a}[data-md-color-primary=blue-grey] .md-typeset a{color:#546e7a}[data-md-color-primary=blue-grey] .md-header{background-color:#546e7a}[data-md-color-primary=blue-grey] .md-nav__item--active>.md-nav__link,[data-md-color-primary=blue-grey] .md-nav__link:active{color:#546e7a}[data-md-color-primary=blue-grey] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-accent=red]{background-color:#ff1744}[data-md-color-accent=red] .md-typeset a:active,[data-md-color-accent=red] .md-typeset a:hover{color:#ff1744}[data-md-color-accent=red] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=red] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ff1744}[data-md-color-accent=red] .md-nav__link:hover,[data-md-color-accent=red] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=red] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=red] .md-typeset [id] .headerlink:focus,[data-md-color-accent=red] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=red] .md-typeset [id]:target .headerlink{color:#ff1744}[data-md-color-accent=red] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff1744}[data-md-color-accent=red] .md-search-result__link:hover{background-color:rgba(255,23,68,.1)}[data-md-color-accent=red] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff1744}button[data-md-color-accent=pink]{background-color:#f50057}[data-md-color-accent=pink] .md-typeset a:active,[data-md-color-accent=pink] .md-typeset a:hover{color:#f50057}[data-md-color-accent=pink] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=pink] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#f50057}[data-md-color-accent=pink] .md-nav__link:hover,[data-md-color-accent=pink] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=pink] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=pink] .md-typeset [id] .headerlink:focus,[data-md-color-accent=pink] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=pink] .md-typeset [id]:target .headerlink{color:#f50057}[data-md-color-accent=pink] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#f50057}[data-md-color-accent=pink] .md-search-result__link:hover{background-color:rgba(245,0,87,.1)}[data-md-color-accent=pink] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#f50057}button[data-md-color-accent=purple]{background-color:#e040fb}[data-md-color-accent=purple] .md-typeset a:active,[data-md-color-accent=purple] .md-typeset a:hover{color:#e040fb}[data-md-color-accent=purple] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=purple] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#e040fb}[data-md-color-accent=purple] .md-nav__link:hover,[data-md-color-accent=purple] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=purple] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=purple] .md-typeset [id] .headerlink:focus,[data-md-color-accent=purple] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=purple] .md-typeset [id]:target .headerlink{color:#e040fb}[data-md-color-accent=purple] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#e040fb}[data-md-color-accent=purple] .md-search-result__link:hover{background-color:rgba(224,64,251,.1)}[data-md-color-accent=purple] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#e040fb}button[data-md-color-accent=deep-purple]{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-typeset a:active,[data-md-color-accent=deep-purple] .md-typeset a:hover{color:#7c4dff}[data-md-color-accent=deep-purple] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=deep-purple] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-nav__link:hover,[data-md-color-accent=deep-purple] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=deep-purple] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=deep-purple] .md-typeset [id] .headerlink:focus,[data-md-color-accent=deep-purple] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=deep-purple] .md-typeset [id]:target .headerlink{color:#7c4dff}[data-md-color-accent=deep-purple] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-search-result__link:hover{background-color:rgba(124,77,255,.1)}[data-md-color-accent=deep-purple] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}button[data-md-color-accent=indigo]{background-color:#536dfe}[data-md-color-accent=indigo] .md-typeset a:active,[data-md-color-accent=indigo] .md-typeset a:hover{color:#536dfe}[data-md-color-accent=indigo] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=indigo] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#536dfe}[data-md-color-accent=indigo] .md-nav__link:hover,[data-md-color-accent=indigo] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=indigo] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=indigo] .md-typeset [id] .headerlink:focus,[data-md-color-accent=indigo] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=indigo] .md-typeset [id]:target .headerlink{color:#536dfe}[data-md-color-accent=indigo] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}[data-md-color-accent=indigo] .md-search-result__link:hover{background-color:rgba(83,109,254,.1)}[data-md-color-accent=indigo] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}button[data-md-color-accent=blue]{background-color:#448aff}[data-md-color-accent=blue] .md-typeset a:active,[data-md-color-accent=blue] .md-typeset a:hover{color:#448aff}[data-md-color-accent=blue] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=blue] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#448aff}[data-md-color-accent=blue] .md-nav__link:hover,[data-md-color-accent=blue] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=blue] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=blue] .md-typeset [id] .headerlink:focus,[data-md-color-accent=blue] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=blue] .md-typeset [id]:target .headerlink{color:#448aff}[data-md-color-accent=blue] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#448aff}[data-md-color-accent=blue] .md-search-result__link:hover{background-color:rgba(68,138,255,.1)}[data-md-color-accent=blue] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#448aff}button[data-md-color-accent=light-blue]{background-color:#0091ea}[data-md-color-accent=light-blue] .md-typeset a:active,[data-md-color-accent=light-blue] .md-typeset a:hover{color:#0091ea}[data-md-color-accent=light-blue] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=light-blue] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#0091ea}[data-md-color-accent=light-blue] .md-nav__link:hover,[data-md-color-accent=light-blue] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=light-blue] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=light-blue] .md-typeset [id] .headerlink:focus,[data-md-color-accent=light-blue] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=light-blue] .md-typeset [id]:target .headerlink{color:#0091ea}[data-md-color-accent=light-blue] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#0091ea}[data-md-color-accent=light-blue] .md-search-result__link:hover{background-color:rgba(0,145,234,.1)}[data-md-color-accent=light-blue] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#0091ea}button[data-md-color-accent=cyan]{background-color:#00b8d4}[data-md-color-accent=cyan] .md-typeset a:active,[data-md-color-accent=cyan] .md-typeset a:hover{color:#00b8d4}[data-md-color-accent=cyan] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=cyan] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}[data-md-color-accent=cyan] .md-nav__link:hover,[data-md-color-accent=cyan] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=cyan] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=cyan] .md-typeset [id] .headerlink:focus,[data-md-color-accent=cyan] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=cyan] .md-typeset [id]:target .headerlink{color:#00b8d4}[data-md-color-accent=cyan] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}[data-md-color-accent=cyan] .md-search-result__link:hover{background-color:rgba(0,184,212,.1)}[data-md-color-accent=cyan] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}button[data-md-color-accent=teal]{background-color:#00bfa5}[data-md-color-accent=teal] .md-typeset a:active,[data-md-color-accent=teal] .md-typeset a:hover{color:#00bfa5}[data-md-color-accent=teal] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=teal] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}[data-md-color-accent=teal] .md-nav__link:hover,[data-md-color-accent=teal] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=teal] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=teal] .md-typeset [id] .headerlink:focus,[data-md-color-accent=teal] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=teal] .md-typeset [id]:target .headerlink{color:#00bfa5}[data-md-color-accent=teal] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}[data-md-color-accent=teal] .md-search-result__link:hover{background-color:rgba(0,191,165,.1)}[data-md-color-accent=teal] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}button[data-md-color-accent=green]{background-color:#00c853}[data-md-color-accent=green] .md-typeset a:active,[data-md-color-accent=green] .md-typeset a:hover{color:#00c853}[data-md-color-accent=green] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=green] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#00c853}[data-md-color-accent=green] .md-nav__link:hover,[data-md-color-accent=green] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=green] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=green] .md-typeset [id] .headerlink:focus,[data-md-color-accent=green] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=green] .md-typeset [id]:target .headerlink{color:#00c853}[data-md-color-accent=green] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00c853}[data-md-color-accent=green] .md-search-result__link:hover{background-color:rgba(0,200,83,.1)}[data-md-color-accent=green] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00c853}button[data-md-color-accent=light-green]{background-color:#64dd17}[data-md-color-accent=light-green] .md-typeset a:active,[data-md-color-accent=light-green] .md-typeset a:hover{color:#64dd17}[data-md-color-accent=light-green] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=light-green] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#64dd17}[data-md-color-accent=light-green] .md-nav__link:hover,[data-md-color-accent=light-green] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=light-green] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=light-green] .md-typeset [id] .headerlink:focus,[data-md-color-accent=light-green] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=light-green] .md-typeset [id]:target .headerlink{color:#64dd17}[data-md-color-accent=light-green] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#64dd17}[data-md-color-accent=light-green] .md-search-result__link:hover{background-color:rgba(100,221,23,.1)}[data-md-color-accent=light-green] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#64dd17}button[data-md-color-accent=lime]{background-color:#aeea00}[data-md-color-accent=lime] .md-typeset a:active,[data-md-color-accent=lime] .md-typeset a:hover{color:#aeea00}[data-md-color-accent=lime] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=lime] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#aeea00}[data-md-color-accent=lime] .md-nav__link:hover,[data-md-color-accent=lime] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=lime] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=lime] .md-typeset [id] .headerlink:focus,[data-md-color-accent=lime] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=lime] .md-typeset [id]:target .headerlink{color:#aeea00}[data-md-color-accent=lime] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#aeea00}[data-md-color-accent=lime] .md-search-result__link:hover{background-color:rgba(174,234,0,.1)}[data-md-color-accent=lime] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#aeea00}button[data-md-color-accent=yellow]{background-color:#ffd600}[data-md-color-accent=yellow] .md-typeset a:active,[data-md-color-accent=yellow] .md-typeset a:hover{color:#ffd600}[data-md-color-accent=yellow] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=yellow] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ffd600}[data-md-color-accent=yellow] .md-nav__link:hover,[data-md-color-accent=yellow] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=yellow] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=yellow] .md-typeset [id] .headerlink:focus,[data-md-color-accent=yellow] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=yellow] .md-typeset [id]:target .headerlink{color:#ffd600}[data-md-color-accent=yellow] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffd600}[data-md-color-accent=yellow] .md-search-result__link:hover{background-color:rgba(255,214,0,.1)}[data-md-color-accent=yellow] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffd600}button[data-md-color-accent=amber]{background-color:#ffab00}[data-md-color-accent=amber] .md-typeset a:active,[data-md-color-accent=amber] .md-typeset a:hover{color:#ffab00}[data-md-color-accent=amber] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=amber] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ffab00}[data-md-color-accent=amber] .md-nav__link:hover,[data-md-color-accent=amber] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=amber] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=amber] .md-typeset [id] .headerlink:focus,[data-md-color-accent=amber] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=amber] .md-typeset [id]:target .headerlink{color:#ffab00}[data-md-color-accent=amber] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffab00}[data-md-color-accent=amber] .md-search-result__link:hover{background-color:rgba(255,171,0,.1)}[data-md-color-accent=amber] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffab00}button[data-md-color-accent=orange]{background-color:#ff9100}[data-md-color-accent=orange] .md-typeset a:active,[data-md-color-accent=orange] .md-typeset a:hover{color:#ff9100}[data-md-color-accent=orange] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=orange] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ff9100}[data-md-color-accent=orange] .md-nav__link:hover,[data-md-color-accent=orange] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=orange] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=orange] .md-typeset [id] .headerlink:focus,[data-md-color-accent=orange] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=orange] .md-typeset [id]:target .headerlink{color:#ff9100}[data-md-color-accent=orange] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff9100}[data-md-color-accent=orange] .md-search-result__link:hover{background-color:rgba(255,145,0,.1)}[data-md-color-accent=orange] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff9100}button[data-md-color-accent=deep-orange]{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-typeset a:active,[data-md-color-accent=deep-orange] .md-typeset a:hover{color:#ff6e40}[data-md-color-accent=deep-orange] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=deep-orange] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-nav__link:hover,[data-md-color-accent=deep-orange] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=deep-orange] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=deep-orange] .md-typeset [id] .headerlink:focus,[data-md-color-accent=deep-orange] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=deep-orange] .md-typeset [id]:target .headerlink{color:#ff6e40}[data-md-color-accent=deep-orange] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-search-result__link:hover{background-color:rgba(255,110,64,.1)}[data-md-color-accent=deep-orange] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}@media only screen and (max-width:59.9375em){[data-md-color-primary=red] .md-nav__source{background-color:rgba(190,66,64,.9675)}[data-md-color-primary=pink] .md-nav__source{background-color:rgba(185,24,79,.9675)}[data-md-color-primary=purple] .md-nav__source{background-color:rgba(136,57,150,.9675)}[data-md-color-primary=deep-purple] .md-nav__source{background-color:rgba(100,69,154,.9675)}[data-md-color-primary=indigo] .md-nav__source{background-color:rgba(50,64,144,.9675)}[data-md-color-primary=blue] .md-nav__source{background-color:rgba(26,119,193,.9675)}[data-md-color-primary=light-blue] .md-nav__source{background-color:rgba(2,134,194,.9675)}[data-md-color-primary=cyan] .md-nav__source{background-color:rgba(0,150,169,.9675)}[data-md-color-primary=teal] .md-nav__source{background-color:rgba(0,119,108,.9675)}[data-md-color-primary=green] .md-nav__source{background-color:rgba(60,139,64,.9675)}[data-md-color-primary=light-green] .md-nav__source{background-color:rgba(99,142,53,.9675)}[data-md-color-primary=lime] .md-nav__source{background-color:rgba(153,161,41,.9675)}[data-md-color-primary=yellow] .md-nav__source{background-color:rgba(198,134,29,.9675)}[data-md-color-primary=amber] .md-nav__source{background-color:rgba(203,142,0,.9675)}[data-md-color-primary=orange] .md-nav__source{background-color:rgba(200,111,0,.9675)}[data-md-color-primary=deep-orange] .md-nav__source{background-color:rgba(203,89,53,.9675)}[data-md-color-primary=brown] .md-nav__source{background-color:rgba(96,68,57,.9675)}[data-md-color-primary=grey] .md-nav__source{background-color:rgba(93,93,93,.9675)}[data-md-color-primary=blue-grey] .md-nav__source{background-color:rgba(67,88,97,.9675)}}@media only screen and (max-width:76.1875em){html [data-md-color-primary=red] .md-nav--primary .md-nav__title--site{background-color:#ef5350}html [data-md-color-primary=pink] .md-nav--primary .md-nav__title--site{background-color:#e91e63}html [data-md-color-primary=purple] .md-nav--primary .md-nav__title--site{background-color:#ab47bc}html [data-md-color-primary=deep-purple] .md-nav--primary .md-nav__title--site{background-color:#7e57c2}html [data-md-color-primary=indigo] .md-nav--primary .md-nav__title--site{background-color:#3f51b5}html [data-md-color-primary=blue] .md-nav--primary .md-nav__title--site{background-color:#2196f3}html [data-md-color-primary=light-blue] .md-nav--primary .md-nav__title--site{background-color:#03a9f4}html [data-md-color-primary=cyan] .md-nav--primary .md-nav__title--site{background-color:#00bcd4}html [data-md-color-primary=teal] .md-nav--primary .md-nav__title--site{background-color:#009688}html [data-md-color-primary=green] .md-nav--primary .md-nav__title--site{background-color:#4caf50}html [data-md-color-primary=light-green] .md-nav--primary .md-nav__title--site{background-color:#7cb342}html [data-md-color-primary=lime] .md-nav--primary .md-nav__title--site{background-color:#c0ca33}html [data-md-color-primary=yellow] .md-nav--primary .md-nav__title--site{background-color:#f9a825}html [data-md-color-primary=amber] .md-nav--primary .md-nav__title--site{background-color:#ffb300}html [data-md-color-primary=orange] .md-nav--primary .md-nav__title--site{background-color:#fb8c00}html [data-md-color-primary=deep-orange] .md-nav--primary .md-nav__title--site{background-color:#ff7043}html [data-md-color-primary=brown] .md-nav--primary .md-nav__title--site{background-color:#795548}html [data-md-color-primary=grey] .md-nav--primary .md-nav__title--site{background-color:#757575}html [data-md-color-primary=blue-grey] .md-nav--primary .md-nav__title--site{background-color:#546e7a}}@media only screen and (min-width:60em){[data-md-color-primary=red] .md-nav--secondary{border-left:.4rem solid #ef5350}[data-md-color-primary=pink] .md-nav--secondary{border-left:.4rem solid #e91e63}[data-md-color-primary=purple] .md-nav--secondary{border-left:.4rem solid #ab47bc}[data-md-color-primary=deep-purple] .md-nav--secondary{border-left:.4rem solid #7e57c2}[data-md-color-primary=indigo] .md-nav--secondary{border-left:.4rem solid #3f51b5}[data-md-color-primary=blue] .md-nav--secondary{border-left:.4rem solid #2196f3}[data-md-color-primary=light-blue] .md-nav--secondary{border-left:.4rem solid #03a9f4}[data-md-color-primary=cyan] .md-nav--secondary{border-left:.4rem solid #00bcd4}[data-md-color-primary=teal] .md-nav--secondary{border-left:.4rem solid #009688}[data-md-color-primary=green] .md-nav--secondary{border-left:.4rem solid #4caf50}[data-md-color-primary=light-green] .md-nav--secondary{border-left:.4rem solid #7cb342}[data-md-color-primary=lime] .md-nav--secondary{border-left:.4rem solid #c0ca33}[data-md-color-primary=yellow] .md-nav--secondary{border-left:.4rem solid #f9a825}[data-md-color-primary=amber] .md-nav--secondary{border-left:.4rem solid #ffb300}[data-md-color-primary=orange] .md-nav--secondary{border-left:.4rem solid #fb8c00}[data-md-color-primary=deep-orange] .md-nav--secondary{border-left:.4rem solid #ff7043}[data-md-color-primary=brown] .md-nav--secondary{border-left:.4rem solid #795548}[data-md-color-primary=grey] .md-nav--secondary{border-left:.4rem solid #757575}[data-md-color-primary=blue-grey] .md-nav--secondary{border-left:.4rem solid #546e7a}}@media only screen and (min-width:76.25em){[data-md-color-primary=red] .md-tabs{background:rgba(190,66,64,.9675)}[data-md-color-primary=red] .md-tabs[data-md-state=hidden]{background:#ef5350}[data-md-color-primary=pink] .md-tabs{background:rgba(185,24,79,.9675)}[data-md-color-primary=pink] .md-tabs[data-md-state=hidden]{background:#e91e63}[data-md-color-primary=purple] .md-tabs{background:rgba(136,57,150,.9675)}[data-md-color-primary=purple] .md-tabs[data-md-state=hidden]{background:#ab47bc}[data-md-color-primary=deep-purple] .md-tabs{background:rgba(100,69,154,.9675)}[data-md-color-primary=deep-purple] .md-tabs[data-md-state=hidden]{background:#7e57c2}[data-md-color-primary=indigo] .md-tabs{background:rgba(50,64,144,.9675)}[data-md-color-primary=indigo] .md-tabs[data-md-state=hidden]{background:#3f51b5}[data-md-color-primary=blue] .md-tabs{background:rgba(26,119,193,.9675)}[data-md-color-primary=blue] .md-tabs[data-md-state=hidden]{background:#2196f3}[data-md-color-primary=light-blue] .md-tabs{background:rgba(2,134,194,.9675)}[data-md-color-primary=light-blue] .md-tabs[data-md-state=hidden]{background:#03a9f4}[data-md-color-primary=cyan] .md-tabs{background:rgba(0,150,169,.9675)}[data-md-color-primary=cyan] .md-tabs[data-md-state=hidden]{background:#00bcd4}[data-md-color-primary=teal] .md-tabs{background:rgba(0,119,108,.9675)}[data-md-color-primary=teal] .md-tabs[data-md-state=hidden]{background:#009688}[data-md-color-primary=green] .md-tabs{background:rgba(60,139,64,.9675)}[data-md-color-primary=green] .md-tabs[data-md-state=hidden]{background:#4caf50}[data-md-color-primary=light-green] .md-tabs{background:rgba(99,142,53,.9675)}[data-md-color-primary=light-green] .md-tabs[data-md-state=hidden]{background:#7cb342}[data-md-color-primary=lime] .md-tabs{background:rgba(153,161,41,.9675)}[data-md-color-primary=lime] .md-tabs[data-md-state=hidden]{background:#c0ca33}[data-md-color-primary=yellow] .md-tabs{background:rgba(198,134,29,.9675)}[data-md-color-primary=yellow] .md-tabs[data-md-state=hidden]{background:#f9a825}[data-md-color-primary=amber] .md-tabs{background:rgba(203,142,0,.9675)}[data-md-color-primary=amber] .md-tabs[data-md-state=hidden]{background:#ffb300}[data-md-color-primary=orange] .md-tabs{background:rgba(200,111,0,.9675)}[data-md-color-primary=orange] .md-tabs[data-md-state=hidden]{background:#fb8c00}[data-md-color-primary=deep-orange] .md-tabs{background:rgba(203,89,53,.9675)}[data-md-color-primary=deep-orange] .md-tabs[data-md-state=hidden]{background:#ff7043}[data-md-color-primary=brown] .md-tabs{background:rgba(96,68,57,.9675)}[data-md-color-primary=brown] .md-tabs[data-md-state=hidden]{background:#795548}[data-md-color-primary=grey] .md-tabs{background:rgba(93,93,93,.9675)}[data-md-color-primary=grey] .md-tabs[data-md-state=hidden]{background:#757575}[data-md-color-primary=blue-grey] .md-tabs{background:rgba(67,88,97,.9675)}[data-md-color-primary=blue-grey] .md-tabs[data-md-state=hidden]{background:#546e7a}} \ No newline at end of file diff --git a/2.0/vapor-material/assets/stylesheets/application-e5b48ab351.css b/2.0/vapor-material/assets/stylesheets/application-e5b48ab351.css new file mode 100644 index 00000000..f6ce61aa --- /dev/null +++ b/2.0/vapor-material/assets/stylesheets/application-e5b48ab351.css @@ -0,0 +1 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}html{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none}body{margin:0}hr{overflow:visible;box-sizing:content-box}a{-webkit-text-decoration-skip:objects}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}a:active,a:hover{outline-width:0}small,sub,sup{font-size:80%}sub,sup{position:relative;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}table{border-collapse:collapse;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{padding:0;background:transparent;font-size:inherit}button,input{border:0;outline:0}.admonition:before,.md-icon,.md-nav__button,.md-nav__link:after,.md-nav__title:before,.md-typeset .critic.comment:before,.md-typeset .footnote-backref,.md-typeset .task-list-control .task-list-indicator:before{font-family:Material Icons;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;white-space:nowrap;speak:none;word-wrap:normal;direction:ltr}.md-content__edit,.md-footer-nav__button,.md-header-nav__button,.md-nav__button,.md-nav__title:before{display:inline-block;margin:.4rem;padding:.8rem;font-size:2.4rem;cursor:pointer}.md-icon--arrow-back:before{content:"arrow_back"}.md-icon--arrow-forward:before{content:"arrow_forward"}.md-icon--menu:before{content:"menu"}.md-icon--search:before{content:"search"}.md-icon--home:before{content:"school"}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,input{color:#181818;-webkit-font-feature-settings:"kern","onum","liga";font-feature-settings:"kern","onum","liga";font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400}code,kbd,pre{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","onum","liga";font-feature-settings:"kern","onum","liga";font-family:Courier New,Courier,monospace;font-weight:400}.md-typeset{font-size:1.6rem;line-height:1.6;-webkit-print-color-adjust:exact}.md-typeset blockquote,.md-typeset ol,.md-typeset p,.md-typeset ul{margin:1em 0}.md-typeset h1{margin:0 0 4rem;color:rgba(0,0,0,.54);font-size:3.125rem;line-height:1.3}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{margin:4rem 0 1.6rem;font-size:2.5rem;line-height:1.4}.md-typeset h3{margin:3.2rem 0 1.6rem;font-size:2rem;font-weight:400;letter-spacing:-.01em;line-height:1.5}.md-typeset h2+h3{margin-top:1.6rem}.md-typeset h4{font-size:1.6rem}.md-typeset h4,.md-typeset h5,.md-typeset h6{margin:1.6rem 0;font-weight:700;letter-spacing:-.01em}.md-typeset h5,.md-typeset h6{color:rgba(0,0,0,.54);font-size:1.28rem}.md-typeset h5{text-transform:uppercase}.md-typeset hr{margin:1.5em 0;border-bottom:.1rem dotted rgba(0,0,0,.26)}.md-typeset a{color:#7b8eb0;word-break:break-word}.md-typeset a,.md-typeset a:before{-webkit-transition:color .125s;transition:color .125s}.md-typeset a:active,.md-typeset a:hover{color:#fca9a8}.md-typeset code,.md-typeset pre{background-color:hsla(0,0%,93%,.5);color:#37474f;font-size:85%}.md-typeset code{margin:0 .29412em;padding:.07353em 0;border-radius:.2rem;box-shadow:.29412em 0 0 hsla(0,0%,93%,.5),-.29412em 0 0 hsla(0,0%,93%,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{margin:0;background-color:transparent;box-shadow:none}.md-typeset a>code{margin:inherit;padding:inherit;border-radius:none;background-color:inherit;color:inherit;box-shadow:none}.md-typeset pre{margin:1em 0;padding:1rem 1.2rem;border-radius:.2rem;line-height:1.4;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset pre::-webkit-scrollbar{width:.4rem;height:.4rem}.md-typeset pre::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#fca9a8}.md-typeset pre>code{margin:0;background-color:transparent;font-size:inherit;box-shadow:none;-webkit-box-decoration-break:none;box-decoration-break:none}.md-typeset kbd{padding:0 .29412em;border:.1rem solid #c9c9c9;border-radius:.2rem;border-bottom-color:#bcbcbc;background-color:#fcfcfc;color:#555;font-size:85%;box-shadow:0 .1rem 0 #b0b0b0;word-break:break-word}.md-typeset mark{margin:0 .25em;padding:.0625em 0;border-radius:.2rem;background-color:rgba(255,235,59,.5);box-shadow:.25em 0 0 rgba(255,235,59,.5),-.25em 0 0 rgba(255,235,59,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset abbr{border-bottom:.1rem dotted rgba(0,0,0,.54);cursor:help}.md-typeset small{opacity:.75}.md-typeset sub,.md-typeset sup{margin-left:.07812em}.md-typeset blockquote{padding-left:1.2rem;border-left:.4rem solid rgba(0,0,0,.26);color:rgba(0,0,0,.54)}.md-typeset ul{list-style-type:disc}.md-typeset ol,.md-typeset ul{margin-left:.625em;padding:0}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em;margin-left:1.25em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin:.5em 0 .5em .625em}.md-typeset dd{margin:1em 0 1em 1.875em}.md-typeset iframe,.md-typeset img,.md-typeset svg{max-width:100%}.md-typeset table:not([class]){box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);display:inline-block;max-width:100%;border-radius:.2rem;font-size:1.28rem;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}.md-typeset table:not([class]) th{min-width:10rem;padding:1.2rem 1.6rem;background-color:rgba(0,0,0,.54);color:#fff;vertical-align:top}.md-typeset table:not([class]) td{padding:1.2rem 1.6rem;border-top:.1rem solid rgba(0,0,0,.07);vertical-align:top}.md-typeset table:not([class]) tr:first-child td{border-top:0}.md-typeset table:not([class]) a{word-break:normal}.md-typeset__scrollwrap{margin:1em -1.6rem;overflow-x:auto;-webkit-overflow-scrolling:touch}.md-typeset .md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 1.6rem}.md-typeset .md-typeset__table table{display:table;width:100%;margin:0;overflow:hidden}html{font-size:62.5%}body,html{height:100%}body{position:relative}hr{display:block;height:.1rem;padding:0;border:0}.md-svg{display:none}.md-grid{max-width:122rem;margin-right:auto;margin-left:auto}.md-container,.md-main{overflow:auto}.md-container{display:table;width:100%;height:100%;padding-top:5.6rem;table-layout:fixed}.md-main{display:table-row;height:100%}.md-main__inner{min-height:100%;padding-top:3rem;overflow:auto}.md-toggle{display:none}.md-overlay{position:fixed;top:0;width:0;height:0;-webkit-transition:width 0s .25s,height 0s .25s,opacity .25s;transition:width 0s .25s,height 0s .25s,opacity .25s;background-color:rgba(0,0,0,.54);opacity:0;z-index:2}.md-flex{display:table}.md-flex__cell{display:table-cell;position:relative;vertical-align:top}.md-flex__cell--shrink{width:0}.md-flex__cell--stretch{display:table;width:100%;table-layout:fixed}.md-flex__ellipsis{display:table-cell;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}@page{margin:25mm}.md-content__inner{margin:2.4rem 1.6rem}.md-content__inner>:last-child{margin-bottom:0}.md-content__edit{float:right}.md-header{position:fixed;top:0;right:0;left:0;height:5.6rem;-webkit-transition:background-color .25s;transition:background-color .25s;background-color:#7b8eb0;color:#fff;z-index:1}.md-header,.no-js .md-header{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2)}.md-header-nav{padding:.4rem}.md-header-nav__button{position:relative;-webkit-transition:opacity .25s;transition:opacity .25s;z-index:1}.md-header-nav__button:hover{opacity:.7}.md-header-nav__button.md-logo img{display:block}.no-js .md-header-nav__button.md-icon--search{display:none}.md-header-nav__title{padding:0 2rem;font-size:1.8rem;line-height:4.8rem}.md-header-nav__parent{color:hsla(0,0%,100%,.7)}.md-header-nav__parent:after{display:inline;color:hsla(0,0%,100%,.3);content:"/"}.md-header-nav__source{display:none}.md-footer-nav{background-color:#3b4752;color:#fff}.md-footer-nav__inner{padding:.4rem;overflow:auto}.md-footer-nav__link{padding-top:2.8rem;padding-bottom:.8rem;-webkit-transition:opacity .25s;transition:opacity .25s}.md-footer-nav__link:hover{opacity:.7}.md-footer-nav__link--prev{width:25%;float:left}.md-footer-nav__link--next{width:75%;float:right;text-align:right}.md-footer-nav__button{-webkit-transition:background .25s;transition:background .25s}.md-footer-nav__title{position:relative;padding:0 2rem;font-size:1.8rem;line-height:4.8rem}.md-footer-nav__direction{position:absolute;right:0;left:0;margin-top:-2rem;padding:0 2rem;color:hsla(0,0%,100%,.7);font-size:1.5rem}.md-footer-meta{background:#292f34}.md-footer-meta__inner{padding:.4rem;overflow:auto}html .md-footer-meta.md-typeset a{color:hsla(0,0%,100%,.7)}.md-footer-copyright{margin:0 1.2rem;padding:.8rem 0;color:hsla(0,0%,100%,.3);font-size:1.28rem}.md-footer-copyright__highlight{color:hsla(0,0%,100%,.7)}.md-footer-social{margin:0 .8rem;padding:.4rem 0 1.2rem}.md-footer-social__link{display:inline-block;width:3.2rem;height:3.2rem;border:.1rem solid hsla(0,0%,100%,.12);border-radius:100%;color:hsla(0,0%,100%,.7);font-size:1.6rem;text-align:center}.md-footer-social__link:before{line-height:1.9}.md-nav{font-size:1.4rem;line-height:1.3}.md-nav--secondary{-webkit-transition:border-left .25s;transition:border-left .25s;border-left:.4rem solid #7b8eb0}.md-nav__title{display:block;padding:1.2rem 1.2rem 0;font-weight:700;text-overflow:ellipsis;overflow:hidden}.md-nav__title:before{display:none;content:"arrow_back"}.md-nav__title .md-nav__button{display:none}.md-nav__list{margin:0;padding:0;list-style:none}.md-nav__item{padding:0 1.2rem}.md-nav__item:last-child{padding-bottom:1.2rem}.md-nav__item .md-nav__item{padding-right:0}.md-nav__item .md-nav__item:last-child{padding-bottom:0}.md-nav__button img{width:100%;height:auto}.md-nav__link{display:block;margin-top:.625em;-webkit-transition:color .125s;transition:color .125s;text-overflow:ellipsis;cursor:pointer;overflow:hidden}.md-nav__item--nested>.md-nav__link:after{content:"keyboard_arrow_down"}html .md-nav__link[for=toc],html .md-nav__link[for=toc]+.md-nav__link:after,html .md-nav__link[for=toc]~.md-nav{display:none}.md-nav__link[data-md-state=blur]{color:rgba(0,0,0,.54);font-style:italic}.md-nav__item--active>.md-nav__link,.md-nav__link:active{color:#7b8eb0}.md-nav__item--nested>.md-nav__link{color:inherit}.md-nav__link:focus,.md-nav__link:hover{color:#fca9a8}.md-nav__source,.no-js .md-search{display:none}.md-search__overlay{display:none;pointer-events:none}.md-search__inner{width:100%}.md-search__form{position:relative}.md-search__input{position:relative;padding:0 1.6rem 0 7.2rem;text-overflow:ellipsis;z-index:1}.md-search__input+.md-search__icon,.md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}.md-search__input+.md-search__icon,.md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__input::-ms-clear{display:none}.md-search__icon{position:absolute;top:.8rem;left:1.2rem;-webkit-transition:color .25s;transition:color .25s;font-size:2.4rem;cursor:pointer;z-index:1}.md-search__icon:before{content:"search"}.md-search__output{position:absolute;width:100%;border-radius:0 0 .2rem .2rem;overflow:hidden}.md-search__scrollwrap{height:100%;background:-webkit-linear-gradient(top,#fff 10%,hsla(0,0%,100%,0)),-webkit-linear-gradient(top,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background:linear-gradient(180deg,#fff 10%,hsla(0,0%,100%,0)),linear-gradient(180deg,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background-attachment:local,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100% 2rem,100% 1rem;box-shadow:inset 0 .1rem 0 rgba(0,0,0,.07);overflow-y:auto;-webkit-overflow-scrolling:touch}.md-search-result__meta{padding:0 1.6rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-size:1.28rem;line-height:4rem}.md-search-result__list{margin:0;padding:0;border-top:.1rem solid rgba(0,0,0,.07);list-style:none}.md-search-result__item{box-shadow:0 -.1rem 0 rgba(0,0,0,.07)}.md-search-result__link{display:block;padding:0 1.6rem;-webkit-transition:background .25s;transition:background .25s;overflow:auto}.md-search-result__link:hover{background-color:hsla(1,93%,82%,.1)}.md-search-result__article{margin:1em 0}.md-search-result__title{margin-top:.5em;margin-bottom:0;color:rgba(0,0,0,.87);font-size:1.6rem;font-weight:400;line-height:1.4}.md-search-result__teaser{margin:.5em 0;color:rgba(0,0,0,.54);font-size:1.28rem;line-height:1.4;word-break:break-word}.md-sidebar{position:relative;width:24.2rem;padding:2.4rem 0;float:left;overflow:visible}.md-sidebar[data-md-state=lock]{position:fixed;top:5.6rem;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-sidebar--secondary{display:none}.md-sidebar__scrollwrap{max-height:100%;margin:0 .4rem;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-sidebar__scrollwrap::-webkit-scrollbar{width:.4rem;height:.4rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#fca9a8}@-webkit-keyframes a{0%{height:0}to{height:1.3rem}}@keyframes a{0%{height:0}to{height:1.3rem}}@-webkit-keyframes b{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes b{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}.md-source{display:block;-webkit-transition:opacity .25s;transition:opacity .25s;font-size:1.3rem;line-height:1.2;white-space:nowrap}.md-source:hover{opacity:.7}.md-source:after,.md-source__icon{display:inline-block;height:4.8rem;content:"";vertical-align:middle}.md-source__icon{width:4.8rem}.md-source__icon svg{margin-top:1.2rem;margin-left:1.2rem}.md-source__icon+.md-source__repository{margin-left:-4.4rem;padding-left:4rem}.md-source__repository{display:inline-block;max-width:100%;margin-left:1.2rem;font-weight:700;text-overflow:ellipsis;overflow:hidden;vertical-align:middle}.md-source__facts{margin:0;padding:0;font-size:1.1rem;font-weight:700;list-style-type:none;opacity:.75;overflow:hidden}[data-md-state=done] .md-source__facts{-webkit-animation:a .25s ease-in;animation:a .25s ease-in}.md-source__fact{float:left}[data-md-state=done] .md-source__fact{-webkit-animation:b .4s ease-out;animation:b .4s ease-out}.md-source__fact:before{margin:0 .2rem;content:"\00B7"}.md-source__fact:first-child:before{display:none}.md-tabs{width:100%;-webkit-transition:background .25s;transition:background .25s;background:rgba(98,113,140,.9675);overflow:auto}.md-tabs__list{margin:0;margin-left:.4rem;padding:0;list-style:none;white-space:nowrap}.md-tabs__item{display:inline-block;height:4.8rem;padding-right:1.2rem;padding-left:1.2rem}.md-tabs__link{display:block;margin-top:1.6rem;-webkit-transition:color .25s,opacity .1s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:color .25s,opacity .1s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:color .25s,transform .4s cubic-bezier(.1,.7,.1,1),opacity .1s;transition:color .25s,transform .4s cubic-bezier(.1,.7,.1,1),opacity .1s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);color:hsla(0,0%,100%,.7);font-size:1.4rem}.md-tabs__link--active,.md-tabs__link:hover{color:#fff}.md-tabs__item:nth-child(2) .md-tabs__link{-webkit-transition-delay:.02s;transition-delay:.02s}.md-tabs__item:nth-child(3) .md-tabs__link{-webkit-transition-delay:.04s;transition-delay:.04s}.md-tabs__item:nth-child(4) .md-tabs__link{-webkit-transition-delay:.06s;transition-delay:.06s}.md-tabs__item:nth-child(5) .md-tabs__link{-webkit-transition-delay:.08s;transition-delay:.08s}.md-tabs__item:nth-child(6) .md-tabs__link{-webkit-transition-delay:.1s;transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{-webkit-transition-delay:.12s;transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{-webkit-transition-delay:.14s;transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{-webkit-transition-delay:.16s;transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{-webkit-transition-delay:.18s;transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{-webkit-transition-delay:.2s;transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{-webkit-transition-delay:.22s;transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{-webkit-transition-delay:.24s;transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{-webkit-transition-delay:.26s;transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{-webkit-transition-delay:.28s;transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{-webkit-transition-delay:.3s;transition-delay:.3s}.md-tabs[data-md-state=hidden]{background:#7b8eb0}.md-tabs[data-md-state=hidden] .md-tabs__link{-webkit-transform:translateY(50%);transform:translateY(50%);-webkit-transition:color .25s,opacity .1s,-webkit-transform 0s .4s;transition:color .25s,opacity .1s,-webkit-transform 0s .4s;transition:color .25s,transform 0s .4s,opacity .1s;transition:color .25s,transform 0s .4s,opacity .1s,-webkit-transform 0s .4s;opacity:0}.admonition{position:relative;margin:1.5625em 0;padding:.8rem 1.2rem;border-left:3.2rem solid rgba(68,138,255,.4);border-radius:.2rem;background-color:rgba(68,138,255,.15);font-size:1.28rem}.admonition:before{position:absolute;left:-2.6rem;color:#fff;font-size:2rem;content:"edit";vertical-align:-.25em}.admonition :first-child{margin-top:0}.admonition :last-child{margin-bottom:0}.admonition.summary,.admonition.tldr{border-color:rgba(0,176,255,.4);background-color:rgba(0,176,255,.15)}.admonition.summary:before,.admonition.tldr:before{content:"subject"}.admonition.hint,.admonition.important,.admonition.tip{border-color:rgba(0,191,165,.4);background-color:rgba(0,191,165,.15)}.admonition.hint:before,.admonition.important:before,.admonition.tip:before{content:"whatshot"}.admonition.check,.admonition.done,.admonition.success{border-color:rgba(0,230,118,.4);background-color:rgba(0,230,118,.15)}.admonition.check:before,.admonition.done:before,.admonition.success:before{content:"done"}.admonition.attention,.admonition.caution,.admonition.warning{border-color:rgba(255,145,0,.4);background-color:rgba(255,145,0,.15)}.admonition.attention:before,.admonition.caution:before,.admonition.warning:before{content:"warning"}.admonition.fail,.admonition.failure,.admonition.missing{border-color:rgba(255,82,82,.4);background-color:rgba(255,82,82,.15)}.admonition.fail:before,.admonition.failure:before,.admonition.missing:before{content:"clear"}.admonition.danger,.admonition.error{border-color:rgba(255,23,68,.4);background-color:rgba(255,23,68,.15)}.admonition.danger:before,.admonition.error:before{content:"flash_on"}.admonition.bug{border-color:rgba(245,0,87,.4);background-color:rgba(245,0,87,.15)}.admonition.bug:before{content:"bug_report"}.admonition.cite,.admonition.quote{border-color:hsla(0,0%,62%,.4);background-color:hsla(0,0%,62%,.15)}.admonition.cite:before,.admonition.quote:before{content:"format_quote"}.admonition-title{font-weight:700}html .admonition-title{margin-bottom:0}html .admonition-title+*{margin-top:0}.codehilite .o,.codehilite .ow{color:inherit}.codehilite .ge{color:#000}.codehilite .gr{color:#a00}.codehilite .gh{color:#999}.codehilite .go{color:#888}.codehilite .gp{color:#555}.codehilite .gs{color:inherit}.codehilite .gu{color:#aaa}.codehilite .gt{color:#a00}.codehilite .gd{background-color:#fdd}.codehilite .gi{background-color:#dfd}.codehilite .k{color:#3b78e7}.codehilite .kc{color:#a71d5d}.codehilite .kd,.codehilite .kn{color:#3b78e7}.codehilite .kp{color:#a71d5d}.codehilite .kr,.codehilite .kt{color:#3e61a2}.codehilite .c,.codehilite .cm{color:#999}.codehilite .cp{color:#666}.codehilite .c1,.codehilite .ch,.codehilite .cs{color:#999}.codehilite .na,.codehilite .nb{color:#c2185b}.codehilite .bp{color:#3e61a2}.codehilite .nc{color:#c2185b}.codehilite .no{color:#3e61a2}.codehilite .nd,.codehilite .ni{color:#666}.codehilite .ne,.codehilite .nf{color:#c2185b}.codehilite .nl{color:#3b5179}.codehilite .nn{color:#ec407a}.codehilite .nt{color:#3b78e7}.codehilite .nv,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#3e61a2}.codehilite .nx{color:#ec407a}.codehilite .il,.codehilite .m,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#e74c3c}.codehilite .s,.codehilite .sb,.codehilite .sc{color:#0d904f}.codehilite .sd{color:#999}.codehilite .s2{color:#0d904f}.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sx{color:#183691}.codehilite .sr{color:#009926}.codehilite .s1,.codehilite .ss{color:#0d904f}.codehilite .err{color:#a61717}.codehilite .w{color:transparent}.codehilite .hll{display:block;margin:0 -1.2rem;padding:0 1.2rem;background-color:rgba(255,235,59,.5)}.md-typeset .codehilite{margin:1em 0;padding:1rem 1.2rem .8rem;border-radius:.2rem;background-color:hsla(0,0%,93%,.5);color:#37474f;line-height:1.4;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .codehilite::-webkit-scrollbar{width:.4rem;height:.4rem}.md-typeset .codehilite::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset .codehilite::-webkit-scrollbar-thumb:hover{background-color:#fca9a8}.md-typeset .codehilite pre{display:inline-block;min-width:100%;margin:0;padding:0;background-color:transparent;overflow:visible;vertical-align:top}.md-typeset .codehilitetable{display:block;margin:1em 0;border-radius:.2em;font-size:1.6rem;overflow:hidden}.md-typeset .codehilitetable tbody,.md-typeset .codehilitetable td{display:block;padding:0}.md-typeset .codehilitetable tr{display:-webkit-box;display:-ms-flexbox;display:flex}.md-typeset .codehilitetable .codehilite,.md-typeset .codehilitetable .linenodiv{margin:0;border-radius:0}.md-typeset .codehilitetable .linenodiv{padding:1rem 1.2rem .8rem}.md-typeset .codehilitetable .linenodiv,.md-typeset .codehilitetable .linenodiv>pre{height:100%}.md-typeset .codehilitetable .linenos{background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.26);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-typeset .codehilitetable .linenos pre{margin:0;padding:0;background-color:transparent;color:inherit;text-align:right}.md-typeset .codehilitetable .code{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.md-typeset>.codehilitetable{box-shadow:none}.md-typeset .footnote{color:rgba(0,0,0,.54);font-size:1.28rem}.md-typeset .footnote ol{margin-left:0}.md-typeset .footnote li{-webkit-transition:color .25s;transition:color .25s}.md-typeset .footnote li:before{display:block;height:0}.md-typeset .footnote li:target{color:rgba(0,0,0,.87)}.md-typeset .footnote li:target:before{margin-top:-9rem;padding-top:9rem;pointer-events:none}.md-typeset .footnote li :first-child{margin-top:0}.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}.md-typeset .footnote li:hover .footnote-backref:hover,.md-typeset .footnote li:target .footnote-backref{color:#fca9a8}.md-typeset .footnote-backref{display:inline-block;-webkit-transform:translateX(.5rem);transform:translateX(.5rem);-webkit-transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s,-webkit-transform .25s .125s;color:rgba(0,0,0,.26);font-size:0;opacity:0;vertical-align:text-bottom}.md-typeset .footnote-backref:before{font-size:1.6rem;content:"keyboard_return"}.md-typeset .headerlink{display:inline-block;margin-left:1rem;-webkit-transform:translateY(.5rem);transform:translateY(.5rem);-webkit-transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s,-webkit-transform .25s .25s;opacity:0}html body .md-typeset .headerlink{color:rgba(0,0,0,.26)}.md-typeset [id]:before{display:inline-block;content:""}.md-typeset [id]:target:before{margin-top:-9.8rem;padding-top:9.8rem}.md-typeset [id] .headerlink:focus,.md-typeset [id]:hover .headerlink,.md-typeset [id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset [id] .headerlink:focus,.md-typeset [id]:hover .headerlink:hover,.md-typeset [id]:target .headerlink{color:#fca9a8}.md-typeset h1[id]{padding-top:.8rem}.md-typeset h1[id] .headerlink{display:none}.md-typeset h2[id]:before{display:block;margin-top:-.4rem;padding-top:.4rem}.md-typeset h2[id]:target:before{margin-top:-8.4rem;padding-top:8.4rem}.md-typeset h3[id]:before{display:block;margin-top:-.7rem;padding-top:.7rem}.md-typeset h3[id]:target:before{margin-top:-8.7rem;padding-top:8.7rem}.md-typeset h4[id]:before{display:block;margin-top:-.8rem;padding-top:.8rem}.md-typeset h4[id]:target:before{margin-top:-8.8rem;padding-top:8.8rem}.md-typeset h5[id]:before{display:block;margin-top:-1.1rem;padding-top:1.1rem}.md-typeset h5[id]:target:before{margin-top:-9.1rem;padding-top:9.1rem}.md-typeset h6[id]:before{display:block;margin-top:-1.1rem;padding-top:1.1rem}.md-typeset h6[id]:target:before{margin-top:-9.1rem;padding-top:9.1rem}.md-typeset .MJXc-display{margin:.75em 0;padding:.25em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .MathJax_CHTML{outline:0}.md-typeset .comment.critic,.md-typeset del.critic,.md-typeset ins.critic{margin:0 .25em;padding:.0625em 0;border-radius:.2rem;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:#fdd;box-shadow:.25em 0 0 #fdd,-.25em 0 0 #fdd}.md-typeset ins.critic{background-color:#dfd;box-shadow:.25em 0 0 #dfd,-.25em 0 0 #dfd}.md-typeset .critic.comment{background-color:hsla(0,0%,93%,.5);color:#37474f;box-shadow:.25em 0 0 hsla(0,0%,93%,.5),-.25em 0 0 hsla(0,0%,93%,.5)}.md-typeset .critic.comment:before{padding-right:.125em;color:rgba(0,0,0,.26);content:"chat";vertical-align:-.125em}.md-typeset .critic.block{display:block;margin:1em 0;padding-right:1.6rem;padding-left:1.6rem;box-shadow:none}.md-typeset .critic.block :first-child{margin-top:.5em}.md-typeset .critic.block :last-child{margin-bottom:.5em}.md-typeset .emojione{width:2rem;vertical-align:text-top}.md-typeset code.codehilite{margin:0 .29412em;padding:.07353em 0}.md-typeset .task-list-item{position:relative;list-style-type:none}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em;left:-2em}.md-typeset .task-list-control .task-list-indicator:before{position:absolute;top:.05em;left:-1.25em;color:rgba(0,0,0,.26);font-size:1.5em;content:"check_box_outline_blank";vertical-align:-.25em}.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator:before{content:"check_box"}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}@media print{.md-typeset a:after{color:rgba(0,0,0,.54);content:" [" attr(href) "]"}.md-typeset code{box-shadow:none;-webkit-box-decoration-break:initial;box-decoration-break:slice}.md-content__edit,.md-footer,.md-header,.md-sidebar,.md-typeset .headerlink{display:none}}@media only screen and (max-width:44.9375em){.md-typeset pre{margin:1em -1.6rem;padding:1rem 1.6rem;border-radius:0}.md-footer-nav__link--prev .md-footer-nav__title{display:none}.codehilite .hll{margin:0 -1.6rem;padding:0 1.6rem}.md-typeset>.codehilite{padding:1rem 1.6rem .8rem}.md-typeset>.codehilite,.md-typeset>.codehilitetable{margin:1em -1.6rem;border-radius:0}.md-typeset>.codehilitetable .codehilite,.md-typeset>.codehilitetable .linenodiv{padding:1rem 1.6rem}.md-typeset>p>.MJXc-display{margin:.75em -1.6rem;padding:.25em 1.6rem}}@media only screen and (min-width:100em){html{font-size:68.75%}}@media only screen and (min-width:125em){html{font-size:75%}}@media only screen and (max-width:59.9375em){body[data-md-state=lock]{overflow:hidden}.ios body[data-md-state=lock] .md-container{display:none}.md-content__edit{margin-right:-.8rem}.md-nav--secondary{border-left:0}html .md-nav__link[for=toc]{display:block;padding-right:4.8rem}html .md-nav__link[for=toc]:after{color:inherit;content:"toc"}html .md-nav__link[for=toc]+.md-nav__link{display:none}html .md-nav__link[for=toc]~.md-nav{display:-webkit-box;display:-ms-flexbox;display:flex}.md-nav__source{display:block;padding:.4rem;background-color:rgba(98,113,140,.9675);color:#fff}.md-search__overlay{display:block;position:absolute;top:.4rem;left:.4rem;width:4rem;height:4rem;-webkit-transform-origin:center;transform-origin:center;-webkit-transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:transform .3s .1s,opacity .2s .2s;transition:transform .3s .1s,opacity .2s .2s,-webkit-transform .3s .1s;border-radius:2rem;background-color:#fff;opacity:0;overflow:hidden;z-index:1}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transition:opacity .1s,-webkit-transform .4s;transition:opacity .1s,-webkit-transform .4s;transition:transform .4s,opacity .1s;transition:transform .4s,opacity .1s,-webkit-transform .4s;opacity:1}.md-search__inner{position:fixed;top:0;left:100%;height:100%;-webkit-transform:translateX(5%);transform:translateX(5%);-webkit-transition:left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;transition:left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;opacity:0;z-index:2}[data-md-toggle=search]:checked~.md-header .md-search__inner{left:0;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;transition:left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;opacity:1}.md-search__input{width:100%;height:5.6rem;font-size:1.8rem}.md-search__icon{top:1.6rem;left:1.6rem}.md-search__icon:before{content:"arrow_back"}.md-search__output{top:5.6rem;bottom:0}}@media only screen and (max-width:76.1875em){[data-md-toggle=drawer]:checked~.md-overlay{width:100%;height:100%;-webkit-transition:width 0s,height 0s,opacity .25s;transition:width 0s,height 0s,opacity .25s;opacity:1}.md-header-nav__button.md-icon--home,.md-header-nav__button.md-logo{display:none}.md-nav{background-color:#fff}.md-nav--primary,.md-nav--primary .md-nav{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;top:0;right:0;left:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:1.6rem;line-height:1.5}html .md-nav--primary .md-nav__title{position:relative;height:11.2rem;padding:6rem 1.6rem .4rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-weight:400;line-height:4.8rem;white-space:nowrap;cursor:pointer}html .md-nav--primary .md-nav__title:before{display:block;position:absolute;top:.4rem;left:.4rem;width:4rem;height:4rem;color:rgba(0,0,0,.54)}html .md-nav--primary .md-nav__title~.md-nav__list{background:-webkit-linear-gradient(top,#fff 10%,hsla(0,0%,100%,0)),-webkit-linear-gradient(top,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background:linear-gradient(180deg,#fff 10%,hsla(0,0%,100%,0)),linear-gradient(180deg,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background-attachment:local,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100% 2rem,100% 1rem;box-shadow:inset 0 .1rem 0 rgba(0,0,0,.07)}html .md-nav--primary .md-nav__title~.md-nav__list>.md-nav__item:first-child{border-top:0}html .md-nav--primary .md-nav__title--site{position:relative;background-color:#7b8eb0;color:#fff}html .md-nav--primary .md-nav__title--site .md-nav__button{display:block;position:absolute;top:.4rem;left:.4rem;width:6.4rem;height:6.4rem;font-size:4.8rem}html .md-nav--primary .md-nav__title--site:before{display:none}.md-nav--primary .md-nav__list{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto}.md-nav--primary .md-nav__item{padding:0;border-top:.1rem solid rgba(0,0,0,.07)}.md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:4.8rem}.md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"keyboard_arrow_right"}.md-nav--primary .md-nav__link{position:relative;margin-top:0;padding:1.6rem}.md-nav--primary .md-nav__link:after{position:absolute;top:50%;right:1.2rem;margin-top:-1.2rem;color:rgba(0,0,0,.54);font-size:2.4rem}.md-nav--primary .md-nav__link:focus:after,.md-nav--primary .md-nav__link:hover:after{color:inherit}.md-nav--primary .md-nav--secondary .md-nav{position:static}.md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:2.8rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:4rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:5.2rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:6.4rem}.md-nav__toggle~.md-nav{display:none}.csstransforms3d .md-nav__toggle~.md-nav{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s;transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);opacity:0}.csstransforms3d .md-nav__toggle~.md-nav,.md-nav__toggle:checked~.md-nav{display:-webkit-box;display:-ms-flexbox;display:flex}.csstransforms3d .md-nav__toggle:checked~.md-nav{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1}.md-sidebar--primary{position:fixed;top:0;left:-24.2rem;width:24.2rem;height:100%;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);background-color:#fff;z-index:2}.no-csstransforms3d .md-sidebar--primary{display:none}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4);-webkit-transform:translateX(24.2rem);transform:translateX(24.2rem)}.no-csstransforms3d [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{display:block}.md-sidebar--primary .md-sidebar__scrollwrap{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;margin:0}.md-tabs{display:none}}@media only screen and (min-width:60em){.md-content{margin-right:24.2rem}.md-header-nav__button.md-icon--search{display:none}.md-header-nav__source{display:block;width:23rem;max-width:23rem;padding-right:1.2rem}.md-search{margin-right:2.8rem;padding:.4rem}.md-search__inner{display:table;position:relative;clear:both}.md-search__form{width:23rem;float:right;-webkit-transition:width .25s cubic-bezier(.1,.7,.1,1);transition:width .25s cubic-bezier(.1,.7,.1,1);border-radius:.2rem}.md-search__input{width:100%;height:4rem;padding-left:4.8rem;-webkit-transition:background-color .25s,color .25s;transition:background-color .25s,color .25s;border-radius:.2rem;background-color:rgba(0,0,0,.26);color:#fff;font-size:1.6rem}.md-search__input+.md-search__icon,.md-search__input::-webkit-input-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input::-moz-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input:-ms-input-placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input+.md-search__icon,.md-search__input::placeholder{-webkit-transition:color .25s;transition:color .25s;color:#fff}.md-search__input:hover{background-color:hsla(0,0%,100%,.12)}[data-md-toggle=search]:checked~.md-header .md-search__input{border-radius:.2rem .2rem 0 0;background-color:#fff;color:rgba(0,0,0,.87);text-overflow:none}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__output{top:4rem;-webkit-transition:opacity .4s;transition:opacity .4s;opacity:0}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4);opacity:1}.md-search__scrollwrap{max-height:0}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap::-webkit-scrollbar{width:.4rem;height:.4rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#fca9a8}.md-search-result__link,.md-search-result__meta{padding-left:4.8rem}.md-sidebar--secondary{display:block;float:right}.md-sidebar--secondary[data-md-state=lock]{margin-left:100%;-webkit-transform:translate(-100%);transform:translate(-100%)}}@media only screen and (min-width:76.25em){.md-content{margin-left:24.2rem;overflow:auto}.md-content__inner{margin:2.4rem}.md-header{box-shadow:none}.md-header[data-md-state=shadow]{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2)}.md-header-nav__button.md-icon--menu{display:none}.md-nav[data-md-state=animate]{-webkit-transition:max-height .25s cubic-bezier(.86,0,.07,1);transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav__toggle~.md-nav{max-height:0;overflow:hidden}.md-nav[data-md-state=expand],.md-nav__toggle:checked~.md-nav{max-height:100%}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--nested>.md-nav__link:after{display:inline-block;-webkit-transform-origin:.45em .45em;transform-origin:.45em .45em;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;vertical-align:-.125em}.js .md-nav__item--nested>.md-nav__link:after{-webkit-transition:-webkit-transform .4s;transition:-webkit-transform .4s;transition:transform .4s;transition:transform .4s,-webkit-transform .4s}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link:after{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__form{width:68.8rem}.md-sidebar__inner{border-right:.1rem solid rgba(0,0,0,.07)}.md-tabs~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{font-size:0}.md-tabs--active~.md-main .md-nav--primary .md-nav__title--site{display:none}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item{font-size:0}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{display:none;font-size:1.4rem;overflow:auto}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested>.md-nav__link{margin-top:1.2rem;font-weight:700;pointer-events:none}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested>.md-nav__link:after{display:none}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--active{display:block}.md-tabs--active~.md-main .md-nav[data-md-level="1"]{max-height:none}.md-tabs--active~.md-main .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-left:0}}@media only screen and (max-width:29.9375em){.md-header-nav__parent{display:none}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(45);transform:scale(45)}}@media only screen and (min-width:45em){.md-footer-nav__link{width:50%}.md-footer-copyright{max-width:75%;float:left}.md-footer-social{padding:1.2rem 0;float:right}}@media only screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(60);transform:scale(60)}}@media only screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(75);transform:scale(75)}}@media only screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__form{width:46.8rem}}@media only screen and (min-width:60em) and (min-width:76.25em){.md-sidebar--secondary[data-md-state=lock]{margin-left:122rem}} \ No newline at end of file diff --git a/2.0/vapor-material/base.html b/2.0/vapor-material/base.html new file mode 100644 index 00000000..fb668bb6 --- /dev/null +++ b/2.0/vapor-material/base.html @@ -0,0 +1,158 @@ +{% import "partials/language.html" as lang %} + + + + {% block site_meta %} + + + {% if config.site_description %} + + {% endif %} + {% if page.canonical_url %} + + {% endif %} + {% if config.site_author %} + + {% endif %} + {% if config.site_favicon %} + + {% else %} + + {% endif %} + + {% endblock %} + {% block htmltitle %} + {% if page.title and not page.is_homepage %} + {{ page.title }} - {{ config.site_name }} + {% else %} + {{ config.site_name }} + {% endif %} + {% endblock %} + {% block libs %} + + {% endblock %} + {% block styles %} + + {% if config.extra.palette %} + + {% endif %} + {% endblock %} + {% block fonts %} + {% if config.extra.font != "none" %} + {% set text = config.extra.get("font", {}).text | default("Roboto") %} + {% set code = config.extra.get("font", {}).code + | default("Roboto Mono") %} + {% set font = text + ':300,400,400i,700|' + code | replace(' ', '+') %} + + + {% endif %} + + {% endblock %} + {% for path in extra_css %} + + {% endfor %} + {% block extrahead %}{% endblock %} + + {% set palette = config.extra.get("palette", {}) %} + {% set primary = palette.primary | replace(" ", "-") | lower %} + {% set accent = palette.accent | replace(" ", "-") | lower %} + {% if primary or accent %} + + {% else %} + + {% endif %} + + + {% set platform = config.extra.repo_icon or config.repo_url %} + {% if "github" in platform %} + {% include "assets/images/icons/github-1da075986e.svg" %} + {% elif "gitlab" in platform %} + {% include "assets/images/icons/gitlab-5ad3f9f9e5.svg" %} + {% elif "bitbucket" in platform %} + {% include "assets/images/icons/bitbucket-670608a71a.svg" %} + {% endif %} + + + + + + {% block header %} + {% include "partials/header.html" %} + {% endblock %} +
+ {% set feature = config.extra.get("feature", {}) %} + {% if feature.tabs %} + {% include "partials/tabs.html" %} + {% endif %} +
+
+ {% block site_nav %} + {% if nav %} +
+
+
+ {% include "partials/nav.html" %} +
+
+
+ {% endif %} + {% if page.toc %} +
+
+
+ {% include "partials/toc.html" %} +
+
+
+ {% endif %} + {% endblock %} +
+
+ {% if config.edit_uri %} + edit + {% endif %} + {% block content %} + {% if not "\x3ch1" in page.content %} +

{{ page.title | default(config.site_name, true)}}

+ {% endif %} + {{ page.content }} + {% endblock %} + {% if config.extra.disqus and not page.is_homepage %} +

{{ lang.t('comments') }}

+
+ + {% endif %} +
+
+
+
+ {% block footer %} + {% include "partials/footer.html" %} + {% endblock %} +
+ {% block scripts %} + + + {% for path in extra_javascript %} + + {% endfor %} + {% endblock %} + {% block analytics %} + {% if config.google_analytics %} + + {% endif %} + {% endblock %} + + diff --git a/2.0/vapor-material/main.html b/2.0/vapor-material/main.html new file mode 100644 index 00000000..94d9808c --- /dev/null +++ b/2.0/vapor-material/main.html @@ -0,0 +1 @@ +{% extends "base.html" %} diff --git a/2.0/vapor-material/partials/footer.html b/2.0/vapor-material/partials/footer.html new file mode 100644 index 00000000..afadcdd6 --- /dev/null +++ b/2.0/vapor-material/partials/footer.html @@ -0,0 +1,58 @@ +{% import "partials/language.html" as lang %} + diff --git a/2.0/vapor-material/partials/header.html b/2.0/vapor-material/partials/header.html new file mode 100644 index 00000000..fda79778 --- /dev/null +++ b/2.0/vapor-material/partials/header.html @@ -0,0 +1,46 @@ +
+ +
diff --git a/2.0/vapor-material/partials/language.html b/2.0/vapor-material/partials/language.html new file mode 100644 index 00000000..9e00a86f --- /dev/null +++ b/2.0/vapor-material/partials/language.html @@ -0,0 +1,9 @@ +{% macro t(key) %}{{ { + "edit.link.title": "Edit this page", + "comments": "Comments", + "footer.previous": "Previous", + "footer.next": "Next", + "search.placeholder": "Search", + "source.link.title": "Go to repository", + "toc.title": "Table of contents" +}[key] }}{% endmacro %} diff --git a/2.0/vapor-material/partials/nav-item.html b/2.0/vapor-material/partials/nav-item.html new file mode 100644 index 00000000..8d09de18 --- /dev/null +++ b/2.0/vapor-material/partials/nav-item.html @@ -0,0 +1,54 @@ +{% set class = "md-nav__item" %} +{% if nav_item.active %} + {% set class = "md-nav__item md-nav__item--active" %} +{% endif %} +{% if nav_item.children %} +
  • + {% if nav_item.active %} + + {% else %} + + {% endif %} + + +
  • +{% elif nav_item == page %} +
  • + {% set toc_ = page.toc %} + + {% if toc_ | first is defined %} + {% set toc_ = (toc_ | first).children %} + {% endif %} + {% if toc_ | first is defined %} + + {% endif %} + + {{ nav_item.title }} + + {% if toc_ | first is defined %} + {% include "partials/toc.html" %} + {% endif %} +
  • +{% else %} +
  • + + {{ nav_item.title }} + +
  • +{% endif %} diff --git a/2.0/vapor-material/partials/nav.html b/2.0/vapor-material/partials/nav.html new file mode 100644 index 00000000..651608d4 --- /dev/null +++ b/2.0/vapor-material/partials/nav.html @@ -0,0 +1,24 @@ + diff --git a/2.0/vapor-material/partials/search.html b/2.0/vapor-material/partials/search.html new file mode 100644 index 00000000..28337cca --- /dev/null +++ b/2.0/vapor-material/partials/search.html @@ -0,0 +1,15 @@ +{% import "partials/language.html" as lang %} + diff --git a/2.0/vapor-material/partials/social.html b/2.0/vapor-material/partials/social.html new file mode 100644 index 00000000..cb68735a --- /dev/null +++ b/2.0/vapor-material/partials/social.html @@ -0,0 +1,9 @@ +{% if config.extra.social %} + +{% endif %} diff --git a/2.0/vapor-material/partials/source.html b/2.0/vapor-material/partials/source.html new file mode 100644 index 00000000..221b551a --- /dev/null +++ b/2.0/vapor-material/partials/source.html @@ -0,0 +1,25 @@ +{% import "partials/language.html" as lang %} +{% set platform = config.extra.repo_icon or config.repo_url %} +{% if "github" in platform %} + {% set repo_type = "github" %} +{% elif "gitlab" in platform %} + {% set repo_type = "gitlab" %} +{% elif "bitbucket" in platform %} + {% set repo_type = "bitbucket" %} +{% else %} + {% set repo_type = "" %} +{% endif %} +{% block repo %} + + {% if repo_type %} +
    + + + +
    + {% endif %} +
    + {{ config.repo_name }} +
    +
    +{% endblock %} diff --git a/2.0/vapor-material/partials/tabs-item.html b/2.0/vapor-material/partials/tabs-item.html new file mode 100644 index 00000000..aef42d77 --- /dev/null +++ b/2.0/vapor-material/partials/tabs-item.html @@ -0,0 +1,25 @@ +{% if nav_item.is_homepage %} +
  • + {% if not page.ancestors | length and nav | selectattr("url", page.url) %} + + {{ nav_item.title }} + + {% else %} + + {{ nav_item.title }} + + {% endif %} +
  • +{% elif nav_item.children and nav_item.children | length > 0 %} +
  • + {% if nav_item.active %} + + {{ nav_item.title }} + + {% else %} + + {{ nav_item.title }} + + {% endif %} +
  • +{% endif %} diff --git a/2.0/vapor-material/partials/tabs.html b/2.0/vapor-material/partials/tabs.html new file mode 100644 index 00000000..e040436b --- /dev/null +++ b/2.0/vapor-material/partials/tabs.html @@ -0,0 +1,13 @@ +{% set class = "md-tabs" %} +{% if page.ancestors | length > 0 %} + {% set class = "md-tabs md-tabs--active" %} +{% endif %} + diff --git a/2.0/vapor-material/partials/toc-item.html b/2.0/vapor-material/partials/toc-item.html new file mode 100644 index 00000000..3b4f4d76 --- /dev/null +++ b/2.0/vapor-material/partials/toc-item.html @@ -0,0 +1,14 @@ +
  • + + {{ toc_item.title }} + + {% if toc_item.children %} + + {% endif %} +
  • diff --git a/2.0/vapor-material/partials/toc.html b/2.0/vapor-material/partials/toc.html new file mode 100644 index 00000000..5e44226b --- /dev/null +++ b/2.0/vapor-material/partials/toc.html @@ -0,0 +1,15 @@ +{% import "partials/language.html" as lang %} + diff --git a/README.es.md b/README.es.md deleted file mode 100644 index 531ee182..00000000 --- a/README.es.md +++ /dev/null @@ -1,86 +0,0 @@ -# Documentación de Vapor - -[![Stack Overflow](https://img.shields.io/stackexchange/stackoverflow/t/vapor.svg)](http://stackoverflow.com/questions/tagged/vapor) - -Esta es la documentación de Vapor, el _framework web_ para Swift que funciona sobre iOS, macOS y ubuntu; y sobre todos los _paquetes_ que Vapor ofrece. - -Vapor es el _framework web_ más utilizado para Swift. Proporciona una base maravillosamente expresiva y fácil de usar para tu próximo sitio web o API. - -Para ver el código fuente y la documentación del código visita [Vapor's GitHub](https://github.com/vapor/vapor). - -Para leer esto en [正體中文](https://github.com/vapor/documentation/blob/master/README.zh-hant.md) - -Para leer esto en [english](https://github.com/vapor/documentation/blob/master/README.md) - -## Cómo leer esta documentación. - -Puedes leer esta guía haciendo clic en las carpetas y los archivos de [GitHub](https://github.com/vapor/documentation) o a través de las páginas generadas [GitHub Pages](https://vapor.github.io/documentation/). - -## API - -La documentación de la API generada automáticamente se encuentra en [api.vapor.codes](http://api.vapor.codes). - -## Paquetes - -Aquí hay una lista de todos los paquetes y módulos incluidos con Vapor (también _utilizables_ individualmente). - -- [Vapor](https://github.com/vapor/vapor): Swift el _framework web_ más utilizado. - - Auth: Autenticación y persistencia de usuarios. - - Sessions: Almacenamiento de datos seguro y _efímero_ basado en cookies. - - Cookies: Cookies HTTP. - - Routing: Enrutador avanzado con parametrización segura. -- [Fluent](https://github.com/vapor/fluent): Modelos, relaciones y consulta de bases de datos NoSQL y SQL. -- [Engine](https://github.com/vapor/engine): Capas de transporte principales. - - HTTP: Cliente y servidor HTTP completamente en Swift. - - URI: Parseo y _serialización_ completamente en Swift. - - WebSockets: Canales de comunicación full-duplex a través de una sola conexión TCP. - - SMTP: Envío de correo electrónico con SendGrill y Gmail. -- [Leaf](https://github.com/vapor/leaf): Un lenguaje de plantillas extensible. -- [JSON](https://github.com/vapor/json): Mapas Jay JSON a tipos de Vapor. -- [Console](https://github.com/vapor/console): Wrapper en Swift para E/S de consola y comandos. -- [TLS](https://github.com/vapor/tls): Wrapper en Swift para el nuevo TLS de CLibreSSL. -- [Crypto](https://github.com/vapor/crypto): Criptografía de LibreSSL y Swift. - - Digests: _Hashing_ con y sin autenticación. - - Ciphers: Encriptación y descifrado. - - Random: Pseudo aleatoriedad criptográficamente segura. - - BCrypt: Implementación completamente en Swift. -- [Node](https://github.com/vapor/node): Estructura de datos para fáciles conversiones de tipo. - - [Polymorphic](https://github.com/vapor/polymorphic): Sintaxis para acceder fácilmente a valores de tipos comunes como JSON. - - [Path Indexable](https://github.com/vapor/path-indexable): Un protocolo para un acceso poderoso via _subscript_ a tipos comunes como JSON. -- [Core](https://github.com/vapor/core): Extensiones básicas, _alias_ de tipos, y funciones que facilitan tareas comunes. -- [Socks](https://github.com/vapor/socks): _API Wrapper_ para acceder a sockets en C. - -## Proveedores y otros. - -Aquí hay una lista de proveedores y paquetes de terceros que funcionan muy bien con Vapor. - -- [MySQL](https://github.com/vapor/mysql): Interface robusta MySQL para Swift. - - [MySQL Driver](https://github.com/vapor/mysql-driver): _Driver_ MySQL para Fluent. - - [MySQL Provider](https://github.com/vapor/mysql-provider): Proveedor MySQL para Vapor. -- [SQLite](https://github.com/vapor/sqlite): _Wrapper_ SQLite 3 para Swift - - [SQLite Driver](https://github.com/vapor/sqlite-driver): _Driver_ SQLite para Fluent. - - [SQLite Provider](https://github.com/vapor/sqlite-provider): Proveedor SQLite provider para Vapor. -- [PostgreSQL](https://github.com/vapor/postgresql): Interface PostgreSQL robusta para Swift. - - [PostgreSQL Driver](https://github.com/vapor/postgresql-driver): _Driver_ PostgreSQL para Fluent. - - [PostgreSQL Provider](https://github.com/vapor/postgresql-provider): Proveedor PostgreSQL para Vapor. -- [MongoKitten*](https://github.com/OpenKitten/MongoKitten): _Driver_ nativo MongoDB, escrito en Swift - - [Mongo Driver](https://github.com/vapor/mongo-driver): _Driver_ MongoKitten para Fluent. - - [Mongo Provider](https://github.com/vapor/mongo-provider): Proveedor MongoKitten para Vapor. - - [MainecoonVapor](https://github.com/OpenKitten/MainecoonVapor): MongoKitten ORM para Vapor. -- [Redbird](https://github.com/vapor/redbird): Un cliente Redis completamente en Swift implementado directamente desde la especificación del protocolo. - - [Redis Provider](https://github.com/vapor/redis-provider): Proveedor del _cache_ de Redis para Vapor. -- [Kitura Provider](https://github.com/vapor/kitura-provider): Permite usar el servidor HTTP de IBM (Kitura) en Vapor. -- [SwiftyBeaver](https://github.com/SwiftyBeaver/SwiftyBeaver-Vapor): Agrega el potente _logging_ de SwiftyBeaver a Vapor. -- [APNS](https://github.com/matthijs2704/vapor-apns): Sencilla biblioteca APNS para Vapor (Swift). -- [JWT](https://github.com/siemensikkema/vapor-jwt): Implementación JWT para Vapor. -- [VaporS3Signer](https://github.com/JustinM1/VaporS3Signer): Gerera _V4 Auth Header/Pre-Signed URL_ para _AWS S3 REST API_. -- [Flock](https://github.com/jakeheis/Flock): _Despliegue_ automatizado de proyectos Swift en servidores. - - [VaporFlock](https://github.com/jakeheis/VaporFlock): Utiliza Flock para _desplegar_ aplicaciones de vapor -- [VaporForms](https://github.com/bygri/vapor-forms): Brinda a Vapor un manejo de formularios web simple, dinámico y _reutilizable_. -- [Jobs](https://github.com/BrettRToomey/Jobs): Un sistema minimalista para ejecutar _jobs_/tareas en _2o plano_ para Swift. -- [Heimdall](https://github.com/himani93/heimdall): Un _logger_ de _requet's_ HTTP fácil de usar. - - -## Autores - -[Tanner Nelson](mailto:tanner@qutheory.io), [Logan Wright](mailto:logan@qutheory.io), y los cientos de miembros de Vapor. diff --git a/README.zh-hant.md b/README.zh-hant.md deleted file mode 100644 index e794031e..00000000 --- a/README.zh-hant.md +++ /dev/null @@ -1,77 +0,0 @@ -# Vapor Documentation - -[![Stack Overflow](https://img.shields.io/stackexchange/stackoverflow/t/vapor.svg)](http://stackoverflow.com/questions/tagged/vapor) - -這是 Vapor 的說明文件, Vapor 是一個可以在 iOS, macOS 及 Ubuntu 上執行的 Web framework,以及其他相關的套件。 - -Vapor 是一個在 Swift 上很受歡迎的 Web framework。它提供了清楚易用的 API 及許多方便的基礎功能,方便我們用它建立網站或是後台。 - -我們可以在 [Vapor's GitHub](https://github.com/vapor/vapor) 查看原始碼及說明文件。 - -## 如何閱讀說明文件 - -在 [GitHub](https://github.com/vapor/documentation) 上瀏覽每個資料夾,特別是 markdown 檔(副檔名為 .md 的檔案)。或是看 [GitHub Pages](https://vapor.github.io/documentation/) 上的文件。 - -## 套件 -以下是 Vapor 提供的套件及模組(我們也可以直接使用它們,不透過 Vapor。) - -- [Vapor](https://github.com/vapor/vapor): Swift 上最常被使用到的 web framework。 - - Auth: 使用者的認證及存續控制(persistance)。 - - Sessions: 建立在 cookie 機制上安全、短暫的資料儲存。 - - Cookies: HTTP cookies. - - Routing: 可透過變數類型確定(type-safe)的參數設定來設定路徑。 -- [Fluent](https://github.com/vapor/fluent): 用來操作 SQL 或 NoSQL 資料庫。 -- [Engine](https://github.com/vapor/engine): 傳輸的核心層。 - - HTTP: HTTP 用戶端及主機端。 - - URI: URI 的分解及組成。 - - WebSockets: 在一個 TCB 連線中進行雙向的溝通管道。 - - SMTP: 透過 Sendgrid 及 Gmail 發送郵件。 -- [Leaf](https://github.com/vapor/leaf): 一種可擴張的樣本語言(extensible templating language)。(譯註: 這可以用來建立使用者介面。) -- [JSON](https://github.com/vapor/json): 用 [Jay JSON]((https://github.com/dantoml/jay)) 解析工具產生Vapor物件。 -- [Console](https://github.com/vapor/console): 用來處理 console 的輸入、輸出及指令的 Swift 工具。 -- [TLS](https://github.com/vapor/tls): 用來處理 CLibreSSL 的新型 TLS 的 Swift 工具。 -- [Crypto](https://github.com/vapor/crypto): 在 LibreSSL 及 Swift 上進行加密的工具。 - - Digests: 無論有沒有認證(authentication)都可以進行雜湊(hash)。 - - Ciphers: 編碼及解碼。 - - Random: 安全的隨機性。 - - BCrypt: 完全用 Swift 實作。 -- [Node](https://github.com/vapor/node): 可以輕易地進行類型轉換的資料結構。 - - [Polymorphic](https://github.com/vapor/polymorphic): 如同 JSON 一般可以輕易取用資料的語法。 - - [Path Indexable](https://github.com/vapor/path-indexable): 如同 JSON 一樣可以用來處理複雜的資料結構。 -- [Core](https://github.com/vapor/core): 主要的 extension 群,例如: 變數類型的重新命名、在許多地方都會被使用的 function 等。 -- [Socks](https://github.com/vapor/socks): 將 C 語言的 Socket API 包裝成 Swift 語言。 - -## 可合併使用的套件 - -以下是可以和 Vapor 合併運用的套件列表。(譯註:原文裡這裡還有個東西叫 Provider,那是一種 protocol,讓我們可以掛到 Vapor 中如同第三方元件一樣使用。) - -- [MySQL](https://github.com/vapor/mysql): 可透過 Swift 操作 MySQL 的套件。 - - [MySQL Driver](https://github.com/vapor/mysql-driver): 透過 Fluent 操作 MySQL 的套件。 - - [MySQL Provider](https://github.com/vapor/mysql-provider): 讓 MySQL 可以在 Vapor 上運作的 provider。 -- [SQLite](https://github.com/vapor/sqlite): 可透過 Swift 操作 SQLite 3 的套件。 - - [SQLite Driver](https://github.com/vapor/sqlite-driver): 透迥 Fluent 操作 SQLite 的工具。 - - [SQLite Provider](https://github.com/vapor/sqlite-provider): 讓 SQLite 可以在 Vapor 上運作的 provider。 -- [PostgreSQL](https://github.com/vapor/postgresql): 用 Swift 操作 PostgreSQL 的工具。 - - [PostgreSQL Driver](https://github.com/vapor/postgresql-driver): 用 Fluent 操作 PostgreSQL 的套件。 - - [PostgreSQL Provider](https://github.com/vapor/postgresql-provider): 讓 PostgreSQL 可以運作在 Vapor 上的 provider。 -- [MongoKitten*](https://github.com/OpenKitten/MongoKitten): 用 Swift 寫的 MongoDB driver。 - - [Mongo Driver](https://github.com/vapor/mongo-driver): Fluent 用的 MongoKitten driver。 - - [Mongo Provider](https://github.com/vapor/mongo-provider): Vapor 用的 MongoKitten provider. - - [MainecoonVapor](https://github.com/OpenKitten/MainecoonVapor): Vapor 的 MongoKitten 物件關聯管理。 -- [Redbird](https://github.com/vapor/redbird): 遵循原始協定的規格實作出來的 Swift Redis client 端。 - - [Redis Provider](https://github.com/vapor/redis-provider): Vapor 的 Redis cache provider。 -- [Kitura Provider](https://github.com/vapor/kitura-provider): 在 Vapor 中使用 IBM 的 Kitura HTTP Server。 -- [SwiftyBeaver](https://github.com/SwiftyBeaver/SwiftyBeaver-Vapor): 在 Vapor 中使用 SwiftBeaver 的套件。(譯註: 就像強化版的 NSLog() 或 print()) -- [APNS](https://github.com/matthijs2704/vapor-apns): 用來操作 Apple 推播的工具。 -- [JWT](https://github.com/siemensikkema/vapor-jwt): 讓我們可以設定一些規則以取得特定資源的工具。 -- [VaporS3Signer](https://github.com/JustinM1/VaporS3Signer): 用來產生 HTTP request 的 headers 及已經簽證過的 URL,用來 request AWS S3 的 REST API。 -- [Flock](https://github.com/jakeheis/Flock): 自動將 Swift 專案發佈上主機。 - - [VaporFlock](https://github.com/jakeheis/VaporFlock): 利用 Flock 發佈 Vapor applications。 -- [VaporForms](https://github.com/bygri/vapor-forms): 讓我們在處理前端送來的 form request 時可以輕鬆一點的套件。 -- [Jobs](https://github.com/BrettRToomey/Jobs): 在某個特定的時間點執行某些程式碼的套件。 -- [Heimdall](https://github.com/himani93/heimdall): 用來將收到的 http request 記錄到某個檔案的套件,且這個寫好的檔可以用試算表類型(ex: excel, google sheets)的軟體開啟。 - - -## 作者們 - -[Tanner Nelson](mailto:tanner@qutheory.io), [Logan Wright](mailto:logan@qutheory.io),以及其他上百位 Vapor 的貢獻者們。 diff --git a/couscous.yml b/couscous.yml deleted file mode 100644 index 9af496f2..00000000 --- a/couscous.yml +++ /dev/null @@ -1,179 +0,0 @@ -template: - directory: template - -title: Vapor Documentation -subTitle: A web framework and server for Swift that works on macOS and Ubuntu. - -baseUrl: https://vapor.github.io/documentation - -menu: - sections: - getting-started: - name: Getting Started - items: - getting-started-install-swift-3-macos: - text: "Install Swift 3: macOS" - relativeUrl: getting-started/install-swift-3-macos.html - getting-started-install-swift-3-ubuntu: - text: "Install Swift 3: Ubuntu" - relativeUrl: getting-started/install-swift-3-ubuntu.html - getting-started-install-toolbox: - text: Install Toolbox - relativeUrl: getting-started/install-toolbox.html - getting-started-hello-world: - text: Hello, World - relativeUrl: getting-started/hello-world.html - getting-started-manual: - text: Manual - relativeUrl: getting-started/manual.html - getting-started-xcode: - text: Xcode - relativeUrl: getting-started/xcode.html - guide: - name: Guide - items: - guide-droplet: - text: Droplet - relativeUrl: guide/droplet.html - guide-folder-structure: - text: Folder Structure - relativeUrl: guide/folder-structure.html - guide-json: - text: JSON - relativeUrl: guide/json.html - guide-config: - text: Config - relativeUrl: guide/config.html - guide-views: - text: Views - relativeUrl: guide/views.html - guide-leaf: - text: Leaf - relativeUrl: guide/leaf.html - guide-controllers: - text: Controllers - relativeUrl: guide/controllers.html - guide-middleware: - text: Middleware - relativeUrl: guide/middleware.html - guide-validation: - text: Validation - relativeUrl: guide/validation.html - guide-provider: - text: Provider - relativeUrl: guide/provider.html - guide-sessions: - text: Sessions - relativeUrl: guide/sessions.html - guide-hash: - text: Hash - relativeUrl: guide/hash.html - guide-commands: - text: Commands - relativeUrl: guide/commands.html - routing: - name: Routing - items: - routing-basic: - text: Basic - relativeUrl: routing/basic.html - routing-parameters: - text: Route Parameters - relativeUrl: routing/parameters.html - routing-query-parameters: - text: Query Parameters - relativeUrl: routing/query-parameters.html - routing-group: - text: Group - relativeUrl: routing/group.html - routing-collection: - text: Collection - relativeUrl: routing/collection.html - fluent: - name: Fluent - items: - fluent-driver: - text: Driver - relativeUrl: fluent/driver.html - fluent-model: - text: Model - relativeUrl: fluent/model.html - fluent-query: - text: Query - relativeUrl: fluent/query.html - fluent-relation: - text: Relation - relativeUrl: fluent/relation.html - auth: - name: Auth - items: - auth-user: - text: User - relativeUrl: auth/user.html - auth-middleware: - text: Middleware - relativeUrl: auth/middleware.html - auth-request: - text: Request - relativeUrl: auth/request.html - auth-protect: - text: Protect - relativeUrl: auth/protect.html - http: - name: HTTP - items: - http-request: - text: Request - relativeUrl: http/request.html - http-response: - text: Response - relativeUrl: http/response.html - http-body: - text: Body - relativeUrl: http/body.html - http-response-representable: - text: ResponseRepresentable - relativeUrl: http/response-representable.html - http-responder: - text: Responder - relativeUrl: http/responder.html - http-client: - text: Client - relativeUrl: http/client.html - http-server: - text: Server - relativeUrl: http/server.html - http-cors: - text: CORS - relativeUrl: http/cors.html - - web-sockets: - name: WebSockets - items: - websockets-droplet: - text: Droplet - relativeUrl: websockets/droplet.html - websockets-custom: - text: Custom - relativeUrl: websockets/custom.html - - testing: - name: Testing - items: - testing-modules: - text: Modules - relativeUrl: testing/modules.html - testing-basic: - text: Basic - relativeUrl: testing/basic.html - - - deploy: - name: Deploy - items: - deploy-nginx: - text: Nginx - relativeUrl: deploy/nginx.html - deploy-supervisor: - text: Supervisor - relativeUrl: deploy/supervisor.html diff --git a/getting-started/install-swift-3-ubuntu.md b/getting-started/install-swift-3-ubuntu.md deleted file mode 100644 index da43a952..00000000 --- a/getting-started/install-swift-3-ubuntu.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -currentMenu: getting-started-install-swift-3-ubuntu ---- - -# Install Swift 3: Ubuntu - -Installing Swift 3 on Ubuntu only takes a couple of minutes. - -## Quick - -Don't want to type? Run the following script to quickly install Swift 3.0. - -```sh -curl -sL swift.vapor.sh/ubuntu | bash -``` - -> Note: The install script adds Swift to your `~/.bashrc` profile automatically. - -## Manual - -### Dependencies - -Depending on your version of Ubuntu, you may need some additional tools for the compiler. We'll err on the safe side and install everything you should need - -```sh -sudo apt-get update -sudo apt-get install clang libicu-dev binutils git libpython2.7-dev libcurl3 -``` - -### Download - -Download the Swift 3 toolchain for your Ubuntu version. - -```sh -# Ubuntu 14.04 -wget https://swift.org/builds/swift-3.0-release/ubuntu1404/swift-3.0-RELEASE/swift-3.0-RELEASE-ubuntu14.04.tar.gz - -# Ubuntu 15.10 -wget https://swift.org/builds/swift-3.0-release/ubuntu1510/swift-3.0-RELEASE/swift-3.0-RELEASE-ubuntu15.10.tar.gz -``` - -### Decompress - -After Swift 3 has downloaded, decompress it. - -```sh -# Ubuntu 14.04 -tar zxf swift-3.0-RELEASE-ubuntu14.04.tar.gz - -# Ubuntu 15.10 -tar zxf swift-3.0-RELEASE-ubuntu15.10.tar.gz -``` - -### Install - -Move Swift 3.0 to a safe, permanent place on your computer. We'll use `/swift-3.0`, but feel free to choose wherever you like. - -```sh -# Ubuntu 14.04 -mv swift-3.0-RELEASE-ubuntu14.04 /swift-3.0 - -# Ubuntu 15.10 -mv swift-3.0-RELEASE-ubuntu15.10 /swift-3.0 -``` - -> Note: You may need to use `sudo`. - -### Export - -Edit your bash profile using your text editor of choice. - -```sh -vim ~/.bashrc -``` - -Add the following line: - -```sh -export PATH=/swift-3.0/usr/bin:"${PATH}" -``` - -> Note: If you moved Swift 3.0 to a folder other than `/swift-3.0`, your path will be different. - -## Check - -Double check the installation was successful by running: - -```sh -curl -sL check.vapor.sh | bash -``` - -## Toolbox - -You can now move on to [Install Toolbox](install-toolbox.md) - -## Swift.org - -Check out [Swift.org](https://swift.org)'s extensive guides if you need more detailed instructions for installing Swift 3.0. \ No newline at end of file diff --git a/getting-started/xcode.md b/getting-started/xcode.md deleted file mode 100644 index 3a54d4fa..00000000 --- a/getting-started/xcode.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -currentMenu: getting-started-xcode ---- - -# Xcode - -The first thing you'll probably notice about Vapor and SwiftPM projects in general is that we don't include an Xcode project. In fact, when SwiftPM generates packages, the `.xcodeproj` file is gitignored by default. - -This means we don't have to worry about pbxproj conflicts, and it's easy for different platforms to utilize their own editors. - -## Generate Project - -### Vapor Toolbox - -To generate a new Xcode project for a project, use: - -```bash -vapor xcode -``` - -> If you'd like to automatically open the Xcode project, use `vapor xcode -y` - -### Manual - -To generate a new Xcode project manually. - -```bash -swift package generate-xcodeproj -``` - -Open the project and continue normally. - -## Flags - -For many packages with underlying c-dependencies, users will need to pass linker flags during **build** AND **project generation**. Make sure to consult the guides associated with those dependencies. For example: - -``` -vapor xcode --mysql -``` - -or - -``` -swift package generate-xcodeproj -Xswiftc -I/usr/local/include/mysql -Xlinker -L/usr/local/lib -``` diff --git a/template/default.twig b/template/default.twig deleted file mode 100644 index f12e7f22..00000000 --- a/template/default.twig +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - {{ title }} - - - - - - - - -
    - - -
    - - - - - -
    - ✎ Edit on GitHub - {{ content | raw }} -
    - - - - - - - - - - - - diff --git a/template/images/droplet.svg b/template/images/droplet.svg deleted file mode 100644 index e60ae92d..00000000 --- a/template/images/droplet.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/template/screenshot.png b/template/screenshot.png deleted file mode 100644 index 317477678c2a03b503b58e67c1731b42530f9fa5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245289 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

    jYTtY$s{>w2N19F1@z0ZNo#bt~S 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

    {F5eu#$MVjLG3COCx*-%wjy>wZ5( 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 diff --git a/template/scripts/highlight.pack.js b/template/scripts/highlight.pack.js deleted file mode 100644 index ed92ae6d..00000000 --- a/template/scripts/highlight.pack.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! highlight.js v9.8.0 | BSD3 License | git.io/hljslicense */ -!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/[&<>]/gm,function(e){return I[e]})}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return R(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||R(i))return i}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){l+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===s);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");u[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):E(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push("self"===e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var l=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join("|"),!0):{exec:function(){return null}}}}r(e)}function l(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function h(e,n,t,r){var a=r?"":y.classPrefix,i='',i+n+o}function p(){var e,t,r,a;if(!E.k)return n(B);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(B);r;)a+=n(B.substr(t,r.index-t)),e=g(E,r),e?(M+=e[1],a+=h(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(B);return a+n(B.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!x[E.sL])return n(B);var t=e?l(E.sL,B,!0,L[E.sL]):f(B,E.sL.length?E.sL:void 0);return E.r>0&&(M+=t.r),e&&(L[E.sL]=t.top),h(t.language,t.value,!1,!0)}function b(){k+=null!=E.sL?d():p(),B=""}function v(e){k+=e.cN?h(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(B+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?B+=n:(t.eB&&(B+=n),b(),t.rB||t.eB||(B=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?B+=n:(a.rE||a.eE||(B+=n),b(),a.eE&&(B=n));do E.cN&&(k+=C),E.skip||(M+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return B+=n,n.length||1}var N=R(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var w,E=i||N,L={},k="";for(w=E;w!==N;w=w.parent)w.cN&&(k=h(w.cN,"",!0)+k);var B="",M=0;try{for(var I,j,O=0;;){if(E.t.lastIndex=O,I=E.t.exec(t),!I)break;j=m(t.substr(O,I.index-O),I[0]),O=I.index+j}for(m(t.substr(O)),w=E;w.parent;w=w.parent)w.cN&&(k+=C);return{r:M,value:k,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function f(e,t){t=t||y.languages||E(x);var r={r:0,value:n(e)},a=r;return t.filter(R).forEach(function(n){var t=l(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function g(e){return y.tabReplace||y.useBR?e.replace(M,function(e,n){return y.useBR&&"\n"===e?"
    ":y.tabReplace?n.replace(/\t/g,y.tabReplace):void 0}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function p(e){var n,t,r,o,s,p=i(e);a(p)||(y.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,s=n.textContent,r=p?l(p,s,!0):f(s),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),s)),r.value=g(r.value),e.innerHTML=r.value,e.className=h(e.className,p,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function d(e){y=o(y,e)}function b(){if(!b.called){b.called=!0;var e=document.querySelectorAll("pre code");w.forEach.call(e,p)}}function v(){addEventListener("DOMContentLoaded",b,!1),addEventListener("load",b,!1)}function m(n,t){var r=x[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function N(){return E(x)}function R(e){return e=(e||"").toLowerCase(),x[e]||x[L[e]]}var w=[],E=Object.keys,x={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
    ",y={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},I={"&":"&","<":"<",">":">"};return e.highlight=l,e.highlightAuto=f,e.fixMarkup=g,e.highlightBlock=p,e.configure=d,e.initHighlighting=b,e.initHighlightingOnLoad=v,e.registerLanguage=m,e.listLanguages=N,e.getLanguage=R,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|like)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*#]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("css",function(e){var c="[a-zA-Z-][a-zA-Z0-9_-]*",t={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:c,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,t]}]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\._]+/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("swift",function(e){var t={keyword:"__COLUMN__ __FILE__ __FUNCTION__ __LINE__ as as! as? associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},i={cN:"type",b:"\\b[A-Z][\\wÀ-ʸ']*",r:0},n=e.C("/\\*","\\*/",{c:["self"]}),r={cN:"subst",b:/\\\(/,e:"\\)",k:t,c:[]},a={cN:"number",b:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",r:0},o=e.inherit(e.QSM,{c:[r,e.BE]});return r.c=[a],{k:t,c:[o,e.CLCM,n,i,a,{cN:"function",bK:"func",e:"{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{b://},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:t,c:["self",a,o,e.CBCM,{b:":"}],i:/["']/}],i:/\[|%/},{cN:"class",bK:"struct protocol class extension enum",k:t,e:"\\{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{cN:"meta",b:"(@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain)"},{bK:"import",e:/$/,c:[e.CLCM,n]}]}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}}); \ No newline at end of file diff --git a/template/styles/main.css b/template/styles/main.css deleted file mode 100644 index 7170e42d..00000000 --- a/template/styles/main.css +++ /dev/null @@ -1,316 +0,0 @@ -html, body { - margin: 0; - padding: 0; - font-size: 14px; - line-height: 1.5; - font-family: -webkit-system-font, sans-serif; } - @media screen and (min-width: 720px) { - html, body { - width: 100%; - height: 100%; } } - -a { - color: #94a9d1; - text-decoration: none; - border-bottom: 1px dotted; } - -a:hover { - color: #f6cfcf; } - -h1, h2, h3, h4, h5, h6 { - color: #333; - margin: 0; - font-family: "Quicksand"; - letter-spacing: -1px; } - -h1 { - font-size: 38px; - font-weight: 300; } - @media screen and (min-width: 720px) { - h1 { - font-size: 42px; } } - -h2 { - font-size: 30px; - font-weight: 400; } - -h3 { - font-size: 24px; - font-weight: 400; - margin-bottom: 6px; } - -h4 { - font-size: 18px; - font-weight: 400; - margin-bottom: 6px; } - -:target { - background: #ffff99; } - -a.logo { - display: block; - position: relative; - border-bottom: none; - height: 100%; - width: 280px; - margin: 0 auto; - padding-left: 52px; } - @media screen and (min-width: 720px) { - a.logo { - padding-left: 72px; - width: 100%; } } - a.logo h1 { - margin: 0; - font-size: 36px; - line-height: 96px; - text-transform: uppercase; } - @media screen and (min-width: 720px) { - a.logo h1 { - font-size: 36px; } } - a.logo h1 em { - font-style: normal; - color: rgba(0, 0, 0, 0.4); - text-transform: none; } - a.logo img { - left: 6px; - top: 24px; - position: absolute; - height: 48px; } - @media screen and (min-width: 720px) { - a.logo img { - left: 24px; - top: 24px; - height: 48px; } } - -* { - box-sizing: border-box; } - -header { - overflow: hidden; - border-bottom: 3px solid #94a9d1; - height: 132px; - position: relative; } - @media screen and (min-width: 720px) { - header { - height: 96px; - position: absolute; - left: 0; - right: 0; - z-index: 10; - background: rgba(255, 255, 255, 0.95); } - .safari header { - background: rgba(255, 255, 255, 0.5); - -webkit-backdrop-filter: blur(10px); } } - header ul { - position: absolute; - margin: 0; - padding: 0; - bottom: 5px; - right: 0; - text-align: center; } - @media screen and (max-width: 720px) { - header ul { - left: 0; } } - @media screen and (min-width: 720px) { - header ul { - text-align: right; - right: 24px; - top: 24px; - height: 100%; } } - header ul li { - display: inline-block; - line-height: 48px; } - header ul li a { - padding: 0 6px; - display: block; - border-bottom: none; } - -a.toggle { - position: absolute; } - @media screen and (min-width: 720px) { - a.toggle { - display: none; } } - a.toggle.close { - top: 12px; - right: 0; - z-index: 20; - color: white; - font-size: 48px; - line-height: 48px; - height: 72px; - width: 72px; - padding: 12px; - border-bottom: none; - text-align: center; } - a.toggle.show { - text-align: center; - border-bottom: none; - background: #94a9d1; - color: white; - right: -36px; - top: 50%; - height: 48px; - width: 36px; - margin-top: -24px; - line-height: 48px; - border-bottom-right-radius: 5px; - border-top-right-radius: 5px; - z-index: 15; - transition: right 0.25s; } - a.toggle.show.hide { - right: -12px; } - body.toggled a.toggle.show { - right: -36px; } - -nav { - font-size: 14px; - border-right: 1px solid rgba(0, 0, 0, 0.05); - width: 100%; - position: fixed; - left: -100%; - transition: left 0.25s; - top: 0; - right: 0; - bottom: 0; - display: block; - background: #94a9d1; - z-index: 10; } - nav a { - border-bottom: none; - color: rgba(255, 255, 255, 0.9); - font-size: 16px; - line-height: 32px; - height: 32px; - display: block; } - nav h3 { - text-transform: uppercase; - margin-top: 12px; - font-size: 18px; - color: white; - font-weight: 600; } - body.toggled nav { - left: 0; } - @media screen and (min-width: 720px) { - nav { - background: white; - display: block; - position: absolute; - left: 0; - top: 0; - bottom: 0; - width: 216px; - z-index: 8; - padding-top: 96px; } - nav h3 { - color: #bbb; - font-size: 14px; - margin-bottom: 6px; - font-weight: 400; } - nav a { - border-bottom: none; - font-weight: 200; - font-size: 14px; - color: #777; - font-size: 12px; - height: 24px; } - nav a:hover { - color: #94a9d1; } } - nav ul, nav ul li { - list-style: none; - padding: 0; - margin: 0; } - nav ul.active a, nav ul li.active a { - font-weight: 600; } - @media screen and (min-width: 720px) { - nav ul.active a, nav ul li.active a { - color: #94a9d1; } } - nav ul { - margin-bottom: 18px; } - -div.scroll { - padding: 22px; - overflow-y: scroll; - height: 100%; - z-index: 10; - -webkit-overflow-scrolling: touch; } - -main { - -webkit-overflow-scrolling: touch; - color: #555; - font-weight: 200; - width: 100%; - padding: 24px; - overflow: hidden; } - @media screen and (min-width: 720px) { - main { - height: 100%; - position: absolute; - position: relative; - z-index: 6; - top: 0; - bottom: 0; - right: 0; - left: 0; - padding: 22px; - padding-top: 110px; - padding-left: 240px; - overflow-y: scroll; - max-width: 1440px; } } - main a.edit { - position: absolute; - top: 146px; - right: 24px; - border-bottom: none; } - @media screen and (min-width: 720px) { - main a.edit { - top: 102px; } } - main h1 { - margin-bottom: 12px; } - main h2 { - margin-top: 24px; - margin-bottom: 12px; - border-bottom: 1px dotted rgba(0, 0, 0, 0.1); } - main h3 { - margin-top: 18px; } - main p { - margin-top: 0; - margin-bottom: 12px; - line-height: 1.75; } - main blockquote { - margin: 0; - background: rgba(247, 202, 201, 0.2); - margin-top: 18px; - margin-bottom: 18px; - margin-left: 0; - padding: 6px; - padding-left: 12px; - border-left: 5px solid #f6cfcf; } - main blockquote p { - margin: 0; - padding: 0; } - -pre, code { - font-size: 12px; - font-family: "Source Code Pro", monospace; - -webkit-overflow-scrolling: touch; } - -p code, li code { - background: #fbfbfb; - border-radius: 5px; - padding: 3px 5px; - display: inline-block; - color: #6b7891; - box-shadow: 0 1px 0px 0px rgba(0, 0, 0, 0.1); } - -pre { - margin-top: 12px; - margin-bottom: 15px; - padding: 5px; - background: #fbfbfb; - border-radius: 10px; - box-shadow: 0 3px 0px 0px rgba(0, 0, 0, 0.1); } - -img { - max-width: 100%; } - -/*# sourceMappingURL=main.css.map */ diff --git a/template/styles/main.css.map b/template/styles/main.css.map deleted file mode 100644 index bd469dad..00000000 --- a/template/styles/main.css.map +++ /dev/null @@ -1,7 +0,0 @@ -{ -"version": 3, -"mappings": "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", -"sources": ["main.sass"], -"names": [], -"file": "main.css" -} \ No newline at end of file diff --git a/template/styles/main.sass b/template/styles/main.sass deleted file mode 100644 index 185c934a..00000000 --- a/template/styles/main.sass +++ /dev/null @@ -1,351 +0,0 @@ -$tablet: 720px -$blue: #94a9d1 - -html, body - margin: 0 - padding: 0 - font-size: 14px - line-height: 1.5 - font-family: -webkit-system-font, sans-serif - - @media screen and (min-width: $tablet) - width: 100% - height: 100% - -a - color: #94a9d1 - text-decoration: none - border-bottom: 1px dotted - -a:hover - color: #f6cfcf - - -h1, h2, h3, h4, h5, h6 - color: #333 - margin: 0 - font-family: 'Quicksand' - letter-spacing: -1px - -h1 - font-size: 38px - @media screen and (min-width: $tablet) - font-size: 42px - font-weight: 300 - -h2 - font-size: 30px - font-weight: 400 - -h3 - font-size: 24px - font-weight: 400 - margin-bottom: 6px - -h4 - font-size: 18px - font-weight: 400 - margin-bottom: 6px - -\:target - background: #ffff99 - -a.logo - display: block - position: relative - border-bottom: none - height: 100% - width: 280px - margin: 0 auto - padding-left: 52px - - @media screen and (min-width: $tablet) - padding-left: 72px - width: 100% - - h1 - margin: 0 - font-size: 36px - line-height: 96px - text-transform: uppercase - - @media screen and (min-width: $tablet) - font-size: 36px - - em - font-style: normal - color: rgba(0, 0, 0, 0.4) - text-transform: none - - img - left: 6px - top: 24px - position: absolute - height: 48px - - @media screen and (min-width: $tablet) - left: 24px - top: 24px - height: 48px - -* - box-sizing: border-box - -header - overflow: hidden - border-bottom: 3px solid #94a9d1 - height: 132px - position: relative - - @media screen and (min-width: $tablet) - height: 96px - position: absolute - left: 0 - right: 0 - z-index: 10 - - background: rgba(255, 255, 255, 0.95) - - .safari & - background: rgba(255, 255, 255, 0.5) - -webkit-backdrop-filter: blur(10px) - - - - ul - position: absolute - margin: 0 - padding: 0 - bottom: 5px - right: 0 - text-align: center - - @media screen and (max-width: $tablet) - left: 0 - - @media screen and (min-width: $tablet) - text-align: right - right: 24px - top: 24px - height: 100% - - li - display: inline-block - line-height: 48px - - a - padding: 0 6px - display: block - border-bottom: none - -a.toggle - @media screen and (min-width: $tablet) - display: none - - position: absolute - - &.close - top: 12px - right: 0 - z-index: 20 - color: white - font-size: 48px - line-height: 48px - height: 72px - width: 72px - padding: 12px - border-bottom: none - text-align: center - - &.show - text-align: center - border-bottom: none - background: $blue - color: white - right: -36px - top: 50% - height: 48px - width: 36px - margin-top: -24px - line-height: 48px - border-bottom-right-radius: 5px - border-top-right-radius: 5px - z-index: 15 - - transition: right 0.25s - - &.hide - right: -12px - - body.toggled & - right: -36px - - -nav - font-size: 14px - border-right: 1px solid rgba(0, 0, 0, 0.05) - width: 100% - position: fixed - left: -100% - transition: left 0.25s - - top: 0 - right: 0 - bottom: 0 - display: block - background: $blue - z-index: 10 - - a - border-bottom: none - color: rgba(255, 255, 255, 0.9) - font-size: 16px - line-height: 32px - height: 32px - display: block - - h3 - text-transform: uppercase - margin-top: 12px - font-size: 18px - color: white - font-weight: 600 - - body.toggled & - left: 0 - - @media screen and (min-width: $tablet) - background: white - display: block - position: absolute - left: 0 - top: 0 - bottom: 0 - width: 216px - z-index: 8 - padding-top: 96px - - h3 - color: #bbb - font-size: 14px - margin-bottom: 6px - font-weight: 400 - - - a - border-bottom: none - font-weight: 200 - font-size: 14px - color: #777 - font-size: 12px - height: 24px - - &:hover - color: #94a9d1 - - ul, ul li - list-style: none - padding: 0 - margin: 0 - - &.active a - @media screen and (min-width: $tablet) - color: #94a9d1 - font-weight: 600 - - ul - margin-bottom: 18px - -div.scroll - padding: 22px - overflow-y: scroll - height: 100% - z-index: 10 - -webkit-overflow-scrolling: touch - -main - -webkit-overflow-scrolling: touch - color: #555 - font-weight: 200 - width: 100% - padding: 24px - overflow: hidden - - @media screen and (min-width: $tablet) - height: 100% - position: absolute - position: relative - z-index: 6 - - top: 0 - bottom: 0 - right: 0 - left: 0 - - padding: 22px - padding-top: 110px - padding-left: 240px - overflow-y: scroll - max-width: 1440px - - a.edit - position: absolute - top: 146px - @media screen and (min-width: $tablet) - top: 102px - right: 24px - border-bottom: none - - h1 - margin-bottom: 12px - - h2 - margin-top: 24px - margin-bottom: 12px - border-bottom: 1px dotted rgba(0, 0, 0, 0.10) - - h3 - margin-top: 18px - - p - margin-top: 0 - margin-bottom: 12px - line-height: 1.75 - - blockquote - margin: 0 - background: rgba(247, 202, 201, 0.2) - margin-top: 18px - margin-bottom: 18px - margin-left: 0 - padding: 6px - padding-left: 12px - border-left: 5px solid #f6cfcf - - p - margin: 0 - padding: 0 - -pre, code - font-size: 12px - font-family: 'Source Code Pro', monospace - -webkit-overflow-scrolling: touch - -p code, li code - background: #fbfbfb - border-radius: 5px - padding: 3px 5px - display: inline-block - color: #6b7891 - box-shadow: 0 1px 0px 0px rgba(0, 0, 0, 0.1) - -pre - margin-top: 12px - margin-bottom: 15px - padding: 5px - background: #fbfbfb - border-radius: 10px - box-shadow: 0 3px 0px 0px rgba(0, 0, 0, 0.1) - -img - max-width: 100% diff --git a/template/styles/vapor-code.css b/template/styles/vapor-code.css deleted file mode 100644 index 9afb04ca..00000000 --- a/template/styles/vapor-code.css +++ /dev/null @@ -1,71 +0,0 @@ -/** - * GitHub Gist Theme - * Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro - */ - -.hljs { - display: block; - padding: 0.5em; - color: #6b7891; - background: none; - overflow-x: auto; -} - -.hljs-comment, -.hljs-meta { - color: #969896; -} - -.hljs-string, -.hljs-variable, -.hljs-template-variable, -.hljs-strong, -.hljs-emphasis, -.hljs-quote { - color: #9cc074; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-type { - color: #9f69c4; -} - -.hljs-literal, -.hljs-symbol, -.hljs-bullet, -.hljs-attribute { - color: #0086b3; -} - -.hljs-section, -.hljs-name { - color: #63a35c; -} - -.hljs-tag { - color: #333333; -} - -.hljs-title, -.hljs-attr, -.hljs-selector-id, -.hljs-selector-class, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #795da3; -} - -.hljs-addition { - color: #55a532; - background-color: #eaffea; -} - -.hljs-deletion { - color: #bd2c00; - background-color: #ffecec; -} - -.hljs-link { - text-decoration: underline; -} From 1fe6654b787c5421f1eece52b9637f40160cdb27 Mon Sep 17 00:00:00 2001 From: Tanner Nelson Date: Fri, 3 Mar 2017 18:58:09 +0100 Subject: [PATCH 2/8] vapor docs updates --- 2.0/docs/advanced/modules.md | 0 2.0/docs/auth/middleware.md | 6 +- 2.0/docs/{guide => general}/commands.md | 0 2.0/docs/{guide => general}/controllers.md | 25 +- 2.0/docs/general/droplet.md | 218 ++++++++++++++++++ .../{guide => general}/folder-structure.md | 13 +- 2.0/docs/general/hash.md | 158 +++++++++++++ 2.0/docs/general/log.md | 1 + 2.0/docs/{guide => general}/middleware.md | 65 ++++-- 2.0/docs/{guide => general}/provider.md | 54 ++--- 2.0/docs/{guide => general}/validation.md | 5 +- 2.0/docs/{guide => general}/views.md | 14 +- 2.0/docs/getting-started/hello-world.md | 2 +- 2.0/docs/guide/droplet.md | 109 --------- 2.0/docs/guide/hash.md | 36 --- 2.0/docs/{guide => json}/json.md | 0 2.0/docs/{guide/leaf.md => leaf/overview.md} | 0 2.0/docs/{guide => sessions}/sessions.md | 2 +- 2.0/docs/{guide => settings}/config.md | 0 2.0/mkdocs.yml | 59 +++-- 20 files changed, 510 insertions(+), 257 deletions(-) create mode 100644 2.0/docs/advanced/modules.md rename 2.0/docs/{guide => general}/commands.md (100%) rename 2.0/docs/{guide => general}/controllers.md (86%) create mode 100644 2.0/docs/general/droplet.md rename 2.0/docs/{guide => general}/folder-structure.md (86%) create mode 100644 2.0/docs/general/hash.md create mode 100644 2.0/docs/general/log.md rename 2.0/docs/{guide => general}/middleware.md (79%) rename 2.0/docs/{guide => general}/provider.md (69%) rename 2.0/docs/{guide => general}/validation.md (98%) rename 2.0/docs/{guide => general}/views.md (79%) delete mode 100644 2.0/docs/guide/droplet.md delete mode 100644 2.0/docs/guide/hash.md rename 2.0/docs/{guide => json}/json.md (100%) rename 2.0/docs/{guide/leaf.md => leaf/overview.md} (100%) rename 2.0/docs/{guide => sessions}/sessions.md (95%) rename 2.0/docs/{guide => settings}/config.md (100%) diff --git a/2.0/docs/advanced/modules.md b/2.0/docs/advanced/modules.md new file mode 100644 index 00000000..e69de29b diff --git a/2.0/docs/auth/middleware.md b/2.0/docs/auth/middleware.md index 389bf35b..32911fec 100644 --- a/2.0/docs/auth/middleware.md +++ b/2.0/docs/auth/middleware.md @@ -1,7 +1,3 @@ ---- -currentMenu: auth-middleware ---- - # Middleware `AuthMiddleware` is at the core of adding authorization to your project. It is responsible for initializing dependencies, checking credentials, and handling sessions. @@ -69,7 +65,7 @@ let drop = Droplet() drop.middleware.append(auth) ``` -> Note: If you'd like to enable or disable the middleware based on config files, check out [middleware](../guide/middleware.md). +> Note: If you'd like to enable or disable the middleware based on config files, check out [middleware](../general/middleware.md). ### Sharing Cache diff --git a/2.0/docs/guide/commands.md b/2.0/docs/general/commands.md similarity index 100% rename from 2.0/docs/guide/commands.md rename to 2.0/docs/general/commands.md diff --git a/2.0/docs/guide/controllers.md b/2.0/docs/general/controllers.md similarity index 86% rename from 2.0/docs/guide/controllers.md rename to 2.0/docs/general/controllers.md index 42d3c3ca..73d52182 100644 --- a/2.0/docs/guide/controllers.md +++ b/2.0/docs/general/controllers.md @@ -1,7 +1,3 @@ ---- -currentMenu: guide-controllers ---- - # Controllers Controllers help you organize related functionality into a single place. They can also be used to create RESTful resources. @@ -11,11 +7,15 @@ Controllers help you organize related functionality into a single place. They ca A basic controller looks like the following: ```swift +import Vapor +import HTTP + final class HelloController { func sayHello(_ req: Request) throws -> ResponseRepresentable { - guard let name = req.data["name"] else { - throw Abort.badRequest + guard let name = req.data["name"]?.string else { + throw Abort(.badRequest) } + return "Hello, \(name)" } } @@ -28,6 +28,9 @@ Simple controllers don't need to conform to any protocols. You are free to desig The only required structure is the signature of each method in the controller. In order to register this method into the router, it must have a signature like `(Request) throws -> ResponseRepresentable`. `Request` and `ResponseRepresentable` are made available by importing the `HTTP` module. ```swift +import Vapor +let drop = try Droplet() + let hc = HelloController() drop.get("hello", handler: hc.sayHello) ``` @@ -128,12 +131,12 @@ drop.resource("users", users) `drop.resource` will take care of registering only the routes that have been supplied by the call to `makeResource()`. In this case, only the `index` and `show` routes will be supplied. -> Note: `drop.resource` also adds useful defaults for OPTIONS requests. These can be overriden. +!!! note + `drop.resource` also adds useful defaults for OPTIONS requests. These can be overriden. ## Folder -Controllers can go anywhere in your application, but they are most often stored in the `Controllers/` directory. +Controllers can go anywhere in your application, but they are most often stored in the `App/Controllers/` directory. -### Modules - -If you are building a large application, you may want to create your controllers in a separate module. This will allow you to perform unit tests on your controllers. For more information on creating modules, visit the documentation for the [Swift Package Manager](https://swift.org/package-manager/). +!!! tip + If you are building a large application, you may want to create your controllers in a separate module. This will allow you to perform unit tests on your controllers. For more information on creating modules, see the [modules](../advanced/modules.md) section in Advanced. diff --git a/2.0/docs/general/droplet.md b/2.0/docs/general/droplet.md new file mode 100644 index 00000000..75d783bd --- /dev/null +++ b/2.0/docs/general/droplet.md @@ -0,0 +1,218 @@ +# Droplet + +The `Droplet` is a service container that gives you access to many of Vapor's facilities. It is responsible for registering routes, starting the server, appending middleware, and more. + +!!! tip + Normally applications will only have one Droplet. However, for advanced use cases, it is possible to create more than one. + +## Initialization + +As you have probably already seen, the only thing required to create an instance of `Droplet` is to import Vapor. + +```swift +import Vapor + +let drop = try Droplet() + +// your magic here + +drop.run() +``` + +Creation of the `Droplet` normally happens in the `main.swift` file. + +!!! note + For the sake of simplicity, most of the documentations sample code uses just the `main.swift` file. See the [modules](../advanced/modules.md) section in Advanced to learn more about using multiple modules. + +## Environment + +The `environment` property contains the current environment your application is running in. Usually development, testing, or production. + +```swift +if drop.environment == .production { + ... +} +``` + +The environment affects [Config](config.md) and [Logging](log.md). The environment is `development` by default. To change it, pass the `--env=` flag as an argument. + +```sh +vapor run serve --env=production +``` + +If you are in Xcode, you can pass arguments through the scheme editor. + +!!! warning + Debug logs can reduce the number of requests your application can handle per second. Enable production mode to silence non-critical logs. + +## Working Directory + +The `workDir` property contains a path to the current working directory of the application. Vapor uses this property to find the folders related to your project, such as `Resources`, `Public`, and `Config`. + +```swift +print(drop.workDir) // /var/www/my-project/ +``` + +Vapor automatically determines the working directory in most situations. However, you may need to manually set it for advanced use cases. + +You can override the working directory through the `Droplet`'s initializer, or by passing the `--workdir` argument. + +```sh +vapor run serve --workdir="/var/www/my-project" +``` + +## Modifying Properties + +The `Droplet`'s properties can be changed programmatically or through configuration. + +### Programmatic + +Properties on the `Droplet` can be changed after it is initialized. + +```swift +let drop = Droplet() + +drop.server = MyServerType.self +``` + +Here the type of server the `Droplet` uses is changed to a custom type. When the `Droplet` is run, this custom server type will be booted instead of the default server. + +### Configurable + +If you want to modify a property of the `Droplet` only in certain cases, you can use `addConfigurable`. Say for example you want to email error logs to yourself in production, but you don't want to spam your inbox while developing. + +```swift +let drop = Droplet() + +drop.addConfigurable(log: MyEmailLogger.self, name: "email") +``` + +The `Droplet` will continue to use the default logger until you modify the `Config/droplet.json` file to point to your email logger. If this is done in `Config/production/droplet.json`, then your logger will only be used in production. + +```json +{ + "log": "email" +} +``` + +#### Supported Properties + +| Property | Type | `droplet.json` key | Config Initializable | +|------------|---------------------|----------------------------|----------------------| +| server | ServerProtocol.Type | server | no | +| client | ClientProtocol.Type | client | no | +| log | LogProtocol | log | yes | +| hash | HashProtocol | hash | yes | +| cipher | CipherProtocol | cipher | yes | +| middleware | Middleware | middleware.[server,client] | no | +| console | ConsoleProtocol | console | yes | +| cache | CacheProtocol | cache | yes | + +#### Example + +Let's create a custom logger to demonstrate Vapor's configurable properties. + +`AllCapsLogger.swift` +```swift +final class AllCapsLogger: LogProtocol { + var enabled: [LogLevel] = [] + func log(_ level: LogLevel, message: String, file: String, function: String, line: Int) { + print(message.uppercased + "!!!") + } +} +``` + +Now add the logger to the Droplet using the `addConfigurable` method for logs. + +`main.swift` +```swift +let drop = try Droplet() + +drop.addConfigurable(log: AllCapsLogger(), name: "all-caps") +``` + +Whenever the `"log"` property is set to `"all-caps"` in the `droplet.json`, our new logger will be used. + +`Config/development/droplet.json` +```json +{ + "log": "all-caps" +} +``` + +Here we are setting our logger only in the `development` environment. All other environments will use Vapor's default logger. + +#### Config Initializable + +For an added layer of convenience, you can allow your custom types to be initialized from configuration files. + +In our previous example, we initialized an `AllCapsLogger` before adding it to the Droplet. + +Let's say we want to allow our project to configure how many exclamation points get added with each log message. + +`AllCapsLogger.swift` +```swift +final class AllCapsLogger: LogProtocol { + var enabled: [LogLevel] = [] + let exclamationCount: Int + + init(exclamationCount: Int) { + self.exclamationCount = exclamationCount + } + + func log(_ level: LogLevel, message: String, file: String, function: String, line: Int) { + print(message.uppercased + String(repeating: "!", count: exclamationCount)) + } +} + +extension AllCapsLogger: ConfigInitializable { + init(config: Config) throws { + let count = config["allCaps", "exclamationCount"]?.int ?? 3 + self.init(exclamationCount: count) + } +} +``` + +!!! note + The first parameter to `config` is the name of the file. + +Now that we have conformed our logger to `ConfigInitializable`, we can pass just the type name to `addConfigurable`. + + +`main.swift` +```swift +let drop = try Droplet() + +drop.addConfigurable(log: AllCapsLogger.self, name: "all-caps") +``` + +Now if you add a file named `allCaps.json` to the `Config` folder, you can configure the logger. + +`allCaps.json` +```json +{ + "exclamationCount": 5 +} +``` + +With this configurable abstraction, you can easily change how your application functions in different environments without needing to hard code these values into your source code. + +## Initialization + +The `Droplet` init method is fairly simple since most properties are variable and can be changed after initialization. + +Most plugins for Vapor come with a [Provider](provider.md), these take care of configuration details for you. + +```swift +Droplet( + arguments: [String]?, + workDir workDirProvided: String?, + config configProvided: Config?, + localization localizationProvided: Localization?, +) +``` + +!!! warning + Remember that the Droplet's properties are initialized with usable defaults. This means that if you change a property, you must be sure to change it _before_ other parts of your code use it. + + diff --git a/2.0/docs/guide/folder-structure.md b/2.0/docs/general/folder-structure.md similarity index 86% rename from 2.0/docs/guide/folder-structure.md rename to 2.0/docs/general/folder-structure.md index 434792ca..7dccbe80 100644 --- a/2.0/docs/guide/folder-structure.md +++ b/2.0/docs/general/folder-structure.md @@ -1,10 +1,6 @@ ---- -currentMenu: guide-folder-structure ---- - # Folder Structure -The first step to creating an awesome application is knowing where things are. If you created your project using the [Toolbox](../getting-started/toolbox.md) or from a template, you will already have the folder structure created. +The first step to creating an awesome application is knowing where things are. If you created your project using the [Toolbox](../getting-started/install-toolbox.md) or from a template, you will already have the folder structure created. If you are making a Vapor application from scratch, this will show you exactly how to set it up. @@ -24,11 +20,12 @@ This works best with the Swift package manager's restrictions on how packages sh The `Public` folder is where all publicly accessible files should go. This folder will be automatically checked every time a URL is requested that is not found in your routes. -> Note: The `FileMiddleware` is responsible for accessing files from the `Public` folder. +!!! note + The `FileMiddleware` is responsible for accessing files from the `Public` folder. ## Models -The `Models` folder is a recommendation of where you can put your database and other models, following the MVC pattern. +The `Models` folder is a recommendation of where you can put your database and other models. ``` . @@ -39,7 +36,7 @@ The `Models` folder is a recommendation of where you can put your database and o ## Controllers -The `Controllers` folder is a recommendation of where you can put your route controllers, following the MVC pattern. +The `Controllers` folder is a recommendation of where you can put your route controllers. ``` . diff --git a/2.0/docs/general/hash.md b/2.0/docs/general/hash.md new file mode 100644 index 00000000..5836c132 --- /dev/null +++ b/2.0/docs/general/hash.md @@ -0,0 +1,158 @@ +# Hash + +Hashes can be used to create file identifiers or store passwords. + +!!! warning + Avoid storing passwords if possible. If you must, please make sure to research the state of the art before continuing. + +## Make + +To hash a string, use the `hash` class on `Droplet`. + +```swift +let digest = try drop.hash.make("vapor") +print(digest.string) +``` + +### Checking + +Some hashing algorithms create different hash digests for the same message. Because of this, it is necessary to check your hashes using the `check` method. + +```swift +let matches = try drop.hash.check("vapor", matchesHash: digest) +``` + +## CryptoHasher + +By default, Vapor uses a SHA-256 hasher. You can change this in the configuration files or by giving the `Droplet` a different hasher. + +### Configuration + +`Config/crypto.json` +```json +{ + "hash": { + "method": "sha256", + "encoding": "hex", + "key": "password" + }, + ... +} +``` + +#### Encoding + +The CryptoHasher supports three methods of encoding. + +- `hex` +- `base64` +- `plain` + +#### Key + +Supplying a key will cause the hasher to produce _keyed_ hashes using HMAC. Some hashers require a key. + +#### Supported + +| Name | Method | Requires Key | +|--------------|-------------|--------------| +| SHA-1 | sha1 | no | +| SHA-224 | sha224 | no | +| SHA-256 | sha256 | no | +| SHA-384 | sha384 | no | +| SHA-512 | sha512 | no | +| MD4 | md4 | no | +| MD5 | md5 | no | +| RIPEMD-160 | ripemd160 | no | +| Whirlpool | whirlpool | yes | +| Streebog-256 | streebog256 | yes | +| Streebog-512 | streebog512 | yes | +| GostR341194 | gostr341194 | yes | + +### Manual + +Hashers can be swapped without the use of configuration files. + +#### Hash + +```swift +let drop = try Droplet() + +drop.hash = CryptoHasher( + hash: .sha256, + encoding: .hex +) +``` + +#### HMAC + +```swift +let drop = try Droplet() + +drop.hash = CryptoHasher( + hmac: .sha256, + encoding: .hex, + key: "password".bytes +) +``` + +## BCryptHasher + +BCrypt is a password hashing function that automatically incorporates salts to increase security. It also offers a configurable work factor that increases the amount of computational resources required to generate a hash ([key stretching](https://en.wikipedia.org/wiki/Key_stretching)). + +### Configuration + +To use the BCryptHasher instead of the CryptoHasher, change the `"hash"` key in the `droplet.json` configuration file. + +`Config/droplet.json` +```json +{ + ..., + "hash": "bcrypt", + ... +} +``` + +To configure the work factor, add a `bcrypt.json` file. + +`Config/bcrypt.json` +```json +{ + "workFactor": 8 +} +``` + +!!! tip + You can use different BCrypt work factors for production and development modes to keep password hashing fast while working on a project. + +### Manual + +You can manually assign a `BCryptHasher` to `drop.hash`. + +```swift +let drop = try Droplet() + +drop.hash = BCryptHasher(workFactor: 8) +``` + +## Advanced + +### Custom + +You can also create your own hasher. You just need to conform to the `Hash` protocol. + +```swift +/// Creates hash digests +public protocol HashProtocol { + /// Given a message, this method + /// returns a hashed digest of that message. + func make(_ message: Bytes) throws -> Bytes + + /// Checks whether a given digest was created + /// by the supplied message. + /// + /// Returns true if the digest was created + /// by the supplied message, false otherwise. + func check(_ message: Bytes, matchesHash: Bytes) throws -> Bool +} +``` diff --git a/2.0/docs/general/log.md b/2.0/docs/general/log.md new file mode 100644 index 00000000..7edad27b --- /dev/null +++ b/2.0/docs/general/log.md @@ -0,0 +1 @@ +Logging... \ No newline at end of file diff --git a/2.0/docs/guide/middleware.md b/2.0/docs/general/middleware.md similarity index 79% rename from 2.0/docs/guide/middleware.md rename to 2.0/docs/general/middleware.md index 00ac5c91..944c8d42 100644 --- a/2.0/docs/guide/middleware.md +++ b/2.0/docs/general/middleware.md @@ -8,7 +8,7 @@ Middleware is an essential part of any modern web framework. It allows you to mo You can imagine middleware as a chain of logic connecting your server to the client requesting your web app. -## Basic +## Version Middleware As an example, let's create a middleware that will add the version of our API to each response. The middleware would look something like this: @@ -36,7 +36,7 @@ You can imagine our `VersionMiddleware` sitting in the middle of a chain that co ![Middleware](https://cloud.githubusercontent.com/assets/1342803/17382676/0b51d6d6-59a0-11e6-9cbb-7585b9ab9803.png) -## Breakdown +### Breakdown Let's break down the middleware line by line. @@ -65,7 +65,7 @@ The middleware can also modify or interact with the request. ```swift func respond(to request: Request, chainingTo next: Responder) throws -> Response { guard request.cookies["token"] == "secret" else { - throw Abort.badRequest + throw Abort(.badRequest) } return try next.respond(to: request) @@ -84,7 +84,7 @@ enum FooError: Error { } ``` -Say there is a custom error that either you defined or one of the APIs you are using `throws`. This error must be caught when thrown, or else it will end up as a server error which may be unexpected to a user. The most obvious solution is to catch the error in the route closure. +Say there is a custom error that either you defined or one of the APIs you are using `throws`. This error must be caught when thrown, or else it will end up as an internal server error (500) which may be unexpected to a user. The most obvious solution is to catch the error in the route closure. ```swift app.get("foo") { request in @@ -92,14 +92,14 @@ app.get("foo") { request in do { foo = try getFooFromService() } catch { - throw Abort.badRequest + throw Abort(.badRequest) } // continue with Foo object } ``` -This solution works, but it would get repetitive if repeated throughout multiple routes. It can also easily lead to code duplication. Luckily, this error could be caught in a middleware instead. +This solution works, but it would get repetitive if multiple routes need to handle the error. Luckily, this error could be caught in a middleware instead. ```swift final class FooErrorMiddleware: Middleware { @@ -107,9 +107,9 @@ final class FooErrorMiddleware: Middleware { do { return try next.respond(to: request) } catch FooError.fooServiceUnavailable { - throw Abort.custom( - status: .badRequest, - message: "Sorry, we were unable to query the Foo service." + throw Abort( + .badRequest, + reason: "Sorry, we were unable to query the Foo service." ) } } @@ -132,7 +132,18 @@ app.get("foo") { request in } ``` -Interestingly, this is how `Abort` itself is implemented in Vapor. `AbortMiddleware` catches any `Abort` errors and returns a JSON response. Should you want to customize how `Abort` errors appear, you can remove this middleware and add your own. +## Route Groups + +For more granularity, Middleware can be applied to specific route groups. + +```swift +let authed = drop.grouped(AuthMiddleware()) +authed.get("secure") { req in + return Secrets.all().makeJSON() +} +``` + +Anything added to the `authed` group must pass through `AuthMiddleware`. Because of this, we can assume all traffic to `/secure` has been authorized. Learn more in [Routing](../routing/group). ## Configuration @@ -172,15 +183,19 @@ Likewise, if the middleware appears in the `client` array for the loaded configu One middleware can be appended to both the Client and the Server, and can be added multiple times. The ordering of middleware is respected. -## Extensions (Advanced) +## Advanced -Middleware pairs great with request/response extensions and storage. +### Extensions + +Middleware pairs great with request/response extensions and storage. This example shows you how to dynamically return either HTML or JSON responses for a Model depending on the type of client. + +#### Middleware ```swift final class PokemonMiddleware: Middleware { - let drop: Droplet - init(drop: Droplet) { - self.drop = drop + let view: ViewProtocol + init(_ view: ViewProtocol) { + self.view = view } func respond(to request: Request, chainingTo next: Responder) throws -> Response { @@ -188,7 +203,7 @@ final class PokemonMiddleware: Middleware { if let pokemon = response.pokemon { if request.accept.prefers("html") { - response.view = try drop.view("pokemon.mustache", context: pokemon) + response.view = try view.make("pokemon.mustache", pokemon) } else { response.json = try pokemon.makeJSON() } @@ -199,6 +214,8 @@ final class PokemonMiddleware: Middleware { } ``` +#### Response + And the extension to `Response`. ```swift @@ -212,11 +229,19 @@ extension Response { In this example, we added a new property to response capable of holding a Pokémon object. If the middleware finds a response with one of these Pokémon objects, it will dynamically check whether the client prefers HTML. If the client is a browser like Safari and prefers HTML, it will return a Mustache view. If the client does not prefer HTML, it will return JSON. +#### Usage + Your closures can now look something like this: ```swift +import Vapor import HTTP +let drop = try Droplet() + +let pokemonMiddleware = PokemonMiddleware(drop.view) +drop.middleware.append(pokemonMiddleware) + drop.get("pokemon", Pokemon.self) { request, pokemon in let response = Response() response.pokemon = pokemon @@ -224,7 +249,9 @@ drop.get("pokemon", Pokemon.self) { request, pokemon in } ``` -Or, if you want to go a step further, you can make `Pokemon` conform to `ResponseRepresentable`. +#### Response Representable + +If you want to go a step further, you can make `Pokemon` conform to `ResponseRepresentable`. ```swift import HTTP @@ -238,7 +265,7 @@ extension Pokemon: ResponseRepresentable { } ``` -Now your route closures are greatly simplified and you don't need to `import HTTP`. +Now your route closures are greatly simplified. ```swift drop.get("pokemon", Pokemon.self) { request, pokemon in @@ -247,5 +274,3 @@ drop.get("pokemon", Pokemon.self) { request, pokemon in ``` Middleware is incredibly powerful. Combined with extensions, it allows you to add functionality that feels native to the framework. - -For those that are curious, this is how Vapor manages JSON internally. Whenever you return JSON in a closure, it sets the `json: JSON?` property on `Response`. The `JSONMiddleware` then detects this property and serializes the JSON into the body of the response. diff --git a/2.0/docs/guide/provider.md b/2.0/docs/general/provider.md similarity index 69% rename from 2.0/docs/guide/provider.md rename to 2.0/docs/general/provider.md index 2a4b5920..9fd754fe 100644 --- a/2.0/docs/guide/provider.md +++ b/2.0/docs/general/provider.md @@ -1,7 +1,3 @@ ---- -currentMenu: guide-provider ---- - # Provider The `Provider` protocol creates a simple and predictable way for adding functionality and third party packages to your Vapor project. @@ -20,13 +16,14 @@ To add the provider to your package, add it as a dependency in your `Package.swi let package = Package( name: "MyApp", dependencies: [ - .Package(url: "https://github.com/vapor/vapor.git", majorVersion: 1, minor: 0), - .Package(url: "https://github.com/vapor/mysql-provider.git", majorVersion: 1, minor: 0) + .Package(url: "https://github.com/vapor/vapor.git", majorVersion: 2), + .Package(url: "https://github.com/vapor/mysql-provider.git", majorVersion: 2) ] ) ``` -> It's important to `vapor clean` or `vapor build --clean` after adding new packages. +!!! warning + Always run `vapor update` or `vapor clean` after editing your `Package.swift` file. ### Import @@ -37,7 +34,13 @@ Here is what importing the MySQL provider looks like: ```swift import Vapor import VaporMySQL +``` +### Add to Droplet + +Every provider comes with a class named `Provider`. Add this class to your Droplet using the `addProvider` method. + +```swift let drop = Droplet() try drop.addProvider(VaporMySQL.Provider.self) @@ -47,9 +50,7 @@ try drop.addProvider(VaporMySQL.Provider.self) drop.run() ``` -Every provider comes with a class named `Provider`. Append the `Type` of this class to your `providers` array in the `Droplet`'s init method. - -### Config +### Configuration Some drivers may require a configuration file. For example, `VaporMySQL` requires a `Config/mysql.json` file like the following: @@ -64,22 +65,16 @@ Some drivers may require a configuration file. For example, `VaporMySQL` require You will receive an error during the `Droplet`'s initialization if a configuration file is required. -## Advanced +!!! tip + Storing sensitive configuration files (ones that contain passwords) in the `Config/secrets` folder will prevent them from being tracked by git. -You may choose to initialize the provider yourself. +### Manual + +Some providers can be configured manually by using the Provider's init method. This method can be used instead of configuration files. ```swift -import Vapor -import VaporMySQL - -let drop = Droplet() - -let mysql = try VaporMySQL.Provider(host: "localhost", user: "root", password: "", database: "vapor") -drop.addProvider(mysql) - -... - -drop.run() +let mysqlProvider = VaporMySQL.Provider(host: "localhost", user: "root", password: "", database: "vapor") +try drop.addProvider(mysqlProvider) ``` ## Create a Provider @@ -95,25 +90,22 @@ import Vapor public final class Provider: Vapor.Provider { public let message: String - public let provided: Providable public convenience init(config: Config) throws { guard let message = config["foo", "message"].string else { - throw SomeError + throw ConfigError.missing(key: ["message"], file: "foo", desiredType: String.self) } - try self.init(message: message) + self.init(message: message) } - public init(message: String) throws { + public init(message: String) { self.message = message } - public func afterInit(_ drop: Droplet) { + public func boot(_ drop: Droplet) { } - } - - public func beforeServe(_ drop: Droplet) { + public func beforeRun(_ drop: Droplet) { drop.console.info(message) } } diff --git a/2.0/docs/guide/validation.md b/2.0/docs/general/validation.md similarity index 98% rename from 2.0/docs/guide/validation.md rename to 2.0/docs/general/validation.md index 5f2ce467..cec1949d 100644 --- a/2.0/docs/guide/validation.md +++ b/2.0/docs/general/validation.md @@ -1,6 +1,5 @@ ---- -currentMenu: guide-validation ---- +!!! warning + This section may contain outdated information. # Validation diff --git a/2.0/docs/guide/views.md b/2.0/docs/general/views.md similarity index 79% rename from 2.0/docs/guide/views.md rename to 2.0/docs/general/views.md index a9053c0c..3c979a14 100644 --- a/2.0/docs/guide/views.md +++ b/2.0/docs/general/views.md @@ -1,10 +1,6 @@ ---- -currentMenu: guide-views ---- - # Views -Views return HTML data from your application. They can be created from pure HTML documents or passed through renderers such as Mustache or Stencil. +Views return HTML data from your application. They can be created from pure HTML documents or passed through renderers such as [Leaf](../leaf/leaf.md). ## Views Directory @@ -22,7 +18,7 @@ drop.get("html") { request in ## Templating -Templated documents like [Leaf](./leaf.html), Mustache, or Stencil can take a `Context`. +Templated documents like [Leaf](../leaf/leaf.md) can take a `Context`. ```swift drop.get("template") { request in @@ -32,6 +28,8 @@ drop.get("template") { request in } ``` +This context will be rendered in the view dynamically based on the `ViewRenderer` used. + ## Public Resources Any resources that your views need, such as images, styles, and scripts, should be placed in the `Public` folder at the root of your application. @@ -41,6 +39,9 @@ Any resources that your views need, such as images, styles, and scripts, should Any class that conforms to `ViewRenderer` can be added to our droplet. ```swift +import Vapor +import VaporLeaf + let drop = Droplet() drop.view = LeafRenderer(viewsDir: drop.viewsDir) @@ -51,4 +52,3 @@ drop.view = LeafRenderer(viewsDir: drop.viewsDir) These renderers can be added to your application through [Providers](provider.md). - [Leaf](https://github.com/vapor/leaf) -- [Mustache](https://github.com/vapor/mustache-provider) diff --git a/2.0/docs/getting-started/hello-world.md b/2.0/docs/getting-started/hello-world.md index 3cc68555..10059562 100644 --- a/2.0/docs/getting-started/hello-world.md +++ b/2.0/docs/getting-started/hello-world.md @@ -50,7 +50,7 @@ Look for the following line in the `main.swift` file. let drop = try Droplet() ``` -This is where the one and only `Droplet `for this example will be created. The `Droplet` class has a plethora of useful functions on it, and is used extensively. +This is where the one and only `Droplet `for this example will be created. The [Droplet](../general/droplet.md) class has a plethora of useful functions on it, and is used extensively. ### Routing diff --git a/2.0/docs/guide/droplet.md b/2.0/docs/guide/droplet.md deleted file mode 100644 index 20ebfba5..00000000 --- a/2.0/docs/guide/droplet.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -currentMenu: guide-droplet ---- - -# Droplet - -The `Droplet` is a service container that gives you access to many of Vapor's facilities. It is responsible for registering routes, starting the server, appending middleware, and more. - -## Initialization - -As you have probably already seen, the only thing required to create an instance of `Droplet` is to import Vapor. - -```swift -import Vapor - -let drop = Droplet() - -// your magic here - -drop.run() -``` - -Creation of the `Droplet` normally happens in the `main.swift` file. - -## Environment - -The `environment` property contains the current environment your application is running in. Usually development, testing, or production. - -```swift -if drop.environment == .production { - ... -} -``` - -The environment affects [Config](config.md) and [Logging](log.md). The environment is `development` by default. To change it, pass the `--env=` flag as an argument. - -```sh -vapor run serve --env=production -``` - -If you are in Xcode, you can pass arguments through the scheme editor. - -> Note: Debug logs can reduce the number of requests your application can handle per second. Enabling the production environment can improve performance. - -## Working Directory - -The `workDir` property contains a path to the current working directory of the application relative to where it was started. By default, this property assumes you started the Droplet from its root directory. - -```swift -drop.workDir // "/var/www/my-project/" -``` - -You can override the working directory through the `Droplet`'s initializer, or by passing the `--workdir` argument. - -```sh -vapor run serve --workdir="/var/www/my-project" -``` - -## Modifying Properties - -The `Droplet`'s properties can be changed programmatically or through configuration. - -### Programmatic - -Properties on the `Droplet` can be changed after it is initialized. - -```swift -let drop = Droplet() - -drop.server = MyServerType.self -``` - -Here the type of server the `Droplet` uses is changed to a custom type. When the `Droplet` is run, this custom server type will be booted instead of the default server. - -### Configurable - -If you want to modify a property of the `Droplet` only in certain cases, you can use `addConfigurable`. Say for example you want to email error logs to yourself in production, but you don't want to spam your inbox while developing. - -```swift -let drop = Droplet() - -drop.addConfigurable(log: MyEmailLogger.self, name: "email") -``` - -The `Droplet` will continue to use the default logger until you modify the `Config/droplet.json` file to point to your email logger. If this is done in `Config/production/droplet.json`, then your logger will only be used in production. - -```json -{ - "log": "email" -} -``` - -## Initialization - -The `Droplet` init method is fairly simple since most properties are variable and can be changed after initialization. - -Most plugins for Vapor come with a [Provider](provider.md), these take care of configuration details for you. - -```swift -Droplet( - arguments: [String]?, - workDir workDirProvided: String?, - config configProvided: Config?, - localization localizationProvided: Localization?, -) -``` - -> Note: Remember that the Droplet's properties are initialized with usable defaults. This means that if you change a property, you must be sure to change it _before_ other parts of your code use it. Otherwise, you may end up with confusing results as the defaults are used sometimes, and your overrides are used other times. - diff --git a/2.0/docs/guide/hash.md b/2.0/docs/guide/hash.md deleted file mode 100644 index b28bd299..00000000 --- a/2.0/docs/guide/hash.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -currentMenu: guide-hash ---- - -# Hash - -Vapor makes hashing strings easy. - -## Example - -To hash a string, use the `hash` class on `Droplet`. - -```swift -let hashed = drop.hash.make("vapor") -``` - -## SHA2Hasher - -By default, Vapor uses a SHA2Hasher with 256 bits. You can change this by giving the `Droplet` a different hasher. - -```swift -let sha512 = SHA2Hasher(variant: .sha512) - -let drop = Droplet(hash: sha512) -``` - -### Protocol - -You can also create your own hasher. You just need to conform to the `Hash` protocol. - -```swift -public protocol Hash: class { - var key: String { get set } - func make(_ string: String) -> String -} -``` diff --git a/2.0/docs/guide/json.md b/2.0/docs/json/json.md similarity index 100% rename from 2.0/docs/guide/json.md rename to 2.0/docs/json/json.md diff --git a/2.0/docs/guide/leaf.md b/2.0/docs/leaf/overview.md similarity index 100% rename from 2.0/docs/guide/leaf.md rename to 2.0/docs/leaf/overview.md diff --git a/2.0/docs/guide/sessions.md b/2.0/docs/sessions/sessions.md similarity index 95% rename from 2.0/docs/guide/sessions.md rename to 2.0/docs/sessions/sessions.md index efac34cc..86369f50 100644 --- a/2.0/docs/guide/sessions.md +++ b/2.0/docs/sessions/sessions.md @@ -24,7 +24,7 @@ let drop = Droplet() drop.middleware.append(sessions) ``` -> Note: If you'd like to enable or disable the middleware based on config files, check out [middleware](../guide/middleware.md). +> Note: If you'd like to enable or disable the middleware based on config files, check out [middleware](middleware.md). ## Request diff --git a/2.0/docs/guide/config.md b/2.0/docs/settings/config.md similarity index 100% rename from 2.0/docs/guide/config.md rename to 2.0/docs/settings/config.md diff --git a/2.0/mkdocs.yml b/2.0/mkdocs.yml index 517f405d..a4a6774f 100644 --- a/2.0/mkdocs.yml +++ b/2.0/mkdocs.yml @@ -1,11 +1,5 @@ site_name: 'Vapor Docs' copyright: 'Copyright © 2017 Qutheory, LLC' -markdown_extensions: - - admonition - - codehilite(guess_lang=false) - - footnotes - - meta - - toc(permalink=true) pages: - Overview: 'index.md' @@ -16,20 +10,21 @@ pages: - 'Hello, World': 'getting-started/hello-world.md' - 'Manual': 'getting-started/manual.md' - 'Xcode': 'getting-started/xcode.md' -- Guide: - - 'Droplet': 'guide/droplet.md' - - 'Folder Structure': 'guide/folder-structure.md' - - 'JSON': 'guide/json.md' - - 'Config': 'guide/config.md' - - 'Views': 'guide/views.md' - - 'Leaf': 'guide/leaf.md' - - 'Controllers': 'guide/controllers.md' - - 'Middleware': 'guide/middleware.md' - - 'Validation': 'guide/validation.md' - - 'Provider': 'guide/provider.md' - - 'Sessions': 'guide/sessions.md' - - 'Hash': 'guide/hash.md' - - 'Commands': 'guide/commands.md' +- Vapor: + - 'Folder Structure': 'general/folder-structure.md' + - 'Droplet': 'general/droplet.md' + - 'Views': 'general/views.md' + - 'Controllers': 'general/controllers.md' + - 'Middleware': 'general/middleware.md' + - 'Validation': 'general/validation.md' + - 'Provider': 'general/provider.md' + - 'Hash': 'general/hash.md' + - 'Log': 'general/log.md' + - 'Commands': 'general/commands.md' +- Settings: + - 'Config': 'settings/config.md' +- JSON: + - 'JSON': 'json/json.md' - Routing: - 'Basic': 'routing/basic.md' - 'Route Parameters': 'routing/parameters.md' @@ -46,6 +41,8 @@ pages: - 'Middleware': 'auth/middleware.md' - 'Request': 'auth/request.md' - 'Protect': 'auth/protect.md' +- Sessions: + - 'Sessions': 'sessions/sessions.md' - HTTP: - 'Request': 'http/request.md' - 'Response': 'http/response.md' @@ -55,22 +52,34 @@ pages: - 'Client': 'http/client.md' - 'Server': 'http/server.md' - 'CORS': 'http/cors.md' +- Leaf: + - 'Overview': 'leaf/overview.md' + +markdown_extensions: + - admonition + - codehilite(guess_lang=false) + - footnotes + - meta + - toc(permalink=true) + theme: 'material' theme_dir: 'vapor-material' repo_url: https://github.com/vapor/documentation + extra_css: - 'stylesheets/extra.css' edit_uri: edit/master/2.0/docs/ extra: - logo: 'images/droplet-white.svg' - social: + logo: 'images/droplet-white.svg' + social: - type: 'twitter' link: 'https://twitter.com/@codevapor' - type: 'slack' link: 'http://vapor.team/' - font: + font: text: 'Roboto Slab' code: 'Source Code Pro' + google_analytics: - - 'UA-76177358-4' - - 'auto' + - 'UA-76177358-4' + - 'auto' From 7814315abbf0f44d13bf77fbfdf590dc20685f2c Mon Sep 17 00:00:00 2001 From: Tanner Nelson Date: Fri, 3 Mar 2017 19:30:40 +0100 Subject: [PATCH 3/8] outdated warning --- 2.0/docs/auth/middleware.md | 5 +++- 2.0/docs/auth/protect.md | 5 ++-- 2.0/docs/auth/request.md | 5 ++-- 2.0/docs/auth/user.md | 5 ++-- 2.0/docs/deploy/nginx.md | 5 ++-- 2.0/docs/deploy/supervisor.md | 6 ++--- 2.0/docs/fluent/driver.md | 5 ++-- 2.0/docs/fluent/model.md | 5 ++-- 2.0/docs/fluent/query.md | 5 ++-- 2.0/docs/fluent/relation.md | 5 ++-- 2.0/docs/getting-started/hello-world.md | 2 +- 2.0/docs/http/body.md | 5 ++-- 2.0/docs/http/client.md | 5 ++-- 2.0/docs/http/cors.md | 5 ++-- 2.0/docs/http/request.md | 5 ++-- 2.0/docs/http/responder.md | 5 ++-- 2.0/docs/http/response-representable.md | 5 ++-- 2.0/docs/http/response.md | 5 ++-- 2.0/docs/http/server.md | 5 ++-- 2.0/docs/json/json.md | 9 ++++--- 2.0/docs/leaf/{overview.md => leaf.md} | 7 +++--- 2.0/docs/routing/basic.md | 5 ++-- 2.0/docs/routing/collection.md | 5 ++-- .../routing/{controller => controller.md} | 5 ++-- 2.0/docs/routing/group.md | 5 ++-- 2.0/docs/routing/parameters.md | 5 ++-- 2.0/docs/routing/query-parameters.md | 5 ++-- 2.0/docs/sessions/sessions.md | 7 +++--- 2.0/docs/settings/config.md | 5 ++-- 2.0/docs/testing/basic.md | 5 ++-- 2.0/docs/testing/modules.md | 5 ++-- 2.0/docs/{general => vapor}/commands.md | 5 ++-- 2.0/docs/{general => vapor}/controllers.md | 0 2.0/docs/{general => vapor}/droplet.md | 2 +- .../{general => vapor}/folder-structure.md | 2 +- 2.0/docs/{general => vapor}/hash.md | 0 2.0/docs/{general => vapor}/log.md | 0 2.0/docs/{general => vapor}/middleware.md | 2 +- 2.0/docs/{general => vapor}/provider.md | 0 2.0/docs/{general => vapor}/validation.md | 0 2.0/docs/{general => vapor}/views.md | 0 2.0/docs/websockets/custom.md | 5 ++-- 2.0/docs/websockets/droplet.md | 5 ++-- 2.0/mkdocs.yml | 24 ++++++++++--------- 44 files changed, 89 insertions(+), 117 deletions(-) rename 2.0/docs/leaf/{overview.md => leaf.md} (98%) rename 2.0/docs/routing/{controller => controller.md} (97%) rename 2.0/docs/{general => vapor}/commands.md (96%) rename 2.0/docs/{general => vapor}/controllers.md (100%) rename 2.0/docs/{general => vapor}/droplet.md (97%) rename 2.0/docs/{general => vapor}/folder-structure.md (96%) rename 2.0/docs/{general => vapor}/hash.md (100%) rename 2.0/docs/{general => vapor}/log.md (100%) rename 2.0/docs/{general => vapor}/middleware.md (97%) rename 2.0/docs/{general => vapor}/provider.md (100%) rename 2.0/docs/{general => vapor}/validation.md (100%) rename 2.0/docs/{general => vapor}/views.md (100%) diff --git a/2.0/docs/auth/middleware.md b/2.0/docs/auth/middleware.md index 32911fec..7168403d 100644 --- a/2.0/docs/auth/middleware.md +++ b/2.0/docs/auth/middleware.md @@ -1,3 +1,6 @@ +!!! warning + This section may contain outdated information. + # Middleware `AuthMiddleware` is at the core of adding authorization to your project. It is responsible for initializing dependencies, checking credentials, and handling sessions. @@ -65,7 +68,7 @@ let drop = Droplet() drop.middleware.append(auth) ``` -> Note: If you'd like to enable or disable the middleware based on config files, check out [middleware](../general/middleware.md). +> Note: If you'd like to enable or disable the middleware based on config files, check out [middleware](../vapor/middleware.md). ### Sharing Cache diff --git a/2.0/docs/auth/protect.md b/2.0/docs/auth/protect.md index d606fe3c..4a33f25d 100644 --- a/2.0/docs/auth/protect.md +++ b/2.0/docs/auth/protect.md @@ -1,6 +1,5 @@ ---- -currentMenu: auth-protect ---- +!!! warning + This section may contain outdated information. # Protect diff --git a/2.0/docs/auth/request.md b/2.0/docs/auth/request.md index 50285926..ea0f0dbb 100644 --- a/2.0/docs/auth/request.md +++ b/2.0/docs/auth/request.md @@ -1,6 +1,5 @@ ---- -currentMenu: auth-request ---- +!!! warning + This section may contain outdated information. # Request diff --git a/2.0/docs/auth/user.md b/2.0/docs/auth/user.md index e881d833..db698128 100644 --- a/2.0/docs/auth/user.md +++ b/2.0/docs/auth/user.md @@ -1,6 +1,5 @@ ---- -currentMenu: auth-user ---- +!!! warning + This section may contain outdated information. # Auth diff --git a/2.0/docs/deploy/nginx.md b/2.0/docs/deploy/nginx.md index c2398554..a028e148 100644 --- a/2.0/docs/deploy/nginx.md +++ b/2.0/docs/deploy/nginx.md @@ -1,6 +1,5 @@ ---- -currentMenu: deploy-nginx ---- +!!! warning + This section may contain outdated information. # Deploying with Nginx diff --git a/2.0/docs/deploy/supervisor.md b/2.0/docs/deploy/supervisor.md index c84b7217..fe9287ba 100644 --- a/2.0/docs/deploy/supervisor.md +++ b/2.0/docs/deploy/supervisor.md @@ -1,7 +1,5 @@ ---- -currentMenu: deploy-supervisor ---- - +!!! warning + This section may contain outdated information. # Supervisor diff --git a/2.0/docs/fluent/driver.md b/2.0/docs/fluent/driver.md index 062899a4..d8f6766d 100644 --- a/2.0/docs/fluent/driver.md +++ b/2.0/docs/fluent/driver.md @@ -1,6 +1,5 @@ ---- -currentMenu: fluent-driver ---- +!!! warning + This section may contain outdated information. # Driver diff --git a/2.0/docs/fluent/model.md b/2.0/docs/fluent/model.md index cb9028b7..8ed2a90e 100644 --- a/2.0/docs/fluent/model.md +++ b/2.0/docs/fluent/model.md @@ -1,6 +1,5 @@ ---- -currentMenu: fluent-model ---- +!!! warning + This section may contain outdated information. # Model diff --git a/2.0/docs/fluent/query.md b/2.0/docs/fluent/query.md index 6702bf38..f59828ac 100644 --- a/2.0/docs/fluent/query.md +++ b/2.0/docs/fluent/query.md @@ -1,6 +1,5 @@ ---- -currentMenu: fluent-query ---- +!!! warning + This section may contain outdated information. # Query diff --git a/2.0/docs/fluent/relation.md b/2.0/docs/fluent/relation.md index ec1146ba..34207ea7 100644 --- a/2.0/docs/fluent/relation.md +++ b/2.0/docs/fluent/relation.md @@ -1,6 +1,5 @@ ---- -currentMenu: fluent-relation ---- +!!! warning + This section may contain outdated information. # Relation diff --git a/2.0/docs/getting-started/hello-world.md b/2.0/docs/getting-started/hello-world.md index 10059562..244ecc3b 100644 --- a/2.0/docs/getting-started/hello-world.md +++ b/2.0/docs/getting-started/hello-world.md @@ -50,7 +50,7 @@ Look for the following line in the `main.swift` file. let drop = try Droplet() ``` -This is where the one and only `Droplet `for this example will be created. The [Droplet](../general/droplet.md) class has a plethora of useful functions on it, and is used extensively. +This is where the one and only `Droplet `for this example will be created. The [Droplet](../vapor/droplet.md) class has a plethora of useful functions on it, and is used extensively. ### Routing diff --git a/2.0/docs/http/body.md b/2.0/docs/http/body.md index 3d867dce..ace31ee0 100644 --- a/2.0/docs/http/body.md +++ b/2.0/docs/http/body.md @@ -1,6 +1,5 @@ ---- -currentMenu: http-body ---- +!!! warning + This section may contain outdated information. > Module: `import HTTP` diff --git a/2.0/docs/http/client.md b/2.0/docs/http/client.md index 9b4ae503..71d33407 100644 --- a/2.0/docs/http/client.md +++ b/2.0/docs/http/client.md @@ -1,6 +1,5 @@ ---- -currentMenu: http-client ---- +!!! warning + This section may contain outdated information. > Module: `import HTTP` diff --git a/2.0/docs/http/cors.md b/2.0/docs/http/cors.md index f30d3bb7..7c3445df 100644 --- a/2.0/docs/http/cors.md +++ b/2.0/docs/http/cors.md @@ -1,6 +1,5 @@ ---- -currentMenu: http-cors ---- +!!! warning + This section may contain outdated information. # CORS diff --git a/2.0/docs/http/request.md b/2.0/docs/http/request.md index f3d5b60e..4fc8cc1a 100644 --- a/2.0/docs/http/request.md +++ b/2.0/docs/http/request.md @@ -1,6 +1,5 @@ ---- -currentMenu: http-request ---- +!!! warning + This section may contain outdated information. > Module: `import HTTP` diff --git a/2.0/docs/http/responder.md b/2.0/docs/http/responder.md index 8533e4dd..94b978e5 100644 --- a/2.0/docs/http/responder.md +++ b/2.0/docs/http/responder.md @@ -1,6 +1,5 @@ ---- -currentMenu: http-responder ---- +!!! warning + This section may contain outdated information. > Module: `import HTTP` diff --git a/2.0/docs/http/response-representable.md b/2.0/docs/http/response-representable.md index 87f747b5..302d9f47 100644 --- a/2.0/docs/http/response-representable.md +++ b/2.0/docs/http/response-representable.md @@ -1,6 +1,5 @@ ---- -currentMenu: http-response-representable ---- +!!! warning + This section may contain outdated information. > Module: `import HTTP` diff --git a/2.0/docs/http/response.md b/2.0/docs/http/response.md index cd92f05d..83557d1d 100644 --- a/2.0/docs/http/response.md +++ b/2.0/docs/http/response.md @@ -1,6 +1,5 @@ ---- -currentMenu: http-response ---- +!!! warning + This section may contain outdated information. > Module: `import HTTP` diff --git a/2.0/docs/http/server.md b/2.0/docs/http/server.md index eef6ae6a..a70fdf94 100644 --- a/2.0/docs/http/server.md +++ b/2.0/docs/http/server.md @@ -1,6 +1,5 @@ ---- -currentMenu: http-server ---- +!!! warning + This section may contain outdated information. # Server diff --git a/2.0/docs/json/json.md b/2.0/docs/json/json.md index 8b6d4fd9..5d6b84ea 100644 --- a/2.0/docs/json/json.md +++ b/2.0/docs/json/json.md @@ -1,10 +1,9 @@ ---- -currentMenu: guide-json ---- - +!!! warning + This section may contain outdated information. + # JSON -JSON is an integral part of Vapor. It powers Vapor's [Config](config.md) and is incredibly easy to use in both requests and responses. +JSON is an integral part of Vapor. It powers Vapor's [Config](../settings/config.md) and is incredibly easy to use in both requests and responses. ## Request diff --git a/2.0/docs/leaf/overview.md b/2.0/docs/leaf/leaf.md similarity index 98% rename from 2.0/docs/leaf/overview.md rename to 2.0/docs/leaf/leaf.md index 7cd8ae77..38776e32 100644 --- a/2.0/docs/leaf/overview.md +++ b/2.0/docs/leaf/leaf.md @@ -1,7 +1,6 @@ ---- -currentMenu: guide-leaf ---- - +!!! warning + This section may contain outdated information. + # Leaf Welcome to Leaf. Leaf's goal is to be a simple templating language that can make generating views easier. There's a lot of great templating languages, use what's best for you, maybe that's Leaf! The goals of Leaf are as follows: diff --git a/2.0/docs/routing/basic.md b/2.0/docs/routing/basic.md index 447ebcf4..3818838e 100644 --- a/2.0/docs/routing/basic.md +++ b/2.0/docs/routing/basic.md @@ -1,6 +1,5 @@ ---- -currentMenu: routing-basic ---- +!!! warning + This section may contain outdated information. # Basic Routing diff --git a/2.0/docs/routing/collection.md b/2.0/docs/routing/collection.md index 8a8debed..c315d5dc 100644 --- a/2.0/docs/routing/collection.md +++ b/2.0/docs/routing/collection.md @@ -1,6 +1,5 @@ ---- -currentMenu: routing-collection ---- +!!! warning + This section may contain outdated information. # Route Collections diff --git a/2.0/docs/routing/controller b/2.0/docs/routing/controller.md similarity index 97% rename from 2.0/docs/routing/controller rename to 2.0/docs/routing/controller.md index 6abc2dd9..4536e225 100644 --- a/2.0/docs/routing/controller +++ b/2.0/docs/routing/controller.md @@ -1,6 +1,5 @@ ---- -currentMenu: routing-controller ---- +!!! warning + This section may contain outdated information. # Introduction diff --git a/2.0/docs/routing/group.md b/2.0/docs/routing/group.md index fe04601a..1a8bf8ba 100644 --- a/2.0/docs/routing/group.md +++ b/2.0/docs/routing/group.md @@ -1,6 +1,5 @@ ---- -currentMenu: routing-group ---- +!!! warning + This section may contain outdated information. # Route Groups diff --git a/2.0/docs/routing/parameters.md b/2.0/docs/routing/parameters.md index a0886167..c0259f81 100644 --- a/2.0/docs/routing/parameters.md +++ b/2.0/docs/routing/parameters.md @@ -1,6 +1,5 @@ ---- -currentMenu: routing-parameters ---- +!!! warning + This section may contain outdated information. # Routing Parameters diff --git a/2.0/docs/routing/query-parameters.md b/2.0/docs/routing/query-parameters.md index 62c0cc0c..b10f98c0 100644 --- a/2.0/docs/routing/query-parameters.md +++ b/2.0/docs/routing/query-parameters.md @@ -1,6 +1,5 @@ ---- -currentMenu: routing-query-parameters ---- +!!! warning + This section may contain outdated information. # Query Parameters diff --git a/2.0/docs/sessions/sessions.md b/2.0/docs/sessions/sessions.md index 86369f50..4c270b12 100644 --- a/2.0/docs/sessions/sessions.md +++ b/2.0/docs/sessions/sessions.md @@ -1,6 +1,5 @@ ---- -currentMenu: guide-sessions ---- +!!! warning + This section may contain outdated information. # Sessions @@ -24,7 +23,7 @@ let drop = Droplet() drop.middleware.append(sessions) ``` -> Note: If you'd like to enable or disable the middleware based on config files, check out [middleware](middleware.md). +> Note: If you'd like to enable or disable the middleware based on config files, check out [middleware](../vapor/middleware.md). ## Request diff --git a/2.0/docs/settings/config.md b/2.0/docs/settings/config.md index 38e448b7..514f4540 100644 --- a/2.0/docs/settings/config.md +++ b/2.0/docs/settings/config.md @@ -1,6 +1,5 @@ ---- -currentMenu: guide-config ---- +!!! warning + This section may contain outdated information. # Config diff --git a/2.0/docs/testing/basic.md b/2.0/docs/testing/basic.md index 7fd53f71..38da0559 100644 --- a/2.0/docs/testing/basic.md +++ b/2.0/docs/testing/basic.md @@ -1,6 +1,5 @@ ---- -currentMenu: testing-basic ---- +!!! warning + This section may contain outdated information. # Basic Testing diff --git a/2.0/docs/testing/modules.md b/2.0/docs/testing/modules.md index 167af2bc..7704b983 100644 --- a/2.0/docs/testing/modules.md +++ b/2.0/docs/testing/modules.md @@ -1,6 +1,5 @@ ---- -currentMenu: testing-modules ---- +!!! warning + This section may contain outdated information. # Using Multiple Modules For Testing diff --git a/2.0/docs/general/commands.md b/2.0/docs/vapor/commands.md similarity index 96% rename from 2.0/docs/general/commands.md rename to 2.0/docs/vapor/commands.md index 42aaa0c1..d287dfb3 100644 --- a/2.0/docs/general/commands.md +++ b/2.0/docs/vapor/commands.md @@ -1,6 +1,5 @@ ---- -currentMenu: guide-commands ---- +!!! warning + This section may contain outdated information. # Commands Custom console commands on Vapor are a breeze. diff --git a/2.0/docs/general/controllers.md b/2.0/docs/vapor/controllers.md similarity index 100% rename from 2.0/docs/general/controllers.md rename to 2.0/docs/vapor/controllers.md diff --git a/2.0/docs/general/droplet.md b/2.0/docs/vapor/droplet.md similarity index 97% rename from 2.0/docs/general/droplet.md rename to 2.0/docs/vapor/droplet.md index 75d783bd..2132653b 100644 --- a/2.0/docs/general/droplet.md +++ b/2.0/docs/vapor/droplet.md @@ -34,7 +34,7 @@ if drop.environment == .production { } ``` -The environment affects [Config](config.md) and [Logging](log.md). The environment is `development` by default. To change it, pass the `--env=` flag as an argument. +The environment affects [Config](../settings/config.md) and [Logging](log.md). The environment is `development` by default. To change it, pass the `--env=` flag as an argument. ```sh vapor run serve --env=production diff --git a/2.0/docs/general/folder-structure.md b/2.0/docs/vapor/folder-structure.md similarity index 96% rename from 2.0/docs/general/folder-structure.md rename to 2.0/docs/vapor/folder-structure.md index 7dccbe80..102f00a1 100644 --- a/2.0/docs/general/folder-structure.md +++ b/2.0/docs/vapor/folder-structure.md @@ -80,6 +80,6 @@ Vapor has a sophisticated configuration system that involves a hierarchy of conf └── app.json // overrides app.json in all environments, ignored by git ``` -`.json` files are structured in the `Config` folder as shown above. The configuration will be applied dependant on where the `.json` file exists in the hierarchy. Learn more in [Config](config.md). +`.json` files are structured in the `Config` folder as shown above. The configuration will be applied dependant on where the `.json` file exists in the hierarchy. Learn more in [Config](../settings/config.md). Learn about changing environments (the `--env=` flag) in the [Droplet](droplet.md) section. diff --git a/2.0/docs/general/hash.md b/2.0/docs/vapor/hash.md similarity index 100% rename from 2.0/docs/general/hash.md rename to 2.0/docs/vapor/hash.md diff --git a/2.0/docs/general/log.md b/2.0/docs/vapor/log.md similarity index 100% rename from 2.0/docs/general/log.md rename to 2.0/docs/vapor/log.md diff --git a/2.0/docs/general/middleware.md b/2.0/docs/vapor/middleware.md similarity index 97% rename from 2.0/docs/general/middleware.md rename to 2.0/docs/vapor/middleware.md index 944c8d42..e5a1596d 100644 --- a/2.0/docs/general/middleware.md +++ b/2.0/docs/vapor/middleware.md @@ -149,7 +149,7 @@ Anything added to the `authed` group must pass through `AuthMiddleware`. Because Appending middleware to the `drop.middleware` array is the simplest way to add middleware--it will be used every time the application starts. -You can also use the [configuration](config.md) files to enabled or disable middleware for more control. This is especially useful if you have middleware that should, for example, run only in production. +You can also use the [configuration](../settings/config.md) files to enabled or disable middleware for more control. This is especially useful if you have middleware that should, for example, run only in production. Appending configurable middleware looks like the following: diff --git a/2.0/docs/general/provider.md b/2.0/docs/vapor/provider.md similarity index 100% rename from 2.0/docs/general/provider.md rename to 2.0/docs/vapor/provider.md diff --git a/2.0/docs/general/validation.md b/2.0/docs/vapor/validation.md similarity index 100% rename from 2.0/docs/general/validation.md rename to 2.0/docs/vapor/validation.md diff --git a/2.0/docs/general/views.md b/2.0/docs/vapor/views.md similarity index 100% rename from 2.0/docs/general/views.md rename to 2.0/docs/vapor/views.md diff --git a/2.0/docs/websockets/custom.md b/2.0/docs/websockets/custom.md index df323e6d..6dac1b57 100644 --- a/2.0/docs/websockets/custom.md +++ b/2.0/docs/websockets/custom.md @@ -1,6 +1,5 @@ ---- -currentMenu: websockets-custom ---- +!!! warning + This section may contain outdated information. # Custom WebSockets diff --git a/2.0/docs/websockets/droplet.md b/2.0/docs/websockets/droplet.md index 672cdb45..aa57d206 100644 --- a/2.0/docs/websockets/droplet.md +++ b/2.0/docs/websockets/droplet.md @@ -1,6 +1,5 @@ ---- -currentMenu: websockets-droplet ---- +!!! warning + This section may contain outdated information. # Droplet WebSockets diff --git a/2.0/mkdocs.yml b/2.0/mkdocs.yml index a4a6774f..1cc59d63 100644 --- a/2.0/mkdocs.yml +++ b/2.0/mkdocs.yml @@ -11,16 +11,16 @@ pages: - 'Manual': 'getting-started/manual.md' - 'Xcode': 'getting-started/xcode.md' - Vapor: - - 'Folder Structure': 'general/folder-structure.md' - - 'Droplet': 'general/droplet.md' - - 'Views': 'general/views.md' - - 'Controllers': 'general/controllers.md' - - 'Middleware': 'general/middleware.md' - - 'Validation': 'general/validation.md' - - 'Provider': 'general/provider.md' - - 'Hash': 'general/hash.md' - - 'Log': 'general/log.md' - - 'Commands': 'general/commands.md' + - 'Folder Structure': 'vapor/folder-structure.md' + - 'Droplet': 'vapor/droplet.md' + - 'Views': 'vapor/views.md' + - 'Controllers': 'vapor/controllers.md' + - 'Middleware': 'vapor/middleware.md' + - 'Validation': 'vapor/validation.md' + - 'Provider': 'vapor/provider.md' + - 'Hash': 'vapor/hash.md' + - 'Log': 'vapor/log.md' + - 'Commands': 'vapor/commands.md' - Settings: - 'Config': 'settings/config.md' - JSON: @@ -53,7 +53,9 @@ pages: - 'Server': 'http/server.md' - 'CORS': 'http/cors.md' - Leaf: - - 'Overview': 'leaf/overview.md' + - 'Overview': 'leaf/leaf.md' +- Advanced: + - 'Modules': 'advanced/modules.md' markdown_extensions: - admonition From 30ab3183fa1b31a7782f62fb54535443cbf5fa03 Mon Sep 17 00:00:00 2001 From: Tanner Nelson Date: Fri, 3 Mar 2017 19:39:10 +0100 Subject: [PATCH 4/8] addl hash info --- 2.0/docs/vapor/hash.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.0/docs/vapor/hash.md b/2.0/docs/vapor/hash.md index 5836c132..cd67f7b0 100644 --- a/2.0/docs/vapor/hash.md +++ b/2.0/docs/vapor/hash.md @@ -1,6 +1,6 @@ # Hash -Hashes can be used to create file identifiers or store passwords. +Hashing is a one way method of converting arbitrary data into a fixed size format. Unlike ciphers, data that is hashed cannot be retrieved from the resulting digest. Hashes can be used to create keys, file identifiers, or store credentials. !!! warning Avoid storing passwords if possible. If you must, please make sure to research the state of the art before continuing. From aa23a15b22df39595b9a465225f9919bc3b346f1 Mon Sep 17 00:00:00 2001 From: Tanner Nelson Date: Fri, 3 Mar 2017 19:45:41 +0100 Subject: [PATCH 5/8] diagram --- 2.0/docs/vapor/hash.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/2.0/docs/vapor/hash.md b/2.0/docs/vapor/hash.md index cd67f7b0..129959a6 100644 --- a/2.0/docs/vapor/hash.md +++ b/2.0/docs/vapor/hash.md @@ -2,12 +2,16 @@ Hashing is a one way method of converting arbitrary data into a fixed size format. Unlike ciphers, data that is hashed cannot be retrieved from the resulting digest. Hashes can be used to create keys, file identifiers, or store credentials. + + +> Hash function diagram from [Wikipedia](https://en.wikipedia.org/wiki/Hash_function). + !!! warning - Avoid storing passwords if possible. If you must, please make sure to research the state of the art before continuing. + Avoid storing password hashes if possible. If you must, please make sure to research the state of the art before continuing. ## Make -To hash a string, use the `hash` class on `Droplet`. +To hash a string, use the `hash` property on `Droplet`. ```swift let digest = try drop.hash.make("vapor") From 868d71bd7d34036fc0503bdcbf9799baf3107fd7 Mon Sep 17 00:00:00 2001 From: Tanner Nelson Date: Fri, 3 Mar 2017 19:47:04 +0100 Subject: [PATCH 6/8] retina --- 2.0/docs/vapor/hash.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.0/docs/vapor/hash.md b/2.0/docs/vapor/hash.md index 129959a6..7b261f85 100644 --- a/2.0/docs/vapor/hash.md +++ b/2.0/docs/vapor/hash.md @@ -2,7 +2,7 @@ Hashing is a one way method of converting arbitrary data into a fixed size format. Unlike ciphers, data that is hashed cannot be retrieved from the resulting digest. Hashes can be used to create keys, file identifiers, or store credentials. - +Hash function diagram > Hash function diagram from [Wikipedia](https://en.wikipedia.org/wiki/Hash_function). From 2ec2cd438a86874a77febec5ebbf876485a76e03 Mon Sep 17 00:00:00 2001 From: Tanner Nelson Date: Fri, 3 Mar 2017 19:52:14 +0100 Subject: [PATCH 7/8] fixes --- 2.0/docs/vapor/hash.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/2.0/docs/vapor/hash.md b/2.0/docs/vapor/hash.md index 7b261f85..6780b2c2 100644 --- a/2.0/docs/vapor/hash.md +++ b/2.0/docs/vapor/hash.md @@ -96,13 +96,16 @@ let drop = try Droplet() drop.hash = CryptoHasher( hmac: .sha256, encoding: .hex, - key: "password".bytes + key: "password".makeBytes() ) ``` ## BCryptHasher -BCrypt is a password hashing function that automatically incorporates salts to increase security. It also offers a configurable work factor that increases the amount of computational resources required to generate a hash ([key stretching](https://en.wikipedia.org/wiki/Key_stretching)). +BCrypt is a password hashing function that automatically incorporates salts and offers a configurable work factor. The work factor can be used to increase the computation required to generate a hash + +!!! seealso + Learn more about [key stretching](https://en.wikipedia.org/wiki/Key_stretching) on Wikipedia. ### Configuration From 51aabd41fe814deaabfc6f8e4861646b813eec27 Mon Sep 17 00:00:00 2001 From: tanner0101 Date: Thu, 23 Mar 2017 12:02:56 +0100 Subject: [PATCH 8/8] separate 1.0 folder --- 1.0/.gitignore | 3 + 1.0/CONTRIBUTING.md | 7 + 1.0/README.es.md | 86 +++++ 1.0/README.md | 87 +++++ 1.0/README.zh-hant.md | 77 ++++ 1.0/auth/middleware.md | 89 +++++ 1.0/auth/protect.md | 33 ++ 1.0/auth/request.md | 161 ++++++++ 1.0/auth/user.md | 120 ++++++ 1.0/couscous.yml | 179 +++++++++ 1.0/deploy/nginx.md | 149 ++++++++ 1.0/deploy/supervisor.md | 65 ++++ 1.0/fluent/driver.md | 52 +++ {fluent => 1.0/fluent}/fixtures.md | 0 1.0/fluent/model.md | 246 ++++++++++++ 1.0/fluent/query.md | 120 ++++++ 1.0/fluent/relation.md | 176 +++++++++ 1.0/getting-started/hello-world.md | 136 +++++++ 1.0/getting-started/install-swift-3-macos.md | 33 ++ 1.0/getting-started/install-swift-3-ubuntu.md | 98 +++++ 1.0/getting-started/install-toolbox.md | 57 +++ 1.0/getting-started/manual.md | 99 +++++ 1.0/getting-started/xcode.md | 45 +++ 1.0/guide/commands.md | 45 +++ 1.0/guide/config.md | 185 +++++++++ 1.0/guide/controllers.md | 139 +++++++ 1.0/guide/droplet.md | 109 ++++++ 1.0/guide/folder-structure.md | 88 +++++ 1.0/guide/hash.md | 36 ++ 1.0/guide/json.md | 53 +++ 1.0/guide/leaf.md | 185 +++++++++ 1.0/guide/middleware.md | 251 +++++++++++++ 1.0/guide/provider.md | 130 +++++++ 1.0/guide/sessions.md | 77 ++++ 1.0/guide/validation.md | 106 ++++++ 1.0/guide/views.md | 54 +++ 1.0/http/body.md | 141 +++++++ 1.0/http/client.md | 160 ++++++++ 1.0/http/cors.md | 94 +++++ 1.0/http/request.md | 223 +++++++++++ 1.0/http/responder.md | 79 ++++ 1.0/http/response-representable.md | 104 ++++++ 1.0/http/response.md | 126 +++++++ 1.0/http/server.md | 210 +++++++++++ 1.0/routing/basic.md | 146 ++++++++ 1.0/routing/collection.md | 82 ++++ 1.0/routing/controller | 74 ++++ 1.0/routing/group.md | 67 ++++ 1.0/routing/parameters.md | 134 +++++++ 1.0/routing/query-parameters.md | 34 ++ 1.0/template/default.twig | 199 ++++++++++ 1.0/template/images/droplet.svg | 9 + 1.0/template/screenshot.png | Bin 0 -> 245289 bytes 1.0/template/scripts/highlight.pack.js | 2 + 1.0/template/styles/main.css | 316 ++++++++++++++++ 1.0/template/styles/main.css.map | 7 + 1.0/template/styles/main.sass | 351 ++++++++++++++++++ 1.0/template/styles/vapor-code.css | 71 ++++ 1.0/testing/basic.md | 94 +++++ 1.0/testing/modules.md | 40 ++ 1.0/websockets/custom.md | 58 +++ 1.0/websockets/droplet.md | 59 +++ 62 files changed, 6456 insertions(+) create mode 100755 1.0/.gitignore create mode 100755 1.0/CONTRIBUTING.md create mode 100755 1.0/README.es.md create mode 100755 1.0/README.md create mode 100755 1.0/README.zh-hant.md create mode 100755 1.0/auth/middleware.md create mode 100755 1.0/auth/protect.md create mode 100755 1.0/auth/request.md create mode 100755 1.0/auth/user.md create mode 100755 1.0/couscous.yml create mode 100755 1.0/deploy/nginx.md create mode 100755 1.0/deploy/supervisor.md create mode 100755 1.0/fluent/driver.md rename {fluent => 1.0/fluent}/fixtures.md (100%) mode change 100644 => 100755 create mode 100755 1.0/fluent/model.md create mode 100755 1.0/fluent/query.md create mode 100755 1.0/fluent/relation.md create mode 100755 1.0/getting-started/hello-world.md create mode 100755 1.0/getting-started/install-swift-3-macos.md create mode 100755 1.0/getting-started/install-swift-3-ubuntu.md create mode 100755 1.0/getting-started/install-toolbox.md create mode 100755 1.0/getting-started/manual.md create mode 100755 1.0/getting-started/xcode.md create mode 100755 1.0/guide/commands.md create mode 100755 1.0/guide/config.md create mode 100755 1.0/guide/controllers.md create mode 100755 1.0/guide/droplet.md create mode 100755 1.0/guide/folder-structure.md create mode 100755 1.0/guide/hash.md create mode 100755 1.0/guide/json.md create mode 100755 1.0/guide/leaf.md create mode 100755 1.0/guide/middleware.md create mode 100755 1.0/guide/provider.md create mode 100755 1.0/guide/sessions.md create mode 100755 1.0/guide/validation.md create mode 100755 1.0/guide/views.md create mode 100755 1.0/http/body.md create mode 100755 1.0/http/client.md create mode 100755 1.0/http/cors.md create mode 100755 1.0/http/request.md create mode 100755 1.0/http/responder.md create mode 100755 1.0/http/response-representable.md create mode 100755 1.0/http/response.md create mode 100755 1.0/http/server.md create mode 100755 1.0/routing/basic.md create mode 100755 1.0/routing/collection.md create mode 100755 1.0/routing/controller create mode 100755 1.0/routing/group.md create mode 100755 1.0/routing/parameters.md create mode 100755 1.0/routing/query-parameters.md create mode 100755 1.0/template/default.twig create mode 100755 1.0/template/images/droplet.svg create mode 100755 1.0/template/screenshot.png create mode 100755 1.0/template/scripts/highlight.pack.js create mode 100755 1.0/template/styles/main.css create mode 100755 1.0/template/styles/main.css.map create mode 100755 1.0/template/styles/main.sass create mode 100755 1.0/template/styles/vapor-code.css create mode 100755 1.0/testing/basic.md create mode 100755 1.0/testing/modules.md create mode 100755 1.0/websockets/custom.md create mode 100755 1.0/websockets/droplet.md diff --git a/1.0/.gitignore b/1.0/.gitignore new file mode 100755 index 00000000..e7aad410 --- /dev/null +++ b/1.0/.gitignore @@ -0,0 +1,3 @@ +/.couscous +.sass-cache +.DS_Store diff --git a/1.0/CONTRIBUTING.md b/1.0/CONTRIBUTING.md new file mode 100755 index 00000000..20663c07 --- /dev/null +++ b/1.0/CONTRIBUTING.md @@ -0,0 +1,7 @@ +# Contributing to Vapor Docs + +Found a mistake or want to add something? Fork the documentation, fix it, and submit a pull request. + +We'll merge it as soon as we can. + +Thanks! \ No newline at end of file diff --git a/1.0/README.es.md b/1.0/README.es.md new file mode 100755 index 00000000..531ee182 --- /dev/null +++ b/1.0/README.es.md @@ -0,0 +1,86 @@ +# Documentación de Vapor + +[![Stack Overflow](https://img.shields.io/stackexchange/stackoverflow/t/vapor.svg)](http://stackoverflow.com/questions/tagged/vapor) + +Esta es la documentación de Vapor, el _framework web_ para Swift que funciona sobre iOS, macOS y ubuntu; y sobre todos los _paquetes_ que Vapor ofrece. + +Vapor es el _framework web_ más utilizado para Swift. Proporciona una base maravillosamente expresiva y fácil de usar para tu próximo sitio web o API. + +Para ver el código fuente y la documentación del código visita [Vapor's GitHub](https://github.com/vapor/vapor). + +Para leer esto en [正體中文](https://github.com/vapor/documentation/blob/master/README.zh-hant.md) + +Para leer esto en [english](https://github.com/vapor/documentation/blob/master/README.md) + +## Cómo leer esta documentación. + +Puedes leer esta guía haciendo clic en las carpetas y los archivos de [GitHub](https://github.com/vapor/documentation) o a través de las páginas generadas [GitHub Pages](https://vapor.github.io/documentation/). + +## API + +La documentación de la API generada automáticamente se encuentra en [api.vapor.codes](http://api.vapor.codes). + +## Paquetes + +Aquí hay una lista de todos los paquetes y módulos incluidos con Vapor (también _utilizables_ individualmente). + +- [Vapor](https://github.com/vapor/vapor): Swift el _framework web_ más utilizado. + - Auth: Autenticación y persistencia de usuarios. + - Sessions: Almacenamiento de datos seguro y _efímero_ basado en cookies. + - Cookies: Cookies HTTP. + - Routing: Enrutador avanzado con parametrización segura. +- [Fluent](https://github.com/vapor/fluent): Modelos, relaciones y consulta de bases de datos NoSQL y SQL. +- [Engine](https://github.com/vapor/engine): Capas de transporte principales. + - HTTP: Cliente y servidor HTTP completamente en Swift. + - URI: Parseo y _serialización_ completamente en Swift. + - WebSockets: Canales de comunicación full-duplex a través de una sola conexión TCP. + - SMTP: Envío de correo electrónico con SendGrill y Gmail. +- [Leaf](https://github.com/vapor/leaf): Un lenguaje de plantillas extensible. +- [JSON](https://github.com/vapor/json): Mapas Jay JSON a tipos de Vapor. +- [Console](https://github.com/vapor/console): Wrapper en Swift para E/S de consola y comandos. +- [TLS](https://github.com/vapor/tls): Wrapper en Swift para el nuevo TLS de CLibreSSL. +- [Crypto](https://github.com/vapor/crypto): Criptografía de LibreSSL y Swift. + - Digests: _Hashing_ con y sin autenticación. + - Ciphers: Encriptación y descifrado. + - Random: Pseudo aleatoriedad criptográficamente segura. + - BCrypt: Implementación completamente en Swift. +- [Node](https://github.com/vapor/node): Estructura de datos para fáciles conversiones de tipo. + - [Polymorphic](https://github.com/vapor/polymorphic): Sintaxis para acceder fácilmente a valores de tipos comunes como JSON. + - [Path Indexable](https://github.com/vapor/path-indexable): Un protocolo para un acceso poderoso via _subscript_ a tipos comunes como JSON. +- [Core](https://github.com/vapor/core): Extensiones básicas, _alias_ de tipos, y funciones que facilitan tareas comunes. +- [Socks](https://github.com/vapor/socks): _API Wrapper_ para acceder a sockets en C. + +## Proveedores y otros. + +Aquí hay una lista de proveedores y paquetes de terceros que funcionan muy bien con Vapor. + +- [MySQL](https://github.com/vapor/mysql): Interface robusta MySQL para Swift. + - [MySQL Driver](https://github.com/vapor/mysql-driver): _Driver_ MySQL para Fluent. + - [MySQL Provider](https://github.com/vapor/mysql-provider): Proveedor MySQL para Vapor. +- [SQLite](https://github.com/vapor/sqlite): _Wrapper_ SQLite 3 para Swift + - [SQLite Driver](https://github.com/vapor/sqlite-driver): _Driver_ SQLite para Fluent. + - [SQLite Provider](https://github.com/vapor/sqlite-provider): Proveedor SQLite provider para Vapor. +- [PostgreSQL](https://github.com/vapor/postgresql): Interface PostgreSQL robusta para Swift. + - [PostgreSQL Driver](https://github.com/vapor/postgresql-driver): _Driver_ PostgreSQL para Fluent. + - [PostgreSQL Provider](https://github.com/vapor/postgresql-provider): Proveedor PostgreSQL para Vapor. +- [MongoKitten*](https://github.com/OpenKitten/MongoKitten): _Driver_ nativo MongoDB, escrito en Swift + - [Mongo Driver](https://github.com/vapor/mongo-driver): _Driver_ MongoKitten para Fluent. + - [Mongo Provider](https://github.com/vapor/mongo-provider): Proveedor MongoKitten para Vapor. + - [MainecoonVapor](https://github.com/OpenKitten/MainecoonVapor): MongoKitten ORM para Vapor. +- [Redbird](https://github.com/vapor/redbird): Un cliente Redis completamente en Swift implementado directamente desde la especificación del protocolo. + - [Redis Provider](https://github.com/vapor/redis-provider): Proveedor del _cache_ de Redis para Vapor. +- [Kitura Provider](https://github.com/vapor/kitura-provider): Permite usar el servidor HTTP de IBM (Kitura) en Vapor. +- [SwiftyBeaver](https://github.com/SwiftyBeaver/SwiftyBeaver-Vapor): Agrega el potente _logging_ de SwiftyBeaver a Vapor. +- [APNS](https://github.com/matthijs2704/vapor-apns): Sencilla biblioteca APNS para Vapor (Swift). +- [JWT](https://github.com/siemensikkema/vapor-jwt): Implementación JWT para Vapor. +- [VaporS3Signer](https://github.com/JustinM1/VaporS3Signer): Gerera _V4 Auth Header/Pre-Signed URL_ para _AWS S3 REST API_. +- [Flock](https://github.com/jakeheis/Flock): _Despliegue_ automatizado de proyectos Swift en servidores. + - [VaporFlock](https://github.com/jakeheis/VaporFlock): Utiliza Flock para _desplegar_ aplicaciones de vapor +- [VaporForms](https://github.com/bygri/vapor-forms): Brinda a Vapor un manejo de formularios web simple, dinámico y _reutilizable_. +- [Jobs](https://github.com/BrettRToomey/Jobs): Un sistema minimalista para ejecutar _jobs_/tareas en _2o plano_ para Swift. +- [Heimdall](https://github.com/himani93/heimdall): Un _logger_ de _requet's_ HTTP fácil de usar. + + +## Autores + +[Tanner Nelson](mailto:tanner@qutheory.io), [Logan Wright](mailto:logan@qutheory.io), y los cientos de miembros de Vapor. diff --git a/1.0/README.md b/1.0/README.md new file mode 100755 index 00000000..04303d78 --- /dev/null +++ b/1.0/README.md @@ -0,0 +1,87 @@ +# Vapor Documentation + +[![Stack Overflow](https://img.shields.io/stackexchange/stackoverflow/t/vapor.svg)](http://stackoverflow.com/questions/tagged/vapor) + +This is the documentation for Vapor, a Web Framework for Swift that works on iOS, macOS, and Ubuntu; and all of the packages that Vapor offers. + +Vapor is the most used web framework for Swift. It provides a beautifully expressive and easy to use foundation for your next website or API. + +To view the framework's source code and code documentation, visit [Vapor's GitHub](https://github.com/vapor/vapor). + +Read this in [正體中文](https://github.com/vapor/documentation/blob/master/README.zh-hant.md) + +## How To Read + +You can read this guide by clicking through the folders and markdown files on [GitHub](https://github.com/vapor/documentation) or through the rendered [GitHub Pages](https://vapor.github.io/documentation/). + +## API + +Auto-generated API documentation is located at [api.vapor.codes](http://api.vapor.codes). + +## Packages + +Here are a list of all the packages and modules included with Vapor (also useable individually). + +- [Vapor](https://github.com/vapor/vapor): Swift's most used web framework. + - Auth: User authentication and persistance. + - Sessions: Secure, ephemeral cookie based data storage. + - Cookies: HTTP cookies. + - Routing: Advanced router with type-safe parameterization. +- [Fluent](https://github.com/vapor/fluent): Models, relationships, and querying for NoSQL and SQL databases. +- [Engine](https://github.com/vapor/engine): Core transport layers. + - HTTP: Pure Swift HTTP client and server. + - URI: Pure Swift URI parsing and serializing. + - WebSockets: Full-duplex communication channels over a single TCP connection. + - SMTP: Send email using Sendgrid and Gmail. +- [Multipart](https://github.com/vapor/multipart): Fast, streaming, non-blocking multipart parser and serializer. + - Multipart: Parses and serializes `multipart/mixed`. + - FormData: Parses and serializes `multipart/form-data`. +- [Leaf](https://github.com/vapor/leaf): An extensible templating language. +- [JSON](https://github.com/vapor/json): Maps Jay JSON to Vapor types. +- [Console](https://github.com/vapor/console): Swift wrapper for console IO and commands. +- [TLS](https://github.com/vapor/tls): Swift wrapper for CLibreSSL's new TLS. +- [Crypto](https://github.com/vapor/crypto): Cryptography from LibreSSL and Swift. + - Digests: Hashing with and without authentication. + - Ciphers: Encryption and decryption + - Random: Pseudo and cryptographically secure randomness. + - BCrypt: Pure Swift implementation. +- [Node](https://github.com/vapor/node): Data structure for easy type conversions. + - [Polymorphic](https://github.com/vapor/polymorphic): Syntax for easily accessing values from common types like JSON. + - [Path Indexable](https://github.com/vapor/path-indexable): A protocol for powerful subscript access of common types like JSON. +- [Core](https://github.com/vapor/core): Core extensions, type-aliases, and functions that facilitate common tasks. +- [Socks](https://github.com/vapor/socks): Swift C Socket API wrapper. + +## Providers & Other + +Here are a list of providers and third party packages that work great with Vapor. + +- [MySQL](https://github.com/vapor/mysql): Robust MySQL interface for Swift. + - [MySQL Driver](https://github.com/vapor/mysql-driver): MySQL driver for Fluent. + - [MySQL Provider](https://github.com/vapor/mysql-provider): MySQL provider for Vapor. +- [SQLite](https://github.com/vapor/sqlite): SQLite 3 wrapper for Swift + - [SQLite Driver](https://github.com/vapor/sqlite-driver): SQLite driver for Fluent. + - [SQLite Provider](https://github.com/vapor/sqlite-provider): SQLite provider for Vapor. +- [PostgreSQL](https://github.com/vapor/postgresql): Robust PostgreSQL interface for Swift. + - [PostgreSQL Driver](https://github.com/vapor/postgresql-driver): PostgreSQL driver for Fluent. + - [PostgreSQL Provider](https://github.com/vapor/postgresql-provider): PostgreSQL provider for Vapor. +- [MongoKitten*](https://github.com/OpenKitten/MongoKitten): Native MongoDB driver for Swift, written in Swift + - [Mongo Driver](https://github.com/vapor/mongo-driver): MongoKitten driver for Fluent. + - [Mongo Provider](https://github.com/vapor/mongo-provider): MongoKitten provider for Vapor. + - [MainecoonVapor](https://github.com/OpenKitten/MainecoonVapor): MongoKitten ORM for Vapor. +- [Redbird](https://github.com/vapor/redbird): Pure-Swift Redis client implemented from the original protocol spec.. + - [Redis Provider](https://github.com/vapor/redis-provider): Redis cache provider for Vapor. +- [Kitura Provider](https://github.com/vapor/kitura-provider): Use IBM's Kitura HTTP server in Vapor. +- [SwiftyBeaver](https://github.com/SwiftyBeaver/SwiftyBeaver-Vapor): Adds the powerful logging of SwiftyBeaver to Vapor. +- [APNS](https://github.com/matthijs2704/vapor-apns): Simple APNS Library for Vapor (Swift). +- [JWT](https://github.com/siemensikkema/vapor-jwt): JWT implementation for Vapor. +- [VaporS3Signer](https://github.com/JustinM1/VaporS3Signer): Generate V4 Auth Header/Pre-Signed URL for AWS S3 REST API +- [Flock](https://github.com/jakeheis/Flock): Automated deployment of Swift projects to servers + - [VaporFlock](https://github.com/jakeheis/VaporFlock): Use Flock to deploy Vapor applications +- [VaporForms](https://github.com/bygri/vapor-forms): Brings simple, dynamic and re-usable web form handling to Vapor. +- [Jobs](https://github.com/BrettRToomey/Jobs): A minimalistic job/background-task system for Swift. +- [Heimdall](https://github.com/himani93/heimdall): An easy to use HTTP request logger. + + +## Authors + +[Tanner Nelson](mailto:tanner@qutheory.io), [Logan Wright](mailto:logan@qutheory.io), and the hundreds of members of Vapor. diff --git a/1.0/README.zh-hant.md b/1.0/README.zh-hant.md new file mode 100755 index 00000000..e794031e --- /dev/null +++ b/1.0/README.zh-hant.md @@ -0,0 +1,77 @@ +# Vapor Documentation + +[![Stack Overflow](https://img.shields.io/stackexchange/stackoverflow/t/vapor.svg)](http://stackoverflow.com/questions/tagged/vapor) + +這是 Vapor 的說明文件, Vapor 是一個可以在 iOS, macOS 及 Ubuntu 上執行的 Web framework,以及其他相關的套件。 + +Vapor 是一個在 Swift 上很受歡迎的 Web framework。它提供了清楚易用的 API 及許多方便的基礎功能,方便我們用它建立網站或是後台。 + +我們可以在 [Vapor's GitHub](https://github.com/vapor/vapor) 查看原始碼及說明文件。 + +## 如何閱讀說明文件 + +在 [GitHub](https://github.com/vapor/documentation) 上瀏覽每個資料夾,特別是 markdown 檔(副檔名為 .md 的檔案)。或是看 [GitHub Pages](https://vapor.github.io/documentation/) 上的文件。 + +## 套件 +以下是 Vapor 提供的套件及模組(我們也可以直接使用它們,不透過 Vapor。) + +- [Vapor](https://github.com/vapor/vapor): Swift 上最常被使用到的 web framework。 + - Auth: 使用者的認證及存續控制(persistance)。 + - Sessions: 建立在 cookie 機制上安全、短暫的資料儲存。 + - Cookies: HTTP cookies. + - Routing: 可透過變數類型確定(type-safe)的參數設定來設定路徑。 +- [Fluent](https://github.com/vapor/fluent): 用來操作 SQL 或 NoSQL 資料庫。 +- [Engine](https://github.com/vapor/engine): 傳輸的核心層。 + - HTTP: HTTP 用戶端及主機端。 + - URI: URI 的分解及組成。 + - WebSockets: 在一個 TCB 連線中進行雙向的溝通管道。 + - SMTP: 透過 Sendgrid 及 Gmail 發送郵件。 +- [Leaf](https://github.com/vapor/leaf): 一種可擴張的樣本語言(extensible templating language)。(譯註: 這可以用來建立使用者介面。) +- [JSON](https://github.com/vapor/json): 用 [Jay JSON]((https://github.com/dantoml/jay)) 解析工具產生Vapor物件。 +- [Console](https://github.com/vapor/console): 用來處理 console 的輸入、輸出及指令的 Swift 工具。 +- [TLS](https://github.com/vapor/tls): 用來處理 CLibreSSL 的新型 TLS 的 Swift 工具。 +- [Crypto](https://github.com/vapor/crypto): 在 LibreSSL 及 Swift 上進行加密的工具。 + - Digests: 無論有沒有認證(authentication)都可以進行雜湊(hash)。 + - Ciphers: 編碼及解碼。 + - Random: 安全的隨機性。 + - BCrypt: 完全用 Swift 實作。 +- [Node](https://github.com/vapor/node): 可以輕易地進行類型轉換的資料結構。 + - [Polymorphic](https://github.com/vapor/polymorphic): 如同 JSON 一般可以輕易取用資料的語法。 + - [Path Indexable](https://github.com/vapor/path-indexable): 如同 JSON 一樣可以用來處理複雜的資料結構。 +- [Core](https://github.com/vapor/core): 主要的 extension 群,例如: 變數類型的重新命名、在許多地方都會被使用的 function 等。 +- [Socks](https://github.com/vapor/socks): 將 C 語言的 Socket API 包裝成 Swift 語言。 + +## 可合併使用的套件 + +以下是可以和 Vapor 合併運用的套件列表。(譯註:原文裡這裡還有個東西叫 Provider,那是一種 protocol,讓我們可以掛到 Vapor 中如同第三方元件一樣使用。) + +- [MySQL](https://github.com/vapor/mysql): 可透過 Swift 操作 MySQL 的套件。 + - [MySQL Driver](https://github.com/vapor/mysql-driver): 透過 Fluent 操作 MySQL 的套件。 + - [MySQL Provider](https://github.com/vapor/mysql-provider): 讓 MySQL 可以在 Vapor 上運作的 provider。 +- [SQLite](https://github.com/vapor/sqlite): 可透過 Swift 操作 SQLite 3 的套件。 + - [SQLite Driver](https://github.com/vapor/sqlite-driver): 透迥 Fluent 操作 SQLite 的工具。 + - [SQLite Provider](https://github.com/vapor/sqlite-provider): 讓 SQLite 可以在 Vapor 上運作的 provider。 +- [PostgreSQL](https://github.com/vapor/postgresql): 用 Swift 操作 PostgreSQL 的工具。 + - [PostgreSQL Driver](https://github.com/vapor/postgresql-driver): 用 Fluent 操作 PostgreSQL 的套件。 + - [PostgreSQL Provider](https://github.com/vapor/postgresql-provider): 讓 PostgreSQL 可以運作在 Vapor 上的 provider。 +- [MongoKitten*](https://github.com/OpenKitten/MongoKitten): 用 Swift 寫的 MongoDB driver。 + - [Mongo Driver](https://github.com/vapor/mongo-driver): Fluent 用的 MongoKitten driver。 + - [Mongo Provider](https://github.com/vapor/mongo-provider): Vapor 用的 MongoKitten provider. + - [MainecoonVapor](https://github.com/OpenKitten/MainecoonVapor): Vapor 的 MongoKitten 物件關聯管理。 +- [Redbird](https://github.com/vapor/redbird): 遵循原始協定的規格實作出來的 Swift Redis client 端。 + - [Redis Provider](https://github.com/vapor/redis-provider): Vapor 的 Redis cache provider。 +- [Kitura Provider](https://github.com/vapor/kitura-provider): 在 Vapor 中使用 IBM 的 Kitura HTTP Server。 +- [SwiftyBeaver](https://github.com/SwiftyBeaver/SwiftyBeaver-Vapor): 在 Vapor 中使用 SwiftBeaver 的套件。(譯註: 就像強化版的 NSLog() 或 print()) +- [APNS](https://github.com/matthijs2704/vapor-apns): 用來操作 Apple 推播的工具。 +- [JWT](https://github.com/siemensikkema/vapor-jwt): 讓我們可以設定一些規則以取得特定資源的工具。 +- [VaporS3Signer](https://github.com/JustinM1/VaporS3Signer): 用來產生 HTTP request 的 headers 及已經簽證過的 URL,用來 request AWS S3 的 REST API。 +- [Flock](https://github.com/jakeheis/Flock): 自動將 Swift 專案發佈上主機。 + - [VaporFlock](https://github.com/jakeheis/VaporFlock): 利用 Flock 發佈 Vapor applications。 +- [VaporForms](https://github.com/bygri/vapor-forms): 讓我們在處理前端送來的 form request 時可以輕鬆一點的套件。 +- [Jobs](https://github.com/BrettRToomey/Jobs): 在某個特定的時間點執行某些程式碼的套件。 +- [Heimdall](https://github.com/himani93/heimdall): 用來將收到的 http request 記錄到某個檔案的套件,且這個寫好的檔可以用試算表類型(ex: excel, google sheets)的軟體開啟。 + + +## 作者們 + +[Tanner Nelson](mailto:tanner@qutheory.io), [Logan Wright](mailto:logan@qutheory.io),以及其他上百位 Vapor 的貢獻者們。 diff --git a/1.0/auth/middleware.md b/1.0/auth/middleware.md new file mode 100755 index 00000000..389bf35b --- /dev/null +++ b/1.0/auth/middleware.md @@ -0,0 +1,89 @@ +--- +currentMenu: auth-middleware +--- + +# Middleware + +`AuthMiddleware` is at the core of adding authorization to your project. It is responsible for initializing dependencies, checking credentials, and handling sessions. + +## Create + +Once you have something that conforms to `Auth.User`, you can create an `AuthMiddleware`. Let's assume we have a class `User` that conforms to `Auth.User`. + +> Note: You may need to include a module name before `User` to disambiguate. + +```swift +import Auth + +let auth = AuthMiddleware(user: User.self) +``` + +Creating the `AuthMiddleware` can be that simple, or you can customize it with additional initialization arguments. + +### Cookie + +Customize the type of cookie the `AuthMiddleware` creates by passing a `CookieFactory`. + +```swift +let auth = AuthMiddleware(user: User.self) { value in + return Cookie( + name: "vapor-auth", + value: value, + expires: Date().addingTimeInterval(60 * 60 * 5), // 5 hours + secure: true, + httpOnly: true + ) +} +``` + +### Cache + +A custom `CacheProtocol` can be passed as well. The `MemoryCache` used by default is not persisted between server restarts and does not allow for sharing between multiple running instances. + +```swift +import VaporRedis + +let redis = RedisCache() +let auth = AuthMiddleware(user: User.self, cache: redis) +``` + +> Note: This example uses the [redis-provider](https://github.com/vapor/redis-provider) package. + +### Realm + +To customize the `AuthMiddleware` even further, you can use a custom `Realm`. The `Realm` takes the responsibility of registering and authenticating the user away from the `Auth.User` protocol. + +```swift +let facebook = FacebookRealm() +let auth = AuthMiddleware(user: User.self, realm: facebook) +``` + +> Note: `FacebookRealm` is hypothetical. + +## Add + +Once you've created the `AuthMiddleware`, you can add it to the `Droplet`. + +```swift +let drop = Droplet() +drop.middleware.append(auth) +``` + +> Note: If you'd like to enable or disable the middleware based on config files, check out [middleware](../guide/middleware.md). + +### Sharing Cache + +If you'd like the `Droplet` and the `AuthMiddleware` to share the same `CacheProtocol`, pass the same instance to both. + +``` +import Vapor +import VaporRedis + +let redis = RedisCache() +let auth = AuthMiddleware(user: User.self, cache: redis) + +let drop = Droplet() + +drop.cache = redis +drop.middleware.append(auth) +``` diff --git a/1.0/auth/protect.md b/1.0/auth/protect.md new file mode 100755 index 00000000..d606fe3c --- /dev/null +++ b/1.0/auth/protect.md @@ -0,0 +1,33 @@ +--- +currentMenu: auth-protect +--- + +# Protect + +Once the `AuthMiddleware` has been enabled, you can use `ProtectMiddleware` to prevent certain routes from being accessed without authorization. + +## Create + +To create a `ProtectMiddleware`, you must give it the error to throw in case authorization fails. + +```swift +let error = Abort.custom(status: .forbidden, message: "Invalid credentials.") +let protect = ProtectMiddleware(error: error) +``` + +Here we pass it a simple 403 response. + +## Route Group + +Once the middleware has been created, you can add it to route groups. Learn more about middleware and routing in [route groups](../routing/group.md). + +``` +drop.grouped(protect).group("secure") { secure in + secure.get("about") { req in + let user = try req.user() + return user + } +} +``` + +Visiting `GET /secure/about` will return the authorized user, or an error if no user is authorized. diff --git a/1.0/auth/request.md b/1.0/auth/request.md new file mode 100755 index 00000000..50285926 --- /dev/null +++ b/1.0/auth/request.md @@ -0,0 +1,161 @@ +--- +currentMenu: auth-request +--- + +# Request + +The `auth` property on `Request` lets you authenticate users and also provides some convenience methods for accessing common authorization headers. + +## Authorization + +The authorization header is a great place to send credentials from a client. + +``` +Authorization: xxxxxxxxxx +``` + +You can access the authorization header through `req.auth.header`. Two common patterns are basic and bearer. + +### Basic + +Basic authorization consists of a username and password concatenated into a string and base64 encoded. + +``` +Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l +``` + +This is what an example header looks like. You can read more about basic auth on [wikipedia](https://en.wikipedia.org/wiki/Basic_access_authentication). + +Below is how you access this header using `req.auth`. + +```swift +guard let credentials = req.auth.header?.basic else { + throw Abort.badRequest +} +``` + +The basic header returns an `APIKey` credential. + +``` +class APIKey: Credentials { + let id: String + let secret: String +} +``` + +### Bearer + +Another common method is bearer which consists of a single API key. + +``` +Authorization: Bearer apikey123 +``` + +It is accessed similarly to the basic header and returns an `AccessToken` credential. + +``` +class AccessToken: Credentials { + let string: String +} +``` + +### Raw + +To access the raw authorization header, use `req.auth.header?.header`. + +## Credentials + +Both Basic and Bearer return something that conforms to `Credentials`. You can always create a custom `Credentials` object for authentication by conforming your own class to `Credentials` or by manually creating an `APIKey`, `AccessToken`, or `Identifier`. + +```swift +let key = AccessToken(string: "apikey123") +``` + +### Input + +You can also create credentials from form or JSON data. + +```swift +guard + let username = req.data["username"]?.string, + let password = req.data["password"]?.string +else { + throw Abort.badRequest +} + +let key = APIKey(id: username, secret: password) +``` + +## Login + +Once you have some object that conforms to `Credentials`, you can try to login the user. + +```swift +try req.auth.login(credentials) +``` + +If this call succeeds, the user is logged in and a session has been started. They will stay logged in as long as their cookie is valid. + +### Authenticate + +Logging in calls the `authenticate` method on `Auth.User` model you supplied to the `AuthMiddleware`. Make sure you add support for all the credential types you may want to use. + +> Note: If you used a custom Realm, it will be called instead. + +### Identifier + +Another important credential type is the `Identifier` type. This is used by Vapor when fetching the `User` object from the `vapor-auth` cookie. It is also a convenient way to log a user in manually. + +```swift +static func authenticate(credentials: Credentials) throws -> Auth.User { + switch credentials { + ... + case let id as Identifier: + guard let user = try User.find(id.id) else { + throw Abort.custom(status: .badRequest, message: "Invalid identifier.") + } + + return user + ... + } +} +``` + +Adding the `Identifier` case for `Credentials` is easy, just look up the user by the identifier. + +```swift +let id = Identifier(id: 42) +try req.auth.login(id) +``` + +Now you can manually log users in with just their identifiers. + +### Ephemeral + +If you just want to log the user in for a single request, disable persistance. + +```swift +req.auth.login(credentials, persist: false) +``` + +> Note: Supporting `Identifier` credentials is required for persisted authentication to work properly. + +## User + +By default, `request.auth.user()` returns the authorized `Auth.User`. This will need to be casted to your internal `User` type for use. + +Adding a convenience method on `Request` is a great way to simplify this. + +```swift +extension Request { + func user() throws -> User { + guard let user = try auth.user() as? User else { + throw Abort.custom(status: .badRequest, message: "Invalid user type.") + } + + return user + } +} +``` + +Now you can access your `User` type with `try req.user()`. diff --git a/1.0/auth/user.md b/1.0/auth/user.md new file mode 100755 index 00000000..e881d833 --- /dev/null +++ b/1.0/auth/user.md @@ -0,0 +1,120 @@ +--- +currentMenu: auth-user +--- + +# Auth + +Authentication and authorization is focused around the `Auth.User` protocol. Authentication is analagous to asking: "Who is this?", while authorization is analagous to asking: "What can they do?". Vapor includes an extensible authentication system that you can use as a base for more sophisticated authorization. + +> Note: An [auth-example](https://github.com/vapor/auth-example) project is available on GitHub. + +## User Protocol + +Any type can conform to the `Auth.User` protocol, but they are commonly added onto Fluent `Model`s. + +```swift +import Vapor +import Auth + +final class User: Model { + var id: Node? + var name: String + + ... +} + +extension User: Auth.User { + static func authenticate(credentials: Credentials) throws -> Auth.User { + + } + + static func register(credentials: Credentials) throws -> Auth.User { + + } +} +``` + +Here is an example `User` class with the `Auth.User` protocol requirements stubbed. Note that the name of our class and the protocol are the same. This is why we use the `Auth.` prefix to differentiate the protocol from the `Auth` module from our `User` class. + +### Authenticate + +A user is authenticated when a set of credentials is passed to the static `authenticate` method and the matching user is returned. + +#### Credentials + +```swift +protocol Credentials { } +``` + +The credentials protocol is an empty protocol that any type can conform to. This gives great flexibility to your authentication model, but also requires that you properly handle the case of unsupported credential types. + +#### Access Token + +One of the simplest credential types included is `AccessToken`. It carries a `String` based token that will be used to authenticate the user. + +Let's look at how we might support the access token type. + +```swift +static func authenticate(credentials: Credentials) throws -> Auth.User { + switch credentials { + case let accessToken as AccessToken: + guard let user = try User.query().filter("access_token", accessToken.string).first() else { + throw Abort.custom(status: .forbidden, message: "Invalid access token.") + } + + return user + default: + let type = type(of: credentials) + throw Abort.custom(status: .forbidden, message: "Unsupported credential type: \(type).") + } +} +``` + +The first step is to cast the credentials to the type we want to support--in this case, `AccessToken`. If we do not have an access token, we will inform the client that the credentials are invalid. + +Once we have the access token, we will use it to query the `User` model for an entry with a matching access token. This is assuming the `users` table or collection has the access tokens stored on it. You may opt to store them somewhere else. + +Once we have found the user associated with the supplied access token, we simply return it. + +#### Identifier + +Vapor uses the `Identifier` credential type internally to lookup users from sessions. You can read more in the [Request](request.md) section. + +### Register + +Similar to the authenticate method, the register method takes credentials. But instead of fetching the user from the data store, it provides a convenient way to create the user. You are not required to register your users through this method. + +## Example + +Here is an example of a User that supports multiple credentials. + +```swift +extension User: Auth.User { + static func authenticate(credentials: Credentials) throws -> Auth.User { + let user: User? + + switch credentials { + case let id as Identifier: + user = try User.find(id.id) + case let accessToken as AccessToken: + user = try User.query().filter("access_token", accessToken.string).first() + case let apiKey as APIKey: + user = try User.query().filter("email", apiKey.id).filter("password", apiKey.secret).first() + default: + throw Abort.custom(status: .badRequest, message: "Invalid credentials.") + } + + guard let u = user else { + throw Abort.custom(status: .badRequest, message: "User not found.") + } + + return u + } + + static func register(credentials: Credentials) throws -> Auth.User { + ... + } +} +``` + +> Note: Try not to store passwords. If you must, hash and salt them. diff --git a/1.0/couscous.yml b/1.0/couscous.yml new file mode 100755 index 00000000..9af496f2 --- /dev/null +++ b/1.0/couscous.yml @@ -0,0 +1,179 @@ +template: + directory: template + +title: Vapor Documentation +subTitle: A web framework and server for Swift that works on macOS and Ubuntu. + +baseUrl: https://vapor.github.io/documentation + +menu: + sections: + getting-started: + name: Getting Started + items: + getting-started-install-swift-3-macos: + text: "Install Swift 3: macOS" + relativeUrl: getting-started/install-swift-3-macos.html + getting-started-install-swift-3-ubuntu: + text: "Install Swift 3: Ubuntu" + relativeUrl: getting-started/install-swift-3-ubuntu.html + getting-started-install-toolbox: + text: Install Toolbox + relativeUrl: getting-started/install-toolbox.html + getting-started-hello-world: + text: Hello, World + relativeUrl: getting-started/hello-world.html + getting-started-manual: + text: Manual + relativeUrl: getting-started/manual.html + getting-started-xcode: + text: Xcode + relativeUrl: getting-started/xcode.html + guide: + name: Guide + items: + guide-droplet: + text: Droplet + relativeUrl: guide/droplet.html + guide-folder-structure: + text: Folder Structure + relativeUrl: guide/folder-structure.html + guide-json: + text: JSON + relativeUrl: guide/json.html + guide-config: + text: Config + relativeUrl: guide/config.html + guide-views: + text: Views + relativeUrl: guide/views.html + guide-leaf: + text: Leaf + relativeUrl: guide/leaf.html + guide-controllers: + text: Controllers + relativeUrl: guide/controllers.html + guide-middleware: + text: Middleware + relativeUrl: guide/middleware.html + guide-validation: + text: Validation + relativeUrl: guide/validation.html + guide-provider: + text: Provider + relativeUrl: guide/provider.html + guide-sessions: + text: Sessions + relativeUrl: guide/sessions.html + guide-hash: + text: Hash + relativeUrl: guide/hash.html + guide-commands: + text: Commands + relativeUrl: guide/commands.html + routing: + name: Routing + items: + routing-basic: + text: Basic + relativeUrl: routing/basic.html + routing-parameters: + text: Route Parameters + relativeUrl: routing/parameters.html + routing-query-parameters: + text: Query Parameters + relativeUrl: routing/query-parameters.html + routing-group: + text: Group + relativeUrl: routing/group.html + routing-collection: + text: Collection + relativeUrl: routing/collection.html + fluent: + name: Fluent + items: + fluent-driver: + text: Driver + relativeUrl: fluent/driver.html + fluent-model: + text: Model + relativeUrl: fluent/model.html + fluent-query: + text: Query + relativeUrl: fluent/query.html + fluent-relation: + text: Relation + relativeUrl: fluent/relation.html + auth: + name: Auth + items: + auth-user: + text: User + relativeUrl: auth/user.html + auth-middleware: + text: Middleware + relativeUrl: auth/middleware.html + auth-request: + text: Request + relativeUrl: auth/request.html + auth-protect: + text: Protect + relativeUrl: auth/protect.html + http: + name: HTTP + items: + http-request: + text: Request + relativeUrl: http/request.html + http-response: + text: Response + relativeUrl: http/response.html + http-body: + text: Body + relativeUrl: http/body.html + http-response-representable: + text: ResponseRepresentable + relativeUrl: http/response-representable.html + http-responder: + text: Responder + relativeUrl: http/responder.html + http-client: + text: Client + relativeUrl: http/client.html + http-server: + text: Server + relativeUrl: http/server.html + http-cors: + text: CORS + relativeUrl: http/cors.html + + web-sockets: + name: WebSockets + items: + websockets-droplet: + text: Droplet + relativeUrl: websockets/droplet.html + websockets-custom: + text: Custom + relativeUrl: websockets/custom.html + + testing: + name: Testing + items: + testing-modules: + text: Modules + relativeUrl: testing/modules.html + testing-basic: + text: Basic + relativeUrl: testing/basic.html + + + deploy: + name: Deploy + items: + deploy-nginx: + text: Nginx + relativeUrl: deploy/nginx.html + deploy-supervisor: + text: Supervisor + relativeUrl: deploy/supervisor.html diff --git a/1.0/deploy/nginx.md b/1.0/deploy/nginx.md new file mode 100755 index 00000000..c2398554 --- /dev/null +++ b/1.0/deploy/nginx.md @@ -0,0 +1,149 @@ +--- +currentMenu: deploy-nginx +--- + +# Deploying with Nginx + +Nginx is an extremely fast, battle tested, and easy-to-configure HTTP server and proxy. While Vapor supports directly serving HTTP requests with or without TLS, proxying behind Nginx can provide increased performance, security, and ease-of-use. + +> Note: We recommend proxying Vapor HTTP servers behind Nginx. + +## Overview + +What does it mean to proxy an HTTP server? In short, a proxy acts as a middleman between the public internet and your HTTP server. Requests come to the proxy and then it sends them to Vapor. + +An important feature of this middleman proxy is that it can alter or even redirect the requests. For instance, the proxy can require that the client use TLS (https), rate limit requests, or even serve public files without talking to your Vapor application. + +![nginx-proxy](https://cloud.githubusercontent.com/assets/1342803/20184965/5d9d588a-a738-11e6-91fe-28c3a4f7e46b.png) + +### More Detail + +The default port for receiving HTTP requests is port `80` (and `443` for HTTPS). When you bind a Vapor server to port `80`, it will directly receive and respond to the HTTP requests that come to your server. When adding a proxy like Nginx, you bind Vapor to an internal port, like port `8080`. + +> Note: Ports greater than 1024 do not require `sudo` to bind. + +When Vapor is bound to a port besides `80` or `443`, it will not be accessible to the outside internet. You then bind Nginx to port `80` and configure it to route requests to your Vapor server bound at port `8080` (or whichever port you've chosen). + +And that's it. If Nginx is properly configured, you will see your Vapor app responding to requests on port `80`. Nginx proxies the requests and responses invisibly. + +## Install Nginx + +The first step is installing Nginx. One of the great parts of Nginx is the tremendous amount of community resources and documentation surrounding it. Because of this, we will not go into great detail here about installing Nginx as there is almost definitely a tutorial for your specific platform, OS, and provider. + +Tutorials: +- [How To Install Nginx on Ubuntu 14.04 LTS](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-14-04-lts) +- [How To Install Nginx on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-16-04) +- [How to Deploy Nginx on Heroku](https://blog.codeship.com/how-to-deploy-nginx-on-heroku/) +- [How To Run Nginx in a Docker Container on Ubuntu 14.04](https://www.digitalocean.com/community/tutorials/how-to-run-nginx-in-a-docker-container-on-ubuntu-14-04) + + +### APT + +Nginx can be installed through APT. + +```sh +sudo apt-get update +sudo apt-get install nginx +``` + +Check whether Nginx was installed correctly by visiting your server's IP address in a browser + +```sh +http://server_domain_name_or_IP +``` + +### Service + +Ther service an be started or stopped. + +```sh +sudo service nginx stop +sudo service nginx start +sudo service nginx restart +``` + +## Booting Vapor + +Nginx can be started an stopped with the `sudo service nginx ...` commands. You will need something similar to start and stop your Vapor server. + +There are many ways to do this, and they depend on which platform you are deploying to. Check out the [Supervisor](supervisor.md) instructions to add commands for starting and stopping your Vapor app. + +## Configure Proxy + +The configuration files for enabled sites can be found in `/etc/nginx/sites-enabled/`. + +Create a new file or copy the example template from `/etc/nginx/sites-available/` to get started. + +Here is an example configuration file for a Vapor project called `Hello` in the home directory. + +```sh +server { + server_name hello.com; + listen 80; + + root /home/vapor/Hello/Public/; + + location @proxy { + proxy_pass http://127.0.0.1:8080; + proxy_pass_header Server; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass_header Server; + proxy_connect_timeout 3s; + proxy_read_timeout 10s; + } +} +``` + +This configuration file assumes the `Hello` project binds to port `8080` when started in production mode. + +### Serving Files + +Nginx can also serve public files without asking your Vapor app. This can improve performance by freeing up the Vapor process for other tasks under heavy load. + +```sh +server { + ... + + # Serve all public/static files via nginx and then fallback to Vapor for the rest + try_files $uri @proxy; + + location @proxy { + ... + } +} +``` + +### TLS + +Adding TLS is relatively straightforward as long as the certificates have been properly generated. To generate TLS certificates for free, check out [Let's Encrypt](https://letsencrypt.org/getting-started/). + +```sh +server { + ... + + listen 443 ssl; + + ssl_certificate /etc/letsencrypt/live/hello.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/hello.com/privkey.pem; + + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_dhparam /etc/ssl/certs/dhparam.pem; + ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; + ssl_session_timeout 1d; + ssl_session_cache shared:SSL:50m; + ssl_stapling on; + ssl_stapling_verify on; + add_header Strict-Transport-Security max-age=15768000; + + ... + + location @proxy { + ... + } +} +``` + +The configuration above are the relatively strict settings for TLS with Nginx. Some of the settings here are not required, but enhance security. diff --git a/1.0/deploy/supervisor.md b/1.0/deploy/supervisor.md new file mode 100755 index 00000000..c84b7217 --- /dev/null +++ b/1.0/deploy/supervisor.md @@ -0,0 +1,65 @@ +--- +currentMenu: deploy-supervisor +--- + + +# Supervisor + +[Supervisor](http://supervisord.org) is a process control system that makes it easy to start, stop, and restart your Vapor app. + +## Install + +```sh +sudo apt-get update +sudo apt-get install supervisor +``` + +## Configure + +Each Vapor app on your server should have its own configuration file. For an example `Hello` project, the configuration file would be located at `/etc/supervisor/conf.d/hello.conf` + +```sh +[program:hello] +command=/home/vapor/hello/.build/release/App serve --env=production +directory=/home/vapor/hello/ +user=www-data +stdout_logfile=/var/log/supervisor/%(program_name)-stdout.log +stderr_logfile=/var/log/supervisor/%(program_name)-stderr.log +``` + +As specified in our configuration file the `Hello` project is located in the home folder for the user `vapor`. Make sure `directory` points to the root directory of your project where the `Config/` folder is. + +The `--env=production` flag will disable verbose logging and prioritize the `Config/production` sub folder of your configuration files. + +### Environment + +You can export variables to your Vapor app with supervisor. + +```sh +environment=PORT=8123 +``` + +Exported variables can be used in Vapor's configuration files with the `$` prefix. + +`Config/production/servers.json ` +```json +{ + "my-server": { + "port": "$PORT" + } +} +``` + +The above config file will start a server named `my-server` on the port number exported by supervisor. This is a great way to control how Vapor starts from the supervisor config scripts. Feel free to name the server whatever you like. + +## Start + +You can now load and start your app. + +```sh +supervisorctl reread +supervisorctl add hello +supervisorctl start hello +``` + +> Note: The `add` command may have already started your app. diff --git a/1.0/fluent/driver.md b/1.0/fluent/driver.md new file mode 100755 index 00000000..062899a4 --- /dev/null +++ b/1.0/fluent/driver.md @@ -0,0 +1,52 @@ +--- +currentMenu: fluent-driver +--- + +# Driver + +Drivers are what power Fluent under the hood. Fluent comes with a memory driver by default and there are many providers for databases like MySQL, SQLite, Mongo, PostgreSQL, and more available as providers. + +![Drivers and Providers](https://cloud.githubusercontent.com/assets/1342803/17418823/73f1d1d2-5a68-11e6-9bed-90f42ce7781d.png) + +This graphic shows the relation between Drivers and Providers using MySQL as an example. This distinction allows Fluent to be used independently from Vapor. + +If you want to use Fluent without Vapor, you will import Drivers into your package. If you are using Vapor, you will import Providers. + +Search GitHub for: +- [Fluent Drivers](https://github.com/vapor?utf8=✓&q=-driver) +- [Vapor Providers](https://github.com/vapor?utf8=✓&q=-provider) + +Not all drivers have providers yet, and not all drivers or providers are up to date with the latest Vapor 1.0. This is a great way to contribute! + +## Creating a Driver + +Fluent is a powerful, database agnostic package for persisting your models. It was designed from the beginning to work with both SQL and NoSQL databases alike. + +Any database that conforms to `Fluent.Driver` will be able to power the models in Fluent and Vapor. + +The protocol itself is fairly simple: + +```swift +public protocol Driver { + var idKey: String { get } + func query(_ query: Query) throws -> Node + func schema(_ schema: Schema) throws + func raw(_ raw: String, _ values: [Node]) throws -> Node +} +``` + +### ID Key + +The ID key will be used to power functionality like `User.find()`. In SQL, this is often `id`. In MongoDB, it is `_id`. + +### Query + +This method will be called for every query made by Fluent. It is the drivers job to properly understand all of the properties on `Query` and return the desired rows, document, or other data as represented by `Node`. + +### Schema + +The schema method will be called before the database is expected to accept queries for a schema. For some NoSQL databases like MongoDB, this can be ignored. For SQL, this is where `CREATE` and other such commands should be called according to `Schema`. + +### Raw + +This is an optional method that can be used by any Fluent driver that accepts string queries. If your database does not accept such queries, an error can be thrown. diff --git a/fluent/fixtures.md b/1.0/fluent/fixtures.md old mode 100644 new mode 100755 similarity index 100% rename from fluent/fixtures.md rename to 1.0/fluent/fixtures.md diff --git a/1.0/fluent/model.md b/1.0/fluent/model.md new file mode 100755 index 00000000..cb9028b7 --- /dev/null +++ b/1.0/fluent/model.md @@ -0,0 +1,246 @@ +--- +currentMenu: fluent-model +--- + +# Model + +`Model` is the base protocol for any of your application's models, especially those you want to persist. + +> `Model` is only available in Vapor, the Fluent equivalent is `Entity` + +## Example + +Let's create a simple `User` model. + +```swift +final class User { + var name: String + + init(name: String) { + self.name = name + } +} +``` + +The first step to conforming to `Model` is to import Vapor and Fluent. + +```swift +import Vapor +import Fluent +``` + +Then add the conformance to your class. + +```swift +final class User: Model { + ... +} +``` + +The compiler will inform you that some methods need to be implemented to conform. + +### ID + +The first required property is an identifier. This property will contain the identifier when the model is fetched from the database. If it is `nil`, it will be set when the model is saved. + +```swift +final class User: Model { + var id: Node? + ... +} +``` + +### Node Initializable + +The next requirement is a way to create the model from the persisted data. Model uses `NodeInitializable` to achieve this. + +```swift +final class User: Model { + init(node: Node, in context: Context) throws { + id = try node.extract("id") + name = try node.extract("name") + } + ... +} +``` + +The keys `id` and `name` are what we expect the columns or fields in the database to be named. The `extract` call is marked with a `try` because it will throw an error if the value is not present or is the wrong type. + +### Node Representable + +Now that we have covered initializing the model, we need to show how to save it back into the database. Model uses `NodeRepresentable` to achieve this. + +```swift +final class User: Model { + func makeNode(context: Context) throws -> Node { + return try Node(node: [ + "id": id, + "name": name + ]) + } + ... +} +``` + +When a `User` is saved, the `makeNode()` method will be called and the resulting `Node` will be saved to the database. The keys `id` and `name` are what we expect the columns or fields in the database to be named. + +> In most of the cases you do not need to be concerned about `context` argument of the `makeNode(context:)` method. It’s a part of the protocol that allows extensibility in more advanced or specific scenarios. + +## Preparations + +Some databases, like MySQL, need to be prepared for a new schema. In MySQL, this means creating a new table. Preparations are also equatable to migrations, as they can be used to alter schemas after they've already been created. + +### Prepare + +Let's assume we are using a SQL database. To prepare the database for our `User` class, we need to create a table. If you are using a database like Mongo, you can leave this method unimplemented. + +```swift +final class User { + static func prepare(_ database: Database) throws { + try database.create("users") { users in + users.id() + users.string("name") + } + } + ... +} +``` + +Here we create a table named `users` that has an identifier field and a string field with the key `name`. This matches both our `init(node: Node)` and `makeNode() -> Node` methods. + +### Revert + +An optional preparation reversion can be created. This will be run if `vapor run prepare --revert` is called. + +```swift +final class User { + static func revert(_ database: Database) throws { + try database.delete("users") + } + ... +} +``` + +Here we are deleting the table named `users`. + +### Preparations as Migrations + +If you want to add a field to your table after you've already created the initial schema, you can create a struct or class that conforms to `Preparation` like so: + +```swift + +struct AddFooToBar: Preparation { + static func prepare(_ database: Database) throws { + try database.modify("bars", closure: { bar in + bar.string("foo", length: 150, optional: false, unique: false, default: nil) + }) + } + + static func revert(_ database: Database) throws { + + } +} +``` + +Then, in your Droplet setup, add this line: `drop.preparations.append(AddFooToBar.self)` + +### Droplet + +To run these prepations when the applications boots, you must add the Model to the `Droplet`. + +```swift +let drop = Droplet() + +drop.preparations.append(User.self) +``` + +> Note: Preparations must be appended before the Droplet is run. + +## Full Model + +This is what our final `User` model looks like: + +```swift +import Vapor +import Fluent + +final class User: Model { + var id: Node? + var name: String + + init(name: String) { + self.name = name + } + + + init(node: Node, in context: Context) throws { + id = try node.extract("id") + name = try node.extract("name") + } + + func makeNode(context: Context) throws -> Node { + return try Node(node: [ + "id": id, + "name": name + ]) + } + + static func prepare(_ database: Database) throws { + try database.create("users") { users in + users.id() + users.string("name") + } + } + + static func revert(_ database: Database) throws { + try database.delete("users") + } +} +``` + +## Interacting + +Now that `User` conforms to `Model`, it has a plethora of new methods like `find()`, `query()`, `makeJSON()` and more. + +### Fetch + +Models can be fetched by their database identifier. + +```swift +let user = try User.find(42) +``` + +### Save + +Newly created models can be saved to the database. + +```swift +var user = User(name: "Vapor") +try user.save() +print(user.id) // prints the new id +``` + +### Delete + +Persisted models with identifiers can be deleted. + +```swift +try user.delete() +``` + +## Model vs. Entity + +Model has a couple of extra conformances that a pure Fluent entity doesn't have. + +```swift +public protocol Model: Entity, JSONRepresentable, StringInitializable, ResponseRepresentable {} +``` + +As can be seen in the protocol, Vapor models can automatically convert to `JSON`, `Response`, and even be used in type-safe routing. + +## Options + +Change the table/collection name +```swift +static var entity = "new_name" +``` diff --git a/1.0/fluent/query.md b/1.0/fluent/query.md new file mode 100755 index 00000000..6702bf38 --- /dev/null +++ b/1.0/fluent/query.md @@ -0,0 +1,120 @@ +--- +currentMenu: fluent-query +--- + +# Query + +The `Query` class is what powers every interaction with Fluent. Whether you're fetching a model with `.find()` or saving to the database, there is a `Query` involved somewhere. + +## Querying Models + +Every type that conforms to [Model](model.md) gets a static `.query()` method. + +```swift +let query = try User.query() +``` + +This is how you can create a `Query`. + +### No Database + +The `.query()` method is marked with `try` because it can throw an error if the Model has not had its static database property set. + +```swift +User.database = drop.database +``` + +This property is set automatically when you pass the Model as a preparation. + +## Filter + +The most common types of queries involve filtering data. + +```swift +let smithsQuery = try User.query().filter("last_name", "Smith") +``` + +Here is the short hand for adding an `equals` filter to the query. As you can see, queries can be chained together. + +In additional to `equals`, there are many other types of `Filter.Comparison`. + +```swift +let over21 = try User.query().filter("age", .greaterThanOrEquals, 21) +``` + +### Scope + +Filters can also be run on sets. + +```swift +let coolPets = try Pet.query().filter("type", .in, ["Dog", "Ferret"]) +``` + +Here only Pets of type Dog _or_ Ferret are returned. The opposite works for `notIn`. + + +### Contains + +Partially matching filters can also be applied. + +```swift +let statesWithNew = try State.query().filter("name", contains: "New") +``` + +## Retrieving + +There are two methods for running a query. + +### All + +All of the matching entities can be fetched. This returns an array of `[Model]`, in this case users. + +```swift +let usersOver21 = try User.query().filter("age", .greaterThanOrEquals, 21).all() +``` + +### First + +The first matching entity can be fetched. This returns an optional `Model?`, in this case a user. + +```swift +let firstSmith = try User.query().filter("last_name", "Smith").first() +``` + +## Union + +Other Models can be joined onto your query to assist in filtering. The results must still be either `[Model]` or `Model?` for whichever type created the query. + +```swift +let usersWithCoolPets = try User.query() + .union(Pet.self) + .filter(Pet.self, "type", .in, ["Dog", "Ferret"]) +``` + +Here the `User` collection is unioned to the `Pet` collection. Only `User`s who have a dog or a ferret will be returned. + +### Keys + +The `union` method assumes that the querying table has a foreign key identifier to the joining table. + +The above example with users and pets assumes the following schema. + +``` +users +- id +pets +- id +- user_id +``` + +Custom foreign keys can be provided through overloads to `union`. + +## Raw Queries + +Since Fluent is focused on interacting with models, each Query requires a model type. If you want to do raw database queries that aren't based on a model, you should use the underlying Fluent Driver to do so. + +```swift +if let mysql = drop.database?.driver as? MySQLDriver { + let version = try mysql.raw("SELECT @@version") +} +``` diff --git a/1.0/fluent/relation.md b/1.0/fluent/relation.md new file mode 100755 index 00000000..ec1146ba --- /dev/null +++ b/1.0/fluent/relation.md @@ -0,0 +1,176 @@ +--- +currentMenu: fluent-relation +--- + +# Relation + +Relations allow foreign key based connections between database entities. This is common in SQL-based databases, but can also be used with NoSQL. + +Fluent's relations are named as follows: +- Parent (BelongsTo) +- Children (HasMany, HasOne) +- Siblings (ManyToMany, BelongsToMany) + +## Parent + +The parent relation should be called on an entity that has a foreign key to another entity. For example, assume the following schema: + +``` +pets +- id +- owner_id +- name +- type + +owner +- id +- name +``` + +Here each pet can have one owner. To access that owner from the pet, call `.parent()`. + +```swift +let pet: Pet = ... +let owner = try pet.parent(pet.ownerId, Owner.self).get() +``` + +The parent method requires the foreign key for the parent as well as the type. + +### Convenience + +To make requesting a parent easier, a method can be added to the model. + +```swift +extension Pet { + func owner() throws -> Parent { + return try parent(ownerId) + } +} +``` + +Since we are extending `Pet`, we no longer need to use `pet.` before the `ownerId`. Furthermore, because we are providing the type information about `Owner` in the return type of the method, we no longer need to pass that as an argument. + +The `Parent` type is a queryable object, meaning you could `delete()` the parent, `filter()`, etc. + +```swift +try pet.owner().delete() +``` + +To fetch the parent, you must call `get()`. + +```swift +let owner = try pet.owner().get() +``` + +## Children + +`Children` are the opposite side of the `Parent` relationship. Assuming the schema from the previous example, the pets could be retrieved from an owner like so: + +```swift +let owner: Owner = ... +let pets = owner.children(Pet.self).all() +``` + +Here only the type of child is required. + +### Convenience + +Similarly to `Parent`, convenience methods can be added for children. + +```swift +extension Owner { + func pets() throws -> Children { + return try children() + } +} +``` + +Since the type information is clear from the return value, `Pet.self` does not need to be passed to `children()`. + +The `Children` is also a queryable object like `Parent`. You can call `first()`, `all()`, `filter()`, etc. + +```swift +let coolPets = try owner.pets().filter("type", .in, ["Dog", "Ferret"]).all() +``` + +## Siblings + +`Siblings` work differently from `Children` or `Parent` since they require a `Pivot`. + +For an example, let's say we want to allow our pets to have multiple toys. But we also want the toys to be shared by multiple pets. We need a pivot entity for this. + +``` +pets +- id +- type +- owner_id + +toys +- id +- name + +pets_toys +- id +- pet_id +- toy_id +``` + +Here you can see the pivot entity, `pets_toys`, or `Pivot`. + +### Convenience + +Let's add the convenience methods to `Pet`. + +```swift +extension Pet { + func toys() throws -> Siblings { + return try siblings() + } +} +``` + +And the opposite for `Toy`. + +```swift +extension Toy { + func pets() throws -> Siblings { + return try siblings() + } +} +``` + +Now you are free to query pets and toys similarly to children. + +```swift +let pet: Pet = ... +let toys = pet.toys().all() +``` + +To create a new many-to-many relationship you can do the following. + +```swift + +var toy: Toy = ... // Create a new toy +try toy.save() // Save the toy to the db + + +var pet: Pet = ... // Create a new pet +try pet.save() // Save the pet to the db + +// Link them together in the db +var pivot = Pivot(toy, pet) // Create the relationship +try pivot.save() // Save the relationship to the db +``` + +### Preparation + +To prepare for a relationship with a `Pivot`, simply add the pivot to the `Droplet`'s preparations. + +```swift +let drop = Droplet() +drop.preparations += [ + Toy.self, + Pet.self, + Pivot.self +] +``` diff --git a/1.0/getting-started/hello-world.md b/1.0/getting-started/hello-world.md new file mode 100755 index 00000000..908189e0 --- /dev/null +++ b/1.0/getting-started/hello-world.md @@ -0,0 +1,136 @@ +--- +currentMenu: getting-started-hello-world +--- + +# Hello, World + +This section assumes you have installed Swift 3 and the Vapor Toolbox and have verified they are working. + +> Note: If you don't want to use the Toolbox, follow the [manual guide](manual.md). + +## New Project + +Let's start by creating a new project called Hello, World + +```sh +vapor new Hello +``` + +Vapor's folder structure will probably look familiar to you if you have worked with other web frameworks. + +``` +Hello +├── Sources +│ └── App +│ └── Controllers +│ └── Middleware +│ └── Models +│ └── main.swift +├── Public +├── Resources +│ └── Views +└── Package.swift +``` + +For our Hello, World project, we will be focusing on the `main.swift` file. + +``` +Hello +└── Sources + └── App + └── main.swift +``` + +Note: The `vapor new` command creates a new project with examples and comments about how to use the framework. You can delete these if you want. + +## Droplet + +Look for the following line in the `main.swift` file. + +```swift +let drop = Droplet() +``` + +This is where the one and only `Droplet `for this example will be created. The `Droplet` class has a plethora of useful functions on it, and is used extensively. + +## Routing + +Right after the creation of `drop`, add the following code snippet. + +```swift +drop.get("hello") { request in + return "Hello, world!" +} +``` + +This creates a new route on the `Droplet` that will match all `GET` requests to `/hello`. + +All route closures are passed an instance of [Request](../http/request.md) that contains information such as the URI requested and data sent. + +This route simply returns a string, but anything that is [ResponseRepresentable](../http/response-representable.md) can be returned. Learn more in the [Routing](../routing/basic.md) section of the guide. + +Note: Xcode autocomplete may add extraneous type information to your closure's input arguments. This can be deleted to keep the code clean. If you'd like to keep the type information add `import HTTP` to the top of the file. + +## Running + +At the bottom of the main file, make sure to serve your `Droplet`. + +```swift +drop.run() +``` + +Save the file, and switch back to the terminal. + +## Compiling + +A big part of what makes Vapor so great is Swift's state of the art compiler. Let's fire it up. Make sure you are in the root directory of the project and run the following command. + +```swift +vapor build +``` + +Note: `vapor build` runs `swift build` in the background. + +The Swift Package Manager will first start by downloading the appropriate dependencies from git. It will then compile and link these dependencies together. + +When the process has completed, you will see `Building Project [Done]` + +Note: If you see a message like `unable to execute command: Killed`, you need to increase your swap space. This can happen if you are running on a machine with limited memory. + +## Run + +Boot up the server by running the following command. + +```swift +vapor run serve +``` + +You should see a message `Server starting...`. You can now visit `http://localhost:8080/hello` in your browser. + +Note: Certain port numbers require super user access to bind. Simply run `sudo vapor run` to allow access. If you decide to run on a port besides `80`, make sure to direct your browser accordingly. + +## Note for sudo usage + +On some Linux based systems, you might get an error while using sudo. In that case, if you need to run the server as root, at first switch the user using this command: + +``` +sudo -i +``` +Then either add the previously installed path of Swift to the root users $PATH variable. + +``` +PATH=$PATH:/your_path_to_swift +# Example command can be like this +# PATH=$PATH:/swift-3.0/usr/bin +# In this case /swift-3.0/usr/bin is the location of my swift installation. + +``` + + +## Hello, World + +You should see the following output in your browser window. + +``` +Hello, world! +``` diff --git a/1.0/getting-started/install-swift-3-macos.md b/1.0/getting-started/install-swift-3-macos.md new file mode 100755 index 00000000..817ab369 --- /dev/null +++ b/1.0/getting-started/install-swift-3-macos.md @@ -0,0 +1,33 @@ +--- +currentMenu: getting-started-install-swift-3-macos +--- + +# Install Swift 3: macOS + +To use Swift 3 on macOS, you just need to have Xcode 8 installed. + +## Install Xcode + +Install [Xcode 8](https://itunes.apple.com/us/app/xcode/id497799835?mt=12) from the Mac App Store. + +[![Xcode 8](https://cloud.githubusercontent.com/assets/1342803/18537674/2ddd8e9c-7ad5-11e6-9bc2-7155d57d20ec.png)](https://itunes.apple.com/us/app/xcode/id497799835?mt=12) + +### Open Xcode + +After Xcode 8 has been downloaded, you must open it to finish the installation. This may take a while. + +## Check + +Double check the installation was successful by running: + +```sh +curl -sL check.vapor.sh | bash +``` + +## Toolbox + +You can now move on to [Install Toolbox](install-toolbox.md). + +## Swift.org + +Check out [Swift.org](https://swift.org)'s extensive guides if you need more detailed instructions for installing Swift 3.0. diff --git a/1.0/getting-started/install-swift-3-ubuntu.md b/1.0/getting-started/install-swift-3-ubuntu.md new file mode 100755 index 00000000..da43a952 --- /dev/null +++ b/1.0/getting-started/install-swift-3-ubuntu.md @@ -0,0 +1,98 @@ +--- +currentMenu: getting-started-install-swift-3-ubuntu +--- + +# Install Swift 3: Ubuntu + +Installing Swift 3 on Ubuntu only takes a couple of minutes. + +## Quick + +Don't want to type? Run the following script to quickly install Swift 3.0. + +```sh +curl -sL swift.vapor.sh/ubuntu | bash +``` + +> Note: The install script adds Swift to your `~/.bashrc` profile automatically. + +## Manual + +### Dependencies + +Depending on your version of Ubuntu, you may need some additional tools for the compiler. We'll err on the safe side and install everything you should need + +```sh +sudo apt-get update +sudo apt-get install clang libicu-dev binutils git libpython2.7-dev libcurl3 +``` + +### Download + +Download the Swift 3 toolchain for your Ubuntu version. + +```sh +# Ubuntu 14.04 +wget https://swift.org/builds/swift-3.0-release/ubuntu1404/swift-3.0-RELEASE/swift-3.0-RELEASE-ubuntu14.04.tar.gz + +# Ubuntu 15.10 +wget https://swift.org/builds/swift-3.0-release/ubuntu1510/swift-3.0-RELEASE/swift-3.0-RELEASE-ubuntu15.10.tar.gz +``` + +### Decompress + +After Swift 3 has downloaded, decompress it. + +```sh +# Ubuntu 14.04 +tar zxf swift-3.0-RELEASE-ubuntu14.04.tar.gz + +# Ubuntu 15.10 +tar zxf swift-3.0-RELEASE-ubuntu15.10.tar.gz +``` + +### Install + +Move Swift 3.0 to a safe, permanent place on your computer. We'll use `/swift-3.0`, but feel free to choose wherever you like. + +```sh +# Ubuntu 14.04 +mv swift-3.0-RELEASE-ubuntu14.04 /swift-3.0 + +# Ubuntu 15.10 +mv swift-3.0-RELEASE-ubuntu15.10 /swift-3.0 +``` + +> Note: You may need to use `sudo`. + +### Export + +Edit your bash profile using your text editor of choice. + +```sh +vim ~/.bashrc +``` + +Add the following line: + +```sh +export PATH=/swift-3.0/usr/bin:"${PATH}" +``` + +> Note: If you moved Swift 3.0 to a folder other than `/swift-3.0`, your path will be different. + +## Check + +Double check the installation was successful by running: + +```sh +curl -sL check.vapor.sh | bash +``` + +## Toolbox + +You can now move on to [Install Toolbox](install-toolbox.md) + +## Swift.org + +Check out [Swift.org](https://swift.org)'s extensive guides if you need more detailed instructions for installing Swift 3.0. \ No newline at end of file diff --git a/1.0/getting-started/install-toolbox.md b/1.0/getting-started/install-toolbox.md new file mode 100755 index 00000000..506825f4 --- /dev/null +++ b/1.0/getting-started/install-toolbox.md @@ -0,0 +1,57 @@ +--- +currentMenu: getting-started-install-toolbox +--- + +# Install Toolbox + +Vapor's command line interface provides shortcuts and assistance for common tasks. + +![Vapor Toolbox](https://cloud.githubusercontent.com/assets/1342803/17454691/97e549e2-5b6d-11e6-979a-f0cd6b6f1b0a.png) + +> If you do not want to install the Toolbox, checkout the [Manual](manual.md) quickstart. + +### Install + +Run the following script to install the [Toolbox](https://github.com/vapor/toolbox). + +```sh +curl -sL toolbox.vapor.sh | bash +``` + +> Note: You must have the correct version of Swift 3 installed. + +### Verify + +Make sure the Toolbox installed successfully by running the help query. You should see a print out of the available commands. You can run the `--help` option on any Toolbox command. + +```sh +vapor --help +``` +## Create A Project + +Now that you have installed the Toolbox, you can create your first Vapor project following the [Hello, World guide](hello-world.md). + +### Updating + +The toolbox can update itself. This may be useful if you experience any issues in the future. + +```sh +vapor self update +``` + +### Templates + +The toolbox can create a project from the Vapor basic-template or any other git repo. + +```sh +vapor new [--template=] +``` + +The toolbox will build an absolute URL based on what you pass as the template option. If you do not specify a template option, the project will be built from the Vapor basic-template. + +```sh +Default(no template option specified) => https://github.com/vapor/basic-template +http(s)://example.com/repo-path => http(s)://example.com/repo-path +user/repo => https://github.com/user/repo +light => https://github.com/vapor/light-template +``` diff --git a/1.0/getting-started/manual.md b/1.0/getting-started/manual.md new file mode 100755 index 00000000..ba91aa2b --- /dev/null +++ b/1.0/getting-started/manual.md @@ -0,0 +1,99 @@ +--- +currentMenu: getting-started-manual +--- + +# Manual Quickstart + +Learn how to create a Vapor project _without_ the Toolbox using just Swift 3 and the Swift Package Manager. + +> If you'd prefer to use the Toolbox, learn how to install it [here](install-toolbox.md). + +This document assumes that you have Swift 3 installed. + +> Note: If you've installed the Toolbox, follow the toolbox guide [here](hello-world.md). + +## Check + +To check that your environment is compatible, run the following script: + +```bash +curl -sL check.vapor.sh | bash +``` + +## Make new project using SwiftPM + +Open your terminal + +> For our example, we'll be using the Desktop folder. + +```bash +cd ~/Desktop +mkdir Hello +cd Hello +swift package init --type executable +``` + +Your folder should look like this: + +``` +├── Package.swift +├── Sources +│   └── main.swift +└── Tests +``` + +## Edit `Package.swift` + +Open your `Package.swift` file: + +```bash +open Package.swift +``` + +And add Vapor as a dependency. Here's how your file will look. + +#### Package.swift + +```swift +import PackageDescription + +let package = Package( + name: "Hello", + dependencies: [ + .Package(url: "https://github.com/vapor/vapor.git", majorVersion: 1, minor: 1) + ] +) +``` + +> We try to keep this document up to date, however, you can view latest releases [here](https://github.com/vapor/vapor/releases) + +## Edit `main.swift` + +A simple hello world: + +``` +import Vapor + +let drop = Droplet() + +drop.get("/hello") { _ in + return "Hello Vapor" +} + +drop.run() +``` + +## Build and Run + +The first `build` command can take a while to fetch dependencies. + +``` +swift build +.build/debug/Hello +``` + +> If different, replace `Hello` above with the name of your executable. + +## View + +Go to your favorite browser and visit `http://localhost:8080/hello` diff --git a/1.0/getting-started/xcode.md b/1.0/getting-started/xcode.md new file mode 100755 index 00000000..3a54d4fa --- /dev/null +++ b/1.0/getting-started/xcode.md @@ -0,0 +1,45 @@ +--- +currentMenu: getting-started-xcode +--- + +# Xcode + +The first thing you'll probably notice about Vapor and SwiftPM projects in general is that we don't include an Xcode project. In fact, when SwiftPM generates packages, the `.xcodeproj` file is gitignored by default. + +This means we don't have to worry about pbxproj conflicts, and it's easy for different platforms to utilize their own editors. + +## Generate Project + +### Vapor Toolbox + +To generate a new Xcode project for a project, use: + +```bash +vapor xcode +``` + +> If you'd like to automatically open the Xcode project, use `vapor xcode -y` + +### Manual + +To generate a new Xcode project manually. + +```bash +swift package generate-xcodeproj +``` + +Open the project and continue normally. + +## Flags + +For many packages with underlying c-dependencies, users will need to pass linker flags during **build** AND **project generation**. Make sure to consult the guides associated with those dependencies. For example: + +``` +vapor xcode --mysql +``` + +or + +``` +swift package generate-xcodeproj -Xswiftc -I/usr/local/include/mysql -Xlinker -L/usr/local/lib +``` diff --git a/1.0/guide/commands.md b/1.0/guide/commands.md new file mode 100755 index 00000000..42aaa0c1 --- /dev/null +++ b/1.0/guide/commands.md @@ -0,0 +1,45 @@ +--- +currentMenu: guide-commands +--- + +# Commands +Custom console commands on Vapor are a breeze. + +## Example +To make a custom console command we must first create a new `.swift` file, import `Vapor` and `Console`, and implement the `Command` protocol. + +```swift +import Vapor +import Console + +final class MyCustomCommand: Command { + public let id = "command" + public let help = ["This command does things, like foo, and bar."] + public let console: ConsoleProtocol + + public init(console: ConsoleProtocol) { + self.console = console + } + + public func run(arguments: [String]) throws { + console.print("running custom command...") + } +} +``` + + - The **id** property is the string you will type in the console to access the command. `.build/debug/App command` will run the Custom Command. + - The **help** property is the help message that will give your custom command's users some idea of how to access it. + - The **console** property is the object passed to your custom command that adheres to the console protocol, allowing manipulation of the console. + - The **run** method is where you put the logic relating to your command. + +After we work our magic in the Custom Command file, we switch over to our `main.swift` file and add the custom command to the droplet like so. +```swift +drop.commands.append(MyCustomCommand(console: drop.console)) +``` +This allows Vapor access to our custom command and lets it know to display it in the `--help` section of the program. + +After compiling the application we can run our custom command like so. + +``` +.build/debug/App command +``` diff --git a/1.0/guide/config.md b/1.0/guide/config.md new file mode 100755 index 00000000..38e448b7 --- /dev/null +++ b/1.0/guide/config.md @@ -0,0 +1,185 @@ +--- +currentMenu: guide-config +--- + +# Config + +An application's configuration settings. Cloud applications generally require complex configurations that can adjust based on their environment. Vapor intends to provide a flexible configuration interaction that can be customized for a given user. + +## QuickStart + +For Vapor applications, configuration files are expected to be nested under a top level folder named `Config`. Here's an example of a basic config featuring a single `servers` configuration. + +```bash +./ +├── Config/ +│ ├── servers.json +``` + +And an example of how this might look: + +```JSON +{ + "http": { + "host": "0.0.0.0", + "port": 8080 + } +} +``` + +What that's saying, is that our application should start a single server named 'http' serving port `8080` on host `0.0.0.0`. This represents the following url: `http://localhost:8080`. + +### Custom Keys + +Let's add a custom key to the `servers.json` file: + +```JSON +{ + "http": { + "host": "0.0.0.0", + "port": 8080, + "custom-key": "custom value" + } +} +``` + +This can be accessed from your application's config using the following. + +```swift +let customValue = drop.config["servers", "http", "custom-key"]?.string ?? "default" +``` + +That's it, feel free to add and utilize keys as necessary to make your application configuration easier. + +## Config Syntax + +You can access your config directory with the following syntax. `app.config[<#file-name#>, <#path#>, <#to#>, <#file#>]`. For example, let's hypothesize that in addition to the `servers.json` file we mentioned earlier, there is also a `keys.json` that looks like this: + +```JSON +{ + "test-names": [ + "joe", + "jane", + "sara" + ], + "mongo": { + "url" : "www.customMongoUrl.com" + } +} +``` + +We can access this file by making sure the first argument in our subscript is keys. To get the first name in our list: + +```swift +let name = drop.config["keys", "test-names", 0]?.string ?? "default" +``` + +Or our mongo url: + +```swift +let mongoUrl = drop.config["keys", "mongo", "url"]?.string ?? "default" +``` + +## Advanced Configurations + +Having the default `servers.json` is great, but what about more complex scenarios. For example, what if we want a different host in production and in development? These complex scenarios can be achieved by adding additional folders to our `Config/` directory. Here's an example of a folder structure that's setup for production and development environments. + +```bash +WorkingDirectory/ +├── Config/ +│ ├── servers.json +│ ├── production/ +│ │ └── servers.json +│ ├── development/ +│ │ └── servers.json +│ └── secrets/ +│ └── servers.json +``` + +> You can specify the environment through the command line by using --env=. Custom environments are also available, a few are provided by default: production, development, and testing. + +```bash +vapor run --env=production +``` + +### PRIORITY + +Config files will be accessed in the following priority. + +1. CLI (see below) +2. Config/secrets/ +3. Config/name-of-environment/ +4. Config/ + +What this means is that if a user calls `app.config["servers", "host"]`, the key will be searched in the CLI first, then the `secrets/` directory, then the top level default configs. + +> `secrets/` directory should very likely be added to the gitignore. + +### EXAMPLE + +Let's start with the following JSON files. + +#### `servers.json` + +```JSON +{ + "http": { + "host": "0.0.0.0", + "port": 9000 + } +} +``` + +#### `production/servers.json` + +```JSON +{ + "http": { + "host": "127.0.0.1", + "port": "$PORT" + } +} +``` + +> The `"$NAME"` syntax is available for all values to access environment variables. + +Please notice that `servers.json`, and `production/servers.json` both declare the same keys: `host`, and `port`. In our application, we'll call: + +```swift +// will load 0.0.0.0 or 127.0.0.1 based on above config +let host = drop.config["servers", "http", "host"]?.string ?? "0.0.0.0" +// will load 9000, or environment variable port. +let port = drop.config["servers", "http", "port"]?.int ?? 9000 +``` + +## COMMAND LINE + +In addition to json files nested within the `Config/` directory, we can also use the command line to pass arguments into our config. By default, these values will be set as the "cli" file, but more complex options are also available. + +#### 1. `--KEY=VALUE` + +Arguments set through the command line can be accessed through config's cli file. For example, the following CLI command: + +```bash +--mongo-password=$MONGO_PASSWORD +``` + +would be accessible within your application by using the following: + +```swift +let mongoPassword = drop.config["cli", "mongo-password"]?.string +``` + +#### 2. `--CONFIG:FILE-NAME.KEY=CUSTOM-VALUE` + +If you want command line arguments set to a file besides "cli", you can use this more advanced specification. For example, the following CLI command: + +```bash +--config:keys.analytics=124ZH61F +``` + +would be accessible within your application by using the following: + +```swift +let analyticsKey = drop.config["keys", "analytics"]?.string +``` diff --git a/1.0/guide/controllers.md b/1.0/guide/controllers.md new file mode 100755 index 00000000..42d3c3ca --- /dev/null +++ b/1.0/guide/controllers.md @@ -0,0 +1,139 @@ +--- +currentMenu: guide-controllers +--- + +# Controllers + +Controllers help you organize related functionality into a single place. They can also be used to create RESTful resources. + +## Basic + +A basic controller looks like the following: + +```swift +final class HelloController { + func sayHello(_ req: Request) throws -> ResponseRepresentable { + guard let name = req.data["name"] else { + throw Abort.badRequest + } + return "Hello, \(name)" + } +} +``` + +Simple controllers don't need to conform to any protocols. You are free to design them however you see fit. + +### Registering + +The only required structure is the signature of each method in the controller. In order to register this method into the router, it must have a signature like `(Request) throws -> ResponseRepresentable`. `Request` and `ResponseRepresentable` are made available by importing the `HTTP` module. + +```swift +let hc = HelloController() +drop.get("hello", handler: hc.sayHello) +``` + +Since the signature of our `sayHello` method matches the signature of the closure for the `drop.get` method, we can pass it directly. + +### Type Safe + +You can also use controller methods with type-safe routing. + +```swift +final class HelloController { + ... + + func sayHelloAlternate(_ req: Request, _ name: String) -> ResponseRepresentable { + return "Hello, \(name)" + } +} +``` + +We add a new method called `sayHelloAlternate` to the `HelloController` that accepts a second parameter `name: String`. + +```swift +let hc = HelloController() +drop.get("hello", String.self, handler: hc.sayHelloAlternate) +``` + +Since this type-safe `drop.get` accepts a signature `(Request, String) throws -> ResponseRepresentable`, our method can now be used as the closure for this route. + +## Resources + +Controllers that conform to `ResourceRepresentable` can be easily registered into a router as a RESTful resource. Let's look at an example of a `UserController`. + +```swift +final class UserController { + func index(_ request: Request) throws -> ResponseRepresentable { + return try User.all().makeNode().converted(to: JSON.self) + } + + func show(_ request: Request, _ user: User) -> ResponseRepresentable { + return user + } +} +``` + +Here is a typical user controller with an `index` and `show` route. Indexing returns a JSON list of all users and showing returns a JSON representation of a single user. + +We _could_ register the controller like so: + +```swift +let users = UserController() +drop.get("users", handler: users.index) +drop.get("users", User.self, handler: users.show) +``` + +But `ResourceRepresentable` makes this standard RESTful structure easy. + +```swift +extension UserController: ResourceRepresentable { + func makeResource() -> Resource { + return Resource( + index: index, + show: show + ) + } +} +``` + +Conforming `UserController` to `ResourceRepresentable` requires that the signatures of the `index` and `show` methods match what the `Resource` is expecting. + +Here is a peek into the `Resource` class. + +```swift +final class Resource { + typealias Multiple = (Request) throws -> ResponseRepresentable + typealias Item = (Request, Model) throws -> ResponseRepresentable + + var index: Multiple? + var store: Multiple? + var show: Item? + var replace: Item? + var modify: Item? + var destroy: Item? + var clear: Multiple? + var aboutItem: Item? + var aboutMultiple: Multiple? + + ... +} +``` + +Now that `UserController` conforms to `ResourceRepresentable`, registering the routes is easy. + +```swift +let users = UserController() +drop.resource("users", users) +``` + + `drop.resource` will take care of registering only the routes that have been supplied by the call to `makeResource()`. In this case, only the `index` and `show` routes will be supplied. + +> Note: `drop.resource` also adds useful defaults for OPTIONS requests. These can be overriden. + +## Folder + +Controllers can go anywhere in your application, but they are most often stored in the `Controllers/` directory. + +### Modules + +If you are building a large application, you may want to create your controllers in a separate module. This will allow you to perform unit tests on your controllers. For more information on creating modules, visit the documentation for the [Swift Package Manager](https://swift.org/package-manager/). diff --git a/1.0/guide/droplet.md b/1.0/guide/droplet.md new file mode 100755 index 00000000..20ebfba5 --- /dev/null +++ b/1.0/guide/droplet.md @@ -0,0 +1,109 @@ +--- +currentMenu: guide-droplet +--- + +# Droplet + +The `Droplet` is a service container that gives you access to many of Vapor's facilities. It is responsible for registering routes, starting the server, appending middleware, and more. + +## Initialization + +As you have probably already seen, the only thing required to create an instance of `Droplet` is to import Vapor. + +```swift +import Vapor + +let drop = Droplet() + +// your magic here + +drop.run() +``` + +Creation of the `Droplet` normally happens in the `main.swift` file. + +## Environment + +The `environment` property contains the current environment your application is running in. Usually development, testing, or production. + +```swift +if drop.environment == .production { + ... +} +``` + +The environment affects [Config](config.md) and [Logging](log.md). The environment is `development` by default. To change it, pass the `--env=` flag as an argument. + +```sh +vapor run serve --env=production +``` + +If you are in Xcode, you can pass arguments through the scheme editor. + +> Note: Debug logs can reduce the number of requests your application can handle per second. Enabling the production environment can improve performance. + +## Working Directory + +The `workDir` property contains a path to the current working directory of the application relative to where it was started. By default, this property assumes you started the Droplet from its root directory. + +```swift +drop.workDir // "/var/www/my-project/" +``` + +You can override the working directory through the `Droplet`'s initializer, or by passing the `--workdir` argument. + +```sh +vapor run serve --workdir="/var/www/my-project" +``` + +## Modifying Properties + +The `Droplet`'s properties can be changed programmatically or through configuration. + +### Programmatic + +Properties on the `Droplet` can be changed after it is initialized. + +```swift +let drop = Droplet() + +drop.server = MyServerType.self +``` + +Here the type of server the `Droplet` uses is changed to a custom type. When the `Droplet` is run, this custom server type will be booted instead of the default server. + +### Configurable + +If you want to modify a property of the `Droplet` only in certain cases, you can use `addConfigurable`. Say for example you want to email error logs to yourself in production, but you don't want to spam your inbox while developing. + +```swift +let drop = Droplet() + +drop.addConfigurable(log: MyEmailLogger.self, name: "email") +``` + +The `Droplet` will continue to use the default logger until you modify the `Config/droplet.json` file to point to your email logger. If this is done in `Config/production/droplet.json`, then your logger will only be used in production. + +```json +{ + "log": "email" +} +``` + +## Initialization + +The `Droplet` init method is fairly simple since most properties are variable and can be changed after initialization. + +Most plugins for Vapor come with a [Provider](provider.md), these take care of configuration details for you. + +```swift +Droplet( + arguments: [String]?, + workDir workDirProvided: String?, + config configProvided: Config?, + localization localizationProvided: Localization?, +) +``` + +> Note: Remember that the Droplet's properties are initialized with usable defaults. This means that if you change a property, you must be sure to change it _before_ other parts of your code use it. Otherwise, you may end up with confusing results as the defaults are used sometimes, and your overrides are used other times. + diff --git a/1.0/guide/folder-structure.md b/1.0/guide/folder-structure.md new file mode 100755 index 00000000..434792ca --- /dev/null +++ b/1.0/guide/folder-structure.md @@ -0,0 +1,88 @@ +--- +currentMenu: guide-folder-structure +--- + +# Folder Structure + +The first step to creating an awesome application is knowing where things are. If you created your project using the [Toolbox](../getting-started/toolbox.md) or from a template, you will already have the folder structure created. + +If you are making a Vapor application from scratch, this will show you exactly how to set it up. + +## Minimum Folder Structure + +We recommend putting all of your Swift code inside of the `App/` folder. This will allow you to create subfolders in `App/` to organize your models and resources. + +This works best with the Swift package manager's restrictions on how packages should be structured. + +``` +. +├── App +│ └── main.swift +├── Public +└── Package.swift +``` + +The `Public` folder is where all publicly accessible files should go. This folder will be automatically checked every time a URL is requested that is not found in your routes. + +> Note: The `FileMiddleware` is responsible for accessing files from the `Public` folder. + +## Models + +The `Models` folder is a recommendation of where you can put your database and other models, following the MVC pattern. + +``` +. +├── App +. └── Models +. └── User.swift +``` + +## Controllers + +The `Controllers` folder is a recommendation of where you can put your route controllers, following the MVC pattern. + +``` +. +├── App +. └── Controllers +. └── UserController.swift +``` + +## Views + +The `Views` folder in `Resources` is where Vapor will look when you render views. + +``` +. +├── App +└── Resources + └── Views + └── user.html +``` + +The following code would load the `user.html` file. + +```swift +drop.view.make("user.html") +``` + +## Config + +Vapor has a sophisticated configuration system that involves a hierarchy of configuration importance. + +``` +. +├── App +└── Config + └── app.json // default app.json + └── development + └── app.json // overrides app.json when in development environment + └── production + └── app.json // overrides app.json when in production environment + └── secrets + └── app.json // overrides app.json in all environments, ignored by git +``` + +`.json` files are structured in the `Config` folder as shown above. The configuration will be applied dependant on where the `.json` file exists in the hierarchy. Learn more in [Config](config.md). + +Learn about changing environments (the `--env=` flag) in the [Droplet](droplet.md) section. diff --git a/1.0/guide/hash.md b/1.0/guide/hash.md new file mode 100755 index 00000000..b28bd299 --- /dev/null +++ b/1.0/guide/hash.md @@ -0,0 +1,36 @@ +--- +currentMenu: guide-hash +--- + +# Hash + +Vapor makes hashing strings easy. + +## Example + +To hash a string, use the `hash` class on `Droplet`. + +```swift +let hashed = drop.hash.make("vapor") +``` + +## SHA2Hasher + +By default, Vapor uses a SHA2Hasher with 256 bits. You can change this by giving the `Droplet` a different hasher. + +```swift +let sha512 = SHA2Hasher(variant: .sha512) + +let drop = Droplet(hash: sha512) +``` + +### Protocol + +You can also create your own hasher. You just need to conform to the `Hash` protocol. + +```swift +public protocol Hash: class { + var key: String { get set } + func make(_ string: String) -> String +} +``` diff --git a/1.0/guide/json.md b/1.0/guide/json.md new file mode 100755 index 00000000..8b6d4fd9 --- /dev/null +++ b/1.0/guide/json.md @@ -0,0 +1,53 @@ +--- +currentMenu: guide-json +--- + +# JSON + +JSON is an integral part of Vapor. It powers Vapor's [Config](config.md) and is incredibly easy to use in both requests and responses. + +## Request + +JSON is automatically available in `request.data` alongside form-urlencoded data and query data. This allows you to focus on making a great API, not worrying about what content types data will be sent in. + +```swift +drop.get("hello") { request in + guard let name = request.data["name"]?.string else { + throw Abort.badRequest + } + return "Hello, \(name)!" +} +``` + +This will return a greeting for any HTTP method or content type that the `name` is sent as, including JSON. + +### JSON Only + +To specifically target JSON, use the `request.json` property. + +```swift +drop.post("json") { request in + guard let name = request.json?["name"]?.string else { + throw Abort.badRequest + } + + return "Hello, \(name)!" +} +``` +The above snippet will only work if the request is sent with JSON data. + +## Response + +To respond with JSON, simply wrap your data structure with `JSON(node: )` + +```swift +drop.get("version") { request in + return try JSON(node: [ + "version": "1.0" + ]) +} +``` + +## Middleware + +The `JSONMiddleware` is included in the `Droplet`'s middleware by default. You can remove it if you don't want JSON to be parsed. diff --git a/1.0/guide/leaf.md b/1.0/guide/leaf.md new file mode 100755 index 00000000..7cd8ae77 --- /dev/null +++ b/1.0/guide/leaf.md @@ -0,0 +1,185 @@ +--- +currentMenu: guide-leaf +--- + +# Leaf + +Welcome to Leaf. Leaf's goal is to be a simple templating language that can make generating views easier. There's a lot of great templating languages, use what's best for you, maybe that's Leaf! The goals of Leaf are as follows: + +- Small set of strictly enforced rules +- Consistency +- Parser first mentality +- Extensibility + +## Syntax +### Structure + +Leaf Tags are made up of 4 Elements: + - Token: `#` is the Token + - Name: A `string` that identifies the tag + - Parameter List: `()` May accept 0 or more arguments + - Body (optional): `{}` Must be separated from the Parameter List by a space + +There can be many different usages of these 4 elements depending on the Tag's implementation. Let's look at a few examples of how Leaf's built-in Tags might be used: + + - `#()` + - `#(variable)` + - `#import("template")` + - `#export("link") { }` + - `#index(friends, "0")` + - `#loop(friends, "friend") {

  • #(friend.name)
  • }` + - `#raw() { Anything goes!@#$%^&* }` + +### Using the `#` token in HTML + +The `#` token cannot be escaped. Use the `#()` or `#raw() {}` Tag to output a `#` in a Leaf Template. `#()` => `#` + +### Raw HTML + +All Leaf output is escaped by default. Use the `#raw() {}` Tag for unescaped output. +`#raw() { Link }` => `Link` +> IMPORTANT! Make sure you are not using the `#raw() {}` Tag with user input. + +### Chaining + +The double token: `##` indicates a chain. It can be applied to any standard Tag. If the previous Tag fails, the chained Tag will be given an opportunity to run. + +``` +#if(hasFriends) ##embed("getFriends") +``` + +### Leaf's built-in Tags + +#### Token: `#()` + +``` +#() #()hashtags #()FTW => # #Hashtags #FTW +``` + +#### Raw: `#raw() {}` + +``` +#raw() { + Do whatever w/ #'s here, this code won't be rendered as leaf document and is not escaped. + It's a great place for things like Javascript or large HTML sections. +} +``` + +#### Equal: `#equal(lhs, rhs) {}` + +``` +#equal(leaf, leaf) { Leaf == Leaf } => Leaf == Leaf +#equal(leaf, mustache) { Leaf == Mustache } => +``` + +#### Variable: `#(variable)` + +``` +Hello, #(name)! +``` + +#### Loop: `#loop(object, "index")` + +``` +#loop(friends, "friend") { + Hello, #(friend.name)! +} +``` +#### Index: `#index(object, _ index: Int|String)` + +``` +Hello, #index(friends, 0)! +Hello, #index(friends, "best")! +``` + +#### If - Else: `#if(bool) ##else() { this }` + +``` +#if(entering) { + Hello, there! +} ##if(leaving) { + Goodbye! +} ##else() { + I've been here the whole time. +} +``` + +#### Import: `#import("template")` +#### Export: `#export("template") { Leaf/HTML }` +#### Extend: `#extend("template")` +#### Embed: `#embed("template")` + +> When using these Layout Tags, omit the template file's .leaf extension. + +``` +/// base.leaf + +#import("html") + +/// html.leaf +#extend("base") + +#export("html") { #embed("body") } + +/// body.leaf + +``` + +Leaf renders `html.leaf` as: + +``` + + +``` + +### Custom Tags + +Look at the existing tags for advanced scenarios, let's look at a basic example by creating `Index` together. This tag will take two arguments, an array, and an index to access. + +```swift +class Index: BasicTag { + let name = "index" + + func run(arguments: [Argument]) throws -> Node? { + guard + arguments.count == 2, + let array = arguments[0].value?.nodeArray, + let index = arguments[1].value?.int, + index < array.count + else { return nil } + return array[index] + } +} +``` + +We can now register this Tag in our `main.swift` file with: + +```swift +if let leaf = drop.view as? LeafRenderer { + leaf.stem.register(Index()) +} +``` + +And use it just like we did [above](#index). + +> Note: Use of non-alphanumeric characters in Tag Names is **strongly discouraged** and may be disallowed in future versions of Leaf. + +## Syntax Highlighting + +### Atom + +[language-leaf](https://atom.io/packages/language-leaf) by ButkiewiczP + +### Xcode + +It is not currently possible to implement Leaf Syntax Highlighting in Xcode, however, using Xcode's HTML Syntax Coloring can help a bit. Select one or more Leaf files and then choose Editor > Syntax Coloring > HTML. Your selected Leaf files will now use Xcode's HTML Syntax Coloring. Unfortunately the usefulness of this is limited because this association will be removed when `vapor xcode` is run. + +There appears to be a way to [make Xcode file associations persist](http://stackoverflow.com/questions/9050035/how-to-make-xcode-recognize-a-custom-file-extension-as-objective-c-for-syntax-hi) but that requires a bit more kung-fu. + +### VS Code + +[html-leaf](https://marketplace.visualstudio.com/items?itemName=Francisco.html-leaf) by FranciscoAmado + +### CLion & AppCode + +Some preliminary work has been done to implement a Leaf Plugin for CLion & AppCode but lack of skill and interest in Java has slowed progress! If you have IntelliJ SDK experience and want to help with this, message Tom Holland on [Vapor Slack](http://vapor.team) diff --git a/1.0/guide/middleware.md b/1.0/guide/middleware.md new file mode 100755 index 00000000..00ac5c91 --- /dev/null +++ b/1.0/guide/middleware.md @@ -0,0 +1,251 @@ +--- +currentMenu: guide-middleware +--- + +# Middleware + +Middleware is an essential part of any modern web framework. It allows you to modify requests and responses as they pass between the client and your server. + +You can imagine middleware as a chain of logic connecting your server to the client requesting your web app. + +## Basic + +As an example, let's create a middleware that will add the version of our API to each response. The middleware would look something like this: + +```swift +final class VersionMiddleware: Middleware { + func respond(to request: Request, chainingTo next: Responder) throws -> Response { + let response = try next.respond(to: request) + + response.headers["Version"] = "API v1.0" + + return response + } +} +``` + +We then supply this middleware to our `Droplet`. + +```swift +let drop = Droplet() +drop.middleware.append(VersionMiddleware()) +``` + +You can imagine our `VersionMiddleware` sitting in the middle of a chain that connects the client and our server. Every request and response that hits our server must go through this chain of middleware. + +![Middleware](https://cloud.githubusercontent.com/assets/1342803/17382676/0b51d6d6-59a0-11e6-9cbb-7585b9ab9803.png) + + +## Breakdown + +Let's break down the middleware line by line. + +```swift +let response = try next.respond(to: request) +``` + +Since the `VersionMiddleware` in this example is not interested in modifying the request, we immediately ask the next middleware in the chain to respond to the request. This goes all the way down the chain to the `Droplet` and comes back with the response that should be sent to the client. + +```swift +response.headers["Version"] = "API v1.0" +``` + +We then _modify_ the response to contain a Version header. + +```swift +return response +``` + +The response is returned and will chain back up any remaining middleware and back to the client. + +## Request + +The middleware can also modify or interact with the request. + +```swift +func respond(to request: Request, chainingTo next: Responder) throws -> Response { + guard request.cookies["token"] == "secret" else { + throw Abort.badRequest + } + + return try next.respond(to: request) +} +``` + +This middleware will require that the request has a cookie named `token` that equals `secret` or else the request will be aborted. + +## Errors + +Middleware is the perfect place to catch errors thrown from anywhere in your application. When you let the middleware catch errors, you can remove a lot of duplicated logic from your route closures. Take a look at the following example: + +```swift +enum FooError: Error { + case fooServiceUnavailable +} +``` + +Say there is a custom error that either you defined or one of the APIs you are using `throws`. This error must be caught when thrown, or else it will end up as a server error which may be unexpected to a user. The most obvious solution is to catch the error in the route closure. + +```swift +app.get("foo") { request in + let foo: Foo + do { + foo = try getFooFromService() + } catch { + throw Abort.badRequest + } + + // continue with Foo object +} +``` + +This solution works, but it would get repetitive if repeated throughout multiple routes. It can also easily lead to code duplication. Luckily, this error could be caught in a middleware instead. + +```swift +final class FooErrorMiddleware: Middleware { + func respond(to request: Request, chainingTo next: Responder) throws -> Response { + do { + return try next.respond(to: request) + } catch FooError.fooServiceUnavailable { + throw Abort.custom( + status: .badRequest, + message: "Sorry, we were unable to query the Foo service." + ) + } + } +} +``` + +We just need to append this middleware to the `Droplet`. + +```swift +drop.middleware.append(FooErrorMiddleware()) +``` + +Now our route closures look a lot better and we don't have to worry about code duplication. + +```swift +app.get("foo") { request in + let foo = try getFooFromService() + + // continue with Foo object +} +``` + +Interestingly, this is how `Abort` itself is implemented in Vapor. `AbortMiddleware` catches any `Abort` errors and returns a JSON response. Should you want to customize how `Abort` errors appear, you can remove this middleware and add your own. + +## Configuration + +Appending middleware to the `drop.middleware` array is the simplest way to add middleware--it will be used every time the application starts. + +You can also use the [configuration](config.md) files to enabled or disable middleware for more control. This is especially useful if you have middleware that should, for example, run only in production. + +Appending configurable middleware looks like the following: + +```swift +let drop = Droplet() +drop.addConfigurable(middleware: myMiddleware, name: "my-middleware") +``` + +Then, in the `Config/droplet.json` file, add `my-middleware` to the appropriate `middleware` array. + +```json +{ + ... + "middleware": { + "server": [ + ... + "my-middleware", + ... + ], + "client": [ + ... + ] + }, + ... +} +``` + +If the name of the added middleware appears in the `server` array for the loaded configuration, it will be added to the server's middleware when the application boots. + +Likewise, if the middleware appears in the `client` array for the loaded configuration, it will be added to the client's middleware. + +One middleware can be appended to both the Client and the Server, and can be added multiple times. The ordering of middleware is respected. + +## Extensions (Advanced) + +Middleware pairs great with request/response extensions and storage. + +```swift +final class PokemonMiddleware: Middleware { + let drop: Droplet + init(drop: Droplet) { + self.drop = drop + } + + func respond(to request: Request, chainingTo next: Responder) throws -> Response { + let response = try next.respond(to: request) + + if let pokemon = response.pokemon { + if request.accept.prefers("html") { + response.view = try drop.view("pokemon.mustache", context: pokemon) + } else { + response.json = try pokemon.makeJSON() + } + } + + return response + } +} +``` + +And the extension to `Response`. + +```swift +extension Response { + var pokemon: Pokemon? { + get { return storage["pokemon"] as? Pokemon } + set { storage["pokemon"] = newValue } + } +} +``` + +In this example, we added a new property to response capable of holding a Pokémon object. If the middleware finds a response with one of these Pokémon objects, it will dynamically check whether the client prefers HTML. If the client is a browser like Safari and prefers HTML, it will return a Mustache view. If the client does not prefer HTML, it will return JSON. + +Your closures can now look something like this: + +```swift +import HTTP + +drop.get("pokemon", Pokemon.self) { request, pokemon in + let response = Response() + response.pokemon = pokemon + return response +} +``` + +Or, if you want to go a step further, you can make `Pokemon` conform to `ResponseRepresentable`. + +```swift +import HTTP + +extension Pokemon: ResponseRepresentable { + func makeResponse() throws -> Response { + let response = Response() + response.pokemon = self + return response + } +} +``` + +Now your route closures are greatly simplified and you don't need to `import HTTP`. + +```swift +drop.get("pokemon", Pokemon.self) { request, pokemon in + return pokemon +} +``` + +Middleware is incredibly powerful. Combined with extensions, it allows you to add functionality that feels native to the framework. + +For those that are curious, this is how Vapor manages JSON internally. Whenever you return JSON in a closure, it sets the `json: JSON?` property on `Response`. The `JSONMiddleware` then detects this property and serializes the JSON into the body of the response. diff --git a/1.0/guide/provider.md b/1.0/guide/provider.md new file mode 100755 index 00000000..2a4b5920 --- /dev/null +++ b/1.0/guide/provider.md @@ -0,0 +1,130 @@ +--- +currentMenu: guide-provider +--- + +# Provider + +The `Provider` protocol creates a simple and predictable way for adding functionality and third party packages to your Vapor project. + +## Adding a Provider + +Adding a provider to your application takes 2-3 steps. + +### Add Package + +All of Vapor's providers end with the `-provider` syntax. You can see a list of [available providers](https://github.com/vapor?utf8=✓&q=-provider) by searching on our GitHub. + +To add the provider to your package, add it as a dependency in your `Package.swift` file. + +```swift +let package = Package( + name: "MyApp", + dependencies: [ + .Package(url: "https://github.com/vapor/vapor.git", majorVersion: 1, minor: 0), + .Package(url: "https://github.com/vapor/mysql-provider.git", majorVersion: 1, minor: 0) + ] +) +``` + +> It's important to `vapor clean` or `vapor build --clean` after adding new packages. + +### Import + +Once the provider has been added, you can import it using `import VaporFoo` where `Foo` is the name of the provider. + +Here is what importing the MySQL provider looks like: + +```swift +import Vapor +import VaporMySQL + +let drop = Droplet() + +try drop.addProvider(VaporMySQL.Provider.self) + +// ... + +drop.run() +``` + +Every provider comes with a class named `Provider`. Append the `Type` of this class to your `providers` array in the `Droplet`'s init method. + +### Config + +Some drivers may require a configuration file. For example, `VaporMySQL` requires a `Config/mysql.json` file like the following: + +```json +{ + "host": "localhost", + "user": "root", + "password": "", + "database": "vapor" +} +``` + +You will receive an error during the `Droplet`'s initialization if a configuration file is required. + +## Advanced + +You may choose to initialize the provider yourself. + +```swift +import Vapor +import VaporMySQL + +let drop = Droplet() + +let mysql = try VaporMySQL.Provider(host: "localhost", user: "root", password: "", database: "vapor") +drop.addProvider(mysql) + +... + +drop.run() +``` + +## Create a Provider + +Creating a provider is easy, you just need to create a package with a class `Provider` that conforms to `Vapor.Provider`. + +### Example + +Here is what a provider for an example `Foo` package would look like. All the provider does is take a message, then print the message when the `Droplet` starts. + +```swift +import Vapor + +public final class Provider: Vapor.Provider { + public let message: String + public let provided: Providable + + public convenience init(config: Config) throws { + guard let message = config["foo", "message"].string else { + throw SomeError + } + + try self.init(message: message) + } + + public init(message: String) throws { + self.message = message + } + + public func afterInit(_ drop: Droplet) { + + } + + public func beforeServe(_ drop: Droplet) { + drop.console.info(message) + } +} +``` + +This provider wil require a `Config/foo.json` file that looks like: + +```json +{ + "message": "The message to output" +} +``` + +The provider can also be initialized manually with the `init(message: String)` init. diff --git a/1.0/guide/sessions.md b/1.0/guide/sessions.md new file mode 100755 index 00000000..efac34cc --- /dev/null +++ b/1.0/guide/sessions.md @@ -0,0 +1,77 @@ +--- +currentMenu: guide-sessions +--- + +# Sessions + +Sessions help you store information about a user between requests. As long as the client supports cookies, sessions are easy to create. + +## Middleware + +Enable sessions on your `Droplet` by adding an instance of `SessionMiddleware`. + +```swift +import Sessions + +let memory = MemorySessions() +let sessions = SessionsMiddleware(sessions: memory) +``` + +Then add to the `Droplet`. + +``` +let drop = Droplet() +drop.middleware.append(sessions) +``` + +> Note: If you'd like to enable or disable the middleware based on config files, check out [middleware](../guide/middleware.md). + +## Request + +After `SessionMiddleware` has been enabled, you can access the `req.sessions()` method to get access to session data. + +```swift +let data = try req.session().data +``` + +## Example + +Let's create an example that remembers the user's name. + +### Store + +```swift +drop.post("remember") { req in + guard let name = req.data["name"]?.string else { + throw Abort.badRequest + } + + try req.session().data["name"] = Node.string(name) + + return "Remebered name." +} +``` + +On `POST /remember`, fetch a `name` from the request input, then store this name into the session data. + +### Fetch + +On `GET /remember`, fetch the `name` from the session data and return it. + +```swift +drop.get("remember") { req in + guard let name = try req.session().data["name"]?.string else { + return throw Abort.custom(status: .badRequest, message: "Please POST the name first.") + } + + return name +} +``` + +## Cookie + +The session will be stored using the `vapor-session` cookie. + + + + diff --git a/1.0/guide/validation.md b/1.0/guide/validation.md new file mode 100755 index 00000000..5f2ce467 --- /dev/null +++ b/1.0/guide/validation.md @@ -0,0 +1,106 @@ +--- +currentMenu: guide-validation +--- + +# Validation + +Vapor provides a few different ways to validate data coming into your application. Let's start by looking at the most common. + +## Common Usage + +Several useful convenience validators are included by default. You can use these to validate data coming into your application, or combine them and create your own. + +Let's look at the most common way to validate data. + +```swift +class Employee { + var email: Valid + var name: Valid + + init(request: Request) throws { + name = try request.data["name"].validated() + email = try request.data["email"].validated() + } +} +``` + +Here we have a typical Employee model with an `email` and `name` property. By declaring both of these properties as `Valid<>`, you are ensuring that these properties can only ever contain valid data. The Swift type checking system will prevent anything that does not pass validation from being stored. + +To store something in a `Valid<>` property, you must use the `.validated()` method. This is available for any data returned by `request.data`. + +`Email` is a real `validator` included with Vapor, but `Name` is not. Let's take a look at how you can create a Validator. + +```swift +Valid +Valid +Valid> +Valid> +Valid> +Valid> +Valid> +``` + +## Validators vs. ValidationSuites + +Validators, like `Count` or `Contains` can have multiple configurations. For example: + +```swift +let name: Valid> = try "Vapor".validated(by: Count.max(5)) +``` + +Here we are validating that the `String` is at most 5 characters long. The type of `Valid` tells us that the string has been validated to be a certain count, but it does not tell us exactly what that count was. The string could have been validated to be less than three characters or more than one million. + +Because of this, `Validators` themselves are not as type safe as some applications might desire. `ValidationSuites` fix this. They combine multiple `Validators` and/or `ValidationSuites` together to represent exactly what type of data should be considered valid. + +## Custom Validator + +Here is how to create a custom `ValidationSuite`. + +```swift +class Name: ValidationSuite { + static func validate(input value: String) throws { + let evaluation = OnlyAlphanumeric.self + && Count.min(5) + && Count.max(20) + + try evaluation.validate(input: value) + } +} +``` + +You only have to implement one method. In this method, use any other validators or logic to create your custom validator. Here we are defining a `Name` as only accepting alphanumeric Strings that are between 5 and 20 characters. + +Now we can be sure that anything of type `Valid` follows these rules. + +## Combining Validators + +In the `Name` validator, you can see that `&&` is being used to combine validators. You can use `&&` as well as `||` to combine any validator as you would boolean values with an `if` statement. + +You can also use `!` to invert the validator. + +```swift +let symbols = input.validated(by: !OnlyAlphanumeric.self) +``` + +## Testing Validity + +While `validated() throw` is the most common method for validating, there are two others. + +```swift +let passed = input.passes(Count.min(5)) +let valid = try input.tested(Count.min(5)) +``` + +`passes()` returns a boolean indicating whether or not the test passed. `tested()` will throw if the validation does not pass. But unlike `validated()` which returns a `Valid<>` type, `tested()` returns the original type of the item it was called on. + +## Validation Failures + +Vapor will automatically catch validation failures in the `ValidationMiddleware`. But you can catch them on your own, or customize responses for certain types of failures. + +```swift +do { + //validation here +} catch let error as ValidationErrorProtocol { + print(error.message) +} +``` diff --git a/1.0/guide/views.md b/1.0/guide/views.md new file mode 100755 index 00000000..a9053c0c --- /dev/null +++ b/1.0/guide/views.md @@ -0,0 +1,54 @@ +--- +currentMenu: guide-views +--- + +# Views + +Views return HTML data from your application. They can be created from pure HTML documents or passed through renderers such as Mustache or Stencil. + +## Views Directory + +Views are stored in `Resources/Views`. They are created by calling the `view` method on `Droplet`. + +## HTML + +Returning HTML, or any other non-rendered document, is simple. Just use the path of the document relative to the views directory. + +```swift +drop.get("html") { request in + return try drop.view.make("index.html") +} +``` + +## Templating + +Templated documents like [Leaf](./leaf.html), Mustache, or Stencil can take a `Context`. + +```swift +drop.get("template") { request in + return try drop.view.make("welcome", [ + "message": "Hello, world!" + ]) +} +``` + +## Public Resources + +Any resources that your views need, such as images, styles, and scripts, should be placed in the `Public` folder at the root of your application. + +## View Renderer + +Any class that conforms to `ViewRenderer` can be added to our droplet. + +```swift +let drop = Droplet() + +drop.view = LeafRenderer(viewsDir: drop.viewsDir) +``` + +## Available Renderers + +These renderers can be added to your application through [Providers](provider.md). + +- [Leaf](https://github.com/vapor/leaf) +- [Mustache](https://github.com/vapor/mustache-provider) diff --git a/1.0/http/body.md b/1.0/http/body.md new file mode 100755 index 00000000..3d867dce --- /dev/null +++ b/1.0/http/body.md @@ -0,0 +1,141 @@ +--- +currentMenu: http-body +--- + +> Module: `import HTTP` + +# Body + +The `HTTP.Body` represents the payload of an `HTTP.Message`, and is used to pass the underlying data. Some examples of this in practice would be `JSON`, `HTML` text, or the bytes of an image. Let's look at the implementation: + +```swift +public enum Body { + case data(Bytes) + case chunked((ChunkStream) throws -> Void) +} +``` + +## Data Case + +The `data` case is by far the most common use for a `Body` in an `HTTP.Message`. It is simply an array of bytes. The serialization protocol or type associated with these bytes is usually defined by the `Content-Type` header. Let's look at some examples. + +### Application/JSON + +If our `Content-Type` header contains `application/json`, then the underlying bytes represent serialized JSON. + +```swift +if let contentType = req.headers["Content-Type"], contentType.contains("application/json"), let bytes = req.body.bytes { + let json = try JSON(bytes: bytes) + print("Got JSON: \(json)") +} +``` + +### Image/PNG + +If our `Content-Type` contains `image/png`, then the underlying bytes represent an encoded png. + +```swift +if let contentType = req.headers["Content-Type"], contentType.contains("image/png"), let bytes = req.body.bytes { + try database.save(image: bytes) +} +``` + +## Chunked Case + +The `chunked` case only applies to outgoing `HTTP.Message`s in Vapor. It is traditionally a responder's role to collect an entire chunked encoding before passing it on. We can use this to send a body asynchronously. + +```swift +let body: Body = Body.chunked(sender) +return Response(status: .ok, body: body) +``` + +We can implement this manually, or use Vapor's built in convenience initializer for chunked bodies: + +```swift +return Response(status: .ok) { chunker in + for name in ["joe", "pam", "cheryl"] { + sleep(1) + try chunker.send(name) + } + + try chunker.close() +} +``` + +> Make sure to call `close()` before the chunker leaves scope. + +## BodyRepresentable + +In addition to the concrete `Body` type, as is common in Vapor, we also have wide support for `BodyRepresentable`. This means objects that we're commonly converting to `Body` type can be used interchangeably. For example: + +```swift +return Response(body: "Hello, World!") +``` + +In the above example, string is converted to bytes and added to the body. + +> In practice, it is better to use `return "Hello, World!"`. Vapor will automatically be able to set the `Content-Type` to appropriate values. + +Let's look at how it's implemented: + +```swift +public protocol BodyRepresentable { + func makeBody() -> Body +} +``` + +### Custom + +We can conform our own types to this as well where applicable. Let's pretend we have a custom data type, `.vpr`. Let's conform our `VPR` file type model: + +```swift +extension VPRFile: HTTP.BodyRepresentable { + func makeBody() -> Body { + // collect bytes + return .data(bytes) + } +} +``` + +> You may have noticed above, that the protocol throws, but our implementation does not. This is completely valid in Swift and will allow you to not throw if you're ever calling the function manually. + +Now we're able to include our `VPR` file directly in our `Responses`. + +```swift +drop.get("files", ":file-name") { request in + let filename = try request.parameters.extract("file-name") as String + let file = VPRFileManager.fetch(filename) + return Response(status: .ok, headers: ["Content-Type": "file/vpr"], body: file) +} +``` + +In practice, if we're repeating this often, we'll probably conform `VPRFile` directly to `ResponseRepresentable` + +```swift +extension VPRFile: HTTP.ResponseRepresentable { + func makeResponse() -> Response { + return Response( + status: .ok, + headers: ["Content-Type": "file/vpr"], + body: file + ) + } +} +``` + +Here's our above example now: + +```swift +drop.get("files", ":file-name") { request in + let filename = try request.parameters.extract("file-name") as String + return VPRFileManager.fetch(filename) +} +``` + +We could also use type-safe routing to make this even more concise: + +```swift +drop.get("files", String.self) { request, filename in + return VPRFileManager.fetch(filename) +} +``` diff --git a/1.0/http/client.md b/1.0/http/client.md new file mode 100755 index 00000000..9b4ae503 --- /dev/null +++ b/1.0/http/client.md @@ -0,0 +1,160 @@ +--- +currentMenu: http-client +--- + +> Module: `import HTTP` + +# Client + +The client provided by `HTTP` is used to make outgoing requests to remote servers. Let's look at a simple outgoing request. + +## QuickStart + +Let's jump right in to make a simple HTTP Request. Here's a basic `GET` request using your Vapor `Droplet`. + +```swift +let query = ... +let spotifyResponse = try drop.client.get("https://api.spotify.com/v1/search?type=artist&q=\(query)") +print(spotifyR) +``` + +### Clean Up + +The url above can be a little tricky to read, so let's use the query parameter to clean it up a little bit: + +```swift +try drop.client.get("https://api.spotify.com/v1/search", query: ["type": "artist", "q": query]) +``` + +### Continued + +In addition to `GET` requests, Vapor's client provides support for most common HTTP functions. `GET`, `POST`, `PUT`, `PATCH`, `DELETE` + +### POST as json +```swift +try drop.client.post("http://some-endpoint/json", headers: ["Content-Type": "application/json"], body: myJSON.makeBody()) +``` + +### POST as x-www-form-urlencoded +```swift +try drop.client.post("http://some-endpoint", headers: [ + "Content-Type": "application/x-www-form-urlencoded" +], body: Body.data( Node(node: [ + "email": "mymail@vapor.codes" +]).formURLEncoded())) +``` + +### Full Request + +To access additional functionality or custom methods, use the underlying `request` function directly. + +```swift +public static func get(_ method: Method, + _ uri: String, + headers: [HeaderKey: String] = [:], + query: [String: CustomStringConvertible] = [:], + body: Body = []) throws -> Response +``` + +For example: + +```swift +try drop.client.request(.other(method: "CUSTOM"), "http://some-domain", headers: ["My": "Header"], query: ["key": "value"], body: []) +``` + +## Config + +The `Config/clients.json` file can be used to modify the client's settings. + +### TLS + +Host and certificate verification can be disabled. + +> Note: Use extreme caution when modifying these settings. + +```json +{ + "tls": { + "verifyHost": false, + "verifyCertificates": false + } +} +``` + +### Mozilla + +The Mozilla certificates are included by default to make fetching content from secure sites easy. + +```json +{ + "tls": { + "certificates": "mozilla" + } +} +``` + +## Advanced + +In addition to our Droplet, we can also use and interact with the `Client` manually. Here's how our default implementation in Vapor looks: + +```swift +let response = try Client.get("http://some-endpoint/mine") +``` + +The first thing we likely noticed is `TCPClientStream` being used as a Generic value. This will be the underlying connection that the `HTTP.Client` can use when performing the request. By conforming to the underlying `ClientStream`, an `HTTP.Client` can accept custom stream implementations seamlessly. + +## Save Connection + +Up to this point, we've been interacting with the Client via `class` or `static` level functions. This allows us to end the connection upon a completed request and is the recommended interaction for most use cases. For some advanced situations, we may want to reuse a connection. For these, we can initialize our client and perform multiple requests like this. + +```swift +let pokemonClient = try drop?.client.make(scheme: "http", host: "pokeapi.co") +for i in 0...1 { + let response = try pokemonClient?.get(path: "/api/v2/pokemon/", query: ["limit": 20, "offset": i]) + print("response: \(response)") +} +``` + +## ClientProtocol + +Up to this point, we've focused on the built in `HTTP.Client`, but users can also include their own customized clients by conforming to `HTTP.ClientProtocol`. Let's look at the implementation: + +```swift +public protocol Responder { + func respond(to request: Request) throws -> Response +} + +public protocol Program { + var host: String { get } + var port: Int { get } + var securityLayer: SecurityLayer { get } + // default implemented + init(host: String, port: Int, securityLayer: SecurityLayer) throws +} + +public protocol ClientProtocol: Program, Responder { + var scheme: String { get } + var stream: Stream { get } + init(scheme: String, host: String, port: Int, securityLayer: SecurityLayer) throws +} +``` + +By conforming to these underlying functions, we immediately gain access to the public `ClientProtocol` apis we viewed above. + +## Customize Droplet + +If we've introduced a custom conformance to `HTTP.ClientProtocol`, we can pass this into our droplet without changing the underlying behavior in our application. + +For example: + +```swift +let drop = Droplet() + +drop.client = MyCustomClient.self +``` + +Going forward, all of your calls to `drop.client` will use `MyCustomClient.self`: + +```swift +drop.client.get(... // uses `MyCustomClient` +``` diff --git a/1.0/http/cors.md b/1.0/http/cors.md new file mode 100755 index 00000000..f30d3bb7 --- /dev/null +++ b/1.0/http/cors.md @@ -0,0 +1,94 @@ +--- +currentMenu: http-cors +--- + +# CORS + +Vapor by default provides a middleware for implementing proper support for Cross-Origin Resource Sharing (CORS) named `CORSMiddleware`. + +"Cross-Origin Resource Sharing (CORS) is a specification that enables truly open access across domain-boundaries. If you serve public content, please consider using CORS to open it up for universal JavaScript / browser access." - [http://enable-cors.org/](http://enable-cors.org/) + +To learn more about middlewares, please visit the Middleware section of the documentation [here](https://vapor.github.io/documentation/guide/middleware.html). + +![](https://upload.wikimedia.org/wikipedia/commons/c/ca/Flowchart_showing_Simple_and_Preflight_XHR.svg) +*Image Author: [Wikipedia](https://commons.wikimedia.org/wiki/File:Flowchart_showing_Simple_and_Preflight_XHR.svg)* + +## Basic + +First of all, add the CORS middleware into your droplet middlewares array. + +```swift +# Insert CORS before any other middlewares +drop.middleware.insert(CORSMiddleware(), at: 0) +``` + +> Note: Make sure you insert CORS middleware before any other throwing middlewares, like the AbortMiddleware or similar. Otherwise the proper headers might not be added to the response. + +`CORSMiddleware` has a default configuration which should suit most users, with values as follows: + +- **Allowed Origin** + - Value of origin header in the request. +- **Allowed Methods** + - `GET`, `POST`, `PUT`, `OPTIONS`, `DELETE`, `PATCH` +- **Allowed Headers** + - `Accept`, `Authorization`, `Content-Type`, `Origin`, `X-Requested-With` + +## Advanced + +All settings and presets can be customized by advanced users. There's two ways of doing this, either you programatically create and configure a `CORSConfiguration` object or you can put your configuration into a Vapor's JSON config file. + +See below for how to set up both and what are the options. + +### Configuration + +The `CORSConfiguration` struct is used to configure the `CORSMiddleware`. You can instanitate one like this: + +```swift +let configuration = CORSConfiguration(allowedOrigin: .custom("https://vapor.codes"), + allowedMethods: [.get, .post, .options], + allowedHeaders: ["Accept", "Authorization"], + allowCredentials: false, + cacheExpiration: 600, + exposedHeaders: ["Cache-Control", "Content-Language"]) +``` + +After creating a configuration you can add the CORS middleware. + +```swift +drop.middleware.insert(CORSMiddleware(configuration: configuration), at: 0) +``` + +> Note: Please consult the documentation in the source code of the `CORSConfiguration` for more information about available values for the settings. + + +### JSON Config + +Optionally, `CORSMiddleware` can be configured using the Vapor's `Config` which is created out of the json files contained in your Config folder. You will need to create a file called `cors.json` or `CORS.json` in your Config folder in your project and add the required keys. + +Example of how such a file could look as follows: + +```swift +{ + "allowedOrigin": "origin", + "allowedMethods": "GET,POST,PUT,OPTIONS,DELETE,PATCH", + "allowedHeaders": ["Accept", "Authorization", "Content-Type", "Origin", "X-Requested-With"] +} + +``` + +> Note: Following keys are required: `allowedOrigin`, `allowedMethods`, `allowedHeaders`. If they are not present an error will be thrown while instantiating the middleware. +> +> Optionally you can also specify the keys `allowCredentials` (Bool), `cacheExpiration` (Int) and `exposedHeaders` ([String]). + +Afterwards you can add the middleware using the a throwing overload of the initialiser that accepts Vapor's `Config`. + +```swift +let drop = Droplet() + +do { + drop.middleware.insert(try CORSMiddleware(configuration: drop.config), at: 0) +} catch { + fatalError("Error creating CORSMiddleware, please check that you've setup cors.json correctly.") +} +``` + diff --git a/1.0/http/request.md b/1.0/http/request.md new file mode 100755 index 00000000..f3d5b60e --- /dev/null +++ b/1.0/http/request.md @@ -0,0 +1,223 @@ +--- +currentMenu: http-request +--- + +> Module: `import HTTP` + +# Request + +The most common part of the `HTTP` library we'll be interacting with is the `Request` type. Here's a look at some of the most commonly used attributes in this type. + +```swift +public var method: Method +public var uri: URI +public var parameters: Node +public var headers: [HeaderKey: String] +public var body: Body +public var data: Content +``` + +### Method + +The HTTP `Method` associated with the `Request`, ie: `GET`, `POST`, `PUT`, `PATCH`, `DELETE`. + +### URI + +The associated `URI` of the request. We will use this to access attributes about the `uri` the request was sent to. + +For example, given the following uri: `http://vapor.codes/example?query=hi#fragments-too` + +```swift +let scheme = request.uri.scheme // http +let host = request.uri.host // vapor.codes + +let path = request.uri.path // /example +let query = request.uri.query // query=hi +let fragment = request.uri.fragment // fragments-too +``` + +### Route Parameters + +The url parameters associated with the request. For example, if we have a path registered as `hello/:name/age/:age`, we would be able to access those in our request, like so: + +```swift +let name = request.parameters["name"] // String? +let age = request.parameters["age"]?.int // Int? +``` + +Or, to automatically throw on `nil` or invalid variable, you can also `extract` + +```swift +let name = try request.parameters.extract("name") as String +let age = try request.parameters.extract("age") as Int +``` + +These extract functions can cast to any `NodeInitializable` type, including your own custom types. Make sure to check out [Node](https://github.com/vapor/node) for more info. + +> Note: Vapor also provides type safe routing in the routing section of our docs. + + +### Headers + +These are the headers associated with the request. If you are preparing an outgoing request, this can be used to add your own keys. + +```swift +let contentType = request.headers["Content-Type"] +``` + +Or for outgoing requests: + +```swift +let request = Request ... +request.headers["Content-Type"] = "application/json" +request.headers["Authorization"] = ... my auth token +``` + +#### Extending Headers + +We generally seek to improve code bases by removing stringly typed code where possible. We can add variables to the headers using generic extensions. + +```swift +extension HTTP.KeyAccessible where Key == HeaderKey, Value == String { + var customKey: String? { + get { + return self["Custom-Key"] + } + set { + self["Custom-Key"] = newValue + } + } +} +``` + +With this pattern implemented, our string `"Custom-Key"` is contained in one section of our code. We can now access like this: + +```swift +let customKey = request.headers.customKey + +// or + +let request = ... +request.headers.customKey = "my custom value" +``` + +### Body + +This is the body associated with the request and represents the general data payload. You can view more about body in the associated [docs](./body.md) + +For incoming requests, we'll often pull out the associated bytes like so: + +```swift +let rawBytes = request.body.bytes +``` + +## Content + +Generally when we're sending or receiving requests, we're using them as a way to transport content. For this, Vapor provides a convenient `data` variable associated with the request that prioritizes content in a consistent way. + +For example, say I receive a request to `http://vapor.codes?hello=world`. + +```swift +let world = request.data["hello"]?.string +``` + +This same code will work if I receive a JSON request, for example: + +```json +{ + "hello": "world" +} +``` + +Will still be accessible through data. + +```swift +let world = request.data["hello"]?.string +``` +> Note: Force unwrap should never be used. + +This also applies to multi-part requests and can even be extended to new types such as XML or YAML through middleware. + +If you'd prefer to access given types more explicitly, that's totally fine. The `data` variable is purely opt-in convenience for those who want it. + +## JSON + +To access JSON directly on a given request, use the following: + +```swift +let json = request.json["hello"] +``` + +## Query Parameters + +The same applies to query convenience: + +```swift +let query = request.query?["hello"] // String? +let name = request.query?["name"]?.string // String? +let age = request.query?["age"]?.int // Int? +let rating = request.query?["rating"]?.double // Double? +``` + +## Key Paths + +Key paths work on most Vapor types that can have nested key value objects. Here's a couple examples of how to access given the following json: + +```json +{ + "metadata": "some metadata", + "artists" : { + "href": "http://someurl.com", + "items": [ + { + "name": "Van Gogh", + }, + { + "name": "Mozart" + } + ] + } +} +``` + +We could access the data in the following ways: + +### Metadata + +Access top level values + +```swift +let type = request.data["metadata"].string // "some metadata" +``` + +### Items + +Access nested values + +```swift +let items = request.data["artists", "items"] // [["name": "Van Gogh"], ["name": "Mozart"]] +``` + +### Mixing Arrays and Objects + +Get first artists + +```swift +let first = request.data["artists", "items", 0] // ["name": "Van Gogh"] +``` + +### Array Item + +Get key from array item + +```swift +let firstName = request.data["artists", "items", 0, "name"] // "Van Gogh" +``` + +### Array Comprehension + +We can also smartly map an array of keys, for example, to just get the names of all of the artists, we could use the following + +```swift +let names = request.data["artists", "items", "name"] // ["Van Gogh", "Mozart"] +``` diff --git a/1.0/http/responder.md b/1.0/http/responder.md new file mode 100755 index 00000000..8533e4dd --- /dev/null +++ b/1.0/http/responder.md @@ -0,0 +1,79 @@ +--- +currentMenu: http-responder +--- + +> Module: `import HTTP` + +# Responder + +The `Responder` is a simple protocol defining the behavior of objects that can accept a `Request` and return a `Response`. Most notably in Vapor, it is the core API endpoint that connects the `Droplet` to the `Server`. Let's look at the definition: + +```swift +public protocol Responder { + func respond(to request: Request) throws -> Response +} +``` + +> The responder protocol is most notably related to Droplet and it's relationship with a server. Average users will not likely interact with it much. + +## Simple + +Of course, Vapor provides some conveniences for this, and in practice, we will often call: + +```swift +try drop.run() +``` + +## Manual + +As we just mentioned, the Vapor `Droplet` itself conforms to `Responder`, connecting it to the `Server`. This means if we wanted to serve our droplet manually, we could do: + +```swift +let server = try Server, Serializer>(port: port) +try server.start(responder: droplet) { error in + print("Got error: \(error)") +} +``` + +## Advanced + +We can conform our own objects to `Responder` and pass them to `Servers`. Let's look at an example: + +```swift +final class Responder: HTTP.Responder { + func respond(to request: Request) throws -> Response { + let body = "Hello World".makeBody() + return Response(body: body) + } +} +``` + +This only returns `"Hello World"` for every request, it's most commonly going to be linked with a router of some type. + + +```swift +final class Responder: HTTP.Responder { + let router: Router = ... + + func respond(to request: Request) throws -> Response { + return try router.route(request) + } +} +``` + +We'll then pass this responder to a server and let it go. + +```swift +let server = try Server, Serializer>(port: port) + +print("visit http://localhost:\(port)/") +try server.start(responder: Responder()) { error in + print("Got error: \(error)") +} +``` + +This can be used as a jumping off point for applications looking to implement features manually. + +## Client + +The `HTTP.Client` is itself a `Responder` although, instead of handling the `Request` itself, it passes it on to the underlying URI. diff --git a/1.0/http/response-representable.md b/1.0/http/response-representable.md new file mode 100755 index 00000000..87f747b5 --- /dev/null +++ b/1.0/http/response-representable.md @@ -0,0 +1,104 @@ +--- +currentMenu: http-response-representable +--- + +> Module: `import HTTP` + +# ResponseRepresentable + +Traditionally HTTP servers take a `Request` and return a `Response`. Vapor is no different, but we can take advantage of Swift's powerful protocols to be a bit more flexible to the user facing API. + +Let's start with the definition of `ResponseRepresentable` + +```swift +public protocol ResponseRepresentable { + func makeResponse() throws -> Response +} +``` + +By conforming to this protocol, we can more flexibly return things that conform instead of creating the response manually each time. Vapor provides some of these by default. Including (but not limited to): + +### String + +Because string conforms to `ResponseRepresentable`, we can return it directly in a Vapor route handler. + +```swift +drop.get("hello") { request in + return "Hello, World!" +} +``` + +### JSON + +`JSON` can be returned directly instead of recreating a response each time. + +```swift +drop.get("hello") { request in + return try JSON(node: [ + "hello": "world", + "some-numbers": [ + 1, + 2, + 3 + ] + ] + ) +} +``` + +### Response + +Of course, we can also return Responses for anything not covered: + +```swift +drop.get("hello") { request in + return Response(status: .ok, headers: ["Content-Type": "text/plain"], body: "Hello, World!") +} +``` + +## Conforming + +All we need to do to return our own objects is conform them to `ResponseRepresentable`. Let's look at an example type, a simple blog post model: + +```swift +import Foundation + +struct BlogPost { + let id: String + let content: String + let createdAt: NSDate +} +``` + +And now, let's conform it to response representable. + +```swift +import HTTP +import Foundation + +extension BlogPost: ResponseRepresentable { + func makeResponse() throws -> Response { + let json = try JSON(node: + [ + "id": id, + "content": content, + "created-at": createdAt.timeIntervalSince1970 + ] + ) + return try json.makeResponse() + } +} +``` + +> Don't forget to import HTTP. + +Now that we've modeled our BlogPost, we can return it directly in route handlers. + +```swift +drop.post("post") { req in + guard let content = request.data["content"] else { throw Error.missingContent } + let post = Post(content: content) + try post.save(to: database) + return post +} +``` diff --git a/1.0/http/response.md b/1.0/http/response.md new file mode 100755 index 00000000..cd92f05d --- /dev/null +++ b/1.0/http/response.md @@ -0,0 +1,126 @@ +--- +currentMenu: http-response +--- + +> Module: `import HTTP` + +# Response + +When building endpoints, we'll often be returning responses for requests. If we're making outgoing requests, we'll be receiving them. + +```swift +public let status: Status +public var headers: [HeaderKey: String] +public var body: Body +public var data: Content +``` + +#### Status + +The http status associated with the event, for example `.ok` == 200 ok. + +#### Headers + +These are the headers associated with the request. If you are preparing an outgoing response, this can be used to add your own keys. + +```swift +let contentType = response.headers["Content-Type"] +``` + +Or for outgoing response: + +```swift +let response = response ... +response.headers["Content-Type"] = "application/json" +response.headers["Authorization"] = ... my auth token +``` + +##### Extending Headers + +We generally seek to improve code bases by removing stringly typed code where possible. We can add variables to the headers using generic extensions. + +```swift +extension HTTP.KeyAccessible where Key == HeaderKey, Value == String { + var customKey: String? { + get { + return self["Custom-Key"] + } + set { + self["Custom-Key"] = newValue + } + } +} +``` + +With this pattern implemented, our string `"Custom-Key"` is contained in one section of our code. We can now access like this: + +```swift +let customKey = response.headers.customKey + +// or + +let request = ... +response.headers.customKey = "my custom value" +``` + +#### Body + +This is the body associated with the response and represents the general data payload. You can view more about body in the associated [docs](./body.md) + +For responses, the body is most commonly set at initialization. With two main types. + +##### BodyRepresentable + +Things that can be converted to bytes, ie: + +```swift +let response = Response(status: .ok, body: "some string") +``` + +In the above example, the `String` will be automatically converted to a body. Your own types can do this as well. + +##### Bytes Directly + +If we already have our bytes array, we can pass it into the body like so: + +```swift +let response = Response(status: .ok, body: .data(myArrayOfBytes)) +``` + +##### Chunked + +To send an `HTTP.Response` in chunks, we can pass a closure that we'll use to send our response body in parts. + +```swift +let response = Response(status: .ok) { chunker in + for name in ["joe", "pam", "cheryl"] { + sleep(1) + try chunker.send(name) + } + + try chunker.close() +} +``` + +> Make sure to call `close()` before the chunker leaves scope. + +## Content + +We can access content the same we do in a [request](./request.md). This most commonly applies to outgoing requests. + +```swift +let pokemonResponse = try drop.client.get("http://pokeapi.co/api/v2/pokemon/") +let names = pokemonResponse.data["results", "name"]?.array +``` + +## JSON + +To access JSON directly on a given response, use the following: + +```swift +let json = request.response["hello"] +``` + +## Key Paths + +For more on KeyPaths, visit [here](./request.md#key-paths) diff --git a/1.0/http/server.md b/1.0/http/server.md new file mode 100755 index 00000000..eef6ae6a --- /dev/null +++ b/1.0/http/server.md @@ -0,0 +1,210 @@ +--- +currentMenu: http-server +--- + +# Server + +The server is responsible for accepting connections from clients, parsing their requests, and delivering them a response. + +## Default + +Starting your Droplet with a default server is simple. + +```swift +import Vapor + +let drop = Droplet() + +drop.run() +``` + +The default server will bind to host `0.0.0.0` at port `8080`. + +## Config + +If you are using a `Config/servers.json` file, this is where you can easily change your host and port or even boot multiple servers. + +```json +{ + "default": { + "port": "$PORT:8080", + "host": "0.0.0.0", + "securityLayer": "none" + } +} +``` + +The default `servers.json` is above. The port with try to resolve the environment variable `$PORT` or fallback to `8080`. + +### Multiple + +You can start multiple servers in the same application. This is especially useful if you want to boot an `HTTP` and `HTTPS` server side by side. + +```json +{ + "plaintext": { + "port": "80", + "host": "vapor.codes", + "securityLayer": "none" + }, + "secure": { + "port": "443", + "host": "vapor.codes", + "securityLayer": "tls", + "tls": { + "certificates": "none", + "signature": "selfSigned" + } + }, +} +``` + +## TLS + +TLS (formerly SSL) can be configured with a variety of different certificate and signature types. + +### Verify + +Verificiation of hosts and certificates can be disabled. They are enabled by default. + +> Note: Be extremely careful when disabling these options. + +```json +"tls": { + "verifyHost": false, + "verifyCertificates": false +} +``` + +### Certificates + +#### None + +```json +"tls": { + "certificates": "none" +} +``` + +#### Chain + +```json +"tls": { + "certificates": "chain", + "chainFile": "/path/to/chainfile" +} +``` + +#### Files + +```json +"tls": { + "certificates": "files", + "certificateFile": "/path/to/cert.pem", + "privateKeyFile": "/path/to/key.pem" +} +``` + +#### Certificate Authority + +```json +"tls": { + "certificates": "ca" +} +``` + +### Signature + +#### Self Signed + +```json +"tls": { + "signature": "selfSigned" +} +``` + +#### Signed File + +```json +"tls": { + "signature": "signedFile", + "caCertificateFile": "/path/to/file" +} +``` + +#### Signed Directory + +```json +"tls": { + "signature": "signedDirectory", + "caCertificateDirectory": "/path/to/dir" +} +``` + +## Example + +Here is an example `servers.json` file using certificate files with a self signed signature and host verification redundantly set to `true`. + +```json +{ + "secure": { + "port": "8443", + "host": "0.0.0.0", + "securityLayer": "tls", + "tls": { + "verifyHost": true, + "certificates": "files", + "certificateFile": "/vapor/certs/cert.pem", + "privateKeyFile": "/vapor/certs/key.pem", + "signature": "selfSigned" + } + } +} +``` + +## Manual + +Servers can also be configured manually, without configuration files. + +> Note: If servers are configured programatically, they override any config settings. + +### Simple + +The `run` method on the Droplet takes a dictionary of server configuration objects. The key is the name of the server. + +```swift +import Vapor + +let drop = Droplet() + +drop.run(servers: [ + "default": (host: "vapor.codes", port: 8080, securityLayer: .none) +] +``` + +### TLS + +TLS can also be configured manually, and works similarly to the `servers.json` config files described above. + +```swift +import Vapor +import TLS + +let drop = Droplet() + +let config = try TLS.Config( + mode: .server, + certificates: .files( + certificateFile: "/Users/tanner/Desktop/certs/cert.pem", + privateKeyFile: "/Users/tanner/Desktop/certs/key.pem", + signature: .selfSigned + ), + verifyHost: true, + verifyCertificates: true +) + +drop.run(servers: [ + "plaintext": ("vapor.codes", 8080, .none), + "secure": ("vapor.codes", 8443, .tls(config)), +]) +```` \ No newline at end of file diff --git a/1.0/routing/basic.md b/1.0/routing/basic.md new file mode 100755 index 00000000..447ebcf4 --- /dev/null +++ b/1.0/routing/basic.md @@ -0,0 +1,146 @@ +--- +currentMenu: routing-basic +--- + +# Basic Routing + +Routing is one of the most critical parts of a web framework. The router decides which requests get which responses. + +Vapor has a plethora of functionality for routing including route builders, groups, and collections. In this section, we will look at the basics of routing. + +## Register + +The most basic route includes a method, path, and closure. + +```swift +drop.get("welcome") { request in + return "Hello" +} +``` + +The standard HTTP methods are available including `get`, `post`, `put`, `patch`, `delete`, and `options`. + +```swift +drop.post("form") { request in + return "Submitted with a POST request" +} +``` + +You can also use `any` to match all methods. + +## Nesting + +To nest paths (adding `/`s in the URL), simply add commas. + +```swift +drop.get("foo", "bar", "baz") { request in + return "You requested /foo/bar/baz" +} +``` + +You can also use `/`, but commas are often easier to type and work better with type safe route [parameters](parameters.md). + +## Alternate + +An alternate syntax that accepts a `Method` as the first parameter is also available. + +```swift +drop.add(.trace, "welcome") { request in + return "Hello" +} +``` + +This may be useful if you want to register routes dynamically or use a less common method. + +## Request + +Each route closure is given a single [Request](../http/request.md). This contains all of the data associated with the request that led to your route closure being called. + +## Response Representable + +A route closure can return in three ways: + +- `Response` +- `ResponseRepresentable` +- `throw` + +### Response + +A custom [Response](../http/response.md) can be returned. + +```swift +drop.get("vapor") { request in + return Response(redirect: "http://vapor.codes") +} +``` + +This is useful for creating special responses like redirects. It is also useful for cases where you want to add cookies or other items to the response. + +### Response Representable + +As you have seen in the previous examples, `String`s can be returned in route closures. This is because they conform to [ResponseRepresentable](../http/response-representable.md) + +A lot of types in Vapor conform to this protocol by default: +- String +- Int +- JSON +- Model + +```swift +drop.get("json") { request in + return try JSON(node: [ + "number": 123, + "text": "unicorns", + "bool": false + ]) +} +``` + +> If you are curious about what `node:` means, read more about [Node](https://github.com/vapor/node) + +### Throwing + +If you are unable to return a response, you may `throw` any object that conforms to `Error`. Vapor comes with a default error enum `Abort`. + +```swift +drop.get("404") { request in + throw Abort.notFound +} +``` + +You can customize the message of these errors by using `Abort` + +```swift +drop.get("error") { request in + throw Abort.custom(status: .badRequest, message: "Sorry 😱") +} +``` + +These errors are caught by default in the `AbortMiddleware` where they are turned into a JSON response like the following. + +```json +{ + error: true, + message: "" +} +``` + +If you want to override this behavior, remove the `AbortMiddleware` from the `Droplet`'s middleware and add your own. + +## Fallback + +Fallback routes allow you to match multiple layers of nesting slashes. + +```swift +app.get("anything", "*") { request in + return "Matches anything after /anything" +} +``` + +For example, the above route matches all of the following and more: + +- /anything +- /anything/foo +- /anything/foo/bar +- /anything/foo/bar/baz +- ... diff --git a/1.0/routing/collection.md b/1.0/routing/collection.md new file mode 100755 index 00000000..8a8debed --- /dev/null +++ b/1.0/routing/collection.md @@ -0,0 +1,82 @@ +--- +currentMenu: routing-collection +--- + +# Route Collections + +Route collections allow multiple routes and route groups to be organized in different files or modules. + +## Example + +Here is an example of a route collection for the `v1` portion of an API. + +```swift +import Vapor +import HTTP +import Routing + +class V1Collection: RouteCollection { + typealias Wrapped = HTTP.Responder + func build(_ builder: B) { + let v1 = builder.grouped("v1") + let users = v1.grouped("users") + let articles = v1.grouped("articles") + + users.get { request in + return "Requested all users." + } + + articles.get(Article.self) { request, article in + return "Requested \(article.name)" + } + } +} +``` + +This class could be place in any file, and we could add it to our droplet or even another route group. + +```swift +let v1 = V1Collection() +drop.collection(v1) +``` + +The `Droplet` will then be passed to the `build(_:)` method of your route collection and have the various routes added to it. + +### Breakdown + +For those that are curious, let's break down the route collection line by line to better understand what is going on. + +```swift +typealias Wrapped = HTTP.Responder +``` + +This limits our route collection to adding HTTP responders. While the underlying router is capable of routing any type, Vapor routes HTTP responders exclusively. If we want to use this route collection with Vapor, it's wrapped type needs to match. + +```swift +func build(_ builder: B) { +``` + +This method accepts a route builder and also verifies that the route builder accepts `Wrapped` or, as defined in the last line, `HTTP.Responder`s. Vapor's `Droplet` and any route [group](group.md) created with Vapor are `RouteBuilder`s that accept HTTP responders. + +```swift +let v1 = builder.grouped("v1") +``` + +From there you can create routes with the `builder` as usual. The `builder: B` will work exactly like a `Droplet` or route [group](group.md). Any methods that work there will work on this builder. + + +## Empty Initializable + +You can even add `EmptyInitializable` to your route collection if it has an empty `init` method. This will allow you to add the route collection via its type name. + +```swift +class V1Collection: RouteCollection, EmptyInitializable { + init() { } + ... +``` + +Now we can add the collection without initializing it. + +```swift +drop.collection(V1Collection.self) +``` diff --git a/1.0/routing/controller b/1.0/routing/controller new file mode 100755 index 00000000..6abc2dd9 --- /dev/null +++ b/1.0/routing/controller @@ -0,0 +1,74 @@ +--- +currentMenu: routing-controller +--- + +# Introduction + +Instead of defining all of your request handling logic as Closures in route files, you may wish to organize this behavior +using Controller classes. Controllers can group related request handling logic into a single class. Controllers are stored +in the `Sources/App/Controllers` directory. + +# Basic Controller + +## Defining Controllers + +```swift +import Vapor +import HTTP + +final class FirstController { + func index(request: Request) throws -> ResponseRepresentable { + return try JSON(node: [ + "message": "This is FirstController's index method" + ]) + } +} +``` +You can define a route to this controller action like so: + +```swift +drop.get("getindex") {request in + return try FirstController().index(request: request) +} +``` +Now, when a request matches the specified route URI, the Index method on the FirstController +class will be executed. Of course, the route parameters will also be passed to the method. + +-------- + +# Resource Controllers + +Vapor resource routing assigns the typical "CRUD" routes to a controller with a single line of code. + +```swift +drop.resource("URI", Controller()) +``` +This single route declaration creates multiple routes to handle a variety of actions on the resource. +The generated controller will already have methods stubbed for each of these actions, including +notes informing you of the HTTP verbs and URIs they handle. + +| Verb | URI | Action | +| :-------------: | :-------------: | :-----------: | +| GET | test/index | test.index | +| POST | test/create | test.create | +| GET | test/show | test.show | +| PUT | test/replace | test.replace | +| PATCH | test/destroy | test.destroy | +| DELETE | test/destroy | test.destroy | +| DELETE | test/clear | test.clear | + +You can also custom method name, add `makeResource` method in the controller + +```swift + func makeResource() -> Resource { + return Resource( + index: index, + store: create, + show: show, + replace: replace, + modify: update, + destroy: delete, + clear: clear + ) + } +``` diff --git a/1.0/routing/group.md b/1.0/routing/group.md new file mode 100755 index 00000000..fe04601a --- /dev/null +++ b/1.0/routing/group.md @@ -0,0 +1,67 @@ +--- +currentMenu: routing-group +--- + +# Route Groups + +Grouping routes together makes it easy to add common prefixes, middleware, or hosts to multiple routes. + +Route groups have two different forms: Group and Grouped. + +### Group + +Group (without the "ed" at the end) takes a closure that is passed a `GroupBuilder`. + +```swift +drop.group("v1") { v1 in + v1.get("users") { request in + // get the users + } +} +``` + +### Grouped + +Grouped returns a `GroupBuilder` that you can pass around. + +```swift +let v1 = drop.grouped("v1") +v1.get("users") { request in + // get the users +} +``` + +### Middleware + +You can add middleware to a group of routes. This is especially useful for authentication. + +```swift +drop.group(AuthMiddleware()) { authorized in + authorized.get("token") { request in + // has been authorized + } +} +``` + +### Host + +You can limit the host for a group of routes. + +```swift +drop.group(host: "vapor.codes") { vapor + vapor.get { request in + // only responds to requests to vapor.codes + } +} +``` + +### Chaining + +Groups can be chained together. + +```swift +drop.grouped(host: "vapor.codes").grouped(AuthMiddleware()).group("v1") { authedSecureV1 in + // add routes here +} +``` + diff --git a/1.0/routing/parameters.md b/1.0/routing/parameters.md new file mode 100755 index 00000000..a0886167 --- /dev/null +++ b/1.0/routing/parameters.md @@ -0,0 +1,134 @@ +--- +currentMenu: routing-parameters +--- + +# Routing Parameters + +Traditional web frameworks leave room for error in routing by using strings for route parameter names and types. Vapor takes advantage of Swift's closures to provide a safer and more intuitive method for accessing route parameters. + +## Type Safe + +To create a type safe route simply replace one of the parts of your path with a `Type`. + +```swift +drop.get("users", Int.self) { request, userId in + return "You requested User #\(userId)" +} +``` + +This creates a route that matches `users/:id` where the `:id` is an `Int`. Here's what it would look like using manual route parameters. + +```swift +drop.get("users", ":id") { request in + guard let userId = request.parameters["id"]?.int else { + throw Abort.badRequest + } + + return "You requested User #\(userId)" +} +``` + +Here you can see that type safe routing saves ~3 lines of code and also prevents runtime errors like misspelling `:id`. + +## String Initializable + +Any type that conforms to `StringInitializable` can be used as a type-safe routing parameter. By default, the following types conform: + +- String +- Int +- Model + +`String` is the most generic and always matches. `Int` only matches when the string supplied can be turned into an integer. `Model` only matches when the string, used as an identifier, can be used to find the model in the database. + +Our previous example with users can be further simplified. + +```swift +drop.get("users", User.self) { request, user in + return "You requested \(user.name)" +} +``` + +Here the identifier supplied is automatically used to lookup a user. For example, if `/users/5` is requested, the `User` model will be asked for a user with identifier `5`. If one is found, the request succeeds and the closure is called. If not, a not found error is thrown. + +Here is what this would look like if model didn't conform to `StringInitializable`. + +```swift +drop.get("users", Int.self) { request, userId in + guard let user = try User.find(userId) else { + throw Abort.notFound + } + + return "You requested User #\(userId)" +} +``` + +Altogether, type safe routing can save around 6 lines of code from each route. + +### Protocol + +Conforming your own types to `StringInitializable` is easy. + +```swift +public protocol StringInitializable { + init?(from string: String) throws +} +``` + +Here is what `Model`'s conformance looks like for those who are curious. + +```swift +extension Model { + public init?(from string: String) throws { + if let model = try Self.find(string) { + self = model + } else { + return nil + } + } +} +``` + +The `init` method can both `throw` and return `nil`. This allows you to `throw` your own errors. Or, if you want the default error and behavior, just return `nil`. + +### Limits + +Type safe routing is currently limited to three path parts. This is usually remedied by adding route [groups](group.md). + +```swift +drop.group("v1", "users") { users in + users.get(User.self, "posts", Post.self) { request, user, post in + return "Requested \(post.name) for \(user.name)" + } +} +``` + +The resulting path for the above example is `/v1/users/:userId/posts/:postId`. If you are clamoring for more type safe routing, please let us know and we can look into increasing the limit of three. + +## Manual + +As shown briefly above, you are still free to do traditional routing. This can be useful for especially complex situations. + +```swift +drop.get("v1", "users", ":userId", "posts", ":postId", "comments", ":commentId") { request in + let userId = try request.parameters.extract("userId") as Int + let postId = try request.parameters.extract("postId") as Int + let commentId = try request.parameters.extract("commentId") as Int + + return "You requested comment #\(commentId) for post #\(postId) for user #\(userId)" +} +``` + +> Property `request.parameters` is used to extract parameters encoded in the URI _path_ (for example, `/v1/users/1` has a parameter `:userId` equal to `"1"`). In case of parameters passed as a part of a _query_ (e.g. `/v1/search-user?userId=1`), the `request.data` should be used (e.g. `let userId = request.data["userId"]?.string`). + +Request parameters can be accessed either as a dictionary or using the `extract` syntax which throws instead of returning an optional. + +### Groups + +Manual request parameters also work with [groups](group.md). + +```swift +let userGroup = drop.grouped("users", ":userId") +userGroup.get("messages") { req in + let user = try req.parameters.extract("userId") as User +} +``` diff --git a/1.0/routing/query-parameters.md b/1.0/routing/query-parameters.md new file mode 100755 index 00000000..62c0cc0c --- /dev/null +++ b/1.0/routing/query-parameters.md @@ -0,0 +1,34 @@ +--- +currentMenu: routing-query-parameters +--- + +# Query Parameters + +Request query parameters can be accessed either as a dictionary or using the `extract` syntax which throws instead of returning an optional. + +## Optional Syntax + +Optional syntax is the easiest way to handle optional query parameters. + +```swift +drop.get("comments") { request in + if let rating = request.query?["rating"]?.int { + return "You requested comments with rating greater than #\(rating)" + } + return "You requested all comments" +} +``` + +## Extract Syntax + +Extract syntax might be useful to *enforce* the presence of query parameters and throw an exception if they are not present. +To use this syntax first we need to ensure the query object is present with a `guard`. + +```swift +drop.get("comments") { request in + guard let rating = request.query?["rating"]?.int else { + throw Abort.custom(status: .preconditionFailed, message: "Please include a rating") + } + return "You requested comments with rating greater than #\(rating)" +} +``` diff --git a/1.0/template/default.twig b/1.0/template/default.twig new file mode 100755 index 00000000..f12e7f22 --- /dev/null +++ b/1.0/template/default.twig @@ -0,0 +1,199 @@ + + + + + + + {{ title }} + + + + + + + + +
    + + +
    + + + + + +
    + ✎ Edit on GitHub + {{ content | raw }} +
    + + + + + + + + + + + + diff --git a/1.0/template/images/droplet.svg b/1.0/template/images/droplet.svg new file mode 100755 index 00000000..e60ae92d --- /dev/null +++ b/1.0/template/images/droplet.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/1.0/template/screenshot.png b/1.0/template/screenshot.png new file mode 100755 index 0000000000000000000000000000000000000000..317477678c2a03b503b58e67c1731b42530f9fa5 GIT binary patch literal 245289 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

    jYTtY$s{>w2N19F1@z0ZNo#bt~S zG-fL1!NG~46d!#;MPCXPR>X9CQNL9zn!m?zv7GdAyT89@sa6xh_6IKvOdS53Z=t?> zP$!j334e*=V9w<@!dLN)Vlk+fk9O?zN}SBT_Tsv1=O>0?AewjLZla9i@X%0x2P-fU zBT(8iL*}eOVgtyGrn}PqIlq8RF}p<6-u!FZO;CI93I}Opf^|EarpuRVhikjJRFe%{ z6)peW;bg_0;cl;czEJFSA9zM4L6A`7aYU7YrAR*;(hG4@v{3UutcZn}r9ThRAphuIQ4kI;Wv#?~f!4}M zN>Uyf8tekaBZvF)D>`6n+45MlihqlR()HAYXl-qM*gkFVsqsj&UEb#nn=MhUTy`ld`(gn9 zT=gM;PhM+2(C^I~Fon!O&4X$MGWp?nqDKk?gy$Ei2eVuM#nSx0XMVv+%6~iZym?1J zM4$pDs}h}!SEFJOfo(dB!3WmMOOqm!+;D*}sW%Hzxk}nJj5YQXO6{=M=yZK+Q;eQ_ ziaPvwBF#s|jGhO-Vm69P*1{X*KHZLd^<4M5&#P}rRtrqd%c)w7cqa!c^oDuM)2(IQ zGtzv$3Zj7w01$#R_gLZ0%F0TluuHoUG|kg^{~ku|jZWl%6bOpk{}D;F`=P%oLK`YX zE$D(AVAsU%*ASZTlYWl;dO(l3yQ3ptkTwR8(Kf9!qQY*WOkZ?l;dcljt^^SEy_b|w zc6+S9>v`Vfu@NWRL9p@ObMx9x_s5M`w!OdVyoc)>-@VSto(qbKaz96QQq)9KY=TKF z0E%&jBWladj$Frn0ak;cHpEcm1ojxql@{jH55uTZytCIe3 zRD3)sH{B!W3wTQbxq=K>W?8ZeGS6Dqz8@`}HuVqya6U*OD5xoo=aWWJP|>Okk7z4;p}watQy+49HJ%(hhv?@uBEzXXH><7?Pg$pZg2~T%VfI589S} z7i%Iab+v)Pln;YgBm|(z;|gn%f7th z{i5uAO8UV-we89A4kpQzWF`}lBn-zEfk$yv+F>RJU$o(q!BK2}{K z-cRGdU+4TBl!&VIiP2eav(&Pdg-zepbf5`d5_;z0NW~%I_LtHBAdN&fqWJl9vyx2% zmatqXE6pVJqSQEw4tjOgKS ze2P6_Wnd3HX?c8jta$fDZ?G1#kwrwJ>55|Wh8U!zd{`X!_IrPjHXncr| zu$^DM-|B2%2@)Be+n&y9{z$D1@~^6rpF7Nh_%1J>i!Z|6E@c`GpijgwTrO8|bad96 z?E0wcBf%{}U7P`dk&Rtb(tkMkdqE%K>BiFH@9!Iikf2wVZ@L~ZXUHPPVjC|+&|}%^ zIVI%&hv53hM1HkAdDwpoC-6P zZG2GNj5!)LR7pQpfP^GCHj53O(3q?|oBel+uLMG_sef7moNwHY<@(=Au`hxI3NH@G z8miq907%MgO5pbnNdyH&rGSyhA0rux{sg@pcXu)-&=j2vRF+CbGWrJku|I$Mj@=mp z0OP%wCZJ$dvO`m|^KROPl>^2P?Uj!rEvHwK6g1A;g?z6rAnzxbm)$m4Q_KfQ^|v5R zXPq#gqZp>GK6FwR8=Gi(ZZt{i&c0vDH+Odg5q9v3@mrHU55C&^NKHhtU@ztUKfDx} zP9^!(ly$-S!bwvp9cIn%tL!v6(zQIj8dW<3$OrGVuBbqaqCE|bfk)0H9}3H*ITuZx zAf_b6r9aKrIO}0ZqSNqi(0Ns+(W-{lsJHA*RM8Ci2@-tS>0d8=aG`>Ef}L2IiHt7y zo>81gsLR>mLrr#DNPr|J8@^omp2=maA;z|aiEVq<(lqd0RzygPCm{kXN@P0$%`Y~Y z`L~Dwrh&7eyK;3@;cix~G7eY|ztTwZ6C_pLiejKtdg^ejS_KS@XYH=o{sF`EZdc!_ zFG{jr-=Tk8N6sMOxoueAAVzQ2PP1m$)<$lv7eun8`0Ko!tb>-%QDnKp_A`ATZQ357 zXjB;x+g}DNVq-!4$AZ6LjPbP#kGM5g_?Py9O*qqA4B%=cZpNx7hs^z^;TZYny1Fl+ z5it!U1iWm^SpUR6|KVg?k{~!<<9hKKs4!Nj?nZoAs)xQ?n(&{+> znU+I>`v=O>I%R4|PfKmBVGnHX#N1kNZkHecutUtm1-Gwd`;FIbSZrY(!~5=9NALQV zSZrEm0PwD&s^tYA6cD}~c;8CAcD;j>daDv9fTfXwkv|`nko1uq`RD2XK*ODIa+(fc zkCy{_iqdw9DX4Oc3`L@CwSio?q|R4NKA|fT#ZZ- zmvbZ;E+?M3GK~mS>ZCso@7LQ|+k9`QTm#hVp>gt@@0^hG#J{~7P4Qr<&TwcUA7kQ) zVPIfWz1U&ohsWBc(l7n6@cJ$fD%J9m(;gTcTBmm&uyteYNhFA%J4jqn^&Sb_nam2V=e zfn8zbhgBa6UvY&Y9Pnp?LCA?_HZ?GUWM8hY+eP)j?m)6OIhH(wCgFX<@> zy_Xh0wBryL`E?S)((wXZHp2UDMI8{Kp(a#6@0k*90Hmro(C}c*D=etintxRRf?FF# zXBz8G{t}n`RAPL8vcC#jn;=2{9=vsNfg~1Et+E6foRjLEXDXaf(TYjvx6Er7<3&Vf z8%mKgH6#T)<8J1q$NVtdHB`?y;r3TltZ{q8VDkjInDwjv^uZ z8WS0NZ^rDP6&C#D9(i$_a~9H#JAL%G+VaK%oZP4__--PX=KC~lcxJL=Wb1+QTbhs5 zp-m~0GcyG~)X3L5Iug=hTsU&G=xLbwNzlcoWd;W3yOIxFg;yHFbtlu2}W0{Rtr78Zo5&WgyhuJrWupkZ3WN zS6PH%06;?2%GHGE0b@k~YBE84_Q8a7bTLeS&IHCMn7HqWb1Kd;#U=CN#BlXq0LzGo zaN9FC^b7TV9J!SYv%%&);=DX5j*M`4j1dKmFz>h59BfYd_5rPVz$#ZMww>hoOaU&_ zU)bjkYAIjypy#j^h3q_Ea$EyOE(WLS#s^{H{(b`&HPYS|`BJr3Wa=ck9*phBrd$U1 zmpGo4o&{(p?c>t>W(*`CS=W>7J}J9f)y9rB6|#2l zPl8qZ<)x*IfdC)9yLh~P>yvvLNQEls*G7LC&o3Y1cQ-o2ZLIb*8b9iD`&npWDw7@B zN1e!CUvJMmLe1U0-RlI|P_TCfTFPoi#6Erz0JoCbk#z%+CROxd? zCrz*UkmE4W-Tr3Ha{Ji~$cdQxS;|};E1q(~j1Fj+Z`4G?e3WDq-wH6#*by@LO|F%` zvqN$hH|7ouHS%bRDDmn4;04ZK`u!OMUyXqEz7sgC@gjz{=a6x0=6P?_UnW1?an zbf=GE&^TRU{oB#p|f_T-GfkxX) zJG+G3i9TA5xOk-8KR~^p-pb520g}FuiOJRNMrcYZabOgDACb6&Zfk1z-pum)c^}*) zf+9mn+EPn#bV&`Q1N$lcQ6YTN1%97j;V{_IOmS zkzN##Qi3Y^>;=3%hisT1aCy_tCcBE zLqja4R%W7B(x{9~HJZx{zT~dIW7x8M@a*kPfaSV0PwpO7PR9{NHl~hnM4}Y>TJD{X zriG-shi#1HxgRNo%eGz9*=)L=W=rHW8IysZwo|O#kUX4Ev!~R@>gi>ri2RC68W1D) zMtgI6B{POA=H%tI_X4S46P!FZs~LRI=v3SMA#oB`DUFO5N8g4^iZKU(op4$bmhq{X zXIq57j0`X0C%lqwhwjdt{fnOXoL*t@j(f+n{;agjEHa36;ZSuJ(y0b&aW&+%{l+Y$ z(GpA&FDftZ5<$1h{-{-4yS2iWAu_)x7(NU%H8bCN(y=YCtJeM5nNC##^*Cp@8h*HqnOf=}ZwZJR>sg7BOeRFaYGs^uFC&jCtNyR#o|z5a zWe)dqw^~*DACnZIlfE~^%vaWwgji@D(IBw3Rt~BKhr8kL$7UpkIgD|H*nEWx06fDy z%Qu^_-Tjp3{`Ighdfbp!^??*e<=UHbALO8=1s6Xm{l%~vGY>#44ei)a%JY|~)gJ^Q z(%6jzNy$J+$Pq*=lU?2hXLeH#Vlw&qrA4%|p|;Bm`zKN%bH|}W!Uj4eRPh<`XPyic zQI1G%QoJvXdM(Cn-E7hC^1f=+65mO^pALL+{;@|+cQ;!zbrzHpqn%)ax+^2`MFZli&+x#kTvaP4QW(>Zb?~$vlNF zkx(a*NJ*E5v{TlG+?mpBc8RGG)TlNk9OHNw{Hy~kDlZ0i1(H|W+gAqqZ?Mm+X{>Kt z>^qD^(6u3i0nW@RR_f|mnNA(Z_UyitjYgSf+q&E>?z79=?Vq)db;(%5m>sfOD3?d% zEG(_~qPwD$YEU;5r0;6DuEafC6RKW35rS7CcTKryPKB?Up zlnnw{HiL3+M1w#2OA)bbm`z$m>6P>OswDL=1PMg>sx6hoLPaT~QbVeKZeZ`nh@|YM zs?4rU3a$Eif~d1qKmJ%K9quX06_~-cw0V`w7rM3wWE%BqgbYKiUJkQY$)pVb$sEWZ zz}?%Wx?@mL$wD}?$!s#?<^d1W4ZB-Eab?>8Rn8n>#e z*nA-QHsO);q5ntpB9xp%d`+ovPCNH4cakE6rs!~~7GR=};%x8)NXvm4LHT)Bo@Axb ziET}Zd%13M#OMoJHvha-oF!9P2gy%LvW(J~^5&-u)jnq*?+pRNDJlC%G%bUhh$P!z zc3N|)oKnLxS8IH$;sU=jtnw~S;L|VLj@OT&^D+tm@RY)zo0kT$td*V7lo`t#iP}^LSF*XVhL? z@^jIg2~uidbqJ4;A7oR7(i)s?_$&K^gAWDxPBDQiBh^8G5)c^~o&6ICIbW(8tVC^= zpQ!1_Q?ScCrT?Anx2DW-`cy;tCgP7b{Ad-S#r3yqhUI|T&< z8G<@=%ao!z@Il|BrU%^}B=#nT7`~44+|%@yAu&!XWKg6Gvtnnt_04Js!?$aG4yTl| zuQIy6mialNr-O`$>QIrUY^$D3gSc2`k=OLxdwT4uI+^%f-gk0h+OG&eGTApKq~}8U zGD>?;n5Zx2!9{h9CD#Gm-!q&NY3_szuFgHd#Bx$jVo^eM-T5s|L4X)mB7*tb^{7dD ztjzsv#SH-cn^CbP!T0F|tV7+&$iPnF1*%fZ@jY!UJXkHB)v%haWj_Z%>zckuxthGhEOG?yp zwGEvM4I5kKh@2C%*7zGGhyx35-?CeR35xn%#!PU>n~IzAEKX_mJ=-~d!q}>;>}GF7 zkghHgJl0%6_hm)Kki!_BpN*qjBFTGD%2{4XBgVeZH@(3YuHI^WFA%pWFX?P?SC~f4 z!0nI)M7EPAnLm}6E{<6|!{86^UbM$q%toXRdpl&L~gP;>DOZ_2GHhN`BtSV9V` zpt=~L7U~SWy>4sh7MN}eFVf8%E*hRr?l)#sR8W`k^Y^#U5kuZw-{mXAw$e*K8U6l6 zl)Uv-{r2{XFnJ!K?*+S{SNDTfass9GVDlI~+@&V{GfGxBEpJwS<*quQ46ja9ji2f* z8##mGE`vU8@Jg;V*|2ch9q4P>C;#Hpup+f7lj_?lj~XIBXU|DME&e*)HdlH(pgt|X zr`IoIhrRd%VKxX4*>W-OOn2UlxuF{RBuAA>#kPrNJc}!NuXNFI_D)!XtKqX?0Q z`FD`^6xBa`rGv`97`FW=Sli=x+NDKZR;y36 zH#Iahx>~1@WsO{(#23xBX)AOt_0Yn)hGk@ynvfU-PuKWqkn;B!NC{($(qE#-!wtVY zB7o11FdTkRoFkYQbJR9cKmY8@Jy~w!;b-d5kg-8}?w+G{b}d;&Q5kPM|$-#z0#&CV`Iozh!%K249= zDtf;y7EX){fNXrwHT{+9^hwiX@BMO`4 z9ZPPhpI`q3r+wv;UuhlKD!rj_mCic7nOC&xs$BJ}B*jHED>ZIDmmoMcu#bJl_ky_& zzt+tC8dXv^cqMDy)GW#yf|)8q$87(@gz2D9-h=db!02x4n!b6#=<8bj?nmb7KqnKU zFLd17KWMb-{i6y+!JxY)EJ}X+2?@oPd(KcXRvA%jHcU$ z#~*6+69Y0qCx7p(utk6-8Ivo_dCW3_`z|gRVq6IwDJ#{7RF^JIZ{6DxPXs_m=Xe!b z^iRa@QdA_m%`!+)ZZunnJUZaAf076sAYvQ&(LCGMV~8ByJ>O$ltx<1fLKK@Xjz0Q( zG8d!5CeZG9FSo56hVSK)UcMy7**<5NleCEAl16{@n~=1VLyE_d=u*;3ctX4a#x(t? z5k^uh`Tb^68)RRbq^$us@k~?;+TPkqO{~WlJ4-<$B^`gnR;cC%{j zV0R@UAtARu2Q&*Kzn`ryx86slp=Q}<9A0qOij*Z!)`rug1)P$YAJzqy6H{A@$n3<+ z&8@CU1FK<0dPhzqU38l?sIB#2P>p)`v3IeQ&TS=kEDeDNd;J^|FBS$Q4h+4dmS)!WXFa5(HRNhk za|ZaUkq(TQ8gZ$KiKrNZ0`14(Ipx6DypVRy_MpGEpj5Z12~7@X!97 z^P-cFp)?pPn34=t@dj1xjQk+;$M_|AfmHryi*W}X(3FqZSvk8Rb*#LcjGG0Te%lrg zl+;rQ|7_e9mCLe{KE{h}e_>^A;iBfV?sP~>K|ymBZ%#s*U7G6;r2{Wxq`VaG@5x-L zEh&aRMTwL7_{(9kAH$c+#{MESg3pYG!4Qy&~$TCY-F^Ow-!HJc(eGd;v8%}8Af=b zyCTxG-Ii!^cyQ`+ZMp}7zq+#R-Ay)7wl0^fC$wmJJ-u$p{FV7z{W?f=npFmfbm+}3 zCGT(s;-Cwt*u$2bq~jtU?UlDITyX1rVi|#I4WI9+F?YN+_8^6VlMA#o?%Q#*%<6cE z_O?f-9bWxVD^qG5tPj_3F=yRDxiiC`WR;;M6^Y#Q=*WVHi`jQ~x*Yd2eQ(Ls{|y7j zxL9hN&8h3|Z%meL?kBkda0PuCQ<(n4ML*PKn^?;;PibLrksH)KVsc9RIzMNj7Y=wVXf^D44M z8rrU3OXf4eEh<{SzP7eXvB&en*F*kLz!@1Dv&$IXy$S2b>uuWC2^}tPMCMt|kohJl zCF6|gnB{t-N2x+beWobOdj?$$PuC1Mo@Y&Be#Ew`_ly}i^-cam-q1cCduY0hT$DVhp_ouXD&UlN*W z`nbxyL$(<^>nJzH7uy&|v?`HQT5hRo860f&72+-C`;Ls8)YRUwmnn#X6jQTuRBDCKV`F?@Tf+OC&I3my6R$S5dgcqLaiC^7P1@cDg# z5Iiz^c$~kni98X9+-Lr%tibU;mdsfEojH+*CV6{2>v&5FDN2xIh>z`ifkm()%aCyY zQkRY1aN0Mt8&Tyx``OTBPR`+XZaHB=ut>b9>wGJ3cwq`?F~Wu?+_^kVm?Vtp10Xdm zJ-rFWcslWuLv~k?_z9)~s70pP&UwmSCRfGEi>H}uiQ;=N`~CW_J{az+1%uM*BjFOl z&%E}nxOgXpL`%XY9dVV7Ony0jylnMZs47Asris6RoC}4Fx14s2+~n(1r7g`cR-;in z{k#-1gG!H8WT)@so2P`3dZE&86=d%Up=ycECDbbY>uYI!8 z8ew+~lkrgKUN@WQ`cq#yrut)lNH#QuQX*=KE}y~36A^q@vbHBAz2$0nQPsDGXgN#f zRdcb)-X<3p7Y_$=wkk}_D`ELCGvtOJhJ*VKnA=}a!0YRDj8M}|MG7NZ)in@BYI!`I zx8%p%B9G;8_@nqH)+3UV(8wu{iVwZR5fvWt5;JJE)+)m|j z8)&+@W1y}nPncurvS={a|LP(GCqVKrNOdttp2d%{pU$5o(5BWW8lrV{0$Hu>DP-nz zBxGSHMNv)VV83&_Px<#d(Ft87)0kzZacC^l5nC=q7{JH)H6g?Zoh7+;2E1pvP|@c| z%s?_7{!mnJJ7piM?&O5JU=>F(uCl<@0eOU^61VhwB<8OUrth6JsdUv;baXfgfsWTX zUT_j>BR{BJ6iI_(H}bqanjQ$W#7T7@(F|5`xWWYEOGjUFfx)J3g?EFsy6I-%0X@KQ zd4%2j4`yp+_3#?jlWlH=)Inuxc^#~hnnH9Tu~d+507#@GxY!4~7)1LI92g4%qgh812v2)e;DC zbxY48FG7aM`4MH&7FNh_OPD2c$MGVD_MV{aGUehtF*dEh1dg_&2a#=riH{zU`qs!5 zF-M0f@r?&h2V+tukz!h~xGJFTujOKzeH1Vz@eyYqMwRA8L~er{f5}7_zLC5fdh4O= zUzL&24|4BSe7{xd@r=c}Q7?88ZM1=_TDzU*?q6j;VymW*$veYF=XQ8kjGO&?uLpT7 zgb3U{N>c%y5RZ_3kPTcB9Kr;Fm2ck<_&qe@3?f}EE!O@14LTCu42Ts%*q(ZWMv)8qU&P?3?6rXegi4p^B>E<4qTEQS4GWXQ-Y2(4Yh7d z7&-QsmDki{YcqId-$DHj?;gE;CVx#!TkN4JEE}^1XjvjEGg&C16z~tv&$@c#_>>ta zzuVgrf#nS=9b`Ea;=5q1^)mLq?|W-PcM#*w9Q~aP$M9qO>i7Lp);(K$oB#@WfT4Re z>QY`o(-+#^BT{hvr52nQGST~3$bdAIjM|V^F)vZJb35f=TI>@DF|*TRpr@Fpb_X5dIXt? z^~@26x+YA&d1}blLaZHwckZ)_`PsI%`Q8|vPgm&0UUKeUIwl$!|7f<Mr<8m#z!#H?ri8!v7HOaaHiUf)`eyeB zkx=aKUV}$+2ruzle8@9cS4~2?+xZ~k=RXkG8bBy90si~cvqAPX4`9nZlxGj#R*w6V zM>2hNOVYVgS&j$M=Rf_a7h%tXn(2x2WRP0Tzb+|Gw(F#JBG`Gghwt|+uBjGE|MAtp zT9+M&$!B7+V|WuDw9~xk>$2-K4~GeSResr$(dydrVA9xymX1!JXpw;Pk9!K6fM<() z8<<=SO^xg7JXqi$wnaw1C{y5ENmi7x^*?w2Oc$!(h56QI8??_rc&%qVv)7bsimnAg zyg6MDgz8U+IOjiDvn+&A<~n*K=WHSDy0_#$pKfZAt;03OHwc-3%Ku$}dT+Z{vK?$E zZ3;0;49U%egcx?I??4pMHz$;vmuNsvkmS{3icXF|M9&_W(GtBJ9PoX!waG`l!T{gG z9nqcZz$^dxU3i^sy1#z@-`(N=7j#vSKzd(o?@PYv3KC^6U&a35Ax$XYs?5S50h0ET zR+j0pZrs%V7)fVCC(bjVSXJ@cfhL22^C{$+}S zI}_nPsK(8NoOCciO?Ho*fM?1VCowP)b!};UwO;L9f78RYY9%vGxUu8yu76e2YD8P77Z&tZo zTVX{Gkll6MPJ1b=Ds-XCTxke|%0?gGwpGO$&B%T~eqL+}oabib8hL+?F)m`0!d5F! zx^_9acfhLR-4=N%zO#J!O$d+ezYTzqrO|t}F5iBp2)I||4&ju)AI09&UlRPsrLa{% z*?{HsKHH8#xy*e~Q^aQj>o1_xe*Rb5C-;L{d#Qey6lSoH>tbR9;wW7m=`-V}I2u?b zLlIYBeW(q{js-np+iIkVWmPmn_Zn-ws7|Fzp@)zWRvKw*QD;qZ|H;;$7@|Pt%+Sd& z)#lge>jelc1~EITnA<3_?cg??mF2X6a~Eo zdhWNkPS9QH$u4Dg&?k_<)2 z?HHGTVz?bbn&lE9#HEYC7x>^aKR*#arx_Eoj9M4{4;*hBkGx?b?F|D0yn6y|VI(^m zg}vMHv3sL=c2yh9F_p_S{bs@?PAE&VKVcj*^M?h&B13|2l(-FKdeS!}$S|Mk(s+yY z2m|>CXBld`;otnq+1+7YWdNzWn{knCeq=0DuNeVI(WLK>es+e?!IcD6A9^ow7h>yS zB@?hJ+q}NEt;G)4%YVAOk5q#~E=}AP?m!V2HTC0UjSG+71aPlbf#!~ZFYjV5_W7Y( z?Y~~odHmIKct^h8W|Oq}-CL5%NRD^)o{BV5|d!RcR=$p4YZc3Oj0w}Uy`9!R& zXuFBCDgDMAO&q2+=fbF~0n-WzUn$A~(v)PJDvz!%vKWo|Hjtx*a zeGOvyP;;TH0cm|MWk;7FH^TQOMMdIH`^Z3sjsG2|V|Hd*6oH#tD5p7reWtKA7dea zUO7>hZTk>)l2%nP^vsev4w@_$jf+ZyWn7Ek>gQ>@@uz_yjrM9Lvq4OBo}E{_KI^;r zk=vTEe>4Ju8*47Qvrr(rtvg;U*}>W+BQIOXrf>^9;e}vXmtrIM%9o!7-(_Wu>Nl|5 zp`XP0Z>4?S5r2|F;5{o<DY%oR5vK6hd7hCH#JCgc*0EF2LQkVv#KBVo zYZ9i)qmw)uU%c9kj1JlECyLIU{?@PuJ6X6lLUL4_f?M5gU8uCjbds!g%@K*vY%rG& zHQCZW_BApmMn9WT;rZTpNB4CGR7HQkPJy3FGXxyK9<_(?u9-k72#~&> zhv-H=5dr$DH1XtvfHxDX+zYl5O>yCp$uoW-wvgi)7Wy?I=}$XWwx9rLXpGR)?BEp@-##&rZMZ&+4{iQS z2BXc|21{eXBGq^6Es<$&o$Ij8Lq-&}9jQ-OLpBrTU3qFkER5IvA!5U}?Fz9ba|lZv z{%(?%DQhds`%9n?YNNw+){OsPe`*guCDyNS8W>bQx#fU575H1ibdp&vWJ#gA$pv!< zhRK0*ojIf8irlIlMxH(nywb8G(WDQzq-r9^JS%OU)@h3QJV|qm$Y=Y)_R|j`&8)EM zC3`LudvPOQU39i_Wxk=q1sD6c+al;#i3@p-aJO*Tpret_ZsON4T{K9is!Eo03CwY+ zPO7aoG=KG$cCo35((dNFMGRLyNNhsvE%yTC5&^3~~-Xt`wd zlL<$bzdV6?;GA#B{WC!|qK}T(ArHW9-CSDC{#~rR^L+k%`W-j-eiCV)WBOU#=@l$* z8^gw1f$m~ld>)fiwsZu{SiiYcQn9#Nk8tGGs(K4b?FU-Hs8K265O}jam`cT1OrFLOp@al7MrSmRhDZ3E| zGV*Yhiw(z?Q0FUhz(dw>jCt=RD3teRIb<-e%Opxh0qSXs%uhh4`-R@F;^v0|yDiuD zLn}`SDrTp4Eh70gdDO=N-KBGk=4Uf+F;2Fo57cJ9YZb8W<429vGR6KYfyXJj8}Bvu zxV~{pPWR+Y32RJ;JQ~%l({XeX2}J(B6cM=;Xwbs1v54=wLOn29A5j6+Xwa4fL{ran zm90k89_NE3sW0PAHfv`j`Br{fa~^t(Oy{dtfA*8S?nf#x`ajS?XkLFFi0w{}c_ed? zsh|p06(jw?PEyI}6YA(#l6s=GyR>Lct;1m{=`rG}riFQHAW91~C;ZJJDq7Dnk0Ojr zFWGjv+uwlO%_=N$V#u?~S$2I5-l$`Ioj8BO#*3ys%m9fX z3@_93hPW}-K?qvhx1!1=1Jq1L1N)dME_K5b@58*VZ4?{4n&6A>=JWNK$)b<4?YLq{ zI+3Iud!sPE+WEr&D9!Yw>)3AicNS6q%Si$=1nKV~vMbbnk11k@guS1k6{{*Bu3|}} z8Me{or_1Z4*XbA8O-bXWgi)W_<({iz`V6;QtrW)#b+rdP!KOWhHQ_xt#G|d~MfZRT zi4f##N^>_F`k;Lmn`5membGY&52Eb*AEPSnI8SqSH&06-jzPW2e}0i(w~^HqzBzx( zwwkGA+t2R#{#=&mb=KJO6`xJk^%bn>=NB?W5xT+)4C*$a>3%IO8BmI7lEQI0^0y7Tn!+ zaCdii4IbQKfB*x*-8H!D;O_43t}lDFo=I=!bOFDznSX!*U%lQsW-_+4|GiKg-guL3#wF!M5yVi zc8^b4klEBe<&D8-rg0VB*0phQj;e}%&H38E_>jghb36=!bXO03V~1~BFAGp*0J}aw zl}d*s`0Lic0uDkyLIXj>t$z_tTm{P`s8UBA$ahVNyRhPYr`UIftAaQ5Q*)ynlPwoq zAsR9fa>)Og1pr9kT>zGqYN+K!JQe4;2jZE2FLtG8;`s>op76^%bBm+(Xk!TRi6$rH zr!DXX4bY9pdZpjxm*M8h;l2O5aFE6f3}9vUkj3LqSqjDjPpxHrE=sR3%XrfT%Of&K zpY$7E!bp;A=FLF3YX4Xt+~0&#m&>6kZUf2P5o4lH&57Z}O;2M#OCa)SxW#$srA-C@ zm>K#3$#Y!oe!LWQ=S9F8EvSZAx}LDzr=3}PgC!fu6#~y~VkDq}Iiog}U_i>=wCL_f zx`b-n!XYA>>^DvRkod&FboJON(@!^3ux3Q7DxHpUhF;tALin|u$9!SVT=r~~5k)@5 zc^zp_hi?8Jd<0>vqB^XVvaIj*cJeXDxg%&AL|VtzR0GwMP-Sw*UFq1LsY$9wt^Eq{ zeiy6!dQKNrSq#`DZ*`Xp>YijPg6vPh6$8w zH(7J0+u`sh%mnVPNNg>_uiEG1Gu-xW>Yb5&9!VQ>L~Ww=yaAQriFyxZlg%5ZlYA=P zq`QiF?yuEaF*K$IIZ*H0HI7(GTo)(#RPID$&2>be<5kM&njQ?l*5=5D!oW zubbDNSM-;kEt~xJe(WT5U?lA{7v|spkB(F_h?9eZ^YkQ$(WpkHQKJoB*N^@x{_RfT z8~NbA>|gnN&cp2b1o?DB&~e{{lenoK5Syl-JiMjw0IX(EYGXUJiYXUN&l$_v))JW zV&Y4Um}4}`C8|I~K2y5bY`ft z+lYvoMZ$!ktG807Xq}A#`T9`Fz$W$a<#V&~<>HeIVM(BP&j8mBx9GBjWQtC@u5nnl zg**);1zT#59O2^xGHUdlAY8^rm>Ngg6q=ZkXsEF||EzHsS9|4tpS?-lrl=p^m5~n1c1z2m zdC3U*T?o$hQWVx>BDRy9?C?R<9_~$irF}is;tT5R_7(|_7_1I>Dw^hNX4hPXQo0U1 z-ta=$AT|e)z?qblK5YMSdZYWEim^~P@`|z#?OOwRu%hcn=oY7W*F;3LZDt@5!6Z7SC zGwDl&$%YiVF+D=jlgc>U+;!jyTp~batCT0UvrQM_0d>AtBJBL+K`X|V@|Y~O|Cc<1 z_-5D`db%>xH;Hd$H~cE>ag1GsfQ-!#hkvwrBr zu)8}~Pf_`5C*DMdH8Bc{=gNW4N4DTvj`bLUawcfp1-Ma|zt!!r#lx`Sd%$(I1ZXH&}nY_zF>ZZOmh%yQ-mb`l4>`Mw;Zz_uF&7*UgA3 z#Xmu5sfyDr&iEuM|Jq&|74K1`yFp8tBwE;AKdzu|?!E>1vI<@g+6CT9hT9m$*1OZJ zJ%3>vfOjCdKchL6+QLF=dhpSwy~M8u5KmS^{`=p%vn%=&(a>XS!!Q;xk?14#VG2y_ zmC(v|ex(3E&Q$;t30L34TWLwTgp$#J#C%OmPY2dqX#ptv&bXk8L_m78HkS)^T06aG zqQohK*4f+jc1I8m>Kn~{U%u8eDLcZp7U2Er@mc-l`p4Jn!N-?fU*t4p{LJTm)wcV! z;{Jj)7||~N;^fS{!SAf4iC;B9_w!>{pK0@p;eDYkCG9!3jL3YCeM?S?_tVx;?zo+J zTc{74=Ze=@`Kq6})9UDUdu*|{yDEmSQtAb(?@0F%eqh2-YY$@GxQUU2GSw6eb$Oiq?W-jjkpI|>V?k`E3y7iHS~6nd zY(p>OVl~m|GxLQC*T96cyBfjWJczg@19oxXD?2GlL z)HY*E!)o$^(MNm_msX0l^S*R%lVnS=yQd+{5KY_~_~}Jo4r48$DH^QdQ*<=mx0j*0 zFh>;l%Lpu6F1z`Uu{zx8RMb)!W{-Vrpb&Se`u9%pVB!S;-y4lzq&-+a^Q1QN-w13Q zZJ}r7j^6x21v%G+svl3Fl}%Ro=BJ@w-@=xST8G-G{tBX=%YJ^{Hf8Al1)4vUui(Y zMFF_MbgRJ&Q!O(V-hEE3m{Ke(O=}~o<5;&wjZP$lyBe55{YtJlC&JE*pn^M63wqLc z9}$SPEZ8YmaJqEwIM%h5jJ$CL`GqQ5pB{^u zrepC`7kjbWm8BSe*~p3G-P~OnpW?OI@YY714^(EE2bo0d)1j=Bg{z`UXgR(` zKqqFbE@kvgPGLj}gJhQUMRkCYcP;4+`=++Lt*3o=YeqIF8KLUo;jF^WAFZZbq3y{EebH%h;AC=$1lOQZXASVzZpouck3wq-BTTNPvR~qVHoeM$je(+@!A%Ug#)GkxT553{5#(o`&{mb@l2)SpkfYc=cc*f? zu6Ju`rVqs1sO-d~CNS%FiZjp$d$GER$E9v1nKRxOa>lg)xnoN*qrhfT9^ zknokDsH^-)fK5!ET@^4&87h3tt=I2y6o|Y&T6%FBk)@ItcVM1#8{5rD4P*Y7D&C5v z$l@;M6rGyf@bGl`S-h@d8wFwNVJ0JK#LrkxYCY!rI`Kd}EBXEz>Od`PJHqu={Zo1# zA1!$MdsIqj#UIu)G}3H$YlVtE6mj+ab3q{+q$4=zi_AYs9)H21Nizr0#@eMtnoYdL z!PW+NQV(Qej-$ffwPcq_c_qskJ`MjhYIJ_QT_31qBY`3F{XqaC!2b$%=R+Aj5d{#d ze!+ebiG@sFh9BhGmnP3ud>sFTPE7nx_LCWXwjRk#?o%_Wq*qqv5{eI*@0*tFY1Tw` zPn-QZ9kjg!Y#udw-d*w+QiAMy|Fxk!HP@=K9C4u9&8Ov9!M;!Rbsmg~YU61nabaw! zUA}y^KazLsnB`917hAE{Z3p|c2#x9s2fbDH+_xTI+g(;bNdeQ$ZWr}X0(iPnG)G0Q zBFxeSwwuBwVR}dNQRpnqrrp<(t;gGjo?O6;NGCT?)=3{m`8NkyTf)(=K9VNOleCXK zV457RAN&1<+gB%uPjXRWcmqmHHWm0K)+~PU55|T_G1AL&wVSXn`Hsl^<07tcqNz{T zBTtCdsUgZn%$MOOGT;0E;n^|~yr?E$mF3?}{aqwgWCv-4cLzpGJ8BzK$R-0Rs|Zsy zB1TZ{oJm<6MBKRLff$AxYiTDwIn1PNJ18ftVCT%_ zwm@73vImK2VedxzP-f2qcv+*EEsoXiiH$zQBrrsSC1SRIzq`u)okea5i%cXbhNzU6 zmBn*_PspUnTKkpGBN$XQpf59=cgHQY|BU3kasDOTJlcwooE^v*5T%Ci%93un+6jMc zSHKQlbaZV@1Q&EHYyR$@u)QuAs|j0ceF+=7H!L%7@G=X(ZodFD88 zhgEin^*;51QKl5oLsz*j;2rt7NT?CJTtqP>%sHxYkxCikI71#Vr+fdP-Km!_=U?dE}ko-TlJ?>xxR8=#>Rt1;fSG&6Q?;8sduL7xSv*(4 z4_%gYu*^7L@>dy5i^<$^&~+vtlX~c|il0>vt`q7hNx#XRQ-yzaMI5-Ksnw&5 zUx=9Jis{J8oYPO}RLP7^ZL~7Ttds%vtA1Vvw$5%wjHq~5abuNQgv5_=)umP-^EbRQ z#-y@#kU2;Tkz-P-ZnQt;Kj>QHIz8G47N#X(Hje z5qu}snEJdm?8MPoF}$PEWptK3$AmlWpf2}yY-mL|#}8u&TKe+4Us0TWCsRL#WT(jTVK<+c*b^RI^|%Mg(b^rzLxf`UJFLO-AK zcWa*!t=mru1(>OAvi^;G9n>DJjQkak+^hb>^?-`fd+jmA2YTzwJH*@>BfVxN;1nbE zu3^Vp&rUxdUXv2GhUZ^P@F$v9ar%r>fB_uhv+B1z(c6j&8i|-s@Ms!c4_-+T&+T#} zM`^+Vh{xs>WO!>*{{R7!C{}83{@xpShA$Fhp{pd*IzYzKrk5=%)aBlT93NbDsqHN9 zj6bstlZw2~@?L;u6m{_|Ywp`ipr5`CQ^s$JDynIl@_OjYAr()v3^igrT{IMM!6lQk zw()hBQwF86R{VN+?BRV_@4IJVX-MFu>*?z~b+po<<{VsLeS2PLN$|mo{F^IONc=@# z=9CyX`Fp-N`gU^(pVlxjRRjGSu5`XpOj=#xo0O(+tuv-$WM@vG|91t}eea>_Xy0Mz zF6@eM-<|kRHsq7qgIpv?RJR6kd6KGr%%h{p+y9!qTP1%h?By^&&%CH+c*w261INB6 z;I}px{l&E%eNga5J~Ph5s)@cVcw>g~lmA8Fc-%{nMB~6yKl{f~rr62o?G-_?vEH{oMNv6SbnInlzjZJFC4Z= zLt$b_Scuve4s;0+X838d;OuzVh|?UMT;S?8$fDVcj^=o$*7PBKrYYDEleSRNeQEq* zuChuFfIltuP44eH{iGme6ajsq>znig%+@Kzh}xk@&Ns9btfuy)fsI}w$psEeKRwNa zXnn=wi@GS+2SGEkHx#w*08fH<`dD%!^=IKv%xiMv2vLPcf7xM zhMWuq!a?7ht?A(KsJNV448*nSeqzWR?V(agP+|#+URw-uGi9Fo=c0;LLuTonk`>K5 zBG0S6Bl-<)8OUz7;dfM99kj$)4frIg6%Ih>$_cCug9l~@zSiG_H)Qi*A*|`8XUuh% zg49fg+aX;4>aJybgG*$wfLN0v&V4FykPGH!#=pDD6qc0-VlTlknC%HPR;pNCsRoncIaqq{PrzDY5?rwXgRw+Al*`rch0D;nv|VkHZRG}%KM zWm%m+LalZdQsp13q!p#P9%@MSeuf088&@zXh-$^R3gpUnS&dzrZ0Qdf5HSa+&75B3 z{R;m3JC=7=Eo^xi9cRL5A*yXJNNz0TEnO_1-4J;cl^VQ!P! zs!C5yGfEPjAJXf^eKlULc#D8B`f4-XUcm`OOW&`eUme~szbE%jltwdJe%QqKWAW*& zH`Z0>ugDDnlhT(8fH6KSE?C`V36(WH& z@^yc>j^bPC!f`VVE!YnBfwEQWHHa%GfWKL6GL(U^$+d#Gg zQY^Q(x|$;bf=C^Ng|`2GWTgKKEgr>-T`rZnM6F+n+0kfm7WA2veoff;*2v+VCTg@Q zi0gRJe+l_J#`~qxC1U&}m}Kjx1+tHsCxY7ijuCsQUKhUw!67`tDaldf-YWDHQ(Ffa z!f1dB`j9Sb6G~Rp{pw#`irI+7icds4Yt-3QGxx;xF7C1U&<}$_>Fy&M6=bPiY=JQ& z(UlU@2Ha;w!}*?WurRN%NWMq4E&a3ZiV4mO_g-M;NzN1?a}Ct~1YZCv$|xa^Smr5R zr2l{Kn1H~~Q2dPC@1bkAVqbZ(v48@rSP0k&aY6nJU-ACgNZ8wtSL}}m=2NO6M|K8? z2~w8Aq|CH-Yu;Q4V&=KU#Qe7ZBgyUUR{b|=CQBPML8`0QI+Gf%MQD{zO<7wV4*J3< za&;;AsN%(4uV-X2v>-fMAf(a(fd_`(TryRCvizFS9ULb)atRF8BY5knZ%&kl-=o0* z^7j7Aa^^&PwR#JbhBWv|UNzd{v=eM5z}6n?akfZNU9Lta+M z2nU%k)iAF+k1z=6Ull&cJ&{`*`_SVsDlWb{k4jHVN(s@Cp$T1uv-1~MPT_tXu>CLt zU$vNJ^?%@oPRw*?QnnER3lgE3Z@1>3p>!Z!@op-OZW>f+wJ|A`p&z$y1eP6j{m_aS=gn;ECOUjSwqPR#&M4?tnD5z?g45qyln6M;F(Z{@Al$uE*OON zx{~En!aL%eP*x^mIBUKhkKz2KvS?GJr`^j~YEwI)y*v|V{h{2)*&)w6Ik*T7QM$VJ zcv#*k@oBfUI03G5PeZIXCrCjO;2&Xji2bku`>2<;1M%!m7T6C5ABF zYu?lSHSO#mHrFQppg{AUW=J0AJDLYC+?ZB`;Hd%ad}M4MUG8_~1le9A54}_(i75d+ z&q|^WK$jO__s1c>;#51P{BIkKdQlFSLZ)Fx%wBh#8ri(n-uyLTWtK8X=V1SFeEC0pIg7jWP&q>K-xXiX$QZLM`@{ebXjCQ zkjo0Gq7Z(uBQ3hAIdBM}clnkC5=zmAF=U zvw*_NtgMK1M+C8`75Q8YGQ$cFDSu|d+gMh}B)RwzUi0;LLZ9QwSlz+G2Ah_Y6^oFQ_h1qBK=YYrDDwmxvzE-j1(^!TQ#5l38ea2_3jR=Zp%H$*W zu(BHC6ioozEb<$&y9EQlsDB}<0fT+hjUx*r#_&m!=Vw0VJX6F$gXP!}rD9f56{#=l zK7L1X%X3q*?Ag3gw@#JhKV7qfM0KD?Gf-V;YKnmJKI7_;+|(o0NZPdhFQ5VRn@ncL z*wTRd>&>xls>kp4ne?!sg2AZwB3YdC4%CY+Wkj88>L&~7aGSsvYu_-l1?femQ56Wm zS~3ntRVYrrBE|JbOSPVwWqlDi%d;#Qi6!U=nO5Q45K|`35K_@nl!=}SEvirM;U>UP zZYYCRb$}gtPq?>=+bhTI7i64z7^dCAivP2n&~kPxnKd+DB@>k|Til94hsA%4&1mXd z8oRy!Tf3ua4DsvSCB3+FjJZRM@xgg@_#1{;;wUS1VZVJ2I*H;#U_dVUl5{w?`1c>) zy{K_kBA#n;6eTt~6t``$uqVthB5pERa0f#hhjQWr$PX7gRElYzhILi3H%yz;{kLBN zsf;!Nh%AQ%$OzNFQ4H3?;8jFocmwXn>?JZeWynlm58Y5eJ*a!J$P^Dp110c zl0>G3CfyU2#jYnRX{wpMw7RCvR zt*F@Ke2T+$sw>7OG-$4wM&MOs5aXn$FuV=?XM&#ql19$~zt#OyaHd2-X~>^+*QM1G z4&e9`H<4iTbK7dTNY)a;QiL|_urNwU{8vFTlU1On=6S|L$5epc`*lg_YLHr=2D$LoD6tGTJlORoAw~i25404jLqzlI_TkN%i4-6e#@hoAT)oo~_ICJ-z z5su35nB}!XvO}oS6ZtB?(1noZysU^|S@P9E45>bxMw|t(c&MRV!e&B|4WkoFRW>= z4*Re&u+PJXOT%47c$!Wrbom7UHOj_!J_*n31I=xPYCqqu)kFvVj28gojXBlD8c*X^ zIO!3-XITE1B9K*C^vYMD00#;8jw2X(a~Gx3hYGGzS;T_eo|BtIInes0pxT@6?>&PQ zz8F~ErN149QxU1TU{vZ2)xH88%&_xp;j0~)Fr{w}7-#i%A^wqeux=+SPkNTGW<)f4 z`kh+&ZE*(cc6O2?=Y!eXmm&znqvFELd*sX&h_OR^ZJrcJjpd&-k^8B9LFqk(VN>?C9*$yz0^ z58B(pI*JJ*>mEYely>9RYs$d>J@WK5}-MWZkc_<^qrPCT~ zsW-f)54^|%BicZJa2NY^`Gkt|9`FEd%!-h4w}n4yKDyLTzeNP(+C_&A8a}&b_i=j zUv$R)N!lP)Fv*RD@2Z{oEELHPJtzM4ceO!oiEcdCqH+mc2jS0|LZO*p}ea< z7Vna2k}mUgw!$Bu#{%x9;!3lTgbPN3+&yl>%4}y+E0MychbMIUQi%J`ub72Ez)Dtx z4MA2+6p4}*>CzHlBHhB%vCrIMN{QhC!d*RqLf4+^XX>RscB+(DvZ-V!J!j_e4SDOz zpi7IC&ofiRs|v&w98Hmy9SRQDzO0CnDLa$zaqd06!vw23?>$nd4Yg}Jjpm75Y3^AS z_s4xY!IsMIH~k)HA4R|op)zuf{(_BsWF>CSPnw+^@798C`!8*0llYlQuodTU4z?Xi?{&-e8HC9uf$u~v}T-n_f z_#*YFJ4e(^xw9_NgI-0s+|IxauAd(oEBU<>Q8L2afd#K$uR^bWQU*Y=DD`f9u#<>H z3rA;XS#=mkM3i6OBWau2)(G=eTUmb5JV7#XTqW&)uc`d!o3K{#r4c2bgfwoIQT}Y3 z@Z0MCe1kPZ`3h#hYh))BKP(qKw_7-_5zj%crJ@m_Ca1*_n&4hN;Q_RmHfgdP+vav3 z)OPx7u>8~L5WdxDIfG7bct!B~`faMP3`OV>DoOre>5W@(WdkM5DUg$o8(so*q8Yz1 z8tDEFq00*Ww=1B@$ExH@C1e@h~X=;t9 zYAG=WseC?-i!u!vR6_w{oJa);#`0ZMY8llS-yV%c%j>7)D7HS;U9pyfL7?#q~z&DyP*K? z0g)^}z`DrOQ_AYwT72{BMs9&`=zn26_$T2 zmDBB15Vec~72a!Y-1Gjvo$9-2Ope{kQVJr*D0!QiBRzFZ)f0Cre^xCh$?LrkCxXYc z2PAWK>=Tw}!?7RRJ`(hz-1o~vsdxQnd;6cs5ak!7!N~I6g<%(7g8EnLgWXup+jMu? zboX2DzsZWR{}`WO!u_vhtPceEsE(>xPBy2|{o$Q#Y?d(t5KtL2AdLzfQ|Y&V-!#C{t{Wpe z^xo}EtFUAT+u8ER9{LF_C@G)5@%Br2g^UVK#L=@9t&mSlS#A|HFUc4L`y`$q^$qAv zaLn5;eSJCsQ8pm)Y6#FOMS`s<#m%>W*CD5a^un7i*&6u;pfi7FikxDKX`31v&6~?$ zZGh?oleS$jnh&t z(v~aMkn9p)O|7Q*W`tP|{-~sjqu)aN@yK1MgIp?lqdyat75vGUjys9Au(H+%y*ZYU zP&)%(KJCRVB=zsa=qYu~9NkRjP0jNDfU3`U^i5swbX=F27H61qP1=Cmv6kiA4-Vi2 ziJ*Z;H{u$*oPAaAwj#iiapaloo~^6_X>TjHfdbr?H)<_BmSH)~{o^?n=*0 z@o(=>*amq4>(d(54(MF$s!otv!@2AI94q`kHNpIR2^Tuc(7cQBzv~g>uAsxMUgL}f zL7n&q%1YXgNkn(3=a)4WmGNbCiJJU~rbfPSfu3dNS$|ZXKBZG-4LxwLoP+(&Rvao9 z-Ty~HH1I%Y?<=?lj+dP!JiC0XI^OGPKYsW@L;R7g;5i{C3Q#y_2QeaIe$7nsUJ_Ph zUk_TOp>QeY8&kC$=)5dX5Aw%DJT{OOAYbZUZvvBK^-XC!iO&r2rn|D9OJI0y3Z^TQ zZv3?hE{Y4I`*+k+fgmqGo8`0F>R=aDPKb@HmK6=vz2THe&fF5Eb?rsuk|%4nT*00O z%$Vd!pBZ6dt}yywkjjj1_-}g|n%M=nTe>3V?=|4Y&yx5%eK$;BnF7sQnT~_hMKeZn zAlU*RZ1ll&Md}q*^!cF%zRVwl_r_f_kiO^Yr_VTW4QTk{>%q%7uQz0~Tn|1z)Cj?_ zBa!x~3;|>9e01YRclwo=dJuG5_p)T!&sUleh_I3E8(OY;4CI2?3Q+a7MYje zF1k%}{#T-EHIqf^M&5dFa@-6ZlEeH`k%fsTsb!^mQt1~|i04x?(W%LbpI08PwW5=0OvfWN`F;HC5ap}>f7TE7S_>eb1 zNfg+L%KFjUEj8hvR}K!Kv}^-M9;+gbt>#;|V}F3%Dg5KuV~gRe!OI}AAYHiYB*!y% z<}b?VKG^hOg#B_uc_rrDF+=7Mf!_xI7gre|f*Y`kl6mHQL9(j5%oW)gg~s_s?jL#= zEK%0nl;0AwB`Gc>>vMS{N$n53qR~968ZWR4Y0U1BWYNK{xa8<|J<@A6Hg>oOGw=_2 zH4LjI287cUk2JVMV_d8nDo@;X@`VG=H883K?+-qPCW?oiSL_-tj2G%rbM8e8Bu5A?tDtO>#}GALVk-WPC@OUa{%oe~)*&rOweoVJGO&zP_05#{Ytm~mVCa{Fjug+U zAy>RH<#96d;MABErKh8}5*FJcw*tq;KyDk8M(2~xyYf{r8)}~X&vRlapudaKLO47A zEeVJZExd5rI)_29raQmhgM=37rKo62{w(T)g<~N}I5f|}%%1!~gAUy**|$zo498ez zyBVM$pgtP2gv^gHIYtdwcEu;u7>|q}nW9`M zNntr$oDsf*!G4rH)AJmj_GKabih4MsfUj6$`#8=|Pe;<}=xT*|EEH<%WFQti#Uvo} zEbnt@x*lmMMaMFx2U@W9!cgdS-9~3PN?2}RGro!LZT^zVN0O@PQkl>%;v|J}VOeni?R@YbJMY33D|5P@QoA-YdI8`1Tm^;_UbR-~9tuN3)}nR2qr8 zv4?$g9$QxP%2UDcyZB)NL$y8E_r*W8zlp;p(!&NZ_?zdYpyhp4u>f`8YK>*FX{VTY z-ynsIVo;ThQGty(M)I8j9ztW`ukETtYgKE-;}0aJKwcvMoG&w9NP4Jxt^&NZ7;CX! zK)BoN8va`>j^Syk#1d10<3O|D@M8M&T@*N9-(n^2aGXY!*=F`%3d(=b!wv@|S^FI@ zX}pf!UuSalL@nZhkPBm|q*nwI8vHV2h-)S;^L3al3ov@MLUeBD_WyumGMaU4+ z0k?c^Fst9p_YdVSO&5gb);a3jC){%poOjp7(wrL;IUF8&@2itr(WpVw|EU>!U356# zeLO@dymJ_XnA_JtTTPg002tl}Vh%C2e!+okwyQMA*ku+HRZrurY^2Qms#y8bI+Yp_ zJtH1Y)VyzADWQLc=4O*ZNycRP0ZB$Q=TdgiE25cO*w0~=^_v>5+3;7mtNk?#n==Ri zjWJ01^;ScaD8w{Twm0F(d3UIL5u%6X1ra)`2F^yK*YkZ$N>R`SAG?0A@(8 z9^ZDH<^rHS`dNRD&5Ix1MJ_RSL>rWOXpr4! z$GWv*j88bDC8tr|6k}WSyk|1Ph&TizY4Qi1qAM>10(-X%fwt**lO*^ubarzbr>k-P zGpH@uTtECu^ogl2*G}jVi6-+M4#N8^qL;=--!r$ z*D{2D^AZjx968uZab)bre(jccC~kaqI+|FpL~@9B@}6^~M{-o68eeE)x?6r|8F?!p zkG>zYpoO7uHKeZpMI&;&NKUi*W+5L1Al%g%CmORcdsAaYEZD648=lfvU+6o^S*@7; z1CmA5EekviqC6!+XnnxHZ2SFu^!ovM+t1OPKWTB+<)C02Lxqmh9nkWk*DUbm;F`B0 zR6wb=&W$($ceMQBJHqZ?5uIrLg+ z6pYtAKO0{J9(@KtVZ@yr4?H`wZ?|t*mF4^k9b~k;D<{L59T)k_3g6<|xb3bx|JoEU z@}R0n$FEiuVCH8#Gbf#Wmw}bH7G03|vhNd2QJdCsjf0(qK{QI!V+B&-uA2)*4qc+U zK~K#({!shyzR?^=l!a5|ay1r`BjqQm0ziWyu;@MvNJ`U19MS8)Sv|{oQfK(R%_bV8 zBPH`vSnKt2(ve24&F>By>&in|ZnAYWT{)4*Z#TJ;v8xE|g3lv3<3p18@n@ATL{i`A#Y1`TGwKPr~V;74m zRFboylKWRBc?>DP-JQG9X)97=29)?*f{ucg%!;pI!s6eyrokw?F1F7+j>tg8&27Sx z)n+ZK=i1gcJtGIYYg5sBLuq+J-x10FNRh^3hAD*?tWlj|%aG$}Y!V?&^SWOuYS=~m zn-t84VncXh`oB@eOFD;koVNaqFdI86zp>vvrm+&e1N8{BJRas-6+WB^``$$1y-2;M zxO>BqmN{ldaD=<9X|kT(^{FylIB)Tg!`fbZf@QDNb8CuUhlKjzLQ+6XG)`|@u|42cGOer224~E5 z^Y2&%oAVkH<0lCx6BIf5qb}~P!ojhnP}coAxq83WK_Y$r^Yc!uh~d}LY5RI{Lv!c@7rXaexGi!<$JiDu%U0GaO@|%6pFiPefCwG81%i8 zAlh@kXW5@2>fV*UPqTtokxcFXy4fOGo^z#kKH z^{^K%I8uW`wlE!$4GtZI!o2vk;HbQ_u7KgKS=gPX7u6Xf@hCXr4}*4Az5gl9F0JlM ztJs%=i2{+ApWr{QK~O?kG?-f~p1V|51+DqNRE4nwc9^E zH3+&l>BKyuz)UC#WJt{AWW^3Y!#he}+Bn(TLPAfu(Zw_$6h~=oNE{h6Z=3cyNSBx& zU&qT2HU17Rc4ftLqQk4AEodpE#DVTN)t@=&ej9sJ`cCtqz;-XPW6oK9z; zGaxXHb0_{NzF?dPo50OimzsWfUGmC?(wE6P?sj+UoUdAAnD`^O1(04Lh1*+fNr$+i zAV=3G1d>|Gm2vuQ?4sm#{$65^QE505Q`xUB72+T)4Mk`?5$YGG5+~DrT6Q3$BY~8q z{5m@rVJWIpB4&nkANF1!nKR=|U40ILonTEp;Ye6?K1j3sN6!h*~_?Ca6e!zV3rK$;!ae9)DB} zW^it`FDNe0u0l-D^oyV@^`n)(O-**= zGCa<#OHda+5g{h9tF%y4bp#)c7ap@5wAd1kjjTisU$Hy$Vs3k#hHF6Td9d{iKzppo z&YbRgq}7XZEGm9F3~OnM<88!4DM{m-3qENIymuCjs8tJsvSJeLARCGV?&`8Iq^o#Q(rpSn!B5LOwc&rQ{4gwx}j!YfA~cwkyz z(zG((bF|@JIrF}P9*w(>frS#_AUcYhXv3S;6DxzMST7pv<;4-iB>?{!8HK?BzS0-a8jB zLhXYJ|8z=POKEK;EwnuctP4e=S*B#Cgk+G-ie|*P*;6#cQq2VqB@<}|d<{M*^g*N| zAycyq=<|AhIAU5orMzrtw?=+j14W<5F=`8Tixn8qKNh;jyUHg>Hu~=C=%nFACQ;8e z65oGrr6EIlmzL!^#Dz36XS|&$k!crkiTGLnt-TaMXGKv|mVr$hl!BB3glRHQUy2!U zYjGYnL_D=U87sS7`=T48LT^5?nezgE8Xty^5X}lE%*%YZiSXMsl4JD$%rJlHt70m5 z9>kHr1BPz%l%{e7ILp+SPx2XMowA=n#(yucJ6E^4yIaTeg~ylbNyMj9})z9NTt&BJrduV z9n5|qAHguez0!&o%jL6YLzA~I@DuH;?`?v2_(gy56j4)@tt`29NY^rlSPynxMNgfN zah+i}s;6SxQ!ZbhHy5w9j2`GZ)~Y+C3#cVW>sOUeGqZ0@i&+DiD?8 z(V?h1ydzv*Jgkus{!+x)BiUuH2B&e}1Nan&@_xRE6hiLXyAks3qTzbs1?$s{Ks$6KUiWznv@nL-l1Y(UP z1}yiX<_=Kv*PoslsQD1@HYuC%MPwm&{zUIq)P04xELC9|--aDo4@XK={$~Xm#w9) z(=Zx*PM1r3#L8O9 zg8553rV0>CWC_sv>v7b2eR&(vCI-V{X~{M7?qih`_JihBo@S5xoW!d~BF^?n>SGzq z&rnz{#ILh5&0;+lmLzg2co5tbYh|^(X@DBx8V(SFTbQ+$*4GSn}ZeSxEP7&*(_y-c4h2&txvQ#la%a!=e;itrp^>3k$sq zqTj^s);icSv)N;J5>po7r2_b!s4@ow^a$_ttu+HW{uONUTRn!C;mPMUzUqo8k1Q8C z-g=)4rze0Ukc#98<6Jq;rF9goiEUzpOPy?tV}@!ig>rfGc`h=-&uO#uyPHR zK2LZy{Z22t6FgwD*YO}{ybFsPxhJsql*EXZWzvzSm~7>{U;ZsMsMwPV*L3w-qtf_@ zDm~HVIT{#XbnqPepn5Z4%tNO19s*Vcmr7Fy?o6kCS%|n1`drGMaWa2<#$6oGx7r8o%$}rp>`Of|+F6-tmwhE2L*D@NbQNQE;6lQ| zJ|QNtB2gC6w7J&)CP_uHfTOG_>L2yRy`hRe!1|+o`x7dds6_cW@i#LB|M58K+R;<( z>({L%DnH8WM}^7cSjy$s2i*GC2v&h^MpVot>yDZ9kisU04xao^!>q{`PA6ncKan7Y zPw;f-{~vSj7+%@7wTmXH*ha;u*tS`5QmNRsZL?zAR>ih$+s=%gob2wi}+fWx~8 z!}fn)X45T)*cCVZ%?wt!)?_oyAfMQ*MLs5^O`b<2 z0DCkCC{C*v4W1O3C945*R2L#Eruf2d8Ck*~RD6D9zXM!_ZLSb!R7D3xBju1J;%SV4 zPmgxMHb|f_&Z>gRIs(oe_3APl6(2)TgMNnOIt5)gk3i&%{2tg-r5+SB6`CoL!Oho4 zI@=H|QqN&6mO@0rSOBNHl(C32*g4`)K%ygZLh{qZX80~boyoCGtIcpjpECG=Z-_4k24lb?HhwEXmjIw+umZ|KR+^ZW^I16=zYK@{uc?aj#+ zvn9B1@kI27@HxkvuG~0ScFgkch?k!_#X(Hhr3?-Ze&`uRU$GRZp?y;f|4UUD9tN~Qyhc@dZ`lCv^mQ67yYYiYz91bO=aOz;0nnKtJj5U<|c^Ck%V# z41u{J_GD;Xjt3C|bYZt;Tl$6bcJ>niUyM?GFNtP4ZD5U=Uw@5fO6;fBY9ve8?h}3m zpB%qkEaq^>kxq?MmF3!x{t#x0eC>#(+n(taG(4*kPxsJ*A&U!`0#C%=msBes+0`3X zk0TwP1C-_7Q7MdU@CZHi@WbRRr=62#`h{=7zrYqryA=@dQBv~ z-Zk))(;DwTS3{735queXRVOP7DgwrPXjzIu1X;^~dY zmERbj851WABaQS;K94{wK#GFGJ6Y0a=|?^?bHCPO69a=baEEMPD{l>xAMltBxq60Z zxln+tdP!%};4&C*j0mmMgD}p49X>T&CYi6 zy|(b^<7f^Qk{UV0M^3O@-71*Zy_H~#Ws>^VtQy{3zsYccPP}tiLt7J(2nvf|&F1A) zw1$0&1E4~dh7dIs9uAN#%zdWScBNr{D}^p;2|bfIpvr*Ye$v{FWeAqVy)XP;y2-Oe zNgvW7iDDG3#@SL?7k~Fu%u$rzd*cu+HlNemA&!ou7^a~rYKf;A_wh+1aIxF%n!H%> zR2biHPV_-irKW)U-OYJ5ZXsuepgz8V-X*Z|Gf7)$!;2SPFkHa;IfAS~Q0{SM7|C(Z zE3g@qW3?IXds1-~rv+1`HC8@{HM-9Xg3Cj5~A;=VRlg!Qgw^7UAW4qN5SmsbyyE%If14>Z~-ITKm_KWXt zp=D3}0f-m7zhNiY-fQ>dRFSw+(q&WqFIup&lsDI3-4@*xSK{uae5dg1^H_48s(o() zE*zz!vl0k7)*Ml^M9*8^k~nHic#PY{ax)&7wFCT<*iCs%G}f92s`O*&=he`SMv69y z-$P@s&7zRspQ)E`c~xh4z*u4;QZYvO42i%?%H7cdSzn+Z=-zLQpFflASt(}-C%uAk zn<)@Ilx?!l)T+XQ(8kWzvugGatc^71mM6ig*k{396K%|-B{FZ>x%h;3Pg>)y<%i$yCBLI{365-ZDe`=xjuaOsyWb$Ab~N*$ z+BbjX@oatcc-{}&n*^VgHO-;y4c4AEA+YAxyDceBAe$J%KN>uB+e;PgaStc1Vu#r* zXhuw$pKW~#F@5X*a1EtF>3+*1JezY%#~a$$A3W`*eBz9JHEZI1U3Jv-fb60mNfBYc zjsutPyU6WVH>nY|Wdqb(-&+nDY{dm zU)(HaZ-Sf%&sOzz zRQ8-BQ}%;t>~*VM z3GI`r!|cXTLCtnkK{Tpdd#NMin(&rXA`TW#`MhlB&GcMj5HqHAoyekSQFx zM+YuW)UF|P5bS1BhaEUyDX`QSOYRWZAaSbwf|(3DZ!o*cj&S_kDZr?;uE}8@bH%vu zOe}5xA z_g$yx>(yfKM4 z+hE!Da6E_2P`+|!?ac>)tQ6F!OrM#3U|Z*ho&?H!iJy9Wd#L5^_xYJ*A;3*7Em&!v~!DVVf)=eJ|Ub}z^GT1PI!ab6UhIG^t8tk^nV zcs1YR*0W4q_g6Px03CB=u11tE2A++JH2=ec_HTeGJPjy3IWXq71k;}OYplLJzy^!u zV(2ljj5-v6jg@nNhkF@Q7p6lWt%Jf6Qu*u+AT7wdS1+6Xcx(rt7b<3KsWN-s13zAP zft8SDhG%-?ihg*T{~FMEp!yITl{W5WBE$Em+l)MlH6($i`^ND=LM9FWjiQ_ z*mwllN5>f!LvPCIG=d@Vj_Z5y(($VyoDX8t6~`sB{A=ekd)sN2$cV&Y-XWcGoM-kI z0eu}5x4DC1&Ysz_!X;+PE|SEnIwYdj&E9*p4c@9uqcyx?CF)Tg{&3IJmh#(ZqqcacnpT&-V) zD(;RtUeH}k*VCReWp$b=u{v~%4qN`YH>!JZIU{M(DZzcB_ zedF4J#ZN{0Tl>l?P+x$5SPBTEo3;daL=-OS6c?nBECB_XHTJ6ao!VkyN|)vT)TW{d zu2lm44HK!;&fInL7=2xKIg=Pv>PbT4e|Z0OW+o|KRNEi+db<6WEuS5%fGOZW_8uwb z*7m1%#dqDnm*?fJWDquseQDeWAmN1g=D^P zU|tuMm;w7jGK~3@^yII}LNWu6g_uO>EY#qeNgiuDa9|l?kZhK;%y4e>C6aWF{7cA@ zS9Q|nv4_<6kW81vq5<6*+r#MKcz;1HhhakGxHm2~COWEcahr=0H8zH_O=53aY;RXDLt9o4QGC?+y|p*oa6IAmPF3#1 zHnubj1^#<8ArefhVn8qik_jQnM{AWUF`!T$bI4#B6)AvrBBOboqUR80XfDk+!7@ z*#bvxwmW3iA(-9_n&S4tzUhu##~9P^q|vm)%^}Iuv6c?#CLSjxTO`ACxGhyZGbAK* zn9d_`;++5{2O7+9ejyHRE{3&PNy`q6I5D;GjE7GAtI?C_yBs=Qzz=Y|t0%;iRNsli z58n;3D*s?tQHYgLF;LD-7a-itHjoY1wu5UAi-jRcySccZLvbi&U<(ti)TnXSgf0De~jom4;mw_w|G z?GxG8-gD-gZ;PyscDdie;9(9uQ9o;?&EOsTm;7_FH}rM8z%H@M(T92H_+NY@;D3Ct zh|DU9Gy%mCD?X+gPw0pFifkWnttg|qDOzaA1a0d-4K&uY#|i7~n0;Y>Ibd^lN}4PN z`jX@zOnh0JA(~2*<;}&-Okve=$yH7iWYoogx%O&3Xsz>(EDT$(n}4U>mygd-i%!rZ z`&%J0SB2ym_GYlKmFLnTi}Z-F4ybB{oupg=)lY4S!I}c zgeEdEO&bg8B<4AfID27wzR#QFOX7yDN-g!sQ#gb%R~zv;;F9(+oL_wz*@W{=^ca|j z94T!&SBh}5>=vKrd?ri}9-0{ySNZuHQ5JVQG$gg_+pw1z>$S~HHF#e8Dt((R6Y|6> zx(7wdk>(3%+cMU`r1oK__pfea?O-yN&q#g_n)~6#;U?)jNR;*x{u9Y!T#`xB-;#* zN1^jMbf3&Q9fm-{`N|3`t{~%4#jsq_daNa!-zWZUdQR`Xn9A4d@wIuV*^r0x{S6|* zp@H}!RzK!>BAi~X8Hy)LLmJPa^_6A+w>P*JH5)&Iw**#bv|E*5wa%iS3w18OhC>y*CD~VkTc5V1ye)AIgW!PlAGr-kkb#F~5e&K2XdQ55aDul#F4$HoMb#=8Xt zN-V=v%8fY5knqjVe5x_y{OulwgagZ!og(VIkg(7JEjG%Ft+@?*>b@5SbNX?!_~T+9 z;Jsxo&b7-p(%nTqcMo&#l)InPI{mOyF~>-)gKuJF`Cq_s;QvOXeG1bX4g@JYlFvEH zAye4?xSj^n*Z6xQAy*-iP~LP~gV;QKeKa>VZebqR^GrCv2#`7l=!rYIWst3JMnf9r zhR!+-E$D2^fNZ$3@}jK=k|oexh|D>U!sMOU%^H1$CKW6RI#FRGe*V5cF((_huEPe^ zDDyL6oVrqi`VD5}V~f20%%i!myayUWee_pVcQMBy;A=*>@;eyu9wbjWBT;2?5@y9B zf#8p}637KB{(Ckp2Co-0-a6E2vdpp3W|E`KK^sG?P>FjM#$ZEoQDd<2(B<#P!6ht9 zVimnFQULg|s1T9HrawPjcr@C*>D8cDABL9;=!(8Mn>`97F>AkU|Rb;6ZLh9xoS zE@V--$Q)G*G;r3}2^)1JiT=GClUOc6^s#6=Gr_*36QrvG=hz66FT_N8PxIeCTv8T^ z+hF5?8SO|Zyn!;uz{;zzeQ^;|zH&#ro{k&m!-)`M9b+p8tH&GiXt{)!ge(0mhE4)j&N+{Sp%k`u-vPkNT>uxl#t%hw}`op@qgS(Op0ZeDQc zmSk7peL#Hsa*+ELqm5M|K97yWmbQO{Qmv00lxD(NKGgZX{3=v0f%2y8S!4Pglv-G^ zN8kEyml^*9WCgev+5$rM0g zwi`M@fHX*eSD1dHpnxrP+mAtrA1Fa`9PwJJzE=?ZHK+j7;~2hY{w;2vZP_sWktnGM}ZqsZS} zg1uMi}#B+$iWcf2-#j6Eqwz&bBmP8XqD;EYw|2xqxH!|%T*qyJ_+ zP>4U<;*^F`H7b7+>~Voo7dxnRGl z{r4mE|8kcKRd_*C_4_^%Rj4LY{+k!$@#8E5LMOv; z`Mv6_U3r$oGVY=s#;`7;2HFrZgq(=nYvhoBs`JYafISsEpMZ$S6At-M^%;+viR6Qp zL>jAU?E|;!$Elmlh7Iz}OuHT5`LOHc3-8TCXj0@S!cK(=1g zlRU28>mfR-;2S-3B*khfyWA{YKS1yMJ+)6Cv{$EBR~q>=FNS#1^Bw@trHTGRWAqOI zay8RGHp(r+1ct`U2-c-{NCqL;kIj|={ryGYXs2_dN86k6`zH6xDz5K-yWK{svP@P2 z$j$R&+k>c;52yQ%h_+xexryABOREE&DG_o$Zpo8`@d>-o`*Z{(fa2xvo*Qyb@V z!*b)KXXC@$*?if<`^lNLrcO%7sORdYvMZgoj`!MC#6*V@-rc0a)#@r&3?hdA?VN#w z6W$9i&YghTmw(UxKicW&fJSr)pg`uDY?+%2O>Z!s*!WTo_$oUNfn;06b7BeQ=TXI1 zA(8>%xzr}kLZ&B!k{CK)C*KSA>d#AtJ`&cwnwwb(OlQvMZ@mBhT2yb}2IW%oaCH$} z@9hD(^v=h-R-yFYg0gu8W!7BE3G+7NF?mg=LXbF(_MADYh8G5ZqWOULCjaS=#QqNI zz!(5fn#1#(nIH(Te~Olg?!^p~azl`wqn*a#v6yhiwNfC1IiKuJ%6 z(<53q^;o0%emD`&b_7okNrS5g?f6Gl57+LO5NZ?G?P6Od)m-tMs)ccb8jOMGkhJ(? z+YcK$@YWQMh~usZRZ3Kre{MdV9s){Yjbp`W04xVrq(Bn$lQ3pa+@Wx@8^@v_BG%j6 zwas$Fy))y)xFBiM{gN!a;v|cI^2(lh3D+Q_l8$<|yAluKs>)liVF3~o_`k*TxgP(T zQLxNbH7I{5N#cJm)&HIB|Nb4jEffyRs=L-D)Q$R1vi`@bOkUOU?gEqv>^B3$S;i)`oaegYY6zM&nx4LEhW>)=Z_i4zqU4nHWS^ms>Rr}CPp1ji zf7k?{3WS3OLKXmo`F*srbO3$qYf>;7-V=N!*9UVsMTw}e%8)!(opK3i{lEfiJWGA| zO?U!JcAFL3eEn9Dvlp=T(_H=1L<{ng?)2kbKr8-cD97x8j-nwC z<8ec^7w;bp&aWlFFkDsV4+7qT3Bg8OMIgZV4u>wD2=pNR2f-#{*9F|Oo4D|Hd8 zFNz>gJfc!tJ@lfM7a?t@0bXUxEl76xem2b-ypgg5dt9;8eZ2hRpr^Cm$dT@n>iQNa z%S7xa?Jqp+ciDZaU-PV6;*-fh;#`rZXU^!R0eml$JPOw{Y9%OJq z9FFsRSyDx42KAPUEmjrDVWMEbQ}t&=M8WMRtjC>Y@RY;1Z2jk5JWYt`=1|H5P-D5& zW}#V~;IW1+l)?#K?{|-3vw*bfc(-`n9Z$fFOZ91pgjdc9ChmS^3Z);m0FWOOvJJ|1p` zJ1p2`tXFnrWN4lViO~(}{vxK%ZxqQ`IXTJ{k`tMC{x*+-uH$)Verj{NCi-p*KR8xa z!^>ujKRC(V8%(;}oU|c~I7+A0f;^lThl6b!oshMnh|OdFwT7tTG!}*7#zaO)J1y$2 zhWFqUFA{~PzeGv@`lnmQZ|8s7Dww`;sa>`hK;HuPtJcF;tzHq4QIKsuvfhKz_}o}% zTXo>^p2zJWJG9mRbs=8~V_jI5(Je18MQ1UG{yn!CYD>W|@lD0@`_dQa z-!2>#2P4?cQb^XqAf(1*isJcoqTSSfxw@8$RM0=sfGbcD68w7UEsVgC^@%h)zrk11 zR)`3TBL?+}=$@apCWlrILJCZbN!?TACP9)r%FvV{JVR(hDCiMiEzQ6^4&r-5?M-yY z>y}g^Aj^f9ePv)E!=hTe1p7WO8%ak5(p#8M9C+^dyQ-45idR=3xd^u|pj=Bca%~oz zn3b{3neTP^tm>aNN#grf6SNO<{)(w%kbo`wOGFAe4b|Yf_6zSpIxnswnQY$?2eG`E zE{$J|uX&mpJue%~X44(G$DwcME;fEA=wYU3i@kA0d1-fNrWaJz@<8AYAeft*-_7yn4(&f} zAmkt|9n_--xY()T2DW@mEC4<*uF#cL7gXypCeQo@DmX<}( zdSxY5Q~27unbp(4vmb&`$$Em_Hm)X-2f12tI;E#*~NU# zU$tYX#&7s%yJd5Y#9j%Kt>K`2UeaT!JSHM@ufzS^H%p=tl(gvq;p}0BW7Yf&^4eMT z230gUF2wtpewk6Q>25aG72c3*xiHej0INJ%;gm|__RU=c4R`}2xty=xEvZh2WOW>E|$k@c8uc^u?|g1rW20V)LNtUUkXZylbBs;*?@xoNTDP!LG3O$z0h~&>WV>=9H&yn~eK2cd`E`&Q`4BOAU zqaNK<#$|O-fJCx=#b}I+CIj|BXK+IB)p1*afO9ON^K9pa!S)q%&%jVm{avQzr9p3l z!&rZ(iQ#cfxid;L&8hk7ZY~owupc`N(2q^mw`l!A9Y&#op74`M3(3!&Dv(FSVtWZG z`X^QJbqGOAn)9@0+Gq_V&s6^Pwnt!fThzWg*C4(LP2%LAT`G1o$VajQE*WB5`$sh9 zot>LWQG0tBJk>`^(TNUNZ;eOr&z`-e+k^ZVp-AbQRbQr2VX#wE*VnxLAqsX|AKt-@ z$KO$DTOUc+>|Pq1c|qAUT7kHdEC-}9#{0-BJHgW$tp|uEC3an?S zSaCisVX_7WcoNvpOIHDNwREk`R~PTY);1G&joSySm)&8%R(%Pf98fO0W5>(PnS4T3Vnx&DGa*sGC4xhNX2pN{6{SZ(ToW_p)R?rPd0!?bc>> zp--@cgka9iEhv;@pB&t^-WIMhcplIUwcet?-Ym1x6EekIjILLXT(08B+8>!oIU9^S zE}fX)sms{m@d*dycH~ThL5D&j^p2nPw%PLq!%Vi~JiI?Y4CNBIjNZZc__6TZ5C)l4 z_DEOlOvuu9v2|W^SkNu`roeRg(6maXE9nHU<fn+`^i)~xEVr%Yk9fwV9;2dem z^HRK&sak=Jvi;87b<4$Pi(RPx^9e=(GANB9Hx+u_LaO1=FC1p3|J!I?wC!pRIlq4} z+hEy>TI-rN2yT49+jGyNoTfs69gH9BJ(~4ytM{YFztau2mJTnt_8=?p5a06)cB6$D zCk-eE6n01@!Od4DpXxvT@y2_f%by!_wj7B__H6?6+>pT#_UV4 zR&}nX>}$R8EFWg7>vFK)h{(edRVb;8$>hwQ>0!!1n=^V*fRXOM`LQD+oX#5}?@a+T zLn-UawL`j}yDSzHnVX%Cdy0J$6PrG?&u)B2x_z3Ez(vnP2L^|FXF!*dwHk5y z#NjO7kayh2OIvcWbYz18rZR2UK6m2hCgr%G3^xu7h{5weNmV<8h=dSv<07kh#q}?MYftCeUQu5D7*}1C%VQ=<1*MEQqn4W53Qas>nSO5 z)@U2G!IqNQt(Yf1rbyaqbRmuq$Aq25!@TZjQqjgGeS6T>aW&s6VE3jYXwAZAI!S6M zva41S9CgSmu3jau-(1yN^PXEK-<2SpK=LLNk_rc^TV+V%Y{;C~j*1}{7G>C0GEm95 zG*?SyROb)W!;`YBo8q%xy9G3EbrUU(RSOW%KQtP&ynlGh>IqfyEKrn2ddGD| zY~NY)&d90s5K9ua`>?e`L{s_sXUA|0mC!~5l)w49az)A4dd&u^hC^&U4RzQF^+NQA zK|abfNu|V(@Tl-z9Pb-IPWa(W`@K@YSlWKIB(aC~4riz6%<)NdIBiYt+i8=4oWs@4e=r+_MV5(Akbnv{WdRh9Fis`H!1aruG9${KL zA+CyKcOm3!oPTx_C8OepWAoa(w zL}K|WnJ*~5QVpb!PV|q#h~BVdR{c)4KmI{!_xsa%~>bjdWx zxlkSy0h(hINZ;3BE@PYSeG( zc|67)ZuOI)Z{G!8>P^>TU(H8p`E`E0j><^=5PG+Z=KyKFFgrVp0u?u!*YK;1quvX% z)l51pUDJ$O#D^kpFFk;;wD*-EFKl^Uvfl5Vs?swcjZ&Ox8{T9@zjLV@3`F#|9N#vRz5V3Lpdi>CV^(ZERzn5 z0P64=;k%jo`Db`mb#9dS(73*zi&qABIj`-hOI`JPV$U*qvVXT}54fyKuVDHs-|!!q z2>K~V9D5jkC?CTzO55E=-odAv+~0uyMc(0rEE7sgdS0JNr1mP>-_Bz9Gi; zGlFIq{`v>~s4#~uLb}kTDe6TO0umC^`(hpQ>ptJ5&PhNK;5UMH=r|p(xOt}_Muh%t zam>UH0Hf0rlNTHSnHe2Gv+CT$0e1N`Qqgp-h~HhkrrUI>+*#z)h%PT5V^zrwHWe+B zT?@5`;}dpJW|@NuAA=R??tO#UaZ^vXrOej`)41V4lZxd+Ow98|D9Awf{8`#$yUoAG znsVDh-uj4AVMV52pFOd8L{&@8|kYqXAfCF;aY0fIkiK}45Dn5DIXbA|V4y%%> zdX(Yo3LL7bv#KaVAwMN;3?r%Wo!2n!!5w4oNUqCA>qsh8zPAUePCxk`ArlW32vUZwkjPe|=T187-K*|hPv|I`$rPSy!UP)K=-8cm z9fRN+>QPCXGUNWLr`Oo^x+$4Dfc@s~+9qq!p#hhfd&CO-{p6%-HwQvesihjwA*eH@ z#V-_0C1-`k;^OP)c|nlJw#F6y^MWxIR(Yw02Am~ z+Z>mZdFN;@a-@oi3K!FUQrHu`vPQbIwjN9#bNuhRUsRJA5Z(B~ej z6CFJma*&*j61NTnPCnqNTJ~>H>g>ua#P%gwq`HjAG{o~g?!?`KHD z(3?EVMZK$=#q$=|Y zti3$Xz+D0yP_}3o>yA818NZRSCPpIolB=~2hn-)(SAYdsH$K#xBu*^Lu6gFV#~dl$nsbJ6G7`j4kjq)Qu3R ztNswUk{)}*S=-r6f#mOmvc?FT)rmjd_`X;4u=qC+kk+BEVh3MG%jC+NLoyPdGEng1 zOXJ2oDqabDR56w)XYJ!rf36P~Wj>nu>9yP%&Y*o_tw&I!jzSNuaPZ^Q99}RY^bNG0 z!f|-7<kKx!$ZFxI8nISPTu9%*XC##vq?+c9(1oNJ~M?vsg)4{lJaklEF zjD<7E(X4I%pfV~TgBn1nrlCI5bw)6SN?OEV6>s05RHu=2XEw-d>WPC!#~n;9iyjXp zexx4K#xD3FAAVKegwZ3^m8-gsgeSW%X-7|V?9t`VL%zy)F5#UoeV(seQP4`b0%fR3 zVkbKlt}kdv@M~Q(wc@XcBPaKj7R;OJcs^pizY&`cnwgP32aQw){?R8yy`tL5Nn%U2o* zZ*C8?G^qaez+J%03Z}PelE0xzlGXoPN6qx`6X(p9VQ*OA-8X;w}`ZK z)l(8rOAVuZtTBFwquxH}IDXI2Sd<*w!}0Pp)%JuPLusNG^*wjlRggojvXm{3LtL7= z@*B0^*GV@tmVs6{%Kh{;Wp7-jM}tOQO!3P)%6a)B6O4>a}NS-lJ%>qNZtes zZ<7n=;U}q%ldyYKS!I3;NSKrIB~Fh&aPpDrWCRZ@WtxaQ-2P-_y%meR0N2tvgGzSHEurMaFh`sxBw z$%*0mgONG=#VQZ#LnO7>4{-=Dfh*b!uR#tCErG>dy4ea>nGsS8Q%rwJXgj3u+t%o( z4`K)p5OA)Um7R`UVq3C#UyoATu)WKE73>>C*XsP>qs9XMLjZ(n0@@<&EOV}luZz1s z7i5^nWee$2dWm!rLv}$bHy4-YL3juTnpCjCB2QqxR~CvNXDUKAZ3W#ZL9fV0G9z6G z^my}Zvera}qLeOV!|87=&ieBcWQxhQI{#p0NpytVmYj$ zg3${^kWqYU$_81lktrZ>1qJQG#eTUBID$?``lMo?06w}D!8owZ6p(O@iZ_yvf*mk8 zur_XuUAQRutDz$nYnW?^i*b4S<7nA)*rfbD0L5$ahx{m>p4IHThSUEg1n) zWJ#!-8vA@#EwUM4_Qa*F_X&KEX-SkBj4{-O7ut4w-SzF;>vfui#5WL8dTXYeI>0w+ zX}SsSW9mmniffi>!$mQSO?I{O;fAUrN-G%n6NjB_qIXd{bM0{Mq$F=O%swHAXiou2f>Q`%)^+b*!kq)mPJQcb1Te&Ns>2Y8Ekfu?IPIol;n)_q_6r%Y8 zi~Xyv+Bj<2MTYI`MN%pB)ep1{sqREw1tp4Oc$uBYlvoSOvUk@I%O%GC%rYC1Ji!74 ztV0~y8u<|NuJ<#)0+Qet@5_Q5HhTBFzyYKS!+6?Ps*dOsy+rsT%M=_NizpDo;I{)ycJLOSu3aL47c`=n!Xv(0br@ z!>7j__O$BYfwtA{u6csFfI7>ytO*_6ZAePZ1*pA?uVM0G7Lm|@z}?W2qcr4o}8hiRlzpbu=BkOQxRD(KHr z(?9Vt*9Ws>^70YjG3txzP8n9eLRh#%GGZe$*cQ{zQQZCiY51!-PrvbQo<6HYa(a>uN0p z2&L1d>=8WdM3J+R3#pMX+iqJvrIa*zUs27&Op7&i$B)<`Q`Bt|5XvPnIU9&fOoaff z&?ghKsDXu`?xiVI{|f18lU(=9uiB6kpIm#IuA{Fj+7CK&FZ9C!4*PG{l{t^2LvHC= z4PR$b;^YS1JTxHGRw(|>1(1chFvh#6FQ(7xCC`m2XK#Mv(&mQVu zvKa+b4D!_)RD^$pN{#W4QK}BqC&EI*=lUGOwyt&tk3Uu z8k{TC+C9qFs(jbmd-|?{z-h}NgXW-nObfjq>kf%GB*LM3HKnsJb5rn#mFl8Y&DuxbG_OhzL{F?K3!d^33s-MpE>e-B`Ds?b3KVtqv-vh)f$dz#rwlZ@ z*olh~gDionLwTy})Xm#99%QFbhO70cQ2vh_$~G|iZ)Kc*fRrWD^rRYi7)hfY^M2DI z*vl?0=tSBpnm|K)_ImEF{{cICrpo>|} zUz1$8);JAoSJU_&3`RU2nc_ zkKu@+vXCxaYM6=9#>Gthl&hb zD+MBmMGj^dp(CF;-a+cM%+Oe!sHC=n>sO88ZRkWnDi^YcJ?V@k!YX3C#8W$0dY-Y> zGUL^XDDAy31g*2b=n`E}o@^-N2oi+$Tuq)7`Dz3UAY}8X*AHKVf$>~o< z?!=>0ju@=MA~7KUVk^FPnl0`OuNhNIj6Jm!>k~+=E~P7NC`o>?o}v)U6>MdvmyKhC zy-IwQRBF(|^b**N3V+mGXcGYs*FEb6_sK7dfuZlTqoonA5q7Fr zX2Ss1mK+Jm-P?>JBF?>3_7BNs{e0yocYbc>9o;yf>tBttg zYu4ySm}%&0b&%Cm896y=?c4iWplqps52yJb%_brw=&vmMf+7SQL0c-lPjKQiQ8tR= zMWYgG{SG_d=DNQmJ(De&o?w~WW~Sf4y$kp#ZY#PGL84PR z=)=|TEo<-Gc{qy(l{q5XpbLwJy4L0qDAz$^%EW|i(B|f%J0rQU_Ot9# zIbc}>H9;q001>^`Wr{*?}J} z(nCJXLk3L3;<_Dpe)4%mtNkhiw-f^TWE^5hY8aUIqX(skNKVK38O2^nXF1%HSJ3>Z zE{%h{^zjBJYwKUf_XqQ<11cl`iH6I}F5Twnnfld*4$5Px0T~In$~jVszmO})byYFtQ7&IqXHQOE{hwH5Tt~& zh_+5(zUb#GBGGET>e;UWgIyh+2o8wPxtK%qgq=p9zpO#BmG!*crx)l{#} zf#(cStbqwp>Uif;TI-u~Q?NeS>iysrx1slcTOI#DLLoBqzj%VxL{@!#kDtV05^ShH zS`olD!*%}LwuB+S8MLhl!$YL4rZo}AKNuOytzH~-dw7y+x z>&auYQS|kuuzK|q35j*y>hYgzdTsHTef5!Fuad+Hc%KjNqfR`H!w_G4%i~>f zP%c{$9q({AOq_%<#Jc;v(|p1B9qfIU8rJpW!?1%oQegDq0{GIHj}A#F!Q2hUgthV=>y( zC0TblwxTLMlMzJy_)z)ukCh{e`kiYVP3>vE`U&|9RP8Jhs62?VEij|;+<>Jr<;(hR z9v*dI<4h)=iP2U}Cd16qJZ|_Vt8k0!8*8#Ilk?8U-mxIle=O(X@2uhr@!9&;_q<%9 z{ut_03o~yHUHMVt@tDK*Rv3rx;pO`EHhohW|DW~|%ur91ImVadS$=+;ECM=`T3X1A z-N4*}tu0*#CrExMvE*ZXr8IM@BQaTdyk*7Wrmxsf6&M_kfOEuGv|m7NExfe_U+-2X zyw4F8uMoHw8-kPQe}b{^i8BooRq}zRM^<0Qyd1Uj&guRq2^x0Lg$>u6!rHOeI1(lz zv^x`NMQ$z{i$W})zW&yoK?5OSg%?lgP6<1$6+>sEm9kg^ZTZ?KLT9M7xvI)@(}nwM z+w(%l?thLW!L5)_KC=D!K1v#!K3~IpxKjPUkdPd}bd8poozOA}xv0|U=jXe>f3b(l zhK3f$ShQ_S)E9Y5Oi?irz4_tTr5XeHmCTgGCK}$PCCX7Y_69OP&v?g;8A&s03JRE! zk&%)zK+^KAEf!z&B4?%cKccyRMT4(_+*UR0&rok7A|jK*80VF7JY0S|R@gf6FgLq9 zB)eWUAt65Y3Jrf0jmEDm?2SVc4ILfON2R6XB))lk?q5XFq>cPfE11|Bu@#G_eyOS9 zm6er!5taIdU^qlqS~)!}A2B{D>M8=8mYzD+ueHvF9q0 z9t~$s;~U@Xsk-MsM(BT(b!h)?Jp`ZH(D;U|HOB)TUJ^AfA^G~YF9b-yoU|khQq1Y! zaf&eN>YUzD2vhg!IpffCIAec7>5u89B_Abo zASoBihT8lHBpQ!Ys##l5fF?nL{u)U`(8SbIgn$8#oHJXOv+^VK0mjXhxbSsD!(1ji zZfu3h9<;xixcnaiy8}xjPa>ksaj|=C063juQbbgg8>rcUg@1gWjX~M=qdbGZsah*i z>6(aJN@QQfl~T?IxzN#oKr3~Du~1rAQ5xAuK*^c6@?{aA5uRAC67TPw4z#{ia%`xt z&&yO!+{RSei~Hs&@5m#1670P(z+OTW$yaT8-}6s3|G(}7kj0^bzkT3Ft1N`=3*OZ= z+4y9!T>W{9$qPQe?)%JwCDuE!J;?rXq|kZ$dI~gH@K-v86_$YAI(I;WVBL#8qnjG7 zqNKU^^uzlMb&+vQIo8ZhVn&e0Y~;d7Mw6zbtejh4i+-6QC*PaWFA!?e5GjNE-Q^4V z4hBt7gTBfoF{0;B%mHRO>2Q4=^(EuI3BxXOn%_xvjG^Ja_Rlqv2@CV2Kl+9s{t8pN z6e5Xi;!#mM?;uyUVi#`SX0i{amF@tAXh&Fh!nwJr-Op;0g-_qe1$Th^mHwddCgCqK z(f9t#WhKpsqBd&HLp}K$BaTqH!c{pi}GEs2>9d z!$7EQmJj7oY5YzGOos`gW;%yuH=gmtz=fXBdWM@$>mfP?6%`j6SW4#snS3kA;5858{o=7(Clmg6fg1!dty-TT8db6q|W zeG)?tAdk!#4JepIDa#|26X=LpbQkVnDLp50n0lEmypHYR zH9O~B^kf`!o`$kMifcOB&=gXLzn#d6}KO&Pe~BW&AON)SIhjrMhmS#AE` zj#HRp5D05O99AsSh!+0NDX%IQ!DG0NYbAfXgI$pjlmRqSQc_w0+A!f>mzr(KN5>?; z$Vl?FxQ#0Tm)DivaYD9T1Mod!*f3I-rCDG64QCmKUi4En&k>&31&!wy$>1&G7w_P7h4yfK4fcH_Bs`WZBKH3NGao1Q8 z2aX(Mc~9;on_q`07-)K?FII_o3BD80L9_vrdT*0LpgN?Qx{@UXR~D8UOiH17CF4hG z`hmLrtmw33#5-q}zj~aUKQKVlvcE(jU%xF^V{z!%W5J>Ln?2={>nj)HL$nmVhm#Uct7XW zCmX0u*7ghpyh~2Duf=CWrs5}CWzPmJG4U~u1_@GFi;6c?1MG{W3ktV%D|G*CH1If+ z{@};1!MwMFGt}KZtXXO_B!7J#?qXr*7z+)R>$nR_2g!ew8;rmY4Xk2v0&A$JUG^eP z>B*^aeUC%W47VEa&gvBdyx|T;X8Y`EG+t|KBn5j({kj#oh8?}CYAOBb{dCav1&jE2 zEs(=Te7XH8;BDAsW-iu#C*D9{B?BR0I6^55`c zDDEdtSD#@lAi2<2FvmX&$IbK@^M5YTsEK{aZHxhj?T~?cfA8DV5wRM2Ix=KeS2fJN zUk^Uhp&6IUjEL33)kbjb^2|uEw@Zzl1cQc#oF5f>HOUwd%+1X?Nr=f2oE=E{$T3hN zZ^b3WyA2OAj$oMf%+1W~^bOF-QOBTW9HU>p4Q~c-xLo)qhFu5+?t^O~;#XIlfVII3j|>rn$QgImje?uR0d;NNjJb+yQ`oW)Ofe}~!k_v8bgx>W{?E_H34yus#Kpn_ z6#;B2kBCX9eI_(ER8(#ZOL#Zhu3#C#b;<3w8*NRUUH3102y58QgsO6zx1Iv`6XjDI zs`tq%kM&xmUC+LTPy5%&Zf~2NhV5?9_HM52&X!<}x7S8j#}?jKI96+WdqsnL&)npm zjsH>NWMQC!DL+VZ&Q*2H%&gsH|l^jYpq~hQw;b2`7c-EadP{=W=Zs zf!et17JE+Z0>0Ar&yEtDf3F~A&WWLUj+y&>3Bx5duD2!Um4v~A)E__VAsWpNm~@fW zZy~u`w^sSxcR9uN%{2N$30!qS1)|pOBHv}mor$Bjz z6Ix3>9-UTF;>n>Ry`~GQQhIWWUWmwKtTOSFXqfRa0iJhCEV4PK<-ec$nq`X%b& z+GYD0;U~pgrf<{WJ?KG$^#7Y}zT{FlP25gj9Hj!{47FYXWH_`9Hk0jXL86*0-u!XDf7duoNILwUw&MtyFQV8r-RLSS!k(|wWT^bKE`-s< z^${SK?NCl7F=iPaEo?i(IGLa9XN%mb@JD-FGm>peTf{Q+UDiQ@V~IGt!+*Ay;u*HB zk@fS0l&YE*h?qM(EL@YCN;)NEV!$w?u4o*KGC2l zfp@7g5|jLh_LLZRs;OCt=VP>(PNps?azL%64JeTe9*$k$I*sC~jqp{+Z!k6c(x+qi*cF1U~A8i9p{!mgPy-Uuz01iJ8@4f#OL`EmlZKSVdW8 zq6r))D$jEHY%J)iPKSORsbb%&dler+c(;UqI)8UJuD|!#oP1HBXQ|4Nkl+mKg=27b5R=yxQ@8^eqwvG9sQgBgDt{>5_(75Xz{mBAmR9&rSU_9U*S7`-@QdQ7D$ffhGu< zC@N!I&>_@RnDamc|A!sSB&R#0S$TQ2$tBsnxrwACVy%6UjWldVarMYL4I2mhw3!`m z(7|U=E4T47=U?&9`&m4wGxa%Zva-oqtsjK!?BrDxL1(kZGFc&)7{xidPs*4l-wFy1 z3k;?=IW5;i#d7NCKS|iKghYqhq1CWWhPEVU~ZV z!cpc)96_M7C?{q8~b}A zxP_M7&Sv7VuBNztP3wmv18)pPQliI~c%Q>dz8Je9`e?6`kt!=;4;b>H+VdC6ND0sk zCb|$jrGc?2ihgS}Q6f!+=}*pULME^RQJ)*YiN*Ru=nOF@W(a50aCdkokzf>!n@?|T4WJKSU2zd>s zp?yPoctY6H;74)Ck&OT{NjRE|baBiP;dhy1y|kZ2EK#Op=Nc4^li7R-2eQQe3#*8a z70f<>@F9IMRf2!-VLtnGlTLj+T&PUv5A~Viz2`NOP7P2n7&JJJP+O~5MPKK4oFS`3 zl-g7asD$OAvFg7I!AAeiZlxN$Y&_XBkgT~6Q;`X~x(?lCMWLagPSZZ(x!8sRqL}lD z`R$9S;=74HhRi5(yGAN z-$sjxJrid=-W-a{V)iXiT%EmE&NTE=_3o^#qC9ey>Z`E{09*&5P`IiTu~x_l7e)!> zop4oEZcWDJrd`we$x@RUi`D}8%e3JJMxk~YwiNC8!>S#r(OWQzbH>=4Uey(G^h36f z>p<%eDmq}ATmIHkKPTFTaSX~1vyy45>jGV!4Dw~9CHabL-*9Y01l`(*j|2P?32Y?t zhEl)`Pp)F@ZL;oy%YHa);Qh=C=I8&T5OKD934$7{E_eHYRNUREH>a!#X*t)Il&!U| z5qQn#yddVxjYefYkS3b=C8*l&M33&m7h|KSsv61U;epQYu~4Ym;6=}V&M2tw0295} zEtUywU2ZL_MUv)ei5r&{U~jyqdz3bDrYGUa9s3(*>O9YR?4kwC*fYd$$L4gl;V-tS z?QeS&S`T*@75(ad^6*=n&wW;$1FKh~yos~Z^T7DD>!wDF{`hpQsU~*2+4lXHt!w(w zsfPwAxJ=iaQJxZaII-66?2&k3k&Eqa4|P2dyD)HdzShp0V_^Pe$+7ik@A59=J(J%I;Pdk*x^ zq^`~^ozERQpabX4pnw1u4^W%HP`dfMNEq#1!23+;tO8wSZ!A4*5Yt4{-r$De{Q<#Q zfNV_iStDE3XKLeF;hS0~qKfx+a0)l?x@Qy7gu#>nlV?qQPhde`M`%vCcLkRJ9=CD>$q34fF*5 zr+RR51p%A2K5}LI6_S&#yVu9r--;O@3Vzb>)!&8ZBUKCMG$k|k(b-LjOF5#&mLG9z zN^FFl_!q_p`@kF@_Sn+UG4|{@CqV+uh=uIfJbs+&5$z4ngMr5uM5+2y~@a?5>HZ17!eXa7tQovdQNg2l)%*mu7n zLSKsg3_{Hw8g~VCD`rfk_ITYJIln$g9X=bBp9$u6H71Ttyn7Rz0SG*Y7CI2nO&7ar zkg_|^$uwP;DIeyOyZk#GGJ&Y*p0L*&(wlEN=)>|!I+DlP!JR6uX9?Z>M=RYOyH|Ik zL(;FFL$LfdZ6SNS{0a3sQ1QoyR*g6WYRZ_MH3XI1V8p8b1#li-yJG* zSNdfnJi)1qJ(XM+?`Ila&W{_e8wLfgN=-^YkU_lIcDc?oYp3%j^usE6jD?Y5+Y@zb z2Y;+);NnR{VKUz}(t?8Ez7N5B>2dTxAT)5Q%kRMZg1IPis^C`Z?N@1b$I#=;%S{wZ zQ~0pv6Nqo|bxJ#{dls-Es;+spLOekG{covE_xjU%S5>>+#$_IhD;NqqTYDFAymsJZ zbm$I%vpcJ@vJ{B9-k74fc=*fp`qXV83?EncuKy5)*3wT!J-Flj>Op@%7UiUvd5E;1 zdZ0Z(KE))cE&BX4DfgzdyA?$2g7RB}NauyrTaRj#cZgi~LVt|hK^`!ihzKGznugpQ&q}sZ((sgTWAEbSEp?K=$b}Cbmn+I}J zdj1F&D1HVKC0p5BXI`y*|O-PxwWd0^>U4LoC&A3eT6E zLHEJ0&sZv-Gq1!0c+a=k>Dj{~h)bfP>3V%ALIXRkSOoQ^ZDw{9*oi{kvsiGJ&hac*SU%p5iPJ!h8 z=Eo(VLpCriTCezZ9=fVu((?NFw`bZMgH8KR4guF*sUg=ocDMrF>cwaoaf6Ds!uFE+ z+6MQ6>Cx`jug;mVw6+iTI}HzWFVS^#dLANI4RGGxHxkCF7bDScaoNt-iNiQkRVja@ zGg9}WVAZ~iLX{=i;~r6Qhhp2?37*qGRO`ykKIVZKE>h-1`68y%H!6WOdrW{BSQ8G*GW*SWG#=(^(Wqzb2E=^0N^=ZlGeF zV9)D)+AacX(EyA)AvIZSWP}P8KR4*g{e%QDgSZ9}OM3!_Z+?e#*hh=y(Q7B~o6q3O zc9o~ZTZW5R6;Z;2gTF$#-^e*Yi0Tz03KxG|UueE|(w%h?`<_)0qOPlt5onZp!jVRv zZG>q9I_(Zxou0j+k_UJb3{HM>rP6DdSp?XZ&iW^Tc)m~YH3NYhe*CTuvi?f3yguOz;zG!o5#m*?7O+2#0kHwG}=;+fu+WBip2#r4tt@e86I=QLN z^2rPps}?cK;c!5P#fHqkJr)*H@qp24@O}kx6Cby1b_D;7RJbjy&DME(Wpd37A0Pl< zu~3r7W~?%k@nizcweyceqcM{XQ0a*>D`gAhGkr(2@>_mc!c!4VaeFytDz)w8IC3Z5 zz9^{!$6sdm25Dj!2=Y~emt=7>qu}3O$QG?ehZZvjaI?M~eIr~bI*$0tWD9(pAHU`g z1*c6sxSAvw$60OYKm096;$e3=y;ayvz5d?J7h|4 z-^vYjq=bhHE3am8it;-MC#OWm`cHK6#ssq_rb8Cxr^c>(sAofj#-pwx^Y2t9mr6rtf)Z1nZ%!bWFwF1Dn=jEVeB4WK0&%J%eHe* zxUd_!;msN&RaH?9iYyOjan&z!=e(N4S3d8rbw(QVt*mOZZM=You4m{YkW=~CS7$=m z{VDIcm|tmuO?PbP*ZA9ov@@v7$QXfrKUq)Gs*J!Lh6L{T;fqprJ*M$Ei3HL%=buHk z?TMzVSRU?WzUR>L_Iv^Iv__mcacU4lC8#*p%~M-)P9A?{*@yMs2f57^{EnMX={W~s7pqSi0@#iZIT1! zev|cvp}5mH3~XIV^sNb9U(%3OYHV%aX){qPC5d zPd`u}_Z27{MYRAX#&k9!ZQtb@l6Ky9uAqebgAI7sQ*WnLT8?4oGk(k|b%vr=t!}#F zud<-`8ATQ>Nsmd}&E_{mt*TB=H8j;?^Nf|nCVuJjM6yt?Cr&Slp2OfQGdK4|snVSZ z;uV%2?=#_dX}lIxeN5=*O&F@|d>_+dJkFPZmx83}3=4Bt>`ACQX?B9B8T5^3iGF_c za*Fa)x~{Lf^Ql9Mf*YMxiDsEY21eL1#cF!Ewe01obRvi zRYf*a{}veG&va;udv~Syfu_S^O1>1rhXNtZJc^t-l+r;B8AZPCkxLG-a(FG`d=mM)S`L z1pv|Y%ITM*=W&6kEQ{qi1=xBHxf9azUzxhPDM=~4sa@x<2pwrZU%EgCqImBJsjYj=1OjWET@U6vO8aGReE){gCsLN z&py4n;D?)O$7{P=A^C|8>isfn=MiJm>RV|FV>Z_&9;6&4hG-Nco6-kUl(U^;yzj-MRq zVTW^=Q%D>!&jsK>05LgTRt5-@+&@tLImL7hEuppDUFl0AzFX7J7JU|iyAHPNG8b#O zRKMG}?SIo+8Ex%X*i>qTpTF$V*J8OkeC2j`_$)~WmhU&O@~V%oZq~P~@e=8Q(gr#b zb~F?YdlpaNrUhXkM+9bCb9Yxli0QQhn!@al{NkfV6dw$}HnrE~c87+cqdT5}A%!(K z6?8)<*TLkG0vW6dfG(qycp8BpacZk5@!+-@5$+>_i#me#1x9>lQajx8jfj-Hc zXUbWdbD~9UB;Ri{n`&bY#JmuKF0_RegIqR|_=xIY{~uh3MtD#vL>+gs!CSN3_T6Z3 zQmG{9C6A5z!{_Vyn8W?F3LvO**x<#o*c5HrWX53?21CXOmKHmc1WMN6EjLv<8ejWK zbKv3C_=k_BOY{AUjcw!G@D`Uz$Fkh`|8R#xZ+r#&R>k+)xtjA3yIqWN+TTgvcYp19 z6wB~=TgK7u1D<);0||ZU=DOj7_3%a>M%Hx(=fV$7`s{bXV@`A zcnEMqGeX1rf?66sZtVx0+Nh=e?!dXn6=DXIMdsbTJZc#$Ez_azaO6i zycG&!kIw6Pc?zF-t4{sF4=F<>6yoPG@`t`_smHBUzt+Xi&sP8@{g=UsVbXL{MXFY> z%@$)O{`(1c+j~EI+x3OyCs<8HDf30k{wD9cuiOvJ%`9E$(QjwzC3}Bh-#uyu7F0BM zDu92{I?7E@&)VKdzZLof{CSH;I`i2gk)S>!t;r!2c(@X))_sMYq!W8mN*YCdxn+4i z362J3k!*-}Zi*U-au=(FoNl){fs{RNo8ErenS3dVCJqYrcB2kLAvo^e`1-0^V>-s} z@wBmNi~fjBUH?e3(!S{41@^UYRA4)MIv%n;5;ys z^=)SL$Duq<9*gFcR?H-I)uW(3Z#zYhaKL513`U!NT#nd$y(Eqx`7s+>maOAJJjs7b zNp16X@Cdx<{t?bhl{hDNfjbR-i_b6Ic{6mL7k~y9czw*)ryF3PoXEXxfi>P%YcX-7u_G-X*Ds=?D`z!E+H!5!snuG#wY+}&)#v>)~<4yR(tI%7|{M!BG z(-TR1qyVn8Lz28y(pkUv>#J5mQeu8a2B0fwh-JXn2oXWxVfp1@%-mr{HZi=hzY1Ck z5(eZ_6_i?rlo_qLthcNkw4CwO#9V81Ho8zcVyTbWktEN})^-*Wy?H(*X1soVd8>0K z@=?NCbrSUX;2Q(;3sK@z$Nfful)}l9d^XW)-Tel*P9LXjsha#NRM^c156rJ$2r%L% z5}!`1*r=&BfB8LRhw$Fhv=oo0F4q;U@qkZu7NZBGRCel6y+nTXiHp^Sd^(wHBpvcr z8!xPyCZZs}`A(i?u7L{oMKYHsu&^A+bGkth*KoVEczt%#!$$45>&>WKr50RThs|B7 zgX0k7QiD{ZFH7fkXCB$8k_8$jn|Lz)abVyz%Plr+3aHFzBkq_o34CwyZOO^0gx5me zguzP4l8QgLBP_>%<>T9ytTZ6T0V@W+$E_SI-a5Z&TduWoWqR!kAD`{GWpr9{Fmg4~ zn*pUAbgfp}v3?jc38N!m@*QAAi;yy;Vq)g$w24yi_mNg8U#LCGVx{IKe>HY6+h5E( zx=z|Uv8p6ItC>m6a1WgU6@5)evpikV3|knXb-8}YmakL~=xbp=n5<3Uj8hS`%ET0n zGNt>IlK(_R-AkQn^!9FduE#u~W^RjY?qxn+wAP7D;`z!qIHkR_LZsdK%?tOA6QQJa zocweEo$+BcCRbpqu*zE`b97IkQj(Rp-SVqL<&dZ4Oo<*}lND03grc#2H+0obdlbsW z8ecwc3Ij1D3YW_a85r_g+`y&~Y04cv+xzw_G%zsl9t$<@XO;BC`FctJrcEFJ3kNWb z`>ajmin3CY>anXw&BtTvb`Q8bcJWAmZvYuzZhkCkn$DBT>oZ<#Z*aLf`#1^Q0=>DS zY@$43WqVvkknb9er$+lGYyXtthv4nrujMoe^j_;k+ot(NuR9UTf?BnG)sx-yDjN3l znK}pRqP-&Fvzx!1YHS7{mWVfDqr4p%8@INHymfjYobI zg~&bj=gY??5cf?7*F9;Jg=)1ePY`M=D$z<~zcog&ZtpzT+HT^nDMljZi>vUAqs4}% z&LC`Lr|opFQC2ZucYTSnz}a15ytehh$?*2pF-wbj2}ICfS_Cq2J4oH?^Vs%Wl~;F~ zBf(6Imc1AztF=5v)yn}A??wLt<5o{vLW4_o!SH^BCFf&7BWH3z4y$5S^E0efSXnD% zp`I^;VAds8ZN8`9KJM>^yU&glxlUUDRwYm;YQ6z{(GyeEY`W=>G{uFbqQn2ed~Wt~ zuo}TcjSsGh-<5;TZjQ&I-(*~^o{$Zre5<`qcHlaCE$Z6ZWjfW{G(LBi6^STxUyLNd zC}(&3xA@MVp>p=K{$Xcg(e$JV=6xUnu7DvnU5qf#eFVSD#iX|Ze1m}KxMsvdm|lr^ zb^%VdGZnd2aop153YvU!hBvk+>w0DrnvUgq1bd_lc;4X`05(nOvSHzW z+ZUt0r##5^C8%ma?iyD;WOrTJC6*@c)GxJTKl?eyh;q@J@66qM+D0O#H!{k`s#UrF z%!%UmEbGt?;b$!>%4Ba3tkj6g$=l!b2WI$6!QT`UhF{!X)L1CuWz00ew>p>wiwWRI zMN&w3dmZuDTP)%V%mwcSl-3=oe4B5$%x$yI>zXA}ZL61GWXK(d8I)+NZPArTT3A7d zA>OtHy(L;r(;qymXDlrKEQ3Qhbo2C!N1%Z2yI-xn95^tXGl+eT>7?)6BY2;pQ3Oho z#}cwO&Pb@A7gfx;VWOUVrjE$oOJnL4zJ3H^=&E z-R)jV)jn5TMXtC`w>pJw8gW`|H*xewYW*rfeN2G+4w=}JIm#DO(%%g#(UZ-0XT}-J z&JBk)Yqp?03R1I{bGci4R5)Cdp3df%mV1SKeKoVA)4>6pn6D9$J@Hc=VMj>H`qyE9 zH0>|(I2+DK9`qh)q@VYMETU0*QrFW#lIV;I6tcYbdS=G9mS#UZu>ozz2=iw9rd3q- zX9Abww}gtDB8#sQiiO%1U4jel zkVj)v6a3<OZT&939O>=cNd?r3Gj;{RCZFs=ClrlxWx(6~OYYoddV;1_{^MN3(QKFk? zYJG}7YVgwzXSA@2VXG5YBE?%rlh(ms@4Lct`CxF-{wiM+a>3i7G%^7f9DO`+CxJNA z20}{>VtY4yiiAv{g^($R*GT}B)QxFSV**P?6W4gR36SpNC_~i?tod!>(^xB_nL3Gr zj_k4X)%;f|cAsXMtjXghrPkc2zf0RocIMS2D^#gvY5d@rYfmm}B^x56{c)@G$fus9 zetEm@EH!)l7iXBBkv%N!MQy3cgb1#~5eM!@ps(W(K4krq*qXM}wp#P+s1&o_KA9Ny z=uUs7!!a*W4GMrCV6NVk@eOOVjjQ4^{U-w$nAM4zctgZx$BK<{ur!Jls^`q>0hF;i z^}M}}HCd=ma*w_J0xV|m5X?{JG#Agy-e^ObW4z3NC$GNT_diDLtE9JoJSU{Z@ zCgA?i=36Xo(mTm$V}8Fv%pP?5u%B-la-8ylLi2Ae0JTi~7esl3k@w#8Uo9#M`y=^> zXzbEAG5!}Cd!s+k3QU!>QbFBsNFQG(nVKu(x=Og_|F)X{w63?FgVMQ{dBjTA^x3&> z(-S}l9y;@m-CZ!|%uIvXjKq%?DF<>f(7jwFDF@6UZi`MmGUiS3o>JCl<_M;(PLD<~ z@EPy`&Spkob6ihafZ}(2VaJw`->YV<=wKC5H30DpYiN6nz*;=8;J5h&A-~)KXrcFV z@H%?i9>RDsQ%K&L!HrlhP8bwR7`G@JKZTGi^W{ymF(c!}N=f#fs z@-9i{GwRZXR#!!jixK%X$a%Tiy+nmOd6vtz#<%QCG{&wAX^+bd&J!Nmc}s^y79Y8C zZD3mwxnta_yq5Fc07d&?8;X=eT|5ynxi_&CR6a}VbiMi7J&W`$_!bDFX%!&Lg`=XZ%?%;$G(=&Cmytd_>W_FW&(WpldVe zh=T=OOj?n{U)Ct=@Jfh9sj9RetzgA1@+X8Q+%Q|)arx&B*PDL((@x)mQ@<+j)A0JZ zRxnlfKn34YZApozU6>~{_y+rkfmocnR&nIHYsC>}Jn*Tz;sLwMmcDJ#6!R7G2Nz$x36 z@75jv6b* z(}K`WD*4yf#FP+I(TF=LNVla2%f0HPWnCrM_FOc!f$zFvpK9e>g8 z*eBY4abrxAS)9ACO|^^E<3;r`-yERv7%RnaJSThfeoZ7?XEfE9aAZ$t#gN8+vnUWp zMP{k|O?;pORVPThqg5X`sr7Jlpi?4|EPTqE22jLk{w*zA~*77U`65qolCP{>}Xj$GleTQN{$WjGW5 z{`>Du{ZSo@iJ^?lQ8&zE&^);v+AKDgUzA0~_fE|<>;j3fT**}r80I96`E6S2RJ zU-Od-xZ2&cxwRjz-0s)yKzz}lIp>XEfrCWVmakN6vk&wRd8SNGXFU_inf}M22rj#+ zDi=G7^V8H3XDD-%9nE5>_Z8_E9l*2S zB!xqjx9KO*doY-Fjy}fWWVIY#q)IfoRkPfrx6(ED5x~?~Z`o$!^aP3WNy1*~g4d36 zBa-VIvhF;7*3fa==5pC@h`zW^R-AdPr(&E=PgkUnWV>gpVr_Y6enM-i_=u0D298n; z2%l-$^?cxN0NtxkVhgiXMQ#mVT2*?1U*v42EUoh$@@aOb|ML0&1%f{{-rF$6fi9BgS>KW=JioDVnFq8vN^P!N@g|@SW+ zEoW8Vm;0H5rzdjo*}qVFMkqLh5Owi)hAp-c%`)JrD&ZZ3Ls-)YvX?tT=UfN{Oz93x zt<5@`606|v?x87ai?0l|1$bZgaJ^7Z2TVGJ)!VH22A|onl+=}-UXh^38Vvqpy84d} z_TUK<@!{Ds;9{zBd zSK~4*sam6l-PxXegmQciJhG>YpYs8pcr1Ki7j;S3z(;(=sQO_s(azasQ^U(Em>a<>k$WD?KH+P$r;oYsx>z+)Z!!dodcbjyWM^9h{}^s0hN*E`jdVl zH+TzhL}?2kI6c}I%D`s#??aZ-el!8EPz`8Fc-VCHp#9FYCqV&6ud=z57^Af@l4;g@ zA+ZB`6jsG7S;gGQbaozntO!5h7L3+6G|PM9QS3MvVI_1__o=Npw?cMPmC5U#{_e-2 z=z0`eO~QWU73lW!NFI-MYZ{dbT^B!h)=I_$wz0r$1ZN&!tAlvIGUU@*wmjjj_?K~= zdQ8*wA2!>2$y_Azf|X!>QUp{Hd28u-j*3ZPc@)bi32ZF!Ud6vP<3;IW?A`fO?E&zc zkSN~c&;9J-HnRIQdK@w(M}%3iBVtkMVRcOShupb;i-Y>@h$P0@O7Ka<6zJ`Eor@od z5Lk+W7Rq(q+Y~dX(){Ga+xp9=)+e9xS&n1rub{E!+R4j?#9BNMKPlDfq1H=;ICNGO zkd|~#$q~L;LF2o~$eC$h^bx#m$e4y&<{E7`&?h6h#u` zD73j4r!iFy{}iOmEKlCsk10tY;T8!XfxO7kEHL9wl>c!clOam%pYTW{@cv3$aE{DZ z>`G>*5@19f=Wcv^8pX7k9`Z6DCDie0@`XLhg#_~Y)$Hvhg6QP`u=kEZmIm9lXm`1~ zY@^GzZQDkdZL7<+-DTTmm#bFUwzbNiNn)cTGbbB3x0Z`-&}x%q>qF<`jrvp0;UDZRQfWSaX8E%~vgk5O@!6>^72;<6mE9$I zq11Yh>`{aaQQ~6UNz!p;Z722(qNo8keeYv4v5gencn#+MXQoIi%+SU87u6soq;7hi zcaAN4mfgr78S?BUWeyhA%B3R84`g(NL;DuY4og++KrPjYw3aN9(Jm53qv--&6z_KD z2ppJGX?=9Vs=2o^`WPTpYDN9ES!!>T-`{5?^W+YL*fRB~e44@m9 zn)9ATBFApVS97mQAAzgsQ8@P5%bQ$epn6}rqTVBCQ!N-N`SBhk=OgdtRB9{_ahJ#W zj{b66fFi)&(|FkZG|$j@<%1u{e=hp0Ow=YvPlmQ@49RJ(XP_c-S5roT+hcjecB3-d?wnZZOXC z@Yk(J$Z65R3{xYg4uv*0o|?O;3{JWls}Lira(3RB zd9RBpBC`f&P~LaAh$rZW@a4q>>z9DeMwNGb=^0949WM0m{C^CaHh zSEc?I9X)e+9nV!};?;13_r*Z zODzTuE$P4Ou_n*CS`xs#;`=TGv|A($IoZnjM%lZ9hD%K@0$xrdb;;DXd{x_)riVcgy((XBn2ag|<^&p}PWRjVe z8(xmtYNEcp6NMvzkjI_+OY8XQ*ceO)NP6-L z4JBEDT*OvrqX**`E&tmT(f?He6wr5tZrv%Dp3XI`gOQ|yFM(cyG%^EmND8e+*jGP` zHoF`@Bd9^VkF8CjuhK{uJ!7{9Lg6LL%ErpBgM}uU77p{Yft2%|E127E7poN~O0A|{ zuB7ZSpgH8f29w&#!gP2qv&N&}8&TDEc1`)EdPSJJbGu$TFORD5C1XouIg0){Xzu%9 z*zKf>)aj=hex2n(=_@xN`8k-)t(D{DXra87q@^ponI2X_uNS^JuV%B<@zKiR4Mdr?FbY!i za-O6kW;Jx9y>UP+fdMA9a_~`KMkKnpPNT zXwSAUd$-WK`(mq3nl*vsU{GBtEdT|Im@27 zy>~&2LjqYfyQ8ew>g) z&2{oOIbX7+8ha1Q)Z#oI+L7LNUtZ~xg*?cP7{V1A8u~`BmSH>OuzpbjqpV8}oTS9o z-ia^bu+mAbuywTLUJTnC`;%!>^$&dfrIy|LiQbN8cvK`gd@o3!^TuXi!&ZOl?(2_G z!;5osH&=G=&G#NI1z$zkzYH!?rsuzB9f+f?noo?y>7Jd~f!iZ~*F_2|%?aC}yOF>= zjx+<=0(aTrd|%Du(VF0}v4JLcUUuR+NMfk_crHxRjeVERGXYRD111c zJ|)jM*gS6BR66Fq%;?Aw5K<9kFNXi&@@);XS6EPMu_hUPua5)_M3KY&=s331my)Mv z>|u5PF(wrNPD#0sB)>;1K=h#4yRsu+x-1+y#qV~{wetp>RYBsab4!1aIs)U+hso!e z1>|(!vDjcR8AQCh{P^JmVf(j2|9v8hR>!tR2fyCB2XjV@D1^kyU`=O}=&*}jpbI&m zG`%3(^Beuu>5JWm1iH(TjylYkC=fn}Ng;F3F7!3hP6j#xRcrsm1g)aaQF(SyExgDOIv~8?r zeZm`kFDRU|Rfvu>85)zA*gtvE`bqH_b`q1McGE1z81BelLPoo(NE{-ceUj=M-3Pj>Jojw zH&vUNnYEee*!pE(6FB?qWQQ&38zQD@wd0gDgtRd6un0g)zX?HcyV*n12Dh zh%{f|`ws}BqnBBbc``l*3ubbmUJE=6<^GMtmOk1`7P3xWd>^&C%7>^N&UiB0+|G9x z)#$O^lTf<+nr0Y=<1GxONYmigKDzwvCBw*>KSn%Er6%YTa50ULt~Zcg6bBT}bEVPH z!MCURlnktaxGO0weiW_I_8j~C1r4YeL3yxEe1}oGVeh)9hA`|S?FGjf5kpj*0g@Rv zbwY`!ix5gS^wcQ)3Ex)TRinas8$T zX&^;@q!gT>nrt@@oq<}?P!ZL84}D*|W!LDpXFq^3)#vkEf}1*dKMUj^qIeO_>M{nk zS#X^xdpoKI6g}^b@9b!2Ed?S9?iv$IDq18$wY2ppDA!oQ6eg-96>CGi3Sh^ZNY#Co z`s6*7POkoeK+bFL4y_jt4QZ9#5sn&*>evzwtZup)GHT%j$#*@fmV;r6$vni0Wap@- z55=Zg?M$8=P|BQwvgDxjC=kq)i2+Yg{&|jI@%on2R%S&Ge*3x{&DvZ<1C4#!SzGmb zJCs&2^dA3q%Sd_7+n=Id8eTe*_#w6oxX5NU2fI3%A=!oxfs$+CI_7nbxZ$}qf1k?^AZ_E7US@_T3tUN?YsF#oNoEb*%fqn%^QL?$xF*^t z3F+E`{NU)4-nI_HNYG=Vov*8wWbN#&%9E3aVkt-O(3qAC~BnN-V2ZBE#8$W?(P}#ZaDimv( zV#;U8|mXQK~NEL83Pyh9Y+PY@2sBO^a99C(UIYHAP&-y@GutgfcK9ZB! zvfOkzn15hpW@jn{(c#!IsOBQ1dQ)AL97&0;D_oT$^nW+lvPqQ#UrGn1vW zO+orny`sE2`$t3SneDXH zmB#e3j7$Q?wn^`C@2hrW|+NFYew?w$1S-Ghoeg z7SWxhh39^=88IsJK)!C2l$sLxqWiP~KRR=1AX({rJLBPOYQak-i)42ZigIo6q3WuF zRY8;ge#)H~8-r&B@uG@>o)U~HBjRM#4Q12@as=Hww&6^T(e>Q&O^k85F6k_IXP9B* ziC4{O=s}{NA#ahQphmTXnL(NjiK-NrkOE?a0pdwRWai@C1!o$ME_rJFhb4jUsc~dLZ*J3Rn6U+*p z83_4xZAH&Sblr0-&9bqBtQ$_R5Ox!gTqd_im1R82=_4;Rwo9qONo2k`D;NL$y>DHfrQIm`VU=YLJ_G5^ERl#U^8v#H?Ut0uQRKA{{2$Qk^~B zrETVXKD~%U?j@PkdJxCC0TWRQC6mq;TDT=AmT7aE-$g#-GH^^_IwNlYPLJ?f8fWY1 zq+1V3X1A$47jJ{IIMZ)9z%!A_g;cR9nun50rA@1|jr3AX zn7mSoX6<4DIc%>hNd;NviZ&u*v(r^BB8ote*LrLQ7HPg_)D1Q>g)kkD>>;f0v~@0L z1gmwu9#oyp{yG|`dhky;x+R2ERx30-ZB?~>UvybgbCEc4Oq0@CDy%+etq2T)Utmmc zg*jrebT^#>SuCa-xNN_OuGP8f>C8?i*hewclU+CH-$a63E|Pn_&vWr3uT!xXKpW7%qt3+)UN$mf=U@qPZ^E~W z!D))8^Zv!WF|1<$?bDnYw{LQ`wauzFV_!5i=HmK_8-H+q-#O!C$bf`czxfxKjtyP2 zZHea8GcTjj1WxPTI=)6yN_Y_^)|356!+c2Tu>@pgZftzPaC}gO`0#Ts;m=~^W(VfE zIzhNMj#~@w*TuQ8*y^AQ5*Lwa3JYOEB{N7#q4(O@f={j_*kR?R>_CjmPmJEuY6d=@LA4ee(L?Rrj%`>V}Euc*gfxH{DQ$tkoPxdJu07 z61V6E{{_w>O3`wTI>tfWtscINR}3x`tU3=LO!VOIzSS?3sp5UXG2yez=3;e*Oh5PYkw-(8HoK9WdOY#W z9{Hf9$tH$@QA00t>Nb%%2UgcJhuuy z?(Lhh)}`PaIkmI(sn_uAd#Ax+y?}!DCjr?SY54g$Z%AlA>wewm;ZV!j9we}QA2qqZ zeW|*;8naWUMfS;sfBg$iVzFLJCz%k8`F`(>q1i$A4($3^fg&j>-1W?$-UMD3ERS)v zruuyL|7ppx8{!0_Z%+b-4TnNx5_+s=s-z*s;Jagiz9<t`vI!|}ilyEbgM%|}Ap)_dfN%&vCh#e3;yu!sRP_p*K{aWI7&YjN$qB?(We@}oRe;hv6;}EMr5?w z5R|R-jMu$soIQ~+aQETABa(-B71Nz{%GT=z=`iJ<9S;~UzLt>|RXl5=m8}v<*|&#xp!>Z;dny!tcx*TB zp~S3PP6q;p{_-d|qN06F-WF4>Y~qmj$~6vpl=dhFw0C@eA)_|KK?`8xM_MR2^QlEs zCfT4Zygd(%W{wDQ6IOvD;Mcd(o2a-~oI~2Dp!g>JUbGEu&S;>=`0RRQ=^}~tmDio- zgv3ge`AgHQ>#~IN#r$TpzxM@~p{{^f)r{wJgTtC!s2xuA*-VwZi}7)^&eE2leR>4R z`9VSaY5sEml`Jc1h+`f-1sm9etGW@DcvJmeqF97j2 zW*Cs$8I}2zZ^YLVTexHQZG zkS9AHdtCrN+qkcfCo|v#aF+WM6ypkKqNc@0!?J^?_b2l&2_Z=(szuRNGN0%*GHy7R zb1x5rEpzj- zOcCo^?bf8l6Ir2Of?Yh(nLKZWUFw~NU|*<(bS=@z>xsaYj@y>mt=S{~s1!?Ze0NjC z%N`TLcYe6u-@qyR+frE^ObwIupt7)XtV0&0tXR@VmSE%C{iLCcGZwv@>NDk~EChzs z@b9GN@U1x{f?Zrq*B4#@Zl_BIh@TP#rn7z!a6`8)ET6lkdaD$dntTMRc{F5|TCuqj z%UMpI`jt-)F5G&`JypAQrEF`g6)d2lg%!VUnoOADeD`F*alc>PdN~$pzw+B@+0>xFv5m#cRNx0Z$O)_GlV?W2EnIQkPp3Yv_`E0g zT^${{=w&_J&6#(>3$Xw-5EW*hZMwT>qR6x%}rg zaRFa|c{{mshm=UZCG{w0u>hutgiQDAtWmX1202p~!QJ7j`%z}NxngRc+im0Tc{UsS z1^rF;N0JoHf+^8IrMmb5T-QUPI2gF8IjgacQI3=rogp(ao~t9G8ora331-R1DE2(W z-$S{S^ot$SN#rlRc1?Kf*H~LmR>$oRNRN_ z?)y2J_InGdge;9b`z4C;oojRaIgpMyZ*m&3=J$oqpYJYvskcGN)Zt5zei8nuxq#zB zm+8;*Ib1=~PIZP-u^&xw1*e01U9mk5XHnj}aIM?cOP|k(P%FuG*18Y{ zFCP(u@1uIJ+=gim9t|~`L z(X)%hbv@1~pc*~1W{T}a*Z4UUS{8)d+k5tG!gE+ejjb=l6Wy^6r*Ahd6H%**&?6Jh zLe0OB61jq~^6~#7j4Owu?(lU5FXdm4+aa(!#-07yuW35O6tAkH-=vNmNjxMcXx)Wr zR^5>)dR~C#bmK!L@z}u?9R6`ZGP*xhI+PCqayGpzXPxwWX$9YKJw$Pq8->6yP1r^b z7C#0#%kNd<7?(=rCkRt0)P*T*$SmyWOoUP4boW;hO?DSH*_Eiu*d&wqFK?Y9oTPahZQKtWHeRLpMRp8E|^ zrd^*BuC9hkVrS zz?j)Nxap&BK*W3Iqw8tq*Yn)fE2*ow5|2;F^||M@^>v~sZC;geAAY>Y z7Od;Q??sM_K)fZmdJ{F-)Y)PL=#aQXb4&lT5dY75ynQ1Ss+IjL*7vPd@z=BiW-wTP zqv+qhR!8>As;Pq5{l``|m$#@boWRZ5vqxrjuXP#Q{bFC3CiD*%C6tz(#H~V6X?25< zG|p1dt=}f48>pC!@;zPB$rLfH^XsK(Xfd1F+HJ?FCzRmy16nA?U^ zA+YBrwUKA?SKA zE$U61i6io=5(pKGi9FL^zsxo7&gSQB;G5?PEoNp(yk94A2j^kjO#5t&Fs2Qe9CRh4 zJNRU+@<_AyBO9?l##IU#SIt>`Vv6P_XjrZ2>8{p;ihUPa9X2CLG75Y+EK`^_tdLRU zK;m##R&VaG(xU%bv2pbTu1=4*=>}puXvEk1f9I}0hG855p9?b*5wj4c({I367N;eS ze=6Sd;?ng-Ft)`Vi$36jAb55>XE77ftx)nPNyiwF)%le?rcv+tr5uJ;l}2U>QwHbY zFg!FLV6h$6%n6gSJ=d3LzbH!EMhW;kJ1;Aj19z9_Y8cxb78{utvaHo9y`{P!K{S@T zVvS4zhh@^N{#qQid&rsycHH@wn!)>+XWkq|bS0v#bjXO$7n)e?GeVodhhP%tFITQi zfRbDZ)|5`f%b+4jM#9I-YRRtt)YZz=vy#f^Cxa=IX|e54 z55>`Hv^K*-2RKRorPy#Y?euLxroD-LjB>`PX&eVOuLHV|h^>H=<@SEqTY--6Y$xi^ z`9fC^w&_kbR^B;7$`woUpu@pMpbQ0O8}$X!H$~^_Ojc*|UR=Jn&+?4Sv2%bpXjKQZm4g$CFLAaolUh zh|-K{*ylYhq8cD_Xh*d3Hi2O@O+$wpZAE5)&$`>JJT8&pFJ!GZ%LS1~u^MaoyYy0l z@2a1O>ZcP>%-DKGq&}n@ld^D?B=HTlnU~p#eTuuNiWwZ;p*E&_p_pm+ifyXM(VH_) zP(KHY#j2-KUp!_*Bj(0Oqrchv@vn-CjY7OJ=s1yF#Ue_iDQhX*+Q?4fLp5P{w3Yhb z(?ne28&+P{l5;<7>{EK{gR>9+#tbk7Q0#)rJq6~~?#UkxWvD>vE$wbTzJt#R!y z5g$;lfaY>E0esoTh5R3EC^o0$32_r9Nh>b4H04`XYSDsCgYHKOf@H6eZN8rzj_|)w zgm`bmFeM|I0uK9G)0Wb~8lprctq@-2rajvno}GDa&Vk2s71TqC#y!t3;tC}mco-|H zPI-ot9PDCdG;(69Q$0^(HrQ%Mo~<}A>UigF(RTNJFL%1fGu1J3X{vtJ zdps+xU$PZ2aEH86Px$Ca;nyRW#-@c%dSS*iJQg$)2iWs@rm*deHb2t!?6#%-<57+b z7>Os?^RJ{W&ZqJgEoEPVxvQLD250#<=`3xg(mK*K=uG+5UHODq(KF_ydNbfM>-_2Y zbndjqbnL6_w+O5|Boy5K4iDq=3nIhxGCJ{r!=y&*PwFQX^|)FrXEC)ylW~%7 z8@<}MFx8zm_&gq;RqmGyeeRcYxjMP2Kg(P_TiCvscb!;RSWi#GHne5e9VJn|$cx7NyN=E^(|=KnGgo2hJF;qPGL=Y zD#lLM)YFohmKQHiRz8WM1G7zQ_O_{FEFIN*G~bkzmVPZKfoq7%0*jjpviPT~=b=(V z9ubVlxufl>^8Bre=u>^L|2JyvYq1iT`I6PwU}19|M&!7JGT$QwuGo-Z?MgVJ$*jIv z0g2)Azj)gNx(%41Vom#E@rSIptg0G_;JoC>43XHl<89%GHSQU*j-Uc?^t_2|U299|^3Ngyg|@3FGG3?(d9KEsmagF3w-tZZKib$( zfODFzV({6;se;5@TT2L@qOhA1$b>nW83K-?Ua^xbPUwBeg8E7cs_>I&lFm297jnSh z4t|l~R8d?X4vRS*mDk`*;u5xNPCjMoVvtcK`svWDC~09sB*u-*GFRqODGiJHpT(=k zaZrLssLPh ze|3>cj)a&GxVmH;DEerz`S~4_me>U`rSJSH(Cl1)#7_uS!l4A6HK5iMVVV7OqY?Pp z6MfrH_hz;6cS5L#4KEVQEK|qgM%@yI5Z^EJyea3)kPk=5Fg(&PTrq2Bg9jaZhR7Wd z$`r7ha8q*Ba(>T+Xxx%ijXTTe60x!$Xv-Itzih~_GF)z(Y8(zS4vI+Do6}HUAtOT& zYNAWZ{Ngb4z6F@5=$WPfq??Qku@8#<_@9j`L_uWwjP|{#;*HGu-r(Gi{$@@W30vJg zFI8!b%CZpWa^!lk7Lei;3?}?RK%A`U_o*gj)DQPyDOM>l)*i0I5$6x{$5C$*_jf{7 zAx$t6^8ig`J7gv&*^3vaD|Fre>wXgbcr$3Vl`k5&{MJ@vw$9ZX=$%EW(H2&Z7*7Ms zf}ql>hYfXv#^Mt~q^V3@Q^&$hnS1C1a+GzrWQyz}g(j(E3CFRjg8IGmNHt=$x~;(y zv`+rW^CuW5{;#Kcp?V9s$Ulmg`>a^!1TV_U_?xLUl9RmQ#OaNf#^)rOX@lMq`ZU!% zzruE2COZ&E??sj?lDXN|2Pxd!MsHqEZ+JE)w69E>%AL*nBz?rpsli zFsa}C_59=x7BVK6|0#)ubjN z=Hq8x^>Cxkr<+Qzac{@dvt}Bj89dX|8D=?8cfo&cJApNjiguY91IF-95%c!MSkmXY zB8y<)A%#ulkRAW2-SS{gOREfW-r1rYtPXm=8ErKr)_;)*Vf_mPd!c#@1V?W%L57jO$Me1T(}3ia z77{EHDcqG65&);18%rT?t1GN+M()#mudN2k3gJTZbM>3$`8b*K5H;^Wbpe!Rl|EDZ zb=$6e8&jVJ>rCNJL+0KR84;dpE)ZjJpWhHv5UepKfU?7dE%n@x_wtpl|!{R!SAbNz7-j=#O^O! zwdl!gsgJs!R5+Mp>&Nd6tUbK~&Xk#+mZehyIH+Q`9*7OGG*V)M^#yO`mXhbU5;h15 zHdU|MfxuxHKC+LlfZPPpOgTf6MxVC(&T0T|W>hR+SEeu1TK;hGr5-sFLomCf(#sP4;9zxKtlI4uu>mtR%|pCFY-VNuCjFlq8ptVMEO{f|T1H1R%; zx0g32RefmWO``cOF05MO8eU%y%aZ*Cm-muFP7V9&({|&fjDr0k>rE~i%{!1{(QL4F zm$RlAFq)y;;u+`r5UZR#gi)$zk=UI38zp^dF$**pgway3H;&3KPq}-7W<83Aj$tN= zZ)zjt-`G2Dj&1RGV)@aNMM=?gKAkrb-j8y> zyu_t_yqYGpgl*<(9`I`05wpx7Fp*z0Z(d0K&9a4>Lh|d@Ili|$t99TlhPj-RbNooT zFjFaNkDW*lH2qTX@AmiZ$20gh6|4l&T1%d?Se1~~gIM~7oo;rIZKL=lIJpoZ2ZMAf z@ktfE14@d}(4Cz#Q9)SHgN2(bLu?IsMUMrts@QUA$&2JD-%JNR+ zkNOgP=j5t4{sLh68G+%3Z#Scg!jusVc(wY!7D$>L%@U~e6;A%iy&dP{$;|!hb1Lq; z>3bJopT@Ns?hs@o}mnjzo`fEE&bixE^!$R@f|;h4O>OjY}*9^HyVeidia)MOTgAk+GgQ=SuvOGgFs-m&^ z=3A=Ymp(fViOU@u^t}Z*%fZ#TDpWB}PkvR6PwhVGr*L6P`f>6zmk2{kHT)0s`Hu;+ zYhx)h{J@7VTaXNQ7V; zLz2=}^^^>|wG&4J=y!vVprpR?eHHJ!dy2vNXdde<$QWVv)MKH3dH=^ZtB;aX{#l=A zbd?@yn0eVGp+%S;n$L#Py5p^{vyHv@?^IHBkCk8mY0=51-m{ze0N=-@6^XSs5<0#T zdY`Gk2`X?-`PWW&7!W#xu8pO8W z_Z;4T!uNU!LfrM`=RjG=0frQQm< zb|z*WM~=iluWk8shQU%P7grL0$Fu!K4PIJg6!F_2CA}~()7`4myz1F1L0ysV9n;k8 zg6lA7Pk)AN(q}7Ztw!FoD<>tVEdM!ex#Yh+oy7r_27Mhqr%qP(_2FAA;UBnmJKq;K za;Fb*!q0(8g`T%;wiiBV527dxi%b))eH{MXi7FAh+oSdx6|;M8`BAr1l!5|9!&tPvT3jgJ`eb0>1iF zl_Yiw*T1v?9RKz3Ka^_zg|GTQW&iDEA_K7Py1z?O?Em+d|Mo--HHg@^f0+LN&HcaV zJB8h4bh{#)ugP#DVDS0zK3t$xG54Q_?H?oagHWMTgYkIlM&@f|L81ZhhE42=*!*@LI0cOxH&%_Wb%{qbXc zgo&%vqobRv=c8cWJ^i_oPw(xfUZWn|WbJE?+Unj{Prhrt?Y0=u@fnXkR0`#7hdyur zBj4^``3;1mfz+9v;#Xf^yjRJkH|IjLH*a5j-o4a|)HA=A1MnP3zN;2}dI&SAFTn*iP>2Gbr$wg8@y=b^EQbxiCqR z!@fU~B$q${epkz>+5qt8zx;HSJi4z1qx4r2x1}=tx%$3+Z@xLiqj>HBdh%;!7gSYS z13v!P&oVD@uEqEK{Us-<;Drl*WsMboz{ztj50^TXJMHz`V~op|eDG+V7x?(~*Q^Hg zkI_}?d|7i<^oSvG+ve@b>ixRsN2SgG`HknJ|l3 zR%o*w40+33~lp zsqXcU61V&5o-bPs+fH2cnVbgZ{WaIXcM%rDew;(-~S1i|Ml)u2CS7d)lp8O?Z?PUc3{@I z?r=01%U6)(1gl#341`j6MmQKt6{p*xsnk#0*K+^btbF$6G?QWdCv#a)P}A2KuL$Sj z&p&obaWl7*Tw+qm{viD(?+;_dg7e=J6e#WyB$ZMCt>tL8){6b}hY%HE_Kpp%cgugu z_J3&MF#PwIk2OJh#=_h5qJ&|GJ%mWDZUB5#VkGz9 zc33q3v2|Zv@4XQg(1S+%W=!ySD)@7~g`lJm>U+vp2;cSt_us=+J@x|^vkLtWZu;`p zbqNt6*)<2*7Yma3Nv-KW|LDIQY+w0xJ=(PfvGu|K(5e6O{@0H0{}bjY94e`6Z~vKx zJP||T8XV64jmT4B6d0E3cpw^o>L`v?PRC$lju}I6iEONiXS}@95AM$l3ovci&RMFh-&aFuMb9#AMZ~j ztaw&m1ToD7|JPU$`5xL8k`JYN36d0=n8820ew=w8sQFsx|G8h=XAj?7Da_1fv^iH};w+MF_=Ety8#1O^SRlkfUBGPRoD-EWm>%V( z^6Zw59!+{GV2NVB?R1v+Kz()GDBeZTGa^V|Wo5P$SquIrX~2390h{&ThjkyQ(eWCy z0L>6PvdVFP$73#0u`Z^fYk?|>iRF5{ftE`F8cBgBQiTRZ8_Ia~%WfXdr}*3mpl|wi zf{I8Xnc*e={^bUJk;uPQ82>#~^g;)IrIq9|>gj(%dg}xQj8i4r;O3jxlGCFh4x|cn zokeBHEShbt&=->_!*BaY5e12+kGfJ!t{g)+s8RtJ46rmwzE>y#ulYxD;=3u(O||q#deSb5vle2V1SD9qn+eHE}|3PNEhKVH&XjEjLAq8+U7VPbdgK&}!=U{if`y;gKlCxy+~T3lp>Vaq zL_Vs>zPq|=Xf{^h2TyM+?O#9Sc^xpYz|jhyt?Xhp`@$R=A8{euGKbegT8jLv^Ts+S zo?*+(aIq^kiQ}e@iKI>zfB#{k$VM@eEx%O{M@uAxr}>~cMkX`08a?OHJiKp#3gkGw9; zc_!K zx{R5yL530ik@J@%O#jZDH!B)*G<`Qg)`ndW5=K<6hJ|kVmDcEi)11IkA$ZZMjzf~~ zAOc=^IVNO*Yi&MIR zA*sCeFq4c(Q2+grRxgq&zR!H587y(1`mf*3!5C2hQ`kgSuB2@D1WhHM0&dM>toYKh zg!S0wMI-D&%HXXDqx}r_JgsKG1=3JsWmvT?*H4l{*!p@W2ImnoC^_>;UJ}UvXU_Tl zd?ih&`N-OIq*si-`J61|;Pfuy-Rudvxf$oLVR?|O{N7lFr_sc88XCG=fJW)=`JuHs zozffU+BB1F+McY$o+!R9-%pPLYDzy0pM?g4b^jJeGh5(t7#-AuwLWeuWahPd+ASIDey< zZ_f-EX@N8tv3K$WZ~Hw=JnFsh@zyQ_W5l6gx*)9Ao7UNe;btN-F8Xu32 z&t}9vV77TzouyqY$3=$*@Ul_TaWbH+*SLAZ{L1Vm)B4-KmUkD!EclO-VPcROkba#G zI8=$Kcgi^|mnsM1@wi#F%#f08UNWDW<5G<~ywkWfqd4h5wQg~)0%ILxvnQK|ljOsxW=S{$@J z>X_!W_4~iJg#X<2`SaHMBE-R+wXoSt?p-@C+e)mpObtONhpjIladHyXtrTZ&=`fWomR zp(1zKGBUugbXtn!ha0f%2gw6fT<`y)>#c*@?E0?JmO^nT5Zv9pxVt+=ibJvD?poZX zI0SchcXuyEg9nG;&fz|D-sioaIp6nZW|Fz)+DZ1cerqpLR~)Sgv(c7PGx+vBVb(9D zVmXYq8B|v6ALm)3Uyts1cQVPm+HU0cznsIrMp~qRZsvdP(dTK1f*m>r5sD0|kSj$j zPf0#4Fo+vjxD*88&+>hm0yg}n`{gkXE5puaJ{7x3TZ>t$J8bgm7k9NIBdp4bP=iLr zC?qf(MTz>JU}NT5K%mromCFMB{Ral!KkGn8Io*?)K{uH6>z#xdivCYEjI2EJ1EC9l zL<;nRpOlExg{39x5!2_lOr#l0j@oZ~hzao`LV*z|Cz+@TfZt6fF6cpN*9JJ#!j$0K zR!qu5?Ut|b^C=YM2_lk!4}$xN<U{kR_CAoOBUfIe$bFatmzEe zb)W5v3{5)AO3g&9=@|VdW2O1n;lT*qp+uZRx>4ADYVX**}Rw|d88X!k8X@a8|)YK(D;tk(i% zR_k$LS||Xi1>Eq1GDrinX)2y}#y((;ND;jJ8U{2vxnK2AZl7%&c~|59@Av;NJmhBw9Z08H z`E&u&5l@_Y=M7>$2jq}E_Rwo1tg>^ybwAI`fZriXJ?6s5ctMc?&S;M##i^{aj_uhW zLg~WWb@azmxzV)%9Lf1;GFmK2QHIC>LBN2C_mJXO2K))Q&L_yH`~yxJ1;*A-PpnZC z`iXIdKf$N{cTr#0Vgdw@)OPH=SFps@*sFC%6H+^QK229>ox_RG1|bplN%su0Fw$eU zE-z0RWIw;zP_pv;8dw{d&4o?&Eex7;S}3g-8yfqA;nf| ziR{S8#6V!M9IKTlZy#NX6IyI+kpV;O{|Sos2w{JGC;|TaYC2M$i0Cg!?8YH}pe@GvF) z{Bm_0#6MRRr`e!zylsAcybrpJ7cW|l~PYV+cYw;06?OC z!;q-nbt(DgdNHLOeC2(cw0*_OAhld*nYurg%LT2U=qFN$lS~Qa3SM#XD z4~vu{Yb3j?)9Wz(m$due4+U;AD6$VuPHyCEZ3tuE!i3F+umHt4WlXAmD9f0e(f?6+a8~jtOB|pVA!CsnW*`r{ ztMkzPwKQfwtCL!fEkd!fyTlwwkpX45u=gOC;K(+8Gb)4yKKj!-Mte9SsnoPSLEZWj zf(zD(8y2DD&-QL(;u+w0v?)!Xt_EQVoG+30)pBxRn!cXEiDCaO!1)yHZaPA3XgQ|c zuB{+d79qW6vP(SM_|H+y|L;FyPe%Ga{Dd#)P?eKjV3U&M*~M1ZY359Ib~LBld5bE% z-g@^<`YGN)#bQeQ-6O+&FXqH{;xsoFn6$^7AYa=122W%OMuB?0--Fh5ya_+JGX2}X zlb673x9Ri76Q4y!b2aV5^NCHaoh{?Lzc1UQ(En?)`u76=f3z&O%0GOs_#tiL{FnO- zQsu9E8Z9|wmt}L29i`8?gz6J>2v~~j9D(_8b5V${zn2Ql|s_Smb` zdz^p8HrZVS;*jtGVa5j3M^S}38EKt5nfqdMF-~E0QK;M?VbSwWY!lrc&a?FdhUJ8c zjrMCHbD-cAgLRDvAdRnG>AbUgV(nqln|T7#=>%I2T(@ep`=1KkDF1&IsdwQ(%YS$_ zj{2o-1lIQJ(Q z6mDyS|EZk*-}n7(jqMrN_fMRymz=A9=!*$uXDPf7d~^0e!yoAzcmvnB^1x3}ph$LP14$CK!IM+JHU zZ-YoCu%H)wW%!0+WkKCRF?;c`^5(vxTp60ix$6BR?JPv@Br z&5c!!_4>R!N+zwBG55va9?#EzYN@?mj&a<(-)^2%Q{HZf@9J0JQFht;txs%454a+) zy4suX5P8mD(tN&0U1tUbL$jBA`I+6tA}*b=L;Yu^d%Dms-eNO-I?dy%*+1IH1$=k; z=gzvI8w`=Q%1bhOhxEJ;Lz5#r7vhA2u6$~+ewS(FZ8uF3QPiGU{CP3*!jrt{sH3JQ zzw80|nzN&ZTuc;`s?ROFFcA%tth^XO>Cv2ObSLea8g>g-sK}yqv6A%@AUJ%AvY%O+28Ysqj;@PI(*)8D{NPu9z$|Ama-{ zj-Ej0!RfbHZ;3!jDNSrwPG^#I8CPSn{AoZl@B2|pK%Wi49OOQ+6#Z}KAHB>Qrexs%`7i=hoMKUo(#edl(+ z)c*SO%^JJo`J9jMQfh;%Ywiyh+PI{!wSkhC{hI0M<>3D;yFc1J6dKFN3&gKDW)bhd z(dR5?8j4{mg&oPin3;U)46d(AnN+MPu!tKSbYW3Ct0dBYEX8hQM00^{b#ZnfPcv2p zJaH;-{$AIi@h{s=80@(^8z6cuIiK8hvv%e-rcGs_=)OyN9vEoCTjf=0ZiDLWSB)dY z77;0&4)@~#ob5-A509v!4sV-U)poWKZT)Df2Ku9a#sAL7YUxfjl;upLQLzzrQ^=PE z*TSV@j;eRBi(;w!!;f#cAjmonFH*PbNAp0@7T4vQpXRM4W8CyRVi_A!O#dWhUR$brHY1k~ztjcBlJl=^EQICbOG*;vKRZ+pc7%V&7=^3*h9i2^E#N0TYjtF#PnAQf{K7YHu#S=! zR}uB_R_ckmrV1Rhg?=aIczFg3*>8Q-j$wLq#p}6kC7{5Q>cUXdnIHigalrV{?pAh& zEM)5TdlV{S5p1>+fx1AQbneI{|D&xUTiFU91WLdmVHqec!)Uh{%Ii6wiG>|*q_X8+ z*@iX=fNE4u%BoX$p;1r%SUn{d7fNGw?bCCtxaOP{5etH4XB-!k(dWEWPJm52|LHbf zC4|n#r83jOFF;hhSF{tb?YP!ij|Ow?{QLb_eI?=k?#`kAi`>UEo%d?#gqJvBO2Im@ zl(A!#Yz{@BFwWp@vqKb9E?f#eMz9)Il?dFlRn%U^pUGetD3$u&~)5Gg9mA_k71KZ?L zdw8p(9=vttMKsX2#7W|{&(hH3*4ng=`~;CAlau!IYE#hHdj*B7GSPqMb z5M>SquC#eRgL|njcAt|*l)@cc%HH(jqhE)dL0(>10hkECBp+HpDyOl4@i=@503=Bwa8xSGsuvn)ZBI$tY z#zthht4RV6UTkVKL~%fmTHitha3=50MBd+pU_ z_lNmRzOsJkkqN5J?Tfjlv@{%6cRfLO$5}QGEA1piEn9tev6P3bXq!>vC|l90b;1Sz;RtZuKPQ#uYl%XbwCK9CH+S+nIO2dX6)!UK!99c9R5mRe@ z?f!b#vAvvo{!@&SgA~i4{Y+e4{cK>qnrX`kcMHhZc#1j68eT@%kQQj0bReg*E`JnoB?`R{9N8Y{Y*Zx|8>H+mTZ4#)iZV+G~M#o0%%a0y8 zW;*U7>3WVnxL;Kcx}QOs<2Va@9F}x3yoQ(8js8`;Np8RS<$W9O!Ie7>N8=`evq)(P78qFA2o6ymT`|uTNjlVlo4RQ1!3Tq#77pg$e)-8sjXkB-xzOYx7HtgwF%6 zQ~1E(Bo5?zHwWZ0lfExQ!Ddwb+W53c3k!`V8os40A&nZqV{loH&*NRZd&REnn@OS#EpqGYY*SqgYU@KDx#K%bK0 zi}*3O@GRbLH82g4#(QQj3h%zYb$%Mz+EjF;!vHC0U@b9L%+3uP=)P(2gA>cc120>- zi-u}W5T35n^xQ~K`{NhFkmqM{utK4O%ge47(s;OAqubnuO*wr$CtWz`7j2xSUx#1> z)pjdxIo5n&kTMc+@&WV*qUVvkCrS+&VOsshUrSFzpGzTA>`F!nyavlN5&PR^uaBac zZmH1d@C-V#2jLpbN*wFsU8WKaf{syNdXEzbv18i@BAG%QfES&SD%?MzHL90|HOE}7 z=_-ens(6+lKdr2WS8niWp(KsneTk@|2!pAKy^&OS*p*e5qK*_UW!0hsq~CoaKeXUN z19y76tbJoi^U~sx!lU**gg25Ebgbgp=$1XSWyLMc4|Z*RkYh!$vhm?n@i3NYm@+^Z zs2=UL14AUCJ3amUN&zW>Mx%7W`DN1|rE!3P0~QD}0R7J^q;kiWQlCzx^JZ`{r-VHk zC0yGZMVMaR=0DZB1wsrosy?uBay1&V+ zPDxb%jOC=FOceI5_s8xC)O-CK9!x9G{Vb|oZy0=O=CAd?9pUod4{Dc%QuZ3tL}TsX zd(w%!Kp#8ObAY?p>0}7V&VluHj7h9uK?*rRlG;~!DI*l`7Hcq4q0IEsV z8h(!zUMHn+&IM& z#Y#?feEr(oVEo!{H9IVk+igDjNAoL911&k1QGIxR(KF&Qvph- zm7yofR|TB-XbjYDJP!{ZKm>0ViT#E|ipoTIk+iBjBpeFHW`P@KKI5qD?U4v34Pec< z65^HZgYN<0`1T$kVpd-$*zr1r2R(E4I|wJ!ebM=(q@?c(pNkg@J$@J2WwE(i2|^v* zw`|6LfBrB+oFYm(ivg>fB6J}|BT9Q_v#c`BGUe`loL(Q7`rBV)ihQv?&L~)hpm`FY zYd(z=unf)?pKefI_%la;p7!vYODvw5#l9D>VGyhlLnAt?zGt$?uoLjl( z8y6m?4zJQA%cHFVrc*!Uv-m$2n(|!?w`U6*Y9OH)NjLDnQM|q!Ci6iK{Lb<^OH;k3 zAP4(E|5}**+Vt(Afi-nq_m$bOh!|0fW53&^;J*#^A3X@F{d-7s9S3XwYU@QxlsB~u zo3aUfMU3Uc8P~KCm#`skntfssqC^4RpW#Z&%8K&|Y&Y4g#thPP@}f?#OwDF_6J@M= zUEGu_+LP(PJ~en)!Eflc#o*bnl(`F1kwtY(i4zE1udJ?K3Ag;;NSMctZAu zbJ~iC>?+rSlyAMfMW}{mVv?+ya~kUYz&CUP{xH4mk4h^kNtl~cj~yaEoQ)xu*jkun zx6^XoC|j2g;(}f|+M1b$k}|2W_3Wvr6bN9&6?0k^w$2i@WI7nGZ42FW&COvucdw^W zuK(_M`S_6U`|PAVV~0`RuV8}u3Jv&R)u>{ITeLk&3UY`QMCLq(9U=ovVtId0t1<)K zA0;+Gq2t|euw^NLQ%}y#rS7*+F+4~1Yo6d2_h;W|CBYIlQa5Y#Kb<-;^~{;SQ~>Qi z?n0tbF0ESt40MH)7}d9C zq8&!NzDJJTJilsUTXOKKGiY z3LKN1&{X&2CF#&?HjqRinuUu!sW#XPgc{Ycc1RgZz!^M9tU}5sF}V|n9KjAkO>hy; zyj=WDc$zWM1=<1bxz^PB+G-)>QeZ>L2<8UHAVf$#LR}`;;#3pLgh68xnJIP5lyo0~ z=Sri!5y4oE7<~9}Q`63pRYYxipb24`9v=g4G1#0pQRl!YNq)MMm9NZxGTjD8thX`% z@%f+xF4Jwwa-`6FKF=+A>riT+9hxPZ$od6n)sdm-v>-^sYetzL4K-qdWD{cw`hBSN zzPsbQKbHhaN6AI?r>}hOkj-@z6^GNP1rpE2I31o!`^?JW>c^BWd|%xDN~NGR1q+*o!usxz=K$CB6~FdW=lS7hCMD zW+;d{Bf;?AaPjjay%(CkOwG%0#oc7S73=vnl^;Wjfl}jUp0kvL#zzIUOlvNXggwC9 z+2B2{6!&yBwZ3iyTm%=ws9=of9amLLT%K+S1_I?K0k1h0OuwJ;>zqQWAZfNYQ%`#1 zF=Qeiae0S`Kz7z~qa)FN_4IE0R)?s6f}Cp83)BYPk9axL7x!I2EMWJxdG%~){jMW| z;f#x$j2;H`G$et;?)e+ztEtS*a>(XSru%P+;rK$>=AY$|Do&opaef}4j>5;(MH9Y_6%7G!t zh>IkhL$pX$YJ~81>bS!WQPE<|f;`S!!!@5(ld2eJ&kt0}_bVOwc<_Ku&g7+?U3OF# zpN;S8flp_?iAJ4=g0p_^G#bpMh5q0x-KavAm<4#637OsJlU|JwS^$D7h&>+%=2;kv3cYA&r>C+;o!S>m-sP0M~{w54>f|?S3HD%qWsjoj#5aw zrt)aS3~KuvjC9sg`i*`EEJY?Fa%_Oo)DY z%`czL2@iVQ1H}!4EW_hJ`F&qB4c~e+_;6zoSg$!KmT|u@ zc#| zljbl^r>~=CIfM#Q{!n>RueUWqXvqat0qc=f7QWK8G9{p*(Qu9;7Uc>#^Tu1Lso3fHroZP3v+;zd=NoKm!$c42TtcgX!M-CIJqLrwbJ(hN*C@yNu z5A@xqJQHa~0B5-%P$}SqR%bb(`(EY~w?Hg@9DrX?g@Ui9f#ZCS7qRVU!@=O}5QvE+ z#H$>?{BfT%D)sxp!0+^x@BFtD$0J0E;cQgx7q_K}nk1Ma*li^&qiC%FZJs+$hWyZF zX2l^EPx;R0qYU@6!e;xGQ7N8}7w`3_L(kaNdp-{YMAOId%5YPYco8+|bN=WAE(e8x zvrEWh1|nnzgPBZ-8krq6eY@lE3wGdX#&K)x#vY(($awiO={-m*C3DkxZ8mi7N$wrw zzxQLiN11jf+rPDk5_ti)LGr`TYwSuzAGouZ?t$8kopRwjQp;3lNXEk_mcu4%e`lGH zZiwB4f))z63HY7LuF?xG-{S(*`n%ofJJljnHZzu<$Xu}<8^qZU30@J$JdVPzLDeIk0#|J4wR@jVYz*dzPu|wca65uxn zs)2_|6-MIC>h)#$)!`{t069uVbTQB;oXnnpY90d;XHv`~qG_C5)qdVPtfFHOE62wPSyrn36; zm{I6v7)I=1U!m3C6hAfl*#70>>?m~4IRRQenjkDY`V`ktk74;^|Cy*V&~UR&|AvU|cVq48#ku*IVcSp7Trm*lV9B)5^2X*?`NH}yD5v}n zlv5@asegxZCD08BKMws?PwSIy5#o{aS!zqW;8Pfxw;x%*OfRb58@1RI!7v36`f52C z!(xY`D{xxpSx8pLp+r#WLxrHWFTE=r6XXI9Sg$n(6`#w4L~%}enCjs%4sf|*ZUJf^ z{tnbAz~h3zHCj;AGxe(KhI*=ink;HrTLKy zG__I?lfIQ4aGG@&khTZ6w7!Yt;IO1@1A_vo9|r{}2~|Vv5TZs{E>UR4^Hp$Zanpdb$^K-Bu}{4QP(km z%QWjhAbTqU)F~$9Sq%Sa^~Yx5uKUGcffGmn`+Nl7+bchNN640Y2#FbsxXXM|<^A6D zYai#)fz5I_NIykNsb6=gsAC6k<~7X7wRNo)E2idzc=o)iz-@8{2`i$`xusv&@JhlT zcQ|xOVeb`3(D#0DsnBmAz%Wx3$93gqrhlhtwc2mjcc@R}wbmB`a1C(7`6GU>x~Xr5 z3XxQw;W4c1hJ+$|WO|jG+GqEmOyL@!(Fz#(4m=8l@S;sq_cY9Yx)E~g>|L^1%dq>b z+5&4bRYK4_tjp7B+3kC(Ak1^8j#y;AA;3&#`hz#{(!9l2&Z6}p2DZkr*SkY}x;8!* zn

    {F5eu#$MVjLG3COCx*-%wjy>wZ5( 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 literal 0 HcmV?d00001 diff --git a/1.0/template/scripts/highlight.pack.js b/1.0/template/scripts/highlight.pack.js new file mode 100755 index 00000000..ed92ae6d --- /dev/null +++ b/1.0/template/scripts/highlight.pack.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.8.0 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/[&<>]/gm,function(e){return I[e]})}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return R(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||R(i))return i}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){l+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===s);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");u[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):E(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push("self"===e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var l=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join("|"),!0):{exec:function(){return null}}}}r(e)}function l(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function h(e,n,t,r){var a=r?"":y.classPrefix,i='',i+n+o}function p(){var e,t,r,a;if(!E.k)return n(B);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(B);r;)a+=n(B.substr(t,r.index-t)),e=g(E,r),e?(M+=e[1],a+=h(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(B);return a+n(B.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!x[E.sL])return n(B);var t=e?l(E.sL,B,!0,L[E.sL]):f(B,E.sL.length?E.sL:void 0);return E.r>0&&(M+=t.r),e&&(L[E.sL]=t.top),h(t.language,t.value,!1,!0)}function b(){k+=null!=E.sL?d():p(),B=""}function v(e){k+=e.cN?h(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(B+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?B+=n:(t.eB&&(B+=n),b(),t.rB||t.eB||(B=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?B+=n:(a.rE||a.eE||(B+=n),b(),a.eE&&(B=n));do E.cN&&(k+=C),E.skip||(M+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return B+=n,n.length||1}var N=R(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var w,E=i||N,L={},k="";for(w=E;w!==N;w=w.parent)w.cN&&(k=h(w.cN,"",!0)+k);var B="",M=0;try{for(var I,j,O=0;;){if(E.t.lastIndex=O,I=E.t.exec(t),!I)break;j=m(t.substr(O,I.index-O),I[0]),O=I.index+j}for(m(t.substr(O)),w=E;w.parent;w=w.parent)w.cN&&(k+=C);return{r:M,value:k,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function f(e,t){t=t||y.languages||E(x);var r={r:0,value:n(e)},a=r;return t.filter(R).forEach(function(n){var t=l(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function g(e){return y.tabReplace||y.useBR?e.replace(M,function(e,n){return y.useBR&&"\n"===e?"
    ":y.tabReplace?n.replace(/\t/g,y.tabReplace):void 0}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function p(e){var n,t,r,o,s,p=i(e);a(p)||(y.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,s=n.textContent,r=p?l(p,s,!0):f(s),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),s)),r.value=g(r.value),e.innerHTML=r.value,e.className=h(e.className,p,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function d(e){y=o(y,e)}function b(){if(!b.called){b.called=!0;var e=document.querySelectorAll("pre code");w.forEach.call(e,p)}}function v(){addEventListener("DOMContentLoaded",b,!1),addEventListener("load",b,!1)}function m(n,t){var r=x[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function N(){return E(x)}function R(e){return e=(e||"").toLowerCase(),x[e]||x[L[e]]}var w=[],E=Object.keys,x={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
    ",y={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},I={"&":"&","<":"<",">":">"};return e.highlight=l,e.highlightAuto=f,e.fixMarkup=g,e.highlightBlock=p,e.configure=d,e.initHighlighting=b,e.initHighlightingOnLoad=v,e.registerLanguage=m,e.listLanguages=N,e.getLanguage=R,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|like)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*#]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("css",function(e){var c="[a-zA-Z-][a-zA-Z0-9_-]*",t={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:c,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,t]}]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\._]+/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("swift",function(e){var t={keyword:"__COLUMN__ __FILE__ __FUNCTION__ __LINE__ as as! as? associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},i={cN:"type",b:"\\b[A-Z][\\wÀ-ʸ']*",r:0},n=e.C("/\\*","\\*/",{c:["self"]}),r={cN:"subst",b:/\\\(/,e:"\\)",k:t,c:[]},a={cN:"number",b:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",r:0},o=e.inherit(e.QSM,{c:[r,e.BE]});return r.c=[a],{k:t,c:[o,e.CLCM,n,i,a,{cN:"function",bK:"func",e:"{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{b://},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:t,c:["self",a,o,e.CBCM,{b:":"}],i:/["']/}],i:/\[|%/},{cN:"class",bK:"struct protocol class extension enum",k:t,e:"\\{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{cN:"meta",b:"(@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain)"},{bK:"import",e:/$/,c:[e.CLCM,n]}]}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}}); \ No newline at end of file diff --git a/1.0/template/styles/main.css b/1.0/template/styles/main.css new file mode 100755 index 00000000..7170e42d --- /dev/null +++ b/1.0/template/styles/main.css @@ -0,0 +1,316 @@ +html, body { + margin: 0; + padding: 0; + font-size: 14px; + line-height: 1.5; + font-family: -webkit-system-font, sans-serif; } + @media screen and (min-width: 720px) { + html, body { + width: 100%; + height: 100%; } } + +a { + color: #94a9d1; + text-decoration: none; + border-bottom: 1px dotted; } + +a:hover { + color: #f6cfcf; } + +h1, h2, h3, h4, h5, h6 { + color: #333; + margin: 0; + font-family: "Quicksand"; + letter-spacing: -1px; } + +h1 { + font-size: 38px; + font-weight: 300; } + @media screen and (min-width: 720px) { + h1 { + font-size: 42px; } } + +h2 { + font-size: 30px; + font-weight: 400; } + +h3 { + font-size: 24px; + font-weight: 400; + margin-bottom: 6px; } + +h4 { + font-size: 18px; + font-weight: 400; + margin-bottom: 6px; } + +:target { + background: #ffff99; } + +a.logo { + display: block; + position: relative; + border-bottom: none; + height: 100%; + width: 280px; + margin: 0 auto; + padding-left: 52px; } + @media screen and (min-width: 720px) { + a.logo { + padding-left: 72px; + width: 100%; } } + a.logo h1 { + margin: 0; + font-size: 36px; + line-height: 96px; + text-transform: uppercase; } + @media screen and (min-width: 720px) { + a.logo h1 { + font-size: 36px; } } + a.logo h1 em { + font-style: normal; + color: rgba(0, 0, 0, 0.4); + text-transform: none; } + a.logo img { + left: 6px; + top: 24px; + position: absolute; + height: 48px; } + @media screen and (min-width: 720px) { + a.logo img { + left: 24px; + top: 24px; + height: 48px; } } + +* { + box-sizing: border-box; } + +header { + overflow: hidden; + border-bottom: 3px solid #94a9d1; + height: 132px; + position: relative; } + @media screen and (min-width: 720px) { + header { + height: 96px; + position: absolute; + left: 0; + right: 0; + z-index: 10; + background: rgba(255, 255, 255, 0.95); } + .safari header { + background: rgba(255, 255, 255, 0.5); + -webkit-backdrop-filter: blur(10px); } } + header ul { + position: absolute; + margin: 0; + padding: 0; + bottom: 5px; + right: 0; + text-align: center; } + @media screen and (max-width: 720px) { + header ul { + left: 0; } } + @media screen and (min-width: 720px) { + header ul { + text-align: right; + right: 24px; + top: 24px; + height: 100%; } } + header ul li { + display: inline-block; + line-height: 48px; } + header ul li a { + padding: 0 6px; + display: block; + border-bottom: none; } + +a.toggle { + position: absolute; } + @media screen and (min-width: 720px) { + a.toggle { + display: none; } } + a.toggle.close { + top: 12px; + right: 0; + z-index: 20; + color: white; + font-size: 48px; + line-height: 48px; + height: 72px; + width: 72px; + padding: 12px; + border-bottom: none; + text-align: center; } + a.toggle.show { + text-align: center; + border-bottom: none; + background: #94a9d1; + color: white; + right: -36px; + top: 50%; + height: 48px; + width: 36px; + margin-top: -24px; + line-height: 48px; + border-bottom-right-radius: 5px; + border-top-right-radius: 5px; + z-index: 15; + transition: right 0.25s; } + a.toggle.show.hide { + right: -12px; } + body.toggled a.toggle.show { + right: -36px; } + +nav { + font-size: 14px; + border-right: 1px solid rgba(0, 0, 0, 0.05); + width: 100%; + position: fixed; + left: -100%; + transition: left 0.25s; + top: 0; + right: 0; + bottom: 0; + display: block; + background: #94a9d1; + z-index: 10; } + nav a { + border-bottom: none; + color: rgba(255, 255, 255, 0.9); + font-size: 16px; + line-height: 32px; + height: 32px; + display: block; } + nav h3 { + text-transform: uppercase; + margin-top: 12px; + font-size: 18px; + color: white; + font-weight: 600; } + body.toggled nav { + left: 0; } + @media screen and (min-width: 720px) { + nav { + background: white; + display: block; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 216px; + z-index: 8; + padding-top: 96px; } + nav h3 { + color: #bbb; + font-size: 14px; + margin-bottom: 6px; + font-weight: 400; } + nav a { + border-bottom: none; + font-weight: 200; + font-size: 14px; + color: #777; + font-size: 12px; + height: 24px; } + nav a:hover { + color: #94a9d1; } } + nav ul, nav ul li { + list-style: none; + padding: 0; + margin: 0; } + nav ul.active a, nav ul li.active a { + font-weight: 600; } + @media screen and (min-width: 720px) { + nav ul.active a, nav ul li.active a { + color: #94a9d1; } } + nav ul { + margin-bottom: 18px; } + +div.scroll { + padding: 22px; + overflow-y: scroll; + height: 100%; + z-index: 10; + -webkit-overflow-scrolling: touch; } + +main { + -webkit-overflow-scrolling: touch; + color: #555; + font-weight: 200; + width: 100%; + padding: 24px; + overflow: hidden; } + @media screen and (min-width: 720px) { + main { + height: 100%; + position: absolute; + position: relative; + z-index: 6; + top: 0; + bottom: 0; + right: 0; + left: 0; + padding: 22px; + padding-top: 110px; + padding-left: 240px; + overflow-y: scroll; + max-width: 1440px; } } + main a.edit { + position: absolute; + top: 146px; + right: 24px; + border-bottom: none; } + @media screen and (min-width: 720px) { + main a.edit { + top: 102px; } } + main h1 { + margin-bottom: 12px; } + main h2 { + margin-top: 24px; + margin-bottom: 12px; + border-bottom: 1px dotted rgba(0, 0, 0, 0.1); } + main h3 { + margin-top: 18px; } + main p { + margin-top: 0; + margin-bottom: 12px; + line-height: 1.75; } + main blockquote { + margin: 0; + background: rgba(247, 202, 201, 0.2); + margin-top: 18px; + margin-bottom: 18px; + margin-left: 0; + padding: 6px; + padding-left: 12px; + border-left: 5px solid #f6cfcf; } + main blockquote p { + margin: 0; + padding: 0; } + +pre, code { + font-size: 12px; + font-family: "Source Code Pro", monospace; + -webkit-overflow-scrolling: touch; } + +p code, li code { + background: #fbfbfb; + border-radius: 5px; + padding: 3px 5px; + display: inline-block; + color: #6b7891; + box-shadow: 0 1px 0px 0px rgba(0, 0, 0, 0.1); } + +pre { + margin-top: 12px; + margin-bottom: 15px; + padding: 5px; + background: #fbfbfb; + border-radius: 10px; + box-shadow: 0 3px 0px 0px rgba(0, 0, 0, 0.1); } + +img { + max-width: 100%; } + +/*# sourceMappingURL=main.css.map */ diff --git a/1.0/template/styles/main.css.map b/1.0/template/styles/main.css.map new file mode 100755 index 00000000..bd469dad --- /dev/null +++ b/1.0/template/styles/main.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["main.sass"], +"names": [], +"file": "main.css" +} \ No newline at end of file diff --git a/1.0/template/styles/main.sass b/1.0/template/styles/main.sass new file mode 100755 index 00000000..185c934a --- /dev/null +++ b/1.0/template/styles/main.sass @@ -0,0 +1,351 @@ +$tablet: 720px +$blue: #94a9d1 + +html, body + margin: 0 + padding: 0 + font-size: 14px + line-height: 1.5 + font-family: -webkit-system-font, sans-serif + + @media screen and (min-width: $tablet) + width: 100% + height: 100% + +a + color: #94a9d1 + text-decoration: none + border-bottom: 1px dotted + +a:hover + color: #f6cfcf + + +h1, h2, h3, h4, h5, h6 + color: #333 + margin: 0 + font-family: 'Quicksand' + letter-spacing: -1px + +h1 + font-size: 38px + @media screen and (min-width: $tablet) + font-size: 42px + font-weight: 300 + +h2 + font-size: 30px + font-weight: 400 + +h3 + font-size: 24px + font-weight: 400 + margin-bottom: 6px + +h4 + font-size: 18px + font-weight: 400 + margin-bottom: 6px + +\:target + background: #ffff99 + +a.logo + display: block + position: relative + border-bottom: none + height: 100% + width: 280px + margin: 0 auto + padding-left: 52px + + @media screen and (min-width: $tablet) + padding-left: 72px + width: 100% + + h1 + margin: 0 + font-size: 36px + line-height: 96px + text-transform: uppercase + + @media screen and (min-width: $tablet) + font-size: 36px + + em + font-style: normal + color: rgba(0, 0, 0, 0.4) + text-transform: none + + img + left: 6px + top: 24px + position: absolute + height: 48px + + @media screen and (min-width: $tablet) + left: 24px + top: 24px + height: 48px + +* + box-sizing: border-box + +header + overflow: hidden + border-bottom: 3px solid #94a9d1 + height: 132px + position: relative + + @media screen and (min-width: $tablet) + height: 96px + position: absolute + left: 0 + right: 0 + z-index: 10 + + background: rgba(255, 255, 255, 0.95) + + .safari & + background: rgba(255, 255, 255, 0.5) + -webkit-backdrop-filter: blur(10px) + + + + ul + position: absolute + margin: 0 + padding: 0 + bottom: 5px + right: 0 + text-align: center + + @media screen and (max-width: $tablet) + left: 0 + + @media screen and (min-width: $tablet) + text-align: right + right: 24px + top: 24px + height: 100% + + li + display: inline-block + line-height: 48px + + a + padding: 0 6px + display: block + border-bottom: none + +a.toggle + @media screen and (min-width: $tablet) + display: none + + position: absolute + + &.close + top: 12px + right: 0 + z-index: 20 + color: white + font-size: 48px + line-height: 48px + height: 72px + width: 72px + padding: 12px + border-bottom: none + text-align: center + + &.show + text-align: center + border-bottom: none + background: $blue + color: white + right: -36px + top: 50% + height: 48px + width: 36px + margin-top: -24px + line-height: 48px + border-bottom-right-radius: 5px + border-top-right-radius: 5px + z-index: 15 + + transition: right 0.25s + + &.hide + right: -12px + + body.toggled & + right: -36px + + +nav + font-size: 14px + border-right: 1px solid rgba(0, 0, 0, 0.05) + width: 100% + position: fixed + left: -100% + transition: left 0.25s + + top: 0 + right: 0 + bottom: 0 + display: block + background: $blue + z-index: 10 + + a + border-bottom: none + color: rgba(255, 255, 255, 0.9) + font-size: 16px + line-height: 32px + height: 32px + display: block + + h3 + text-transform: uppercase + margin-top: 12px + font-size: 18px + color: white + font-weight: 600 + + body.toggled & + left: 0 + + @media screen and (min-width: $tablet) + background: white + display: block + position: absolute + left: 0 + top: 0 + bottom: 0 + width: 216px + z-index: 8 + padding-top: 96px + + h3 + color: #bbb + font-size: 14px + margin-bottom: 6px + font-weight: 400 + + + a + border-bottom: none + font-weight: 200 + font-size: 14px + color: #777 + font-size: 12px + height: 24px + + &:hover + color: #94a9d1 + + ul, ul li + list-style: none + padding: 0 + margin: 0 + + &.active a + @media screen and (min-width: $tablet) + color: #94a9d1 + font-weight: 600 + + ul + margin-bottom: 18px + +div.scroll + padding: 22px + overflow-y: scroll + height: 100% + z-index: 10 + -webkit-overflow-scrolling: touch + +main + -webkit-overflow-scrolling: touch + color: #555 + font-weight: 200 + width: 100% + padding: 24px + overflow: hidden + + @media screen and (min-width: $tablet) + height: 100% + position: absolute + position: relative + z-index: 6 + + top: 0 + bottom: 0 + right: 0 + left: 0 + + padding: 22px + padding-top: 110px + padding-left: 240px + overflow-y: scroll + max-width: 1440px + + a.edit + position: absolute + top: 146px + @media screen and (min-width: $tablet) + top: 102px + right: 24px + border-bottom: none + + h1 + margin-bottom: 12px + + h2 + margin-top: 24px + margin-bottom: 12px + border-bottom: 1px dotted rgba(0, 0, 0, 0.10) + + h3 + margin-top: 18px + + p + margin-top: 0 + margin-bottom: 12px + line-height: 1.75 + + blockquote + margin: 0 + background: rgba(247, 202, 201, 0.2) + margin-top: 18px + margin-bottom: 18px + margin-left: 0 + padding: 6px + padding-left: 12px + border-left: 5px solid #f6cfcf + + p + margin: 0 + padding: 0 + +pre, code + font-size: 12px + font-family: 'Source Code Pro', monospace + -webkit-overflow-scrolling: touch + +p code, li code + background: #fbfbfb + border-radius: 5px + padding: 3px 5px + display: inline-block + color: #6b7891 + box-shadow: 0 1px 0px 0px rgba(0, 0, 0, 0.1) + +pre + margin-top: 12px + margin-bottom: 15px + padding: 5px + background: #fbfbfb + border-radius: 10px + box-shadow: 0 3px 0px 0px rgba(0, 0, 0, 0.1) + +img + max-width: 100% diff --git a/1.0/template/styles/vapor-code.css b/1.0/template/styles/vapor-code.css new file mode 100755 index 00000000..9afb04ca --- /dev/null +++ b/1.0/template/styles/vapor-code.css @@ -0,0 +1,71 @@ +/** + * GitHub Gist Theme + * Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro + */ + +.hljs { + display: block; + padding: 0.5em; + color: #6b7891; + background: none; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #9cc074; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #9f69c4; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} diff --git a/1.0/testing/basic.md b/1.0/testing/basic.md new file mode 100755 index 00000000..0fc27ce5 --- /dev/null +++ b/1.0/testing/basic.md @@ -0,0 +1,94 @@ +--- +currentMenu: testing-basic +--- + +# Basic Testing + +Testing is a critical part of any software application, and Vapor apps should be no different. In this documentation, we'll cover some of the basic setup required to be able to test against our `Droplet`. + +## Displacing Droplet Creation Logic + +Up to this point, a lot of our documentation has centered around putting our `Droplet` creation logic in `main.swift`. Unfortunately, when testing against our application, this code becomes largely inaccessible. The first thing we'll need to do is break this out into the `AppLogic` module. + +Here's an example of my setup file. I name mine `Droplet+Setup.swift`. Here's how it might look: + +```swift +import Vapor + +public func load(_ drop: Droplet) throws { + drop.preparations.append(Todo.self) + + drop.get { _ in return "put my droplet's logic in this `load` function" } + + drop.post("form") { req in + ... + return Response(body: "Successfully posted form.") + } + + // etc. +} +``` + +> [WARNING] Do **not** call `run()` anywhere within the `load` function as `run()` is a blocking call. + +## Updated `main.swift` + +Now that we've abstracted our loading logic, we'll need to update our `main.swift` **in the `App` module** to reflect those changes. Here's how it should look after: + +```swift +let drop = Droplet(...) +try load(drop) +drop.run() +``` + +> The reason we still initialize `Droplet` outside of the scope of `load` is so that we can have the option to initialize differently for testing. We'll cover that soon. + +## Testable Droplet + +The first thing we'll do is in my testing target, add a file called `Droplet+Test.swift`. It will look like this: + +```swift +@testable import Vapor + +func makeTestDroplet() throws -> Droplet { + let drop = Droplet(arguments: ["dummy/path/", "prepare"], ...) + try load(drop) + try drop.runCommands() + return drop +} +``` + +This looks a lot like our initializer in `main.swift`, but there are 3 very key differences. + +### Droplet(arguments: ["dummy/path/", "prepare"], ... + +The `arguments:` parameter in our `Droplet` creation. This is rarely used except for advanced situations, but we'll use it here in testing to ensure that our `Droplet` doesn't try to automatically `serve` and block our thread. You can use arguments besides `"prepare"`, but unless you're doing something specific for an advanced situation, these arguments should suffice. + +### try drop.runCommands() + +You'll notice here that we're calling `runCommands()` instead of `run()`. This allows the `Droplet` to do all the setup it would normally do before booting without actually binding to a socket or exiting. + +### `@testable import Vapor` + +We'll need to import the testable compilation of Vapor to access the `runCommands` function. This is currently not public as a protection against accidental bugs in live apps. + +## Test Our Droplet + +Now that all of this has been created, we're ready to start testing our application's `Droplet`. Here's how a really basic test might look: + +```swift +@testable import AppLogic + +func testEndpoint() throws { + let drop = try makeTestDroplet() + let request = ... + let expectedBody = ... + + let response = try drop.respond(to: request) + XCTAssertEqual(expectedBody, response.body.bytes) +} +``` + +Notice that now you can use `CMD-U` to run your tests in Xcode with in-line results. In addition, you can run `vapor test` to test your code from the command line. If you choose to use `swift build` instead and you are using MySQL in your app, make sure you add the correct build flags to the call. + +Good luck, and happy testing! diff --git a/1.0/testing/modules.md b/1.0/testing/modules.md new file mode 100755 index 00000000..167af2bc --- /dev/null +++ b/1.0/testing/modules.md @@ -0,0 +1,40 @@ +--- +currentMenu: testing-modules +--- + +# Using Multiple Modules For Testing + +Testing a Vapor app gets tricky, and requires some maneuvering of your app targets. + +> [WARNING] Technically this is only necessary if you plan to run your tests on Linux. You can keep your tests in the same module if you want to only run your tests from the command line using `vapor test` + +## **Step 1:** Update Package.swift + +To start, you need to split up your Vapor project into a target called `App`, and a target called `AppLogic`. The App module will only include a `main.swift`, and your `AppLogic` will contain the actual logic for the app. + +```swift +import PackageDescription + +let package = Package( + name: “ProjectName”, + targets: [ + Target(name: "App", dependencies: ["AppLogic"]) + ], + dependencies: [ + .Package(url: "https://github.com/vapor/vapor.git", majorVersion: 1, minor: 3) + ], + exclude: [ + "Config", + "Database", + "Localization", + "Public", + "Resources" + ] +) +``` + +## **Step 2:** Update Tests Folder + +Make sure that your tests folder has a file called `LinuxMain.swift` and a folder called `AppLogicTests`. In your `AppLogicTests`, you can add your testing files like `UserTests.swift`. + +As always, make sure that you regenerate with `vapor xcode -y` diff --git a/1.0/websockets/custom.md b/1.0/websockets/custom.md new file mode 100755 index 00000000..df323e6d --- /dev/null +++ b/1.0/websockets/custom.md @@ -0,0 +1,58 @@ +--- +currentMenu: websockets-custom +--- + +# Custom WebSockets + +Below are some examples of WebSockets using the underlying Engine package. + +## Client + +```Swift +import WebSockets + +try WebSocket.connect(to: url) { ws in + print("Connected to \(url)") + + ws.onText = { ws, text in + print("[event] - \(text)") + } + + ws.onClose = { ws, _, _, _ in + print("\n[CLOSED]\n") + } +} +``` + +## Server + +```Swift +import HTTP +import WebSockets +import Transport + +final class MyResponder: Responder { + func respond(to request: Request) throws -> Response { + return try request.upgradeToWebSocket { ws in + print("[ws connected]") + + ws.onText = { ws, text in + print("[ws text] \(text)") + try ws.send("🎙 \(text)") + } + + ws.onClose = { _, code, reason, clean in + print("[ws close] \(clean ? "clean" : "dirty") \(code?.description ?? "") \(reason ?? "")") + } + } + } +} + +let port = 8080 +let server = try Server, Serializer>(port: port) + +print("Connect websocket to http://localhost:\(port)/") +try server.start(responder: MyResponder()) { error in + print("Got server error: \(error)") +} +``` diff --git a/1.0/websockets/droplet.md b/1.0/websockets/droplet.md new file mode 100755 index 00000000..672cdb45 --- /dev/null +++ b/1.0/websockets/droplet.md @@ -0,0 +1,59 @@ +--- +currentMenu: websockets-droplet +--- + +# Droplet WebSockets + +Creating a WebSocket server with the Droplet is easy. WebSockets work by upgrading an HTTP request to a WebSocket connection. + +Because of this, you should pick a URL for your WebSocket server to reside at. In this case, we use `/ws`. + +```swift +import Vapor + +let drop = Droplet() + +drop.socket("ws") { req, ws in + print("New WebSocket connected: \(ws)") + + // ping the socket to keep it open + try background { + while ws.state == .open { + try? ws.ping() + drop.console.wait(seconds: 10) // every 10 seconds + } + } + + ws.onText = { ws, text in + print("Text received: \(text)") + + // reverse the characters and send back + let rev = String(text.characters.reversed()) + try ws.send(rev) + } + + ws.onClose = { ws, code, reason, clean in + print("Closed.") + } +} + +drop.run() +``` + +To connect with a WebSocket client, you would open a connection to `ws:///ws`. + +Here is an example using JavaScript. + +```swift +var ws = new WebSocket("ws://0.0.0.0:8080/ws") + +ws.onmessage = function(msg) { + console.log(msg) +} + +ws.onopen = function(event) { + ws.send("test") +} +``` + +The above will log `tset` (`test` reversed).