Selaa lähdekoodia

Initial Import.

woollybah 7 vuotta sitten
vanhempi
commit
228bc5aafb
76 muutettua tiedostoa jossa 18425 lisäystä ja 0 poistoa
  1. 13 0
      .gitignore
  2. 44 0
      docs/assets/command-symbol.svg
  3. 10 0
      docs/community/2d_audio.md
  4. 20 0
      docs/community/2d_drivers.md
  5. 35 0
      docs/community/2d_frameworks.md
  6. 27 0
      docs/community/3d_audio.md
  7. 55 0
      docs/community/3d_engines.md
  8. 11 0
      docs/community/3d_libraries.md
  9. 15 0
      docs/community/3d_physics.md
  10. 45 0
      docs/community/applications.md
  11. 146 0
      docs/community/collections.md
  12. 28 0
      docs/community/controllers.md
  13. 20 0
      docs/community/database.md
  14. 42 0
      docs/community/file_formats.md
  15. 31 0
      docs/community/gui.md
  16. 15 0
      docs/community/gui_builders.md
  17. 11 0
      docs/community/gui_drivers.md
  18. 13 0
      docs/community/gui_gadgets.md
  19. 54 0
      docs/community/ides.md
  20. 40 0
      docs/community/networking.md
  21. 18 0
      docs/community/open_source_games.md
  22. 14 0
      docs/community/particles.md
  23. 7 0
      docs/community/resources.md
  24. 93 0
      docs/language/arrays.md
  25. 105 0
      docs/language/basic_compatibility.md
  26. 41 0
      docs/language/collections.md
  27. 23 0
      docs/language/comments.md
  28. 89 0
      docs/language/conditional_compiling.md
  29. 30 0
      docs/language/constants.md
  30. 105 0
      docs/language/data_types.md
  31. 24 0
      docs/language/debugging.md
  32. 36 0
      docs/language/exceptions.md
  33. 99 0
      docs/language/expressions.md
  34. 28 0
      docs/language/functions.md
  35. 52 0
      docs/language/identifiers.md
  36. 660 0
      docs/language/keywords.md
  37. 64 0
      docs/language/literals.md
  38. 104 0
      docs/language/variables.md
  39. 6 0
      docs/setup/custom_settings.md
  40. 97 0
      docs/setup/get_started.md
  41. 7 0
      docs/setup/platform_android.md
  42. 7 0
      docs/setup/platform_ios.md
  43. 7 0
      docs/setup/platform_linux.md
  44. 7 0
      docs/setup/platform_macos.md
  45. 7 0
      docs/setup/platform_nx.md
  46. 7 0
      docs/setup/platform_rpi.md
  47. 7 0
      docs/setup/platform_win32.md
  48. 7 0
      docs/site/about.md
  49. 19 0
      docs/site/credits.md
  50. 7 0
      docs/tools/bcc.md
  51. 144 0
      docs/tools/bmk.md
  52. 7 0
      docs/tools/maxide.md
  53. 2582 0
      docs/tutorials/beginners_guide.md
  54. 60 0
      docs/tutorials/network_programming.md
  55. 1877 0
      docs/tutorials/oop_tutorial.md
  56. 655 0
      docs/tutorials/tcp_tutorial.md
  57. 193 0
      website/README.md
  58. 82 0
      website/core/Footer.js
  59. 9226 0
      website/package-lock.json
  60. 14 0
      website/package.json
  61. 157 0
      website/pages/en/downloads.js
  62. 149 0
      website/pages/en/index.js
  63. 74 0
      website/sidebars.json
  64. 94 0
      website/siteConfig.js
  65. 21 0
      website/static/css/custom.css
  66. 52 0
      website/static/img/devices.svg
  67. 60 0
      website/static/img/group.svg
  68. BIN
      website/static/img/max_logo.png
  69. 57 0
      website/static/img/network.svg
  70. 89 0
      website/static/img/platform/android.svg
  71. 45 0
      website/static/img/platform/apple.svg
  72. 79 0
      website/static/img/platform/linux.svg
  73. 86 0
      website/static/img/platform/rpi.svg
  74. 67 0
      website/static/img/platform/switch.svg
  75. 45 0
      website/static/img/platform/windows.svg
  76. 58 0
      website/static/img/rocket.svg

+ 13 - 0
.gitignore

@@ -0,0 +1,13 @@
+.DS_Store
+
+node_modules
+
+lib/core/metadata.js
+lib/core/MetadataBlog.js
+
+website/translated_docs
+website/build/
+website/yarn.lock
+website/node_modules
+website/i18n/*
+.idea/

+ 44 - 0
docs/assets/command-symbol.svg

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="16px" height="16px" viewBox="0 0 80 80" style="enable-background:new 0 0 80 80;" xml:space="preserve">
+<g>
+	<path d="M64,48L64,48h-8V32h8c8.836,0,16-7.164,16-16S72.836,0,64,0c-8.837,0-16,7.164-16,16v8H32v-8c0-8.836-7.164-16-16-16
+		S0,7.164,0,16s7.164,16,16,16h8v16h-8l0,0l0,0C7.164,48,0,55.164,0,64s7.164,16,16,16c8.837,0,16-7.164,16-16l0,0v-8h16v7.98
+		c0,0.008-0.001,0.014-0.001,0.02c0,8.836,7.164,16,16,16s16-7.164,16-16S72.836,48.002,64,48z M64,8c4.418,0,8,3.582,8,8
+		s-3.582,8-8,8h-8v-8C56,11.582,59.582,8,64,8z M8,16c0-4.418,3.582-8,8-8s8,3.582,8,8v8h-8C11.582,24,8,20.417,8,16z M16,72
+		c-4.418,0-8-3.582-8-8s3.582-8,8-8l0,0h8v8C24,68.418,20.418,72,16,72z M32,48V32h16v16H32z M64,72c-4.418,0-8-3.582-8-8l0,0v-8
+		h7.999c4.418,0,8,3.582,8,8S68.418,72,64,72z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 10 - 0
docs/community/2d_audio.md

@@ -0,0 +1,10 @@
+---
+id: 2d_audio
+title: 2D Audio
+sidebar_label: 2D Audio
+---
+
+## MaxMod2 - audio module
+Topic: http://wasted.nz/posts.php?topic=84593
+
+Repo: http://code.google.com/p/maxmod

+ 20 - 0
docs/community/2d_drivers.md

@@ -0,0 +1,20 @@
+---
+id: 2d_drivers
+title: 2D Drivers
+sidebar_label: 2D Drivers
+---
+
+## DX9 Max2D driver
+Topic: http://wasted.nz/posts.php?topic=84089
+
+Repo: http://code.google.com/p/max2ddx9
+
+## D3D11Max2DDriver - DirectX 10/11 2D driver
+Repo: https://github.com/davecamp/srs.mod
+
+Old Repo: https://github.com/SRSSoftware/srs.mod
+
+## Odd2d module
+Topic: http://wasted.nz/posts.php?topic=90436
+
+Site: http://www.gooeyblob.com/mods/odd2dmodule.zip

+ 35 - 0
docs/community/2d_frameworks.md

@@ -0,0 +1,35 @@
+---
+id: 2d_frameworks
+title: 2D Frameworks
+sidebar_label: 2D Frameworks
+---
+
+## RetroRemakes Framework
+Repo: http://code.google.com/p/retroremakes-framework
+
+## Planiax 2D Framework
+Topic: http://wasted.nz/posts.php?topic=88042
+
+Site: http://www.playniax.com
+
+## Dig - 2d game and app framework
+Repo: http://github.com/GWRon
+
+## Digital Wizard's Lab framework
+Repo: http://code.google.com/p/dwlab/
+
+## BMax 2D Framework
+Topic: http://wasted.nz/posts.php?topic=83888
+
+Repo: http://code.google.com/p/bmax2dframework
+
+## Public Domain part of Grey Alien Framework
+Topic: http://wasted.nz/posts.php?topic=82765
+
+## OFXMax - OpenFrameworks
+Topic: http://wasted.nz/posts.php?topic=84991
+
+Repo: http://code.google.com/p/ofxmax
+
+## Horizon - Rapid game prototyping framework (by maverick69)
+Repo: https://github.com/JochenHeizmann/Horizon

+ 27 - 0
docs/community/3d_audio.md

@@ -0,0 +1,27 @@
+---
+id: 3d_audio
+title: 3D Audio
+sidebar_label: 3D Audio
+---
+
+## MiniB3D sound system (by ima747)
+Worklog: http://wasted.nz/userlog.php?user=10151&log=1449
+
+Download: http://wasted.nz/userlog.php?user=8652&log=1737
+
+## OpenAL 3DSound module (by klepto2)
+Topic: http://wasted.nz/posts.php?topic=68838
+
+Download: http://wasted.nz/userlog.php?user=8652&log=1737
+
+## Sound3D - OpenAL module for MiniB3D (by ziggy)
+Topic: http://wasted.nz/posts.php?topic=85688
+
+Repo: http://code.google.com/p/sound3d
+
+## Leadwerks Audio - OpenAL and EAX
+Topic: http://wasted.nz/posts.php?topic=80152
+
+OpenAL code: http://wasted.nz/codearcs.php?code=2307
+
+EAX code: http://wasted.nz/codearcs.php?code=2308

+ 55 - 0
docs/community/3d_engines.md

@@ -0,0 +1,55 @@
+---
+id: 3d_engines
+title: 3D Engines
+sidebar_label: 3D Engines
+---
+
+## bo3d - Ogre3D wrapper
+Repo: http://code.google.com/p/bo3d/
+
+Repo: http://github.com/bruZard/bo3d
+
+## BlitzGDK - DarkGDK wrapper (DX9)
+Repo: http://code.google.com/p/blitzgdk
+
+## DreiDe engine (GL)
+Repo: https://github.com/oliverskawronek/dreide.mod
+
+Topic: http://wasted.nz/posts.php?topic=49211
+
+## MiniB3D (GL)
+Repo: http://github.com/si-design
+
+Forum: http://wasted.nz/topics.php?forum=119
+
+## iMinib3d - Objective-C port for iPhone
+Topic: http://wasted.nz/posts.php?topic=85763
+
+Repo: https://github.com/si-design/iminib3d
+
+## Irrlicht Engine (GL/DX9)
+Site: http://www.gprogs.com/viewforum.php?id=1
+
+Library: http://irrlicht.sourceforge.net/
+
+## MiniB3D Extended (GL2)
+Topic: http://wasted.nz/posts.php?topic=89447
+
+Repo: http://code.google.com/p/minib3dextended/
+
+## MiniB3D Plus (GL3) - needs blabz.mod.zip & pub.mod.zip
+Topic: http://wasted.nz/posts.php?topic=102524
+
+Site: http://infotread.com/downloads/
+
+## OpenB3D library wrapper (GL2)
+Topic: http://wasted.nz/posts.php?topic=102556
+
+Wrapper: https://github.com/markcwm/openb3d.mod
+
+Library: http://sourceforge.net/projects/minib3d/files/
+
+## Warner Engine (GL)
+Topic: http://wasted.nz/posts.php?topic=94606
+
+Repo: http://code.google.com/p/warner-engine/

+ 11 - 0
docs/community/3d_libraries.md

@@ -0,0 +1,11 @@
+---
+id: 3d_libraries
+title: 3D Libraries
+sidebar_label: 3D Libraries
+---
+
+## Assimp wrapper - Open Asset Import Library
+Topic: http://wasted.nz/posts.php?topic=82586
+
+Repo: http://code.google.com/p/blitzmax-assimp
+

+ 15 - 0
docs/community/3d_physics.md

@@ -0,0 +1,15 @@
+---
+id: 3d_physics
+title: 3D Physics
+sidebar_label: 3D Physics
+---
+
+## Farseer Physics Engine
+Topic: http://wasted.nz/posts.php?topic=78349
+
+Site: http://www.codeplex.com/FarseerPhysics
+
+## JV-ODE Physics Wrapper
+Topic: http://wasted.nz/posts.php?topic=63207
+
+Site: http://jv-ode.devcode.co.uk

+ 45 - 0
docs/community/applications.md

@@ -0,0 +1,45 @@
+---
+id: applications
+title: Applications
+sidebar_label: Applications
+---
+
+## Framework Assistant - template generator
+Topic: http://wasted.nz/posts.php?topic=47141
+
+Repo: http://sites.google.com/site/jimbrown007/
+
+## BlitzMax Companion - download manager
+Topic: http://wasted.nz/posts.php?topic=79814
+
+Site: http://www.graphio.net
+
+## Maximus - module manager
+Site: https://github.com/maximos
+
+## Blitz Code Archives - code downloader
+Topic: http://blitzmax.com/Community/posts.php?topic=88368
+
+## Fontext - bitmap font tool
+Topic: http://wasted.nz/posts.php?topic=65909
+
+## Font Machine - bitmap font tool
+Toolbox: http://web.archive.org/web/20160619092430/http://www.blitzbasic.com/toolbox/toolbox.php?tool=214
+
+Site: http://www.blide.org
+
+## Universal Map Editor - 2d tilemap editor
+Topic: http://www.blitzforum.de/forum/viewtopic.php?t=19899
+
+Site: http://mapeditor.de.vu
+
+## IsoBlox - isometric pixel art tool
+Repo: https://github.com/Trylobot/isoblox
+
+## BlitzICON - icon and manifest tool (Win)
+Topic: http://wasted.nz/posts.php?topic=86283
+
+## MakeObject - icon tool (Win)
+Topic: http://wasted.nz/posts.php?topic=66129
+
+Download: https://sites.google.com/site/yanbloke/MakeObject.zip

+ 146 - 0
docs/community/collections.md

@@ -0,0 +1,146 @@
+---
+id: collections
+title: Collections
+sidebar_label: Collections
+---
+
+## Alberto-Diablo modules
+scriptlua, script, audiosquall, audio, collision, reflector, language, random
+
+Repo: http://code.google.com/p/apimax/
+
+## Axe3d modules
+axe3d, b3d, b3dsdk, drivers, m3d, minib3d, model, ode
+
+## Axe modules
+entityport, freeport, gif, jasper, oggsaver, pixmapgraphics, portaudio, python, v8, wiimote
+
+Repo: https://github.com/nitrologic
+
+## BaH modules
+appstub, avbin, barcode, base64, bass, bigint, boost, box2d, cairo, cegui, chipmunk, clearsilver, crypto, curses, database, datetime, dbgp, dbmysql, dbodbc, dboracle, dbpostgresql, dbsqlite, dbxbase, diff, escapi, expat, filesystemex, fit, flickcurl, fmod, format, freeimage, freetypegl, ftpparser, gdal, glslopt, gme, gmp, graphviz, growl, gtkmaxgui, gtkwebkitgtk, inet, interprocess, irrklang, jansson, keychain, leptonica, libarchive, libcurl, libiconv, libnotify, libsmbclient, libssh2, libtcod, libtorrent, libusb, libwebsockets, libxml, libxslt, locale, magick, mapm, mathtoolkit, maxguitextareascintilla, maxunit, muparser, oggvorbis, opencl, osmesa, persistence, protobuf, qrencode, raknet, ramsstream, random, raptor, rational, regex, registry, rtl, rtmidi, scriptingbridge, serial, sfxr, sid, sparkle, speech, sstream, streamhtmlparser, stringbuffer, taglib, tesseract, textsstream, theoraplayer, tmx, unimotion, uuid, volumes, wiringpi, xcb, xls, xlwriter, xz
+
+Topic: http://wasted.nz/posts.php?topic=75695
+
+Site: http://brucey.net/programming/blitz/index.php
+
+Repo: https://github.com/maxmods/bah.mod
+
+## BlitzMax Next Generation
+bcc, bmk, pub, brl, maxgui, axe, sdl, b3d, zeke, bgfx
+
+Site: http://www.bmx-ng.com/main/
+
+Repo: https://github.com/bmx-ng
+
+## BlitzMax modules mirror
+axe, bah, wx, dwlab, maxgui, sidesign, osgplugins, osg, axe3d, byo, muttley, rigz
+
+Repo: http://github.com/BlitzMaxModules
+
+## Chaos Interactive modules (by d-bug, Hyde and hamZta)
+CocoaUserDefaults, ChaosClone, ChaosConsole, ChaosButton, DesktopExtension, BitmapFont, Ini
+
+Site: http://www.chaos-interactive.de/en/modules
+
+## Duct-Max game modules
+animations, app, appendstream, archive, arghandling, argparser, clapp, csv, drawstate, dui, duidate, duidraw, duimisc, enumerator, etc, graphix, imageio, ini, input, intmap, json, locale, logging, memcrypt, network, numericmap, objectio, objectmap, pathing, protog2d, rc4, reflectivenetwork, scriptparser, soundmap, tilemap, time, variables, vector
+
+Repo: https://github.com/komiga/duct-max
+
+Site: http://www.komiga.com/?q=node/14
+
+## GMan modules & stuff
+
+Irrlicht, Xeffects, Addons, ColDet, 3Impact, SIDPlay, SIDSample, SIDStream, ISQLDB, ZipEngine, Mappy, PCXLoader, ggTray
+
+Site: http://www.gprogs.com
+
+## Htbaa modules
+zmq, rest, rackspacecloudfiles, xmlrpc, sqlbuilder, process, goal, fuzzy, fsm, factory
+
+Repo: http://github.com/Htbaa
+
+## ITSpeedway modules
+maxgui.stylesheet, bhtree, printing, vectorfont, win32service
+
+Repo: https://sourceforge.net/u/itspeedway/profile/
+
+## JazzieB examples
+Bitmap Fonts, User Input, Scrolling, Invaders
+
+Site: http://www.blitz.sos-software.co.uk/code.htm
+
+## Kistjes modules
+Phidget21, Sprite, Modelshop, Animation
+
+Repo: http://code.google.com/p/blitzmax-modules
+
+## kfprimm modules
+maxb3d, maxb3dex, prime, gfx, mapletce, nehe_bmx
+
+Maxb3d modules - a3dsloader, audio3d, b3dcollision, b3dloader, boneanimator, bsploader, core, d3d11driver, d3d9driver, drivers, functions, gldriver, glsloader, gui, heightmaploader, loaders, logging, math, md2loader, ms3dloader, newton, objloader, openalaudio3d, plyloader, primitives, retro, stringfunctionloader, vertexanimator, xloader
+
+Prime modules - aamva, app, archive, assetmanager, assetpacker, blockpacker, bsp, csv, deltatimer, enumerator, kbsplines, lib3ds, libb3d, libgls, libms3d, libply, libx, math3d, max2dasset, maxml, newton, npapi, pcxloader, pixmapasset, pixmapex, pixmappacker, printlib, pthreads2, serialio, triangulator, xmlasset
+
+Gfx modules - cgshaderdriver, cgtoolkit, d3d11max2d, d3d11max2dex, d3d9max2dex, directxex, dxgraphicsex, glmax2dex, max2dex
+
+Repo: http://github.com/kfprimm
+
+## Lobby modules
+arraylist, beziercurve, body, clipboard, content, datafile, fastrandom, filemanipulator, freepolledinput, inifile, line2d, multitouch, object2d, polygon, primenumber, touchgui, touchobject, vector, wavearea, wndproccallback
+
+Download: http://www.blitzforum.de/forum/viewtopic.php?t=34549
+
+## Muttley modules
+commandstack, stack, logger, inifilehandler, SublimeText, node-os-service, registry
+
+Repo: https://bitbucket.org/muttley/
+
+Mirror: http://code.google.com/p/muttmod/
+
+## Nilium modules
+lugi, tmbundle, bmxlexer, NUIToolkit, bufferedglmax2d, renderbuffer, jonk, charset, numerical
+
+Repo: http://github.com/nilium
+
+## Otus modules
+RE2, ZlibStream, LzmaStream, FS, Actor, Lzma
+
+Repo: https://code.google.com/p/otus-mod/
+
+## PantsOn modules
+MPEG, Morph, REKO, Theora, YUV
+
+Site: http://www.pantson.com/mods
+
+## Perturbatio modules
+appfuncs, cgi, html, stringlist
+
+Mirror: http://wasted.nz/userlog.php?user=8652&log=1737
+
+## Spacerat modules
+advtext, colour, logprintstream, riff, snarl, threadedio, tiles
+
+Repo: http://github.com/Spacerat/joe.mod
+
+## Vertex's modules
+BNetEx, DreiDe engine, MIDI, OpenAL, MySQL, Milkshape3D Loader, BSP-Compiler, Raycaster Engine
+
+Site: http://vertex.dreamfall.at/projects.php
+
+Repo: https://github.com/oliverskawronek
+
+## Warpy's code and games
+
+Repo: http://github.com/christianp/warpycode
+
+## Wiebo's modules
+game2d, grid2d, vector2d, propertygrid, quadtree, artemax
+
+Repo: https://github.com/wiebow
+
+## Yasha's projects
+ybc, BlitzMax-Extensions, MaxYourselfASchemeIn48Hours, TMeta-Parser, MaxBridge
+
+Repo: http://github.com/Leushenko

+ 28 - 0
docs/community/controllers.md

@@ -0,0 +1,28 @@
+---
+id: controllers
+title: Controllers
+sidebar_label: Controllers
+---
+
+## FryPad - virtual control system for game input
+Topic: http://wasted.nz/posts.php?topic=85744
+
+Download: http://www.hi-toro.com/blitz/frypad.rar
+
+## Multitouch module
+Topic: http://www.blitzforum.de/forum/viewtopic.php?p=365769#365769
+
+Download: http://www.flowersoft.smokecover.com/flowersoft/developement/lobby%20modules.rar
+
+## ManyMouse wrapper
+Topic: http://wasted.nz/posts.php?topic=77031
+
+## Linux Webcam wrapper
+Topic: http://wasted.nz/posts.php?topic=55972
+
+Download: http://wasted.nz/userlog.php?user=8652&log=1737
+
+## ESCAPI Webcam DLL - Extremely Simple Capture API
+Code: http://wasted.nz/codearcs.php?code=1899
+
+Site: http://sol.gfxile.net/code.html

+ 20 - 0
docs/community/database.md

@@ -0,0 +1,20 @@
+---
+id: database
+title: Database
+sidebar_label: Database
+---
+
+## ETNA - Easy daTabase Network Access
+Topic: http://wasted.nz/posts.php?topic=56603
+Site: http://repeatuntil.online.fr/Etna
+
+## SQLiter
+Topic: http://wasted.nz/posts.php?topic=59937
+Download: http://wasted.nz/userlog.php?user=8652&log=1737
+
+## Sqlserver (by byo)
+Repo: http://code.google.com/p/byomods
+
+## Redis client module (by Ibmurai)
+Repo: https://github.com/Ibmurai/redis.mod
+

+ 42 - 0
docs/community/file_formats.md

@@ -0,0 +1,42 @@
+---
+id: file_formats
+title: File Formats
+sidebar_label: File Formats
+---
+
+## MaXML - XML module
+Topic: http://wasted.nz/posts.php?topic=53834
+
+Download: http://wasted.nz/userlog.php?user=8652&log=1737
+
+## ZipStream module
+Topic: http://wasted.nz/posts.php?topic=71734
+
+Repo: https://github.com/maxmods/koriolis.mod
+
+## Batch Renamer
+Repo: http://code.google.com/p/batch-renamer
+
+## Reflection-Based JSON Encoder/Decoder
+Repo: https://github.com/Trylobot/bmx-rjson
+
+## Dependency injection module - uses Reflection
+Repo: https://github.com/FWeinb/injection.mod
+
+## ParserGen and Coocoo - parser/compiler generators
+Topic: http://wasted.nz/posts.php?topic=66735
+
+Site: http://sites.google.com/site/grable0
+
+## Blitz Lua
+Topic: http://wasted.nz/posts.php?topic=68845
+
+Wiki: http://lua-users.org/wiki/BlitzLua
+
+## BlitzProg Precompiler
+Repo: http://code.google.com/p/bb-bmax-precompiler
+
+## HOTDOCS - html generator
+Toolbox: http://web.archive.org/web/20160618193050/http://www.blitzbasic.com/toolbox/toolbox.php?tool=142
+
+Site: http://www.hotdocs.de.vu

+ 31 - 0
docs/community/gui.md

@@ -0,0 +1,31 @@
+---
+id: gui
+title: GUI
+sidebar_label: GUI
+---
+
+## MaxGUI v1.42 - native OS gadget kit
+Repo: http://sourceforge.net/projects/maxgui
+
+## MaxGUI 2 beta - Fltk replaced by Gtk
+Maxgui2: https://github.com/nitrologic/maxgui2.mod
+
+## wxMax - wxWidgets GUI toolkit
+Topic: http://wasted.nz/posts.php?topic=79723
+
+Repo: https://github.com/maxmods/wx.mod
+
+## ifsoGUI
+Topic: http://wasted.nz/posts.php?topic=85828
+
+Topic: http://wasted.nz/posts.php?topic=101857
+
+Repo: https://github.com/maxmods/ifsogui.mod
+
+## FryGUI
+Topic: http://wasted.nz/posts.php?topic=65067
+
+Download: http://wasted.nz/userlog.php?user=8652&log=1737
+
+## HighGUI 3
+Site: http://myweb.tiscali.co.uk/diablogames/portfolio/

+ 15 - 0
docs/community/gui_builders.md

@@ -0,0 +1,15 @@
+---
+id: gui_builders
+title: GUI Builders
+sidebar_label: GUI Builders
+---
+
+## Logic Gui Professional
+Toolbox: http://web.archive.org/web/20160619072958/http://www.blitzbasic.com/toolbox/toolbox.php?tool=182
+
+Site: http://jsp.logiczone.de
+
+## GUIde
+Toolbox: http://web.archive.org/web/20160619052400/http://www.blitzbasic.com/toolbox/toolbox.php?tool=28
+
+Repo: https://github.com/wiebow/guide

+ 11 - 0
docs/community/gui_drivers.md

@@ -0,0 +1,11 @@
+---
+id: gui_drivers
+title: GUI Drivers
+sidebar_label: GUI Drivers
+---
+
+## gtkmaxgui.mod - GTK driver for MaxGUI
+Repo: https://github.com/maxmods/bah.mod
+
+## QtMax - wip
+Repo: http://code.google.com/p/qtmax

+ 13 - 0
docs/community/gui_gadgets.md

@@ -0,0 +1,13 @@
+---
+id: gui_gadgets
+title: GUI Gadgets
+sidebar_label: GUI Gadgets
+---
+
+## Scintilla - TextArea replacement (Win)
+Topic: http://wasted.nz/posts.php?topic=85716
+
+Repo: http://code.google.com/p/scintillabmx
+
+## maxguitextareascintilla.mod - Scintilla textarea (Linux/Mac)
+Repo: https://github.com/maxmods/bah.mod

+ 54 - 0
docs/community/ides.md

@@ -0,0 +1,54 @@
+---
+id: ides
+title: IDEs
+sidebar_label: IDEs
+---
+
+## BLIde
+Toolbox: http://web.archive.org/web/20160619071115/http://www.blitzbasic.com/toolbox/toolbox.php?tool=131
+
+Site: http://www.blide.org
+
+## MaxIDE - default IDE v1.43/1.44
+Topic: http://wasted.nz/posts.php?topic=102086
+
+Repo: https://github.com/nitrologic/maxide
+
+Repo: http://sourceforge.net/projects/maxgui/files/
+
+## MaxIDE Community Edition
+Toolbox: http://web.archive.org/web/20160619031248/http://www.blitzbasic.com/toolbox/toolbox.php?tool=164
+
+Repo: http://blitzmax-ide.sourceforge.net/
+
+## MaxEdit - steamstub, maxedit
+Topic: http://wasted.nz/posts.php?topic=53227
+
+Repo: http://code.google.com/p/max-edit
+
+## HydraMax IDE
+Toolbox: http://web.archive.org/web/20160619092241/http://www.blitzbasic.com/toolbox/toolbox.php?tool=192
+
+Site: http://www.eiksoft.com/hydra
+
+## CollIDE - MaxIDE in Java
+Toolbox: http://web.archive.org/web/20160619092230/http://www.blitzbasic.com/toolbox/toolbox.php?tool=244
+
+Repo: http://code.google.com/p/blitzcoderide
+
+## EclipseMax - editor for Eclipse
+Repo: http://code.google.com/p/eclipsemax
+
+## indevIDE - full-featured open source IDE
+Topic: http://wasted.nz/posts.php?topic=101943
+
+Repo: http://sourceforge.net/projects/indevide/
+
+## GEdit plugin
+Topic: http://wasted.nz/posts.php?topic=87684
+
+Site: http://chaos-interactive.de/en/geditbmax
+
+## Geany plugin
+Topic: http://wasted.nz/posts.php?topic=98327
+

+ 40 - 0
docs/community/networking.md

@@ -0,0 +1,40 @@
+---
+id: networking
+title: Networking
+sidebar_label: Networking
+---
+
+## BNetEx - Network Module
+Topic: http://wasted.nz/posts.php?topic=50723
+
+## TNet - Truplo Network Library
+Topic: http://wasted.nz/posts.php?topic=50268
+
+Site: https://sites.google.com/site/tnetsite/
+
+## RakNet wrapper
+Topic: http://wasted.nz/posts.php?topic=59325
+
+Site: http://repeatuntil.free.fr/raknet
+
+## K-NetLib - network library
+Topic: http://wasted.nz/posts.php?topic=63761
+
+## Leadwerks Netwerks
+Topic: http://wasted.nz/posts.php?topic=84665
+
+Code: http://wasted.nz/codearcs.php?code=2580
+
+## LibSSL module (openssl: v1.0.2)
+Download: http://www.subsoft.net/get.php?name=sub.libssl.mod_v1.0.zip
+
+Reference: http://www.subsoft.net/sublibsslmod_docs.php
+
+## Websocket module - uses BNetEx
+Repo: http://github.com/FWeinb/websocket.mod
+
+## NitroServer - http server
+Repo: http://code.google.com/p/nitroserver
+
+## MSC Chat
+Repo: http://code.google.com/p/mscchat

+ 18 - 0
docs/community/open_source_games.md

@@ -0,0 +1,18 @@
+---
+id: open_source_games
+title: Open Source Games
+sidebar_label: Open Source Games
+---
+
+## Cocoon - Tandy Color Computer emulator
+Repo: https://github.com/laurentmor/cocoon-bm
+
+## Vib'Z - shoot-em-up
+Repo: http://code.google.com/p/pfe-blitzmax
+
+## Arky - Revolution remake
+Repo: http://code.google.com/p/arky
+
+## MaxGames - VectorTube and VectorZone
+Repo: http://code.google.com/p/maxgames
+

+ 14 - 0
docs/community/particles.md

@@ -0,0 +1,14 @@
+---
+id: particles
+title: Particles
+sidebar_label: Particles
+---
+
+## TimelineFX
+Topic: http://wasted.nz/posts.php?topic=85732
+
+Site: http://rigzsoft.co.uk
+
+## Swift Sprite System
+Topic: http://wasted.nz/posts.php?topic=72716
+

+ 7 - 0
docs/community/resources.md

@@ -0,0 +1,7 @@
+---
+id: resources
+title: Resources
+sidebar_label: Resources
+---
+
+TODO

+ 93 - 0
docs/language/arrays.md

@@ -0,0 +1,93 @@
+---
+id: arrays
+title: Arrays
+sidebar_label: Arrays
+---
+
+Arrays are used to store sequences of variables, or elements. An element within an array is accessed by indexing the
+array with an integer offset.
+
+The general syntax for indexing an array is:
+
+```blitzmax
+ArrayExpression [ index1 , index2 etc... ]
+```
+
+## Creating Arrays
+
+The most common way to create an array is when declaring a variable:
+
+```blitzmax
+Local int_array[10]
+```
+
+This will initialize the int_array variable with a 10 element array. You can declare an **empty** array by using []:
+
+```
+Local int_array[]
+```
+
+An empty array is identical to an array with 0 elements.
+
+Arrays may also be created 'on the fly' using the syntax:
+
+```blitzmax
+New [ Dimension1 , Dimension2 etc... ]
+```
+
+This returns an array of the specified dimension(s) with each element initialized to #Null. For example:
+
+```blitzmax
+Local int_array:Int[]
+int_array = New Int[10]
+```
+
+**Auto arrays** may be created using the syntax:
+
+```blitzmax
+[ Element1 , Element2 etc... ]
+```
+
+This returns a 1 dimensional array containing the specified elements, for example:
+
+```blitzmax
+Local int_array[] = [1,2,3,4,5]
+```
+
+Each element of an auto array must have exactly the same type. If necessary, you can use type conversions to enforce this.
+
+Arrays also provide the following methods:
+
+| Method  | Description  |
+|---|---|
+| ```Sort( ascending = True )``` | Sort the array.  |
+| ```Dimensions:Int[]()```  | Get array dimensions.  |
+
+Arrays also provide a read-only **length** field that returns the total number of elements in the array.
+
+Here are some examples of using array methods:
+
+```blitzmax
+Strict
+
+Local arr:String[] = ["some", "random", "strings", "in", "a", "string", "array"]
+
+arr.Sort        ' sort ascending
+Print "Array in ascending order..."
+For Local t:String=EachIn arr
+    Print t
+Next
+
+arr.Sort False  'sort descending
+Print "Array in descending order..."
+For Local t:String = EachIn arr
+    Print t
+Next
+
+Local arr2[10,20,30,40]
+
+'Dump array dimensions
+For Local i = EachIn arr2.Dimensions()
+    Print i
+Next
+```

+ 105 - 0
docs/language/basic_compatibility.md

@@ -0,0 +1,105 @@
+---
+id: basic_compatibility
+title: Basic Compatibility
+sidebar_label: Basic Compatibility
+---
+
+This section covers some of the differences between BlitzMax and 'classic' BASIC, and introduces features that help
+overcome some of classic BASIC's shortcomings.
+
+## Strict mode
+
+Classic BASIC allows you to declare variables **on the fly**. For example, consider a program consisting of:
+
+```blitzmax
+For k=1 To 10
+    sum=sum+k
+Next
+Print sum
+```
+This program automatically creates 2 local variables: ```k``` and ```sum```. However, this behaviour can often lead to
+unexpected bugs. For example, if you mistyped one of the ```sum``` variables, the program would not work as expected.
+No error would be given - a new variable would simply be created.
+
+By default, BlitzMax NG implements what is known as `Strict` mode to override this behaviour.
+
+`Strict` must appear at the top of your program before any actual program code and puts your program into **strict mode**.
+`Strict` mode forces you to declare all variables before use. For example, rewriting the above program in strict mode
+results in:
+
+```blitzmax
+Strict
+Local sum, k
+For k = 1 To 10
+    sum = sum + k
+Next
+Print sum
+```
+If you were to mistype one of the variable names in this program, you would receive an **identifier not found** error
+when compiling, allowing you to easily find and correct the problem.
+
+In `Strict` mode, a variable whose type is not declared is assumed to be an `Int`.
+
+## SuperStrict mode
+
+For even greater strictness, there is also `SuperStrict` mode.
+`SuperStrict` mode forces you to declare the type of each of your variables, as well as the return types of functions
+and methods. This can further assist in solving issues in your program by eliminating potential variable type confusion.
+
+Rewriting the above program in `SuperStrict` mode results in:
+
+```blitzmax
+SuperStrict
+Local sum:Int, k:Int
+For k = 1 To 10
+    sum = sum + k
+Next
+Print sum
+```
+With all your variables **strongly typed** the compiler will be less forgiving and provide you with better errors if
+you attempt to mix incompatible variable types together.
+
+## Arrays
+
+Blitzmax does not support the Dim statement for array creation. Instead, arrays in BlitzMax are real types - they can
+be passed to functions, returned from functions and placed in variables.
+
+To create a classic BASIC style array in BlitzMax, use a global variable. For example:
+
+```blitzmax
+Global my_array$[100]   ' create a 100 element string array
+```
+Also note that arrays in BlitzMax are not **1 bigger** than their dimensioned size - the 100 element array above
+contains 100 elements, numbered 0 through 99 inclusive.
+
+BlitzMax also does not support a **Redim** operation. Instead, you can use **slices**. For example:
+
+```blitzmax
+Global my_array$[100]       ' create a 100 element string array
+my_array=my_array[..200]    ' now a 200 element array!
+```
+
+## Data, Read and Restore
+
+Data, Read and Restore are supported but have been renamed to `DefData`, `ReadData` and `RestoreData`. Data labels must
+also be prefixed with a ```#``` character.
+
+## Type tag shortcuts
+
+When declaring variables and function return types, BlitzMax allows you to use BASIC style **type tags**. These are as
+follows:
+
+| Type tag  | Equivalent type  |
+|---|---|
+| %  | `Int`  |
+| #  | `Float`  |
+| !  | `Double`  |
+| $  | `String`  |
+
+For example, a string variable can be declared in two ways:
+
+```blitzmax
+Local a_string:String
+Local another_string$
+```
+Mac users whose keyboards do not feature the ```#``` character should use ```Alt 3```.

+ 41 - 0
docs/language/collections.md

@@ -0,0 +1,41 @@
+---
+id: collections
+title: Collections
+sidebar_label: Collections
+---
+
+BlitzMax offers simple support for managing **collections** of objects, and for visiting each
+object in a **collections** using a special form of `For` / `Next` loop.
+
+The simplest kind of collection is an array:
+
+```blitzmax
+Local a[]=[1,2,3,4,5]
+For Local k=EachIn a
+    Print k
+Next
+```
+Each iteration of such a loop will assign the next array element (starting with element 0) to the index variable
+before executing the body of the loop. This allows you to **visit** each array element in turn.
+
+It is also possible to create your own kind of collection with user defined types.
+
+To do this, you must create a user defined type with a method named ```ObjectEnumerator``` which takes no parameters and
+returns an object. The object returned by this method must itself have the following methods:
+
+```blitzmax
+Method HasNext:Int()        ' returns true if there's a next object
+Method NextObject:Object()  ' returns the next object
+```
+You can then use the object in a `for_eachin_next`:
+
+```blitzmax
+Local list:TList = New TList
+
+list.AddLast "Hello"
+list.AddLast "World!"
+
+For Local t:String= E achIn list
+    Print t
+Next
+```

+ 23 - 0
docs/language/comments.md

@@ -0,0 +1,23 @@
+---
+id: comments
+title: Comments
+sidebar_label: Comments
+---
+
+Comments are chunks of text in your program code that are ignored by the compiler, but are there to remind you how the
+code works.
+
+BlitzMax support single line comments using the ```'``` character - for example:
+
+```blitzmax
+Print "Comment Test"    ' Everything from the apostrophe (') character to the end of line is ignored.
+```
+Multiline comments are also supported, using `Rem` and `EndRem` - for example:
+
+```blitzmax
+Rem
+Blitzmax rocks!
+An example of a multiline comment...
+Multiline comments are useful for documenting and maintaining your code
+End Rem
+```

+ 89 - 0
docs/language/conditional_compiling.md

@@ -0,0 +1,89 @@
+---
+id: conditional_compiling
+title: Conditional Compiling
+sidebar_label: Conditional Compiling
+---
+
+Conditional compiling allows you to turn compiling on or off from within your program depending on the environment
+the program is being compiled for.
+
+Conditional compiling works a bit like an `If` statement, but takes the form:
+
+```blitzmax
+?Identifier
+```
+
+The ```?``` must appear at the start of a new line, and ```Identifier``` should be one of the following:
+
+| Name  | Meaning  |
+|---|---|
+| Debug  | True if program is being compiled in debug mode.  |
+| Threaded  | True if program is being compiled in threaded mode.  |
+| Release  | True if program is being compiled in release mode.  |
+| Win32  | True if program is being compiled for the Windows operating system.  |
+| Win32x86  | True if program is being compiled for 32-bit Windows operating system.  |
+| Win64  | True if program is being compiled for 64-bit Windows operating system.  |
+| Win32x64  | Same as above  |
+| MacOS  | True if program is being compiled for the macOS or iOS operating system.  |
+| MacOSX86  | True if program is being compiled for an 32-bit macOS or iOS operating system.  |
+| MacOSX64  | True if program is being compiled for an 64-bit macOS or iOS operating system.  |
+| MacOSPPC  | True if program is being compiled for a PowerPC macOS or iOS operating system.  |
+| osx  | True if program is being compiled for a Mac.  |
+| osxx86  | True if program is being compiled for a 32-bit Intel Mac.  |
+| osxppc  | True if program is being compiled for a PowerPC Mac.  |
+| osxx64  | True if program is being compiled for a 64-bit Intel Mac.  |
+| ios  | True if program is being compiled for an iPhone.  |
+| iosx86  | True if program is being compiled for a 32-bit iPhone.  |
+| iosx64  | True if program is being compiled for a 64-bit iPhone.  |
+| iosarmv7  | True if program is being compiled for a ArmV7 iPhone.  |
+| iosarm64  | True if program is being compiled for an Arm64 iPhone.  |
+| Linux  | True if program is being compiled for the Linux operating system.  |
+| LinuxX86  | True if program is being compiled for 32-bit Linux operating system.  |
+| LinuxX64  | True if program is being compiled for 64-bit Linux operating system.  |
+| LinuxARM  | True if program is being compiled for Linux operating system running on ARM processors.  |
+| android  | True if program is being compiled for android.  |
+| androidx86  | True if program is being compiled for 32-bit android.  |
+| androidx64  | True if program is being compiled for 64-bit android.  |
+| androidarm  | True if program is being compiled for android running on any ARM processor.  |
+| androidarmeabi  | True if program is being compiled for android running on ARMeabi processor.  |
+| androidarmeabiv7a  | True if program is being compiled for android running on ARMeabi-v7a processor.  |
+| androidarm64v8a  | True if program is being compiled for android running on ARM64-v8a processor.  |
+| raspberrypi  | True if program is being compiled for RaspberryPi  |
+| raspberrypiARM  | True if program is being compiled for ARM based RaspberryPi  |
+| emscripten  | True if program is using emuscripten compiler  |
+| emscriptenjs  | True if program is compiled into javascript using emuscripten compiler  |
+| X86  | True if program is being compiled for x86-based 32-bit CPU.  |
+| X64  | True if program is being compiled for x64-based 64-bit CPU.  |
+| PPC  | True if program is being compiled for PowerPC CPU.  |
+| arm  | True if program is being compiled for any ARM CPU  |
+| armeabi  | True if program is being compiled for ARMeabi CPU  |
+| armeabiv7a  | True if program is being compiled for ARMeabi-v7a CPU  |
+| arm64v8a  | True if program is being compiled for ARM64-v8a  |
+| js  | True if program is being compiled for javascript  |
+| armv7  | True if program is being compiled for ARM-v7  |
+| arm64  | True if program is being compiled for ARM64  |
+| ptr32  | True if program being compiled for systems with 32-bit pointers  |
+| ptr64  | True if program being compiled for systems with 64-bit pointers  |
+| BigEndian  | True if program is being compiled for a big endian CPU.  |
+| LittleEndian  | True if program is being compiled for a little endian CPU.  |
+| opengles  | True if program is being compiled for platform that uses OpenGL ES  |
+| bmxng  | True if program is being compiled using BlitzMax-NG  |
+
+```Identifier``` may also be preceded by `Not` to invert the result.
+
+An ```?``` on its own always turns compiling on.
+
+BlitzMax-NG also allows for **conditional expressions** such as ```?x64 and raspberrypi```
+
+For example:
+
+```blitzmax
+?Debug
+    ' Any code here is only compiled in debug mode.
+?Not Debug
+    ' Any code here is only compiled in release mode.
+?Debug and x64
+    ' Any code here is only compiled in debug mode and if being compiled for a 64 bit system
+?
+    ' Code here is always compiled.
+```

+ 30 - 0
docs/language/constants.md

@@ -0,0 +1,30 @@
+---
+id: constants
+title: Constants
+sidebar_label: Constants
+---
+
+Constants can be used to store values that don't change during the execution of your program.
+
+Constants must be declared in your program before use with the `Const` command.
+Declaring a constant means defining a name, type and initial value for it.
+
+The general syntax for declaring a constant is:
+
+```blitzmax
+Const Identifier : Type = ConstantExpression
+```
+For example:
+
+```blitzmax
+Const STARTUP_SIZE = 1000
+Const SCREEN_WIDTH = 640, SCREEN_HEIGHT = 480
+Const SCREEN_AREA = SCREEN_WIDTH * SCREEN_HEIGHT
+Const SCALE_FACTOR:Float = 1.5
+Const DEFAULT_TITLE:String = "BlitzMax"
+```
+Multiple constants may be declared per `Const` statement using the comma separator.
+In `Strict` mode, if no type is provided for a constant, the constant defaults to being of type `Int`.
+
+The initial value for a constant may be an expression, but the expression must itself be constant -
+it may only use other constants or literals and may not use any variables.

+ 105 - 0
docs/language/data_types.md

@@ -0,0 +1,105 @@
+---
+id: data_types
+title: Data Types
+sidebar_label: Data Types
+---
+
+All constants, variables, functions and expressions have an associated type. BlitzMax supports the following types:
+
+|  Description | Syntax  | Minimum value  |  Maximum value |
+|---|---|---|---|
+| 8 bit unsigned integer | `Byte` | 0  | 255  |
+| 16 bit unsigned integer |  `Short` | 0  | 65535  |
+| 32 bit signed integer | `Int`  |  -2^31 | +2^31-1  |
+| 32 bit unsigned integer |  `UInt` |  0 |  +2^32-1 |
+| 64 bit signed integer |  `Long` | -2^63  | +2^63-1  |
+| 64 bit unsigned integer | `ULong`  | 0  | +2^64-1  |
+| 32 bit floating point  | `Float`  | (+/-)10^-38  | (+/-)10^38  |
+| 64 bit floating point  | `Double`  | (+/-)10^-308  | (+/-)10^308  |
+| 16 bit unicode string  | `String`  |   |   |
+| Unsigned integer (32 bit arch)  | `Size_T`  | 0  | +2^32-1  |
+| Unsigned integer (64 bit arch)  | `Size_T`  | 0  | +2^64-1  |
+| 64 bit SIMD float  | `Float64`  |   |   |
+| 128 bit SIMD integer  | `Int128`  |   |   |
+| 128 bit SIMD float  | `Float128`  |   |   |
+| 128 bit SIMD double  | `Double128`  |   |   |
+| Object  | Typename  |   |   |
+| Array  | ElementType [ ]  |   |   |
+| Function  | ReturnType ( Parameters )  |   |   |
+| Pointer  | ValueType Ptr  |   |   |
+| Variable  | VariableType Var  |   |   |
+
+Integers are used to store simple numeric data without any fractional part.
+Unsigned integers can only store positive values, while signed integers can store both positive and negative values.
+
+Floating point values are used to store numeric data which may have a fractional part.
+
+SIMD values are available on x64 architectures and can be used for performing numeric calculations more efficiently.
+
+Strings are used to store sequences of characters: letters, punctuation, digits and so on. Use strings for storing
+non-numeric data such as names.
+
+Arrays are used to store sequences of variables. A variable within an array is accessed by 'indexing' the array with an
+integer offset. Please refer to the arrays sections for more information on arrays.
+
+Objects are instances of user-defined types. Please refer to the user-defined types section.
+
+## Type Conversions
+
+The following type conversions are performed automatically by BlitzMax when necessary - for example, when assigning an
+expression to a variable, or when passing an expression to a function:
+
+| Source Type  | Target Type  |
+|---|---|
+| Integer  | Floating point, String  |
+| Floating point | String  |
+
+You can also convert types explicitly using a cast operation. This takes the form of a type specifier followed by an
+expression in brackets.
+
+Explicit casting allows you to perform the following extra conversions:
+
+| Source Type  | Target Type  |
+|---|---|
+| String  | Integer, Floating point  |
+
+For example:
+
+```blitzmax
+Local n:Int=10
+Local t:String="20"
+Print Int( t )
+Print String( n )
+```
+## Type Balancing
+
+When performing arithmetic operations such as addition or multiplication, it is possible to provide mismatched argument
+types. For example, the addition operator may be used to add an integer value to a floating point value. But what type
+should the result be?
+
+BlitzMax decides the result type by balancing the argument types. Both arguments are then converted to the result type
+before the operator is applied.
+
+The rules governing type balancing are:
+
+
+
+    If either argument is `Double`, then result is `Double`
+
+    else if either argument is `Float`, then result is `Float`
+
+    else if either argument is `ULong`, then result is `ULong`
+
+    else if either argument is `Size_T`, then result is `Size_T`
+
+    else if either argument is `WParam`, then result is `WParam`
+
+    else if one argument is `Long` and the other `UInt`, then result is `ULong`
+
+    else if either argument is `LParam`, then result is `LParam`
+
+    else if either argument is `Long`, then result is `Long`
+
+    else if either argument is `UInt`, then result is `UInt`
+
+    else result is `Int`

+ 24 - 0
docs/language/debugging.md

@@ -0,0 +1,24 @@
+---
+id: debugging
+title: Debugging
+sidebar_label: Debugging
+---
+
+BlitzMax provides several commands to help with debugging your programs:
+
+| `DebugStop`  | In debug mode, causes the program to stop executing and activates the debugger. In release mode, no effect.  |
+|---|---|
+| `DebugLog` StringExpression  | In debug mode, causes ```StringExpression``` to be printed to the debugger output window. In release mode, no effect.  |
+| `RuntimeError` StringExpression  | Causes a runtime error exception (see: `exceptions`) to be thrown with the specified string.  |
+| `Assert` Expression `Else` StringExpression  | In debug mode, causes a `RuntimeError` if ``Expression`` evaluates to false. No effect in release mode.  |
+
+`Assert` is particularly useful for validating function arguments. For example:
+
+```blitzmax
+Function SetAlpha( alpha# )
+    Assert alpha>=0 And alpha<=1 Else "Alpha value out of range"
+    ' rest of function here...
+End Function
+```
+However, since asserts are taken out in release mode, be careful that your asserts don't have any **side effects** -
+code that may affect the execution of the program.

+ 36 - 0
docs/language/exceptions.md

@@ -0,0 +1,36 @@
+---
+id: exceptions
+title: Exceptions
+sidebar_label: Exceptions
+---
+
+BlitzMax provides a mechanism for handling runtime errors known as **exception handling**.
+
+An exception is actually just an object. You can **throw** and **catch** exceptions using the `Throw` command and a `Try` /
+`Catch` block. Here is a simple example:
+
+```blitzmax
+Function ExTest()
+    Throw "Bingo!"
+End Function
+
+Try
+    ExTest()
+Catch ex:Object
+    Print ex.ToString()
+End Try
+```
+Throwing an exception causes the program to jump to the most recent `Catch` block. You can provide multiple catch blocks
+for catching exceptions of different types. If there is no appropriate `Catch` block for the exception, then the program
+jumps to the %next most recent `Catch` block. If no catch block can be found to deal with the exception, the program
+will end.
+
+BlitzMax has several built-in exception types, all of which extend type TBlitzException. These are:
+
+| Exception  | Cause  |
+|---|---|
+| TNullMethodException  | Thrown when a program attempts to call an abstract method.  |
+| TNullFunctionException  | Thrown when a program attempts to call a null function.  |
+| TNullObjectException  | Thrown when a program attempts to access a null object (only thrown in debug mode).  |
+| TArrayBoundsException  | Thrown when a program attempts to access an array element outside of an array's bounds (only thrown in debug mode).  |
+| TRuntimeException  | Thrown by the `RuntimeError` or `Assert` commands.  |

+ 99 - 0
docs/language/expressions.md

@@ -0,0 +1,99 @@
+---
+id: expressions
+title: Expressions
+sidebar_label: Expressions
+---
+
+## Operators
+
+BlitzMax supports the following operators. Operators are grouped into levels of precedence,
+starting with the highest precedence operators:
+
+| Operator  | Syntax  |
+|---|---|
+| Sub expression  | ( Expression )  |
+| New object  | `New` Typename  |
+| Literal  | Value  |
+| Identifier  | Value  |
+| Self object  | `Self`  |
+| Super object  | `Super`  |
+| Null value  | `Null`  |
+| Pi  | `Pi`  |
+| True  | `True`  |
+| False  | `False`  |
+| Minumum  | `Min` ( Expression1 , Expression2 )  |
+| Maximum  | `Max` ( Expression1 , Expression2 )  |
+| Member  | Expression . Identifier  |
+| Index  | Expression [ IndexExpressions ]  |
+| Call  | Expression ( Parameters ) |
+| Negate  | + Expression  |
+| Posate  | - Expression  |
+| Bitwise complement  | {~} Expression  |
+| Boolean not  | `Not` Expression  |
+| Absolute value  | `Abs` Expression  |
+| Sign  | `Sgn` Expression  |
+| Value byte size  | `SizeOf` Expression  |
+| Variable address  | `Varptr` Variable  |
+| Convert type expression  | Type Expression  |
+| Power  | Expression ^ Expression  |
+| Multiply  | Expression * Expression  |
+| Divide  | Expression / Expression  |
+| Remainder  | Expression `Mod` Expression  |
+| Bitwise shift left  | Expression `Shl` Expression  |
+| Bitwise shift right  | Expression `Shr` Expression  |
+| Arithmetic shift right  | Expression `Sar` Expression  |
+| Add  | Expression + Expression  |
+| Subtract  | Expression - Expression  |
+| Bitwise and  | Expression & Expression  |
+| Bitwise or  | Expression ```|``` Expression  |
+| Bitwise exclusive or  | Expression ```~``` Expression  |
+| Equal  | Expression = Expression  |
+| Not equal  | Expression ```<>``` Expression  |
+| Less than  | Expression < Expression  |
+| Greater than  | Expression > Expression  |
+| Less than or equal  | Expression <= Expression  |
+| Greater than or equal  | Expression {~>=} Expression  |
+| Conditional and  | Expression `And` Expression  |
+| Conditional or  | Expression `Or` Expression  |
+
+In addition, the following built in functions are also supported:
+
+| Function  | Syntax  |
+|---|---|
+| Character code  | `Asc` ( Expression )  |
+| Character  | `Chr` ( Expression )  |
+| Value length  | `Len` ( Expression )  |
+
+`Null` returns 0, an empty string, an empty array, the null object or a pointer to 0 depending on context.
+
+`True` and `False` are integer constants with the values 1 and 0, respectively.
+
+The index operator can be used on either arrays or strings. If used on an array,
+the element at the specified index is returned. If used on a string, the character code
+of the character at the specified index is returned.
+
+The `Not` operator ``inverts`` the logic of a boolean expression. If the expression
+evaluates to true, `Not` returns false and vice versa.
+
+`Asc` returns the character value of the first character of a string, or -1 if the length of the string is 0.
+
+`Chr` constructs a 1 character string with the specified character value.
+
+`Len` can be used with either a string or array. When used with a string, `Len`
+returns the number of characters in the string. When used with an array, `Len` returns
+the number of elements in the array. In the case of multidimensional arrays, `Len`
+returns the total number of elements.
+
+## Boolean expressions
+
+It is frequently necessary to consider an expression as ``true`` or ``false``, for
+example, for use with an `If` statement.
+
+The rules for determining whether an expression is true or false are:
+
+| Expression Type  | Truth condition  |
+|---|---|
+| Numeric  | True if value is not equal to 0  |
+| Object  | True if object is not equal to `Null`  |
+| String  | True if length is not equal to 0  |
+| Array  | True if length is not equal to 0  |

+ 28 - 0
docs/language/functions.md

@@ -0,0 +1,28 @@
+---
+id: functions
+title: Functions
+sidebar_label: Functions
+---
+
+A function is a self contained block of code that can be called from multiple
+points in your program.
+
+Functions are declared using the syntax:
+
+```blitzmax
+Function Identifier:ReturnType(Parameters)
+    Function statements...
+End Function
+```
+If ReturnType is omitted, the function defaults to returning an `Int`.
+
+%Parameters is a comma separated list of parameters for the function. The syntax
+of each parameter is similar to a variable declaration: ``Identifier : Type``.
+Function parameters may be used inside a function in the same way as local
+variables.
+
+The `Return` statement is used to return a value from a function.
+
+Here is an example of a simple function that adds 2 integers and returns their sum:
+
+<TODO>

+ 52 - 0
docs/language/identifiers.md

@@ -0,0 +1,52 @@
+---
+id: identifiers
+title: Identifiers
+sidebar_label: Identifiers
+---
+
+Identifiers are used to name constants, variables, functions and user defined types.
+
+Identifiers start with a letter or underscore and can be followed by any combination of letters,
+digits or underscores. For example, the following are all valid identifiers:
+
+```blitzmax
+player1_up
+your_name
+_hello_world_
+```
+Identifiers in BlitzMax are case-insensitive. This means that the identifiers ```hello```, ```Hello```
+and ```HELLO``` are all treated as the same identifier.
+
+The following identifiers are reserved for use by the BlitzMax language, and can not be used as general
+purpose identifiers:
+
+```blitzmax
+Strict SuperStrict Module ModuleInfo Framework
+End Return Continue Exit Assert
+Public Private
+True False Pi Null Self Super
+Byte Short Int Long Float Double Object String
+UInt ULong Size_T
+Var Ptr VarPtr Chr Len Asc SizeOf Sgn Abs Min Max Mod
+Shl Shr Sar Not And Or
+New Release Delete
+Incbin IncbinPtr IncbinLen
+Include Import Extern EndExtern
+Function EndFunction
+Type EndType Extends
+Interface EndInterface
+Struct EndStruct
+Method EndMethod
+Local Global Const Field
+Abstract Final ReadOnly Export
+Rem EndRem
+If Then Else ElseIf EndIf
+For To Next Step EachIn
+While Wend
+Repeat Until Forever
+Select Case Default EndSelect
+Try Catch EndTry Throw
+DefData ReadData RestoreData
+Alias
+Operator Where
+```

+ 660 - 0
docs/language/keywords.md

@@ -0,0 +1,660 @@
+---
+id: keywords
+title: Keywords
+sidebar_label: Keywords
+---
+
+## Strict
+
+Set strict mode
+
+## SuperStrict
+
+Set SuperStrict mode
+
+## End
+
+End program execution
+
+## Rem
+
+Begin a remark block
+
+## EndRem
+
+End a remark block
+
+## True
+
+Constant integer of value 1
+
+## False
+
+Constant integer of value 0
+
+## Pi
+
+Constant Pi value: 3.1415926535897932384626433832795
+
+## Null
+
+Get Default Null value
+
+
+
+## Byte
+
+Unsigned 8 bit integer Type
+
+
+
+## Short
+
+Unsigned 16 bit integer Type
+
+
+
+## Int
+
+Signed 32 bit integer Type
+
+
+
+## UInt
+
+Unsigned 32 bit integer Type
+
+
+
+## Long
+
+Signed 64 bit integer Type
+
+
+
+## ULong
+
+Unsigned 64 bit integer Type
+
+
+
+## Size_T
+
+Unsigned 32/64 bit integer Type
+
+
+
+## Int128
+
+128 bit integer intrinsic Type
+
+
+
+## Float
+
+32 bit Floating point Type
+
+
+
+## Double
+
+64 bit floating point Type
+
+
+
+## Float128
+
+128 bit floating point intrinsic Type
+
+
+
+## Float64
+
+64 bit floating point intrinsic Type
+
+
+
+## Double128
+
+128 bit double intrinsic Type
+
+
+
+## String
+
+String Type
+
+
+
+## Object
+
+Object Type
+
+
+
+## Var
+
+Composite Type specifier for 'by reference' types
+
+
+
+## Ptr
+
+Composite Type specifier for pointer types
+
+
+
+## If
+
+Begin a conditional block.
+
+
+
+## Then
+
+Optional separator between the condition and associated code in an If statement.
+
+
+
+## Else
+
+Else provides the ability For an If Then construct to execute a second block of code when the If condition is False.
+
+
+
+## ElseIf
+
+ElseIf provides the ability to test and execute a section of code if the initial condition failed.
+
+
+
+## EndIf
+
+Marks the End of an If Then block.
+
+
+
+## For
+
+Marks the start of a loop that uses an iterator to execute a section of code repeatedly.
+
+
+
+## To
+
+Followed by a constant which is used to calculate when to exit a For..Next loop.
+
+
+
+## Step
+
+Specifies an optional constant that is used to increment the For iterator.
+
+
+
+## Next
+
+End a For block
+
+
+
+## EachIn
+
+Iterate through an array or collection
+
+
+
+## While
+
+Execute a block of code While a condition is True
+
+
+
+## Wend
+
+End a While block
+
+
+
+## EndWhile
+
+End a While block
+
+
+
+## Repeat
+
+Execute a block of code Until a termination condition is met, or Forever
+
+
+
+## Until
+
+Conditionally continue a Repeat block
+
+
+
+## Forever
+
+Continue a Repeat block Forever
+
+
+
+## Select
+
+Begin a Select block
+
+
+
+## EndSelect
+
+End a Select block
+
+
+
+## Case
+
+Conditional code inside a Select block
+
+
+
+## Default
+
+Default code inside a Select block
+
+
+
+## Exit
+
+Exit enclosing loop
+
+
+
+## Continue
+
+Continue execution of enclosing loop
+
+
+
+## Const
+
+Declare a constant
+
+
+
+## Local
+
+Declare a Local variable
+
+
+
+## Global
+
+Declare a Global variable
+
+
+
+## Field
+
+Declare a Field variable
+
+
+
+## Function
+
+Begin a Function declaration
+
+
+
+## EndFunction
+
+End a Function declaration
+
+
+
+## Return
+
+Return from a Function
+
+
+
+## Type
+
+Begin a user defined Type declaration
+
+
+
+## EndType
+
+End a user defined Type declaration
+
+
+
+## Struct
+
+Begin a user defined Struct declaration
+
+
+
+## EndStruct
+
+End a user defined Struct declaration
+
+
+
+## Extends
+
+Specify user defined Type supertype
+
+
+
+## Implements
+
+Specify user defined Interface(s)
+
+
+
+## Method
+
+Begin a Method declaration
+
+
+
+## EndMethod
+
+End a Method declaration
+
+
+
+## Abstract
+
+Denote a Type or Method as Abstract
+
+
+
+## Final
+
+Denote a Type or Method as Final
+
+
+
+## New
+
+Create an instance of a user defined Type
+
+
+
+## Self
+
+Reference to this Method's Object instance
+
+
+
+## Super
+
+Reference to the Super Type Object instance
+
+
+
+## Delete
+
+Reserved for future expansion
+
+
+
+## Release
+
+Release an integer Object handle
+
+
+
+## Public
+
+Public makes a Constant, Global variable or Function accessible from outside the current source file (Default)
+
+
+
+## Private
+
+Private makes a Constant, Global variable or Function only accessible from within the current source file, or a Type member only accessible from within that Type.
+
+
+
+## Protected
+
+Protected makes a Type member accessible only from within that Type or its sub-Types.
+
+
+
+## Extern
+
+Extern marks the beginning of an external list of Function declarations
+
+
+
+## EndExtern
+
+EndExtern marks the End of an Extern section
+
+
+
+## Module
+
+Declare Module scope and identifier
+
+
+
+## ModuleInfo
+
+Define Module properties
+
+
+
+## Incbin
+
+Embed a data file
+
+
+
+## IncbinPtr
+
+Get start address of embedded data file
+
+
+
+## IncbinLen
+
+Get length of embedded data file
+
+
+
+## Include
+
+Include effectively 'inserts' the specified file into the file being compiled.
+
+
+
+## Framework
+
+Framework builds the BlitzMax application with only the Module specified rather than all modules installed.
+
+
+
+## Import
+
+Import declarations from a Module or source file
+
+
+
+## Assert
+
+Throw a RuntimeError if a condition is False
+
+
+
+## Goto
+
+Transfer program flow to specified label
+
+
+
+## Try
+
+Begin declaration of a Try block
+
+
+
+## EndTry
+
+End declaration of a Try block
+
+
+
+## Catch
+
+Catch an exception Object in a Try block
+
+
+
+## Throw
+
+Throw an exception Object to the enclosing Try block
+
+
+
+## DefData
+
+Define class BASIC style data
+
+
+
+## ReadData
+
+Read classic BASIC style data
+
+
+
+## RestoreData
+
+Restore classic BASIC style data
+
+
+
+## And
+
+Conditional 'And' binary operator
+
+
+
+## Or
+
+Conditional 'Or' binary operator
+
+
+
+## Not
+
+Conditional 'Not' binary operator
+
+
+
+## Shl
+
+Bitwise 'Shift left' binary operator
+
+
+
+## Shr
+
+Bitwise 'Shift right' binary operator
+
+
+
+## Sar
+
+Bitwise 'Shift arithmetic right' binary operator
+
+
+
+## Len
+
+Number of characters in a String or elements in an array
+
+
+
+## Abs
+
+Numeric 'absolute value' unary operator
+
+
+
+## Mod
+
+Numeric 'modulus' or 'remainder' binary operator
+
+
+
+## Sgn
+
+Numeric 'sign' unary operator
+
+
+
+## Min
+
+Numeric 'minimum' builtin function
+
+
+
+## Max
+
+Numeric 'maximum' builtin function
+
+
+
+## Varptr
+
+Find the address of a variable
+
+
+
+## SizeOf
+
+Size, in bytes, occupied by a variable, string, array or object
+
+
+
+## Asc
+
+Get character value of the first character of a string
+
+
+
+## Chr
+
+Create a string of length 1 with a character code
+
+
+
+## Interface
+
+Begin a user defined Interface declaration
+
+
+
+## EndInterface
+
+End a user defined Interface declaration
+
+
+
+## WParam
+
+WPARAM Type
+
+
+
+## LParam
+
+LPARAM Type
+

+ 64 - 0
docs/language/literals.md

@@ -0,0 +1,64 @@
+---
+id: literals
+title: Literals
+sidebar_label: Literals
+---
+
+Literals are simple numeric or string values.
+
+## Integer literals
+
+Integer literals may be in either decimal, hexadecimal or binary format. To specify a hexadecimal literal, prepend it
+with the ```$``` character. To specify a binary literal, prepend it with the ```%``` character. Here are some examples of
+integer literals:
+
+```blitzmax
+100         'decimal literal
+$CAFEBABE   'hexadecimal (base 16) literal
+%10101010   'binary (base 2) literal
+```
+## Floating point literals
+
+Floating point literals are numeric values with a fractional part. The fractional part is specified using a decimal
+point. Floating point literals may also be extended using '**e notation**'. For example:
+
+```blitzmax
+.5      'one half
+10.0    'ten point zero
+1e6     '1 times (10 to the power of 6)
+1.5e-6  '1.5 times (10 to the power of -6)
+```
+## String literals
+
+A string literal is a sequence of characters enclosed in quotation marks. For example:
+
+```blitzmax
+"Hello World"
+""              'empty string
+```
+
+String literals can also contain **escape sequences**. An escape sequence is a special sequence of characters used to
+represent another character. This is useful for including *untypable* characters and quotation marks in strings. Escape
+sequences always start with the ```~``` character. The following escape sequences are supported:
+
+| Escape sequence  | Equivalent character  |
+|---|---|
+| ~0  | Null character (ascii code 0)  |
+| ~t  | Tab character (ascii code 9)  |
+| ~r  | Return character (ascii code 13)  |
+| ~n  | Newline character (ascii code 10)  |
+| ~q  | Quote character (ascii code 34)  |
+| ~~  | Tilde character (ascii code 126)  |
+
+For example:
+
+```blitzmax
+Print "And then Mark said, ~qescape sequences rule!~q"
+Print "Line1~nLine2~nLine3~nLine4~nLine5"
+```
+The type of a literal may also be modified by appending @:%TypeName to the literal. For example:
+
+```blitzmax
+$8000000000000000:Long
+10:Double
+```

+ 104 - 0
docs/language/variables.md

@@ -0,0 +1,104 @@
+---
+id: variables
+title: Variables
+sidebar_label: Variables
+---
+
+Variables are used to store values that change during the execution of your program.
+
+Variables should be declared in your program before use. Declaring a variable means defining a name and type for the
+variable and, optionally, an initial value.
+
+The general syntax for declaring a variable is:
+
+```
+Declaration Identifier : Type = Expression
+```
+Multiple variables may be declared in one statement using the comma separator.
+
+In `Strict` mode, if the type of a variable is omitted, the variable defaults to being of type `Int`. In `SuperStrict`
+mode the type is mandatory. If the initial value expression is omitted, the variable is assigned an initial value of
+`Null`.
+
+There are 3 kinds of variable, each of which differs by how and where the variable is stored:
+
+## Local Variables
+
+Local variables are used to store temporary values that will eventually be discarded. Local variables are associated
+with the block of code they are declared in, and are only visible to code within that block. A block of code is
+represented by one of the following:
+
+* The body of a function or loop
+
+* The body of an if/then/else statement
+
+* The body of a case or default statement
+
+
+To declare a local variable, use a `Local` declaration:
+
+```blitzmax
+Local int_var
+Local string_var:String = "Str", float_var:Float = 10.5
+```
+
+## Global Variables
+
+Global variables are variables that exist for the entire lifetime of a program.
+
+To declare a global variable, use a `Global` declaration:
+
+```blitzmax
+Global int_var
+Global string_var:String = "Str", float_var:Float = 10.5
+```
+## Field Variables
+
+Field variables are declared within user-defined types using a `Field` declaration:
+
+```blitzmax
+Field int_var
+Field string_var:String = "Str", float_var:Float = 10.5
+```
+See the user-defined types section for more on field variables.
+
+## Assigning variables
+
+Once declared, a variable's value may be changed using an assignment statement:
+
+```blitzmax
+Variable = Expression
+```
+You can also perform **modifying** assignments, which are shorthand for ```Variable = Variable Operator Expression```.
+The syntax for modifying assignments is:
+
+.. list-table::
+    :widths: 10 30
+    :header-rows: 1
+
+    * - Syntax
+      - Operator
+    * - :+
+      - Addition
+    * - :-
+      - Subtraction
+    * - :*
+      - Multiplication
+    * - :/
+      - Division
+    * - :Mod
+      - Remainder
+    * - :&
+      - Bitwise and
+    * - :|
+      - Bitwise or
+    * - :~
+      - Bitwise exclusive or
+    * - :Shl
+      - Bitwise shift left
+    * - :Shr
+      - Bitwise shift right
+    * - :Sar
+      - Arithmetic shift right
+
+For example, the code ````my_var :+ 1```` can be used in place of ````my_var = my_var + 1````.

+ 6 - 0
docs/setup/custom_settings.md

@@ -0,0 +1,6 @@
+---
+id: custom_settings
+title: Custom Settings
+sidebar_label: Custom Settings
+---
+

+ 97 - 0
docs/setup/get_started.md

@@ -0,0 +1,97 @@
+---
+id: get_started
+title: Getting Started
+sidebar_label: Getting Started
+---
+
+BlitzMax is a strongly-typed, garbage-collected, open-source programming language
+with built-in support for advanced 2D graphics, sound, unicode and is ideally suited to
+making all kinds of apps and games.
+
+BlitzMax primarily targets the main three desktop platforms - Windows, Linux and macOS -
+but also supports building native binaries for Android, iOS, Raspberry Pi and
+NX (Switch homebrew).
+
+To get you started, we'll walk you through downloading and installing BlitzMax, introduce you
+to MaxIDE, and !.... something something!
+
+## Getting BlitzMax
+
+The first thing to do is to get yourself a copy of BlitzMax for your platform of choice.
+Head on over to the [Downloads](/downloads) section.
+
+### Which is the download for me?
+
+For Windows, there are 3 releases available. Each provides a different version of the MinGW
+toolchain depending on whether you are targetting 32-bit or 64-bit Windows applications.
+If you are not sure, just pick the 32/64 bit release, which allows you to build applications for both.
+
+The Linux and macOS releases rely on the system-provided compiler tools, therefore
+you are free to target whichever architecture your toolchain supports.
+
+## Prerequisites
+
+The Windows releases come with everything you need to start making your apps. For other
+platforms you may need to install a set of developer tools before you'll be able
+to compile your BlitzMax sources. See the relevant section on the left for your
+target platform for specific details on what you may need to install.
+
+## Installation
+
+Installing BlitzMax itself is just a case of extracting the downloaded archive. We use
+`7zip` on Windows, and `xz` on Linux.
+
+Once that's done, you can launch MaxIDE, the BlitzMax developer environment.
+
+The very first time you start MaxIDE, it will prompt you to generate the documentation.
+After that, and assuming you have installed any necessary development tools,
+you are all set to start writing your first BlitzMax application.
+
+## Hello World with MaxIDE
+
+We are going to begin our BlitzMax adventures with a traditional `Hello World` example.
+
+First, we need to create a new, empty BlitzMax source (`.bmx`) file. There are several ways
+you can do this.
+ * Choosing `New` from the File Menu
+ * Clicking on the New file icon (the first on the left) on the toolbar.
+ * Using the keyboard shortcut, Ctrl-N (or ![](assets/command-symbol.svg)-N on macOS)
+
+Enter the following text into the editor :
+```blitzmax
+Print "Hello World!"
+```
+
+With that done, we're all set to run it now.
+
+Again, there are several ways you can accomplish this :
+ * Choosing `Build and Run` from the Program Menu.
+ * Clicking on Build and Run icon (the tilted rocket) on the toolbar.
+ * Using the keyboard shortcut, Ctrl-R (or ![](assets/command-symbol.svg)-R on macOS)
+
+The `Output` window will appear, and a fair amount of text will spew forth. Don't be alarmed.
+On your very first build, BlitzMax needs to compile the core modules. But generally, once
+those are built, you'll never need to rebuild those again, and so you'll only usually
+see your own source files compiling.
+
+After the successful build and run, the Output window will show something along the
+lines of :
+```
+Building untitled1
+[ 97%] Processing:untitled1.bmx
+[ 98%] Compiling:untitled1.bmx.gui.debug.win32.x64.c
+[100%] Linking:untitled1.debug.exe
+Executing:untitled1.debug.exe
+Hello World!
+
+Process complete
+```
+The interesting part in all of that, of course, are the words "Hello World!".
+
+That's it. Now, go and create!
+
+## Further Reading
+
+Check out the `Language Guide` for a breakdown on syntax and language features.
+
+We also have some great tutorials, covering a variety of different topics.

+ 7 - 0
docs/setup/platform_android.md

@@ -0,0 +1,7 @@
+---
+id: android
+title: Android
+sidebar_label: Android
+---
+
+TODO

+ 7 - 0
docs/setup/platform_ios.md

@@ -0,0 +1,7 @@
+---
+id: ios
+title: iOS
+sidebar_label: iOS
+---
+
+TODO

+ 7 - 0
docs/setup/platform_linux.md

@@ -0,0 +1,7 @@
+---
+id: linux
+title: Linux
+sidebar_label: Linux
+---
+
+TODO

+ 7 - 0
docs/setup/platform_macos.md

@@ -0,0 +1,7 @@
+---
+id: macos
+title: macOS
+sidebar_label: macOS
+---
+
+TODO

+ 7 - 0
docs/setup/platform_nx.md

@@ -0,0 +1,7 @@
+---
+id: nx
+title: NX (Switch Homebrew)
+sidebar_label: NX (Switch Homebrew)
+---
+
+TODO

+ 7 - 0
docs/setup/platform_rpi.md

@@ -0,0 +1,7 @@
+---
+id: rpi
+title: Raspberry Pi
+sidebar_label: Raspberry Pi
+---
+
+TODO

+ 7 - 0
docs/setup/platform_win32.md

@@ -0,0 +1,7 @@
+---
+id: win32
+title: Win32
+sidebar_label: Win32
+---
+
+TODO

+ 7 - 0
docs/site/about.md

@@ -0,0 +1,7 @@
+---
+id: about
+title: About
+sidebar_label: About
+---
+
+TODO

+ 19 - 0
docs/site/credits.md

@@ -0,0 +1,19 @@
+---
+id: credits
+title: Site Credits
+sidebar_label: Site Credits
+---
+
+
+## Icons
+
+<div>Icons made by <a href="https://www.flaticon.com/authors/freepik" title="Linux">Linux</a> from <a href="https://www.flaticon.com/"     title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/"     title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div>
+<div>Icons made by <a href="https://www.flaticon.com/authors/dave-gandy" title="Windows logo silhouette">Windows logo silhouette</a> from <a href="https://www.flaticon.com/"     title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/"     title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div>
+<div>Icons made by <a href="https://www.flaticon.com/authors/freepik" title="Android logo">Android logo</a> from <a href="https://www.flaticon.com/"     title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/"     title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div>
+<div>Icons made by <a href="https://www.flaticon.com/authors/icomoon" title="Apple">Apple</a> from <a href="https://www.flaticon.com/"     title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/"     title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div>
+<div>Icons made by <a href="https://www.flaticon.com/authors/those-icons" title="Nintendo switch">Nintendo switch</a> from <a href="https://www.flaticon.com/"     title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/"     title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div>
+<div>Icons made by <a href="https://www.flaticon.com/authors/freepik" title="Raspberry pi">Raspberry pi</a> from <a href="https://www.flaticon.com/"     title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/"     title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div>
+<div>Icons made by <a href="https://www.flaticon.com/authors/freepik" title="Business affiliate network">Business affiliate network</a> from <a href="https://www.flaticon.com/"     title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/"     title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div>
+<div>Icons made by <a href="https://www.flaticon.com/authors/freepik" title="Users group">Users group</a> from <a href="https://www.flaticon.com/"     title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/"     title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div>
+<div>Icons made by <a href="https://www.flaticon.com/authors/smashicons" title="Devices">Devices</a> from <a href="https://www.flaticon.com/"     title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/"     title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div>
+<div>Icons made by <a href="https://www.flaticon.com/authors/freepik" title="Command symbol">Command symbol</a> from <a href="https://www.flaticon.com/"     title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/"     title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div>

+ 7 - 0
docs/tools/bcc.md

@@ -0,0 +1,7 @@
+---
+id: bcc
+title: BlitzMax Compiler (bcc)
+sidebar_label: BlitzMax Compiler (bcc)
+---
+
+TODO

+ 144 - 0
docs/tools/bmk.md

@@ -0,0 +1,144 @@
+---
+id: bmk
+title: BlitzMax Make (bmk)
+sidebar_label: BlitzMax Make (bmk)
+---
+
+`bmk` is used to build BlitzMax applications and modules. It scans source
+files for imports and build options !TODO!
+
+## Command line syntax
+
+	bmk <operation> [options] source
+
+(Note that you will need `./bmk` on *nix platforms, if you want to run bmk from the `bin` directory.)
+
+	
+### Operations
+
+
+#### `makeapp`
+
+Builds an application from a single root source file.
+
+#### `makemods`
+
+Builds a set of modules.
+
+### Options
+
+
+
+#### `-a`
+
+Recompiles all source/modules regardless of timestamp. By default, only those
+modified since the last build are recompiled.
+
+#### `-b <custom appstub module>`
+
+Builds an app using a custom appstub (The default is brl.appstub).
+
+This can be useful when you want more control over low-level application state and the debugger.
+
+#### `-d`
+
+Builds a debug version. (This is the default for makeapp)
+
+#### `-g <architecture>`
+
+Compiles to the specified architecture. (the default is the native for the current binary -
+For example, it will be x86 for an x86-built bmk)
+
+Options vary depending on the current OS/architecture/installed toolchain and version of [`bcc`](bcc).
+ * MacOS : `x86`, `x64`
+ * Win32 : `x86`, `x64`
+ * Linux : `x86`, `x64`, `arm`, `arm64`
+ * iOS : `x86`, `x64` (simulator), `armv7`, `arm64`
+ * Android : `x86`, `x64`, `arm`, `armeabi`, `armeabiv7a`, `arm64v8a`
+ * RaspberryPi : `arm`, `arm64`
+ * NX : `arm64`
+
+#### `-gdb`
+
+Generates line mappings suitable for GDB debugging.
+
+Backtrace (etc.) will show .bmx relative source lines rather than that of the generated code.
+
+#### `-h`
+
+Builds multithreaded version. (By default, the single threaded version is built.)
+
+#### `-i`
+
+Creates a Universal build for supported platforms. !TODO!
+
+#### `-l <target platform>`
+
+Cross-compiles to the specific target platform.
+
+Valid targets are `win32`, `linux`, `macos`, `ios`, `android`, `raspberrypi` and `nx`. !TODO!
+
+#### `-musl`
+
+Enables musl libc compatibility. (Linux NG only)
+
+#### `-nostrictupgrade`
+
+Don't upgrade strict method void return types, if required. (NG only)
+
+If a Strict sub type overrides the method of a SuperStrict type and the return
+type is void, don't upgrade the return type to void (i.e. none), and default it to Int.
+
+#### `-o <output file>`
+
+Specifies the output file. (makeapp only)
+
+By default, the output file is placed into the same directory as the root source file.
+
+#### `-q`
+
+Quiet build.
+
+#### `-quick`
+
+Quick build.
+
+Does not scan modules for changes. May result in quicker build times on some systems.
+
+The default behaviour is to scan and build all requirements for the application, including modules.
+
+#### `-r`
+
+Builds a release version.
+
+#### `-standalone`
+
+Generate but do not compile into binary form.
+
+Useful for creating ready-to-build source for a different platform/architecture.
+
+#### `-static`
+
+Statically link binary. (Linux NG only)
+
+#### `-t <app type>`
+
+Specifies the application type. (makeapp only)
+
+Should be either `console` or `gui`.
+
+The default is `console`.
+	
+#### `-v`
+
+Verbose (noisy) build.
+
+#### `-w`
+
+Warns about function argument casting issues rather than error. (NG only)
+
+With this warning enabled you may have problems using method overloading.
+
+#### `-x`
+
+Executes built application. (makeapp only)

+ 7 - 0
docs/tools/maxide.md

@@ -0,0 +1,7 @@
+---
+id: maxide
+title: MaxIDE
+sidebar_label: MaxIDE
+---
+
+TODO

+ 2582 - 0
docs/tutorials/beginners_guide.md

@@ -0,0 +1,2582 @@
+---
+id: beginners_guide
+title: Beginners Guide to BlitzMax
+sidebar_label: Beginners Guide
+---
+by Wave~
+
+## Overview
+
+This guide was written for people new to BlitzMax and perhaps even programming, especially recommended to those who want to
+take a first step in Object Oriented Programming (OOP) in BlitzMax. This Introduction should work if you are converting to BlitzMax from any other
+programming language, including Blitz3D/Plus. It's not written as a BlitzBasic & BlitzMax tutorial.  My aim is to give
+anyone the opportunity to get a good start in learning the fantastic BlitzMax. If you are converting from Blitz3D/Plus
+you will get a shock, because there is a lot of new stuff. Ways have changed but I promise you, it's for the better.
+When you have taken the first steps and learned your way around there is no other place like BlitzMax ;)
+
+Also the code in this tutorial may be hard to paste, sometimes it laps pages and the tabs don't seem to copy all the
+time. A good way to learn is to do. Read my examples but try to write them yourself. It gives good coding practice. If
+you want to use any code within this guide for anything, please do so, the code is public.
+
+## Variables
+
+You probably know this: A variable is a place where you may store a number or a text. There are different variable
+"types" depending on their use. Here are the most basic types: Integers which store numbers, Strings which store text
+and Floats which store decimal numbers. We also have object-"types" which includes these basic types such as Arrays,
+Lists and your own custom Types (more on these later). See the Language Reference if you want more information about
+BlitzMax variables.
+
+If you want to increase a variable, let say speed. You can write `speed = speed + acceleration` Or in a shorter way
+`speed :+ acceleration`. Both are identical, but the last is shorter. It is required that you declare your variables
+before use.
+
+```blitzmax
+Local speed:Float=0, acceleration:Int , name:String= "Name"
+Local speed#=0     , acceleration     , name$      = "Name"
+```
+These 2 lines are identical; use whatever you like, but be aware of both.
+
+
+> `Local` is a way to declare the variable.
+
+If you want to force all variables to be declared by you, use the command Strict which gives you a compile error if
+there is a variable that you didn't declare like this: Local/Global VarName:VarType , 2ndVarName:VarType
+
+```blitzmax
+Local Name$ = "-=[ Fireglue ]=-"
+```
+I do not use SuperStrict in my examples, so if you want to use SuperStrict make sure you declare all the variables. You should
+always use Strict unless you are very lazy or are making a tiny examples or minor tests, it will help you find
+misspelling-bugs before they occur and save you hours of debugging.
+
+> BlitzMax is case-insensitive, and considers `Speed` and `speed` and `sPeEd` to be the SAME variable.
+> Same goes with all commands, like `rem` or `Rem` or `reM`.
+
+### Global or Local
+
+A variable can be Global or Local. Globals can be accessed from the entire program. Locals on the other hand are more
+complicated, cause where they exists depends on where they where declared. To declare a local variable use the keyword
+Local in front of the variable name. If you declare a local variable in a function it will only exist in that function.
+If it is declared in a loop if will only exists as long as you are in that loop. If a local is in an if-statement it
+will only exists in that if statement.
+
+## Constants
+
+You can also declare constants. A constant will have the value you gave it when you first declared it. The value of a
+Constant can never change, it will always stay the same. If you try to change a constant'a value the complier will warn
+you when you compile - build. Constant is useful for values that always will stay the same. You'll encounter constants
+in examples later on.
+
+## Comments
+
+Comments are text which explains the code. Comments are not required for your program to work, still it's one of those
+things you can't live without! Here is a sample of a comment:
+
+```blitzmax
+Local Speed:Float = 0 ' Sets speed to zero
+```
+The ' denotes that the rest of that line will be a comment. You can also use
+
+```blitzmax
+Rem
+If you want to comment out several lines
+End Rem
+```
+Comment much, it helps others who read your code and it will help you, because eventually you will forget why you did it
+a certain way or why you added that function and what it did. While you are new to programming I would advice you to
+comment almost every line. To explain something is a good way to learn it, use comments as your walking stick when you
+take your first steps in programming and BlitzMax.
+
+## If Statements
+
+If statements are used if you want to check if a condition has been meet and then act upon that. This example does
+nothing special, it just shows you how to use If, Else If, Else and EndIf. (A,B,C and R are variables)
+
+```blitzmax
+If A > 10   ' Read:  If A is greater than 10..
+    A = 10  ' Read: Set A to 10
+Else If A < 0 And B => 2 ' Read: if  A less than 0 and B is equal or greater than 2
+    R:- 10  ' Read: Decrease R with 10.  E.g. if R was 100 it is now 90
+Else ' Read: if none of above conditions is met do this..
+    A:+B    ' Read: Add B to A. Or Increase A with B. That is: A = A + B
+End If
+```
+If you want to make the above example strict add these lines to the top of it:
+
+```blitzmax
+Strict
+Local A, B, R
+```
+You can also write If statements on one line. The ``;`` signals a new expression.
+
+```blitzmax
+If A < 0 And C=2 Then B = 2 ; C=3; R:+5 Else A=1; C:+1
+```
+The above line is equal to:
+
+```blitzmax
+If A < 0 And C = 2
+    B = 2
+    C = 3
+    R:+5
+Else
+    A = 1
+    C:+1
+End If
+```
+Note: "End if" can also be written "EndIf", it does not matter which you use.
+
+### Then
+
+When to use Then? You can put it after your If expression. The use of `Then`, is not required and I think the code is
+just as easy to read without `Then`. Like this, `If A = 1 Then B = 2` is equal to `If A = 1 B = 2`. If you take a
+BlitzMax file and delete all `Then`, it will run the same. Use `Then` if you think it helps you read the code. When I
+use then, then it is to make an ifstatement on one line more readable, like in the example above and in the example
+below. My advice is, never use then if your if-statement is not on one line.
+
+## Not True or <> False?
+
+`True` and `False` can be used in If-statements, usually to make the code a little easier to read, you can live
+without them*. False means something is equal to 0, True if it's not equal 0. Many functions return 1 if success and
+else 0.
+
+> BlitzMax doesn't have ``Boolean`` variables which only accepts `True` or `False`.
+
+This can be used in an if-statement like this:
+
+```blitzmax
+If KeyDown(Space) = True Then A = 10 Else A = 0
+```
+This is also the same as writing:
+
+```blitzmax
+If KeyDown(Key_Space) Then A = 10 Else A = 0
+```
+Because " = True" is assumed. You can also use `Not` after an `If` to see if something is Not True (That is false), Like this:
+
+```blitzmax
+If KeyDown(Key_Space) = False Then A = 10 Else A = 0
+```
+Can be written:
+
+```blitzmax
+If Not KeyDown(Key_Space) Then A = 10 Else A = 0
+```
+The two lines above do the exact same thing. You can also check objects with true and false, if an object is "null" (does not exist) it's false else it's true. Example:
+
+```blitzmax
+If Not Car Then Print "Car not Found"
+```
+<> means "greater or higher than" and is therefore the same as not.
+
+```blitzmax
+If A <> 10
+```
+Above is the same as:
+
+```blitzmax
+If Not A = 10
+```
+## Start with Graphics
+
+`DrawRect`, `DrawOval`, `DrawLine`, `DrawText` and `Plot` are some of the built in graphics commands. They simply
+draw a filled Rect/Oval, line, text and pixel respectively. If you want to know how to use these commands check out
+the Module Reference. To be able to use your graphics card you will first need to set a graphics mode - specifying
+the resolution you want to use. Just enter `Graphics 800,600` for a full screen resolution of 800x600.
+`Graphics 800,600,0` gives you windowed mode, very good for debugging. Note: Keep reading there is a sample below!
+
+## Loops
+
+A loop is a way to tell Blitz to do one thing several times, or in games to update the game until the game is ended.
+Loops are what makes games run in real-time. This loop below starts at Repeat and when the program reaches
+Until X >= 800 it will jump back to `Repeat` unless the condition is met. So it will loop depending on X. Try to
+run the example on the next page:
+
+```blitzmax
+Graphics 800,80,0 ' Smaller Window Size
+
+Repeat
+
+    DrawRect X, 40, 10, 12  ' Where 40 is the Y coordinate
+    '10 is the width of the rect and 12 is the height of the rect
+    DrawText "- Please Wait -", 0, 0      'The String is within the "" and 0,0 is the location
+    X:+2    ' Increase X with 2 every loop
+    Flip    ' Show what you have drawn
+Until X >= 800 ' Exit the loop when X is greater or equal to 800
+```
+Press F5 to build and run the example. The above code will create a **loading line** on top of the screen. If you put
+a `Cls` on a new line below `Flip`, you'll notice that a instead of a line, a box will be traveling from 0 to 800,
+measured in pixels. Also you can replace DrawRect with DrawOval and guess what…
+
+## Flip and Clear
+
+In BlitzMax everything you draw is drawn to an invisible Board. You can draw how much you want to this board but
+it won't show up on screen. You can see it as if BlitzMax is drawing on the back of your screen, the when you want
+to show it, you Flip the Board and we can see what have been drawn to it. If we keep drawing a lot of stuff and
+Flip, then continue draw a lot of stuff, the board will be a mess. This is why we clear the board after we have
+flipped it, but this also means we have to redraw everything we previously had at this board! And that's how it
+works. This board is known as the back buffer. You do not need to (and cannot) set the back buffer as in
+Blitz3D/BlitzPlus. This method with flip and clear is called double buffering and is done to prevent flickering graphics.
+
+How to make our loading bar work while using cls? (Remove cls to see what happens)
+
+```blitzmax
+Graphics 800,600,0 ' Set graphics mode
+Repeat
+    DrawRect 0,40,W,12' Let's change the width of the box instead
+    DrawText "- Please Wait -",0,0
+    DrawText " Width = " + W, 0, 20
+    W :+ 3
+    Flip;Cls
+Until W >= 800
+```
+## The Coordinate System
+
+This part is identical to BlitzBasic. At the Top Left of the screen we have the point 0,0. Add these lines to the
+above example, just one row below "Repeat": (They might be hard to see, try fullscreen by removing the last ",0"
+in graphics )
+
+```blitzmax
+Plot 0,0     'Draws a pixel in the top left corner. Try 1,1 too
+Plot 400,40  'Draws a pixel at location 400,40, Read: plot at X:400, Y:40
+```
+The X-Axis is the Horizontal Axis from the left side of the screen to the right side, The Y-Axis is Vertical and
+travels from the Top to the bottom. The resolution is what determines how many pixels you will have at each axis.
+So in our example the screen width (in pixels) would be 800 and the screen height 600. The more pixels at screen
+the more calculations is required by the computer both in 2D and 3D. You can get the current screen width with
+`GraphicsWidth()` The Line X1,Y1,X2,Y2 command creates a line from X1,Y1 to X2,Y2. Add the following to our example:
+`DrawLine 40,40,80,80 ;DrawLine 40,40,40,200`
+
+> Remember: The `;` allows several commands to be written on one line.
+
+## Input
+
+Input is an easy and simple part of BlitzMax. If you understood the Loop Example this should be a piece of cake.
+(We're talking about keyboard and mouse input, not the command called input)
+
+```blitzmax
+Graphics 800,600
+Local X=500,Y=500   ' <--- Start location
+' - - - - - - - - - - L o o p   S t a r t - - - - - - - - - - - - -
+While Not KeyDown(Key_Escape)   ' This loop is equal to repeat except the condition is at the top.
+
+    'DRAW____________________________________________
+    DrawOval X,Y,8,8 'Draw an Oval at X,Y with a width and height of 8
+    DrawText "Press Arrow Keys to go around, Space to Center",20,20
+    'INPUT_______________________________________
+    If KeyDown(Key_Left) X:-1   ' Decrease X  <-- Go left
+    If KeyDown(Key_Right) X:+1  ' Increase X  --> Go Right
+    If KeyDown(Key_Down)  Y:+1  ' Increase Y  Go Down \/
+    If KeyDown(Key_Up)   Y:-1   ' Decrease Y  Go Up  /\
+    If KeyHit(Key_Space) X=400;Y=300 ' Set position
+
+    Flip;Cls
+Wend
+' - - - - - - - - -- - - L o o p   E n d - - - - - - - - - - - - -
+```
+To optimize the above code add a new variable called speed after Graphics but before the loop. Now replace all 1's
+with this new variable speed. Go to the place where you have your variable speed (at the top) and set it = 5.
+If you done it right. You'll notice a speed increase when you drive around. Also note that all keys have names
+which start with `Key_` The a-key is `Key_A` and so on for all letters and numbers. See the scan code section of the
+manual for a complete listing of keycodes.
+
+## Functions
+
+A function is a way of reusing code. It can also be a way to split up your code into easier to manage parts. They are
+just the same as in previous Blitz. A function looks like this:
+
+```blitzmax
+Function Collectdata$( Name$, Id,  Age )    ' $ means String, nothing means Int
+    Local TotalData$ = "Name: "+Name+", ID: "+id+", Age: "+Age
+    Return TotalData
+End Function
+```
+To use this function I must pass a name, an id and an age to it. Take your Input example and add this line below
+graphics but before the loop:
+
+```blitzmax
+Local TestData$ = Collectdata("Blast", 8, 30)
+```
+Now add the function above, Collectdata, to the bottom or start of your file. Add the following inside your loop:
+
+```blitzmax
+DrawText TestData, 20, 40
+```
+The name, id and age are the function Collectdata's input parameters. The function returns a String. A function can
+return any type of data including objects. What type it returns is specified after the function name , the "$" for
+String. If you change this to an int "%" or  `:Int`. `Function CollectData:Int(..`  Now you will receive a common
+error: "Unable to convert from 'String' to 'Int' ".  The function does actually return a string but you specified you
+wanted it to return an Int and BlitzMax warn you something is wrong. But this does not mean you can't convert strings
+to ints, see below.
+
+To convert strings – Ints simply do this:
+
+```blitzmax
+Local A% = Int( "123E234 - This is string" )
+```
+This will result in `A  = 123`, same goes with floats `B# = Float(A)`, This will result in `B = 123.0`
+
+Here is another example of a simple function:
+
+```blitzmax
+'--------------------- A D D ----------------------
+' Parameters: A,B,C ; numbers to add
+' Returns: The sum of these numbers
+' Note: Only accepts integers
+'_______________________________
+Function Add( A% , B% , C% = 0 )
+
+ Return A + B + C
+
+End Function
+'-------------------------------------------------------
+
+Number = Add(2,2,3) ' Will set Number to 7
+Number = Add(2,2)   ' Will set Number to 4
+```
+Note that in the function that `C=0`, which means use `C=0` as default if none specified. If the function would have had
+a C% only, without the =0 part, you would encounter a compiler error doing Add(2,2) but it would work fine
+to `Add(9,9,9)`. Note that it is important to comment you functions. Write what the parameters are and what it returns
+and what it does. Always try to keep your functions less than a page in size. If they become larger try to divide
+them up into several functions. Functions can be used inside other functions. In the long run good comments and
+frequent use of functions will save a lot of your time! If you don't specify any return parameter as in this latest
+example, BlitzMax, in `Strict` mode, assumes you want to return an int. Nothing = Default = Int.
+
+## Random
+
+A most useful command is `Rand(A, B)` which creates a Random value between A and B. Example:
+
+```blitzmax
+Test = Rand(1,3)
+```
+This will set test to 1 or 2 or 3. If you call Rand(A) with one parameter only it'll return a value between 1 and A. This
+means Rand(2) should give 1 or 2.
+
+## Arrays
+
+Arrays are a way to store several variables at one place.
+
+`Local NameList$[] = [ "Dawn" , "Trac" , "Fire" ,"Nitro" ,"Nex"]`   This creates an array with 5 strings. All strings set.
+
+`Text$ = NameList[2]`
+
+`NameList[2]` refers to element 2 of Array NameList. Arrays start at 0, so this would give us "Fire"
+
+`NameList[0] = "None"`
+
+Above would set element 0 to "None" (this element was previously "Dawn")
+
+Arrays have a great feature; they can be used in Eachin-loops, so that you can retrieve each element of the array.
+
+```blitzmax
+For Local Name$ = EachIn NameList ' The variable "Name" will store each element of this array
+    Print Name'Print each string element
+Next
+```
+Here is a sample of how to set arrays on the fly. It's a very handy way to setup arays.
+
+```blitzmax
+Global Name$[]'Declear an Array!
+
+Print "Start Array Test ----------"
+Name = ["Torm","Arth","Yire","Float","Stew","Sword","Dew","Flash","Lost","Temo re"]
+PrintArray(Name)
+
+Print "---Set this Array to this instead----------------"
+Name = ["Storm","Earth","Fire","Water","Moon","Sunshine"]
+PrintArray(Name)
+
+Function PrintArray(Arr$[])
+    For Local S2$ = EachIn Arr
+        If S2 <> "" Print  S2$
+    Next
+    Print "Array Length was : "+Arr.length
+End Function
+```
+## Arrays with Multiple Dimensions
+
+An Array can have more than one dimension. For example `Local Grid[3,3]` which would create a 2D (Two Dimension) array
+called Grid with 3x3 integer elements. We can store 9 different variables in this array. A 2D array is like a table
+or matrix with rows and columns. While a 1D array would only have 1 row but several columns a 2D array has several
+columns and several rows. See for yourself:
+
+
+To access one slot in the array, `A = Grid[X,Y]`, where X,Y is the element's position. If we want to loop through
+all elements in this array we'll have to use a double For-Next loop. All elements in an Array have to be of the
+same type!
+
+0 2 1 This is a normal 1D array. It's length is 3, which is the number of columns. Declare it: `MyArray[3]`
+0,0 2,0 1,0 0,1 2,1 1,1 0,2 2,2 1,2
+Width = 3
+Length = 3
+Height = 3
+This is a 2D array. Declare it: `Local MyArray[3,3]`. To get the value of the element in the middle go, `MyArray[1,1]`
+
+An element in an array can (Ex. `MyArray[0,0]` ) be used just as an int. Ex. `MyArray[0,0] :+ 1`
+
+```blitzmax
+Local Grid[3,3] ' Create an empty 3x3 array called Grid
+For X = 0 To 2
+    For Y = 0 To 2
+        Grid[X,Y] = Rand(9) ' Sets each element to a random value from 1 to 9
+    Next
+Next
+
+Print "Value at Row1 Column1 = "+Grid[0,0]
+Print "Value at Row1 Column2 = "+Grid[1,0]
+Print "Value at Row1 Column3 = "+Grid[2,0]
+Print "Value at Row2 Column1 = "+Grid[0,1]
+Print "Value at Row2 Column2 = "+Grid[1,1]
+Print "Value at Row2 Column3 = "+Grid[2,1]
+Print "Value at Row3 Column1 = "+Grid[0,2]
+Print "Value at Row3 Column2 = "+Grid[1,2]
+Print "Value at Row3 Column3 = "+Grid[2,2]
+```
+To Print the above in a more optimized form you could instead write:
+```blitzmax
+For X = 0 To 2
+    For Y = 0 To 2
+       Print Grid[X,Y]
+    Next
+Next
+```
+### Fake multiple dimensions with arrays in arrays
+
+You cannot create multidimensional arrays with set variables, but you can use another side of arrays which mimics
+the same behavior. It's about creating several 1D arrays and putting them into another array; an array of arrays.
+
+```blitzmax
+Local Grid[][] = [ [1,1,1,2],[7,7],[5,5,5] ]
+```
+This creates three 1D arrays, the first has length 4 the second length 2 and the third length 3. These arrays are
+used as columns in a bigger array. To get a element we go `Grid[ WhichArray ][ PlaceInThisArray ]` Example: To get the
+first 7 in the second array; `Grid[ 1 ][ 0 ]`. Remember that arrays start from 0 so 1 is the second array and 0 is
+the first element. Example: To get the last element in the first array; `Grid[ 0 ][ 3 ]`.  Because Grid in the last
+example is an array of arrays you can access one of the arraya in Grid with just the first `[]`. So if we want the
+first array: `Grid[ 0 ]`.  Example: Loop and print the first array of our Grid you could write:
+
+```blitzmax
+For Local n = EachIn Grid[0] ' Try changing the 0 to 1 and 2
+    Print n
+Next
+```
+### Check length and sort
+
+I'll say it again, Arrays are objects. Therefore they may have methods. The two most useful is length and sort. In
+the first example about arrays add a line: NameList.Sort  The array of strings will be sorted alphabetical, int/float
+arrays by largest value. If you provide the argument `Sort( False )` you will sort in reversed order.
+
+```blitzmax
+Local Test[] = [7, 39, 1, 24, 5, 6, 3, 8, 19, 5, 3, 3, 2, 5, 18, 8, 2, 221, 3, 4, 5, 63, 87, 12, 92]
+Test.Sort
+For n = EachIn Test
+    Print n
+Next
+Print "Length " + Test.length
+```
+### From Arrays to Slices
+
+There will be a time where you want a part of an array. Like the first 3 elements or the last 4.
+BlitzMax has a very easy and elegant solution for this called slices. A slice is a copy of a part of an array.
+See the code below to figure out how it works, also check the reference.
+```blitzmax
+Local Test[] = [0,1,2,3,4,5,6,7,8,9,10,11,12,13]
+
+Local First4[] = Test[..4]  'Get the four first elements
+
+For n = EachIn First4
+    Print n
+Next
+Print "Lenght "+First4.length
+```
+This can also be used directly in the EachIn-loop:
+```blitzmax
+For n = EachIn Test[9..]  'Get all elements from 9 to end of array
+    Print n
+Next
+Print "Lenght "+Test[9..].length
+```
+To get all elements (full copy) you could go:
+```blitzmax
+For n = EachIn Test[0..Test.length]  'Get all elements
+    Print n
+Next
+Print "Length "+Test[0..Test.length].length
+Print "Length "+Test.length
+```
+Or you could go `Test[..]` which means all elements from first to last.
+To get the last 2 elements you could do: 
+```blitzmax
+Local Last2[] = Test[Test.Length-2..]'Get the last two elements
+
+For n = EachIn Last2
+    Print n
+Next
+Print "Length "+Last2.length
+```
+The above example show how powerful and easy arrays are in BlitzMax. I don't use arrays for everything.
+This is because BlitzMax has another way to store data. A way which is even more flexible and allows for better
+code and object oriented programming. You can always have arrays in your types.
+
+## Types
+
+A type is like a structure or a blueprint of variables. It's like a skeleton you define, you can then use
+this skeleton for animals or objects you create. Types are the part of BlitzMax which makes it an
+OOP (Object Oriented Programming) language. Types are one of the hardest parts to get around if you are new
+to OOP or programming in general. Make a new file if you want to try the examples that follow.
+
+### Setup and Create Types
+
+Let's say we want a spaceship then let's first create a structure for it:
+```blitzmax
+Type Spaceship  'Declares a new Type
+
+    'This is what the structure contains:
+    Global Fleet$
+    Field MaxSpeed#
+    Field Armor%=2000
+    Field Name$
+
+End Type' Ends declaration
+```
+Note that above is the same as this:
+```blitzmax
+Type Spaceship
+    Global Fleet:String
+    Field MaxSpeed:Float
+    Field Armor:Int=2000
+    Field Name:String
+End Type
+```
+There is no rule that says we need to have our type at the top of our file, types are like functions in this case.
+They can be declared almost anywhere except inside of another type. You can even keep them in separate files which
+is common when working with OOP.
+Here I'll declare the variable to use, "Ship"
+```blitzmax
+Local Ship:Spaceship
+```
+This did not create a ship we merely made a placeholder for one. We are now ready to create a spaceship,
+which will be an instance of our structure; an object.
+```blitzmax
+Ship = New SpaceShip
+```
+What I did here (4 rows above) is that I declared a variable Ship to use the SpaceShip structure.
+Then I created a new SpaceShip which is an object (an instance of SpaceShip) and I put this new SpaceShip into
+the variable Ship (at least the address to it).
+I can now set the fields of this object using `Ship.SpaceShipFieldName`. If we don't create a new ship, our ship
+will be = null; it will not exist.
+
+To access the field of this new object called ship we use dot, you can see it as if the dot means "step into".
+```blitzmax
+Ship.MaxSpeed = 3.5 'Read: Ship's MaxSpeed set to 3.5
+Ship.Armor = 5000 'Default was 2000 (See the type)
+Ship.Name = "Wavebreaker"
+```
+Let's create another Ship:
+```blitzmax
+Local Ship2:Spaceship = New SpaceShip
+Ship2.MaxSpeed = 7.5
+```
+Let's use the default armor value (see SpaceShip-Type if unsure)
+```blitzmax
+Ship2.Name = "Starbreaker"
+```
+Now I have two objects of the SpaceShip Type, Ship and Ship2. I can always use the fields of these objects as a
+variable. For example:
+```blitzmax
+If Ship.MaxSpeed > 200 Then
+    Ship.Name = "LightBreaker"
+End If
+```
+Note that if I would set `Ship2 = Ship` then both Ship and Ship2 would point to Ship, in that case Ship2
+would be lost and there would be no way to access it, and it will be automatically deleted by BlitzMax.
+Ship/Ship2 is simply the addresses to these objects. One object can have several pointers to it.
+The object itself is unique but the address to it can reside in several different variables. Think about it.
+
+Let's continue on our space ship example:
+```blitzmax
+SpaceShip.Fleet = "Quantum Light" 'refer To the Global from the Type itself
+
+Print "Name: "  +Ship.Name
+Print "MaxSpeed: "  +Ship.MaxSpeed
+Print "Armor: "  +Ship.Armor
+Print "Fleet Name: " +Ship.Fleet
+
+Print "---------------"
+Print "Name: "  +Ship2.Name
+Print "MaxSpeed: "  +Ship2.MaxSpeed
+Print "Armor: "  +Ship2.Armor
+Print "Fleet Name: " +Ship2.Fleet
+```
+Note the `Global Fleet$`. Because Fleet is a global in the SpaceShip type it is shared among all Instances of
+Spaceship. If one SpaceShip would change it's Fleet so would all other SpaceShips. Constants act in the same way,
+except they can't change. Because a global is global and not bound to an instance it can be altered even if you
+don't have any instances of the type in question. Try moving ( `SpaceShip.Fleet = "Quantum Light"` ) to the top of
+the file.
+
+### List Types
+
+Types store data but what if I want to store types? You can always have types in types. But often we want to loop
+our types, move all spaceships. Sometimes we want to sort them. You might thing that arrays would be the perfect
+choice, and so far it seems like a perfect fit. Arrays can contain objects, any object including your homemade.
+
+If we collect all our objects into one place we would not need to refer to them with individual names, like ship1,
+ship2.  We could use a eachin-loop and loop all objects.
+
+The solution is called Lists. Lists are more dynamic that arrays and therefore offer a great advantage that makes
+your code easier. It's all about removing and adding objects. Arrays have a set length, lists does not. The length
+of a list is depending on the number of objects inside it. See next page for an example.
+
+Create a new file. Paste, Read, Build, Read, Learn.
+
+```blitzmax
+Strict ' This time I'll use Strict mode
+Global Number_of_Tanks = 10 ' How many tanks to create?
+
+' Having a Global like the one above makes it easy To change how the program
+' acts at least in small examples like this. Now let's declare a new type ' called Tank.
+
+Type TTank ' The extra T infront of the type name is good use
+    Field X#, Y#
+    Field Dir, Armor = 100
+    Field Speed# = 0.2, Size = 25
+End Type
+
+Graphics 800,600
+
+Global TankList:TList = CreateList()    ' Create a list to store all tanks
+
+' TankList:TList defines TankList To be of the List-Type, CreateList() returns
+' a New List. The variable TankList will be used whenever you want To add,
+' remove or alter this TList.
+' Note that TList is a BlitzMax built-in Type And it has it's own methods and
+' functions.
+
+' Create a bunch of new Tanks
+For Local N = 1 To Number_of_Tanks
+    ' Number_of_Tanks is a Global
+    Local NewTank:TTank 'Declares a variable to store our Tank-Type
+    ' Put the address of this new Tank into variable NewTank
+    NewTank  = New TTank
+
+    ' Set a random Armor 150 + 10,20,30,40 or 50
+    NewTank.Armor = Rand( 5 )*10 + 150
+    ' Random Start Location
+    NewTank.X  = Rand( 5, 800 ) ;NewTank.Y = Rand( 5, 600 )
+    NewTank.Dir  = Rand( 0, 360 )
+    ' Put this tank called NewTank into our TankList
+    ListAddLast( TankList, NewTank )
+Next
+
+While Not KeyDown(Key_Escape)
+    'Local T is declared to hold the current Tank each loop
+    'Because we called our Type TTank, Tank is available as variable
+    For Local Tank:TTank = EachIn TankList
+        DrawOval( Tank.X, Tank.Y, Tank.Size, Tank.Size )
+        DrawText "Number of Tanks : " + TankList.Count(), 20, 20
+        DrawText "Press ESC to exit", 20, 40 '20 is X-coordinate, 40 is Y
+        Tank.X:+ Tank.Speed * Cos( Tank.Dir )
+        Tank.Y:+ Tank.Speed * Sin( Tank.Dir )
+    Next ' This loop will loop for every Tank that was added to TankList
+    Flip ; Cls
+Wend
+```
+In this way you can change all your tanks in an Eachin-loop. Note that in the above example Number_of_Tanks could
+have been a constant and it could have been inside the Tank-Type. Also the Global TankList could have been put inside
+the Type with success.
+
+## Methods
+
+A type can have more than Global, Const and Fields. It can have methods and functions. A method is usually an
+action of the Type, it could be FireShot() or Explode() or Turn() or Update(). The difference between a Type-Method
+and a Type-Function is that Methods use the Type itself and can therefore refer directly to a field which reduce code.
+
+```blitzmax
+Type TWizard
+    Field X, Y, Mana
+    Method Teleport( X1, Y1 )
+        X = X1; Y = Y1
+    End Method
+End Type
+```
+This is that same as following:
+
+```blitzmax
+Type TWizard
+    Field X, Y, Mana
+    Method Teleport( X, Y )
+        Self.X = X
+        Self.Y = Y
+    End Method
+End Type
+```
+We could also have used a function but then it would have looked like this:
+
+```blitzmax
+Type TWizard
+    Field X, Y, Mana
+    Function Teleport( Wizard:TWizard, X, Y )
+        Wizard.X = X; Wizard.Y = Y
+    End Function
+End Type
+```
+The obvious gain of methods is that the type and its fields (the type that the method resides in) are available to
+the method. In functions we need to supply the type and to refer to the field of this type we need to use a handle,
+like Wizard.X instead of just X. To use a method we need an object. If we don't have any objects we can't reach
+the method. To call a method you use ObjectName.MethodName( Parameters,.. ), Example:
+```blitzmax
+MyWizard.Teleport( 50,50 )
+```
+I altered the previous Tank-example and added two methods, Draw() and Move():
+
+```blitzmax
+Strict
+
+Global Number_of_Tanks = 20
+
+Type TankType ' Renamed from TTank to TankType
+    Field X#,Y#
+    Field Dir, Armor = 100
+    Field Speed# = 0.2, Size = 25
+    Global ModelName$ = "Delta 11"
+
+    Method Draw()
+        DrawRect( X, Y, Size, Size )
+    End Method
+
+    Method Move()
+        X:+Speed*Cos( Dir ); Y:+Speed*Sin( Dir )
+    End Method
+End Type
+
+Graphics 800,600,0 ' Window mode this time
+
+Global TankList:TList = CreateList()
+
+For Local N = 1 To Number_of_Tanks
+    Local NewTank:TankType
+    NewTank   = New TankType
+    NewTank.Armor = Rand( 5 )*10 + 150
+    NewTank.X  = Rand( 5, 800 ) ;NewTank.Y = Rand( 5, 600 )
+    NewTank.Dir  = Rand( 0, 360 )
+    TankList.AddLast( NewTank )
+Next
+
+While Not KeyDown(Key_Escape)
+    For Local Tank:TankType  = EachIn TankList
+        Tank.Draw()
+        DrawText "Number of Tanks : "+TankList.Count(), 20, 20
+        DrawText "Press ESC to exit", 20, 40
+        Tank.Move()
+    Next
+    Flip;Cls
+Wend
+```
+There is a special method. The Method New() which is run each time you create an instance of that type.
+
+### Functions in Types
+
+In the tank-example it would be appropriate to add a function too. This function could take care of
+the creation of the Tank. Methods can only be called if you have an instance of the Type. Like
+"Tank.Draw()" while functions are called from the Type itself e.g. `TTank.Create()`. Functions
+are like global methods bundled with the Type. Remember that functions can be standalone too.
+You can always have functions that are outside of a type, as in BlitzBasic, but if you put them
+inside your type your code gets more modular, you can for example have several functions in
+different types with the same name.
+I added a function to the Tank-example and made the TankList a part of the Tank-Type. Note that
+functions in types can refer directly to Globals and constants in that type, because they are global
+too. See "ModelName". What I mean is that there is no reason to, in a Type-Function, to write
+`TTank.ModelName = "Alpha 11"`, because you can write, `ModelName = "Alpha 11"` instead.
+
+```blitzmax
+Strict
+
+Global Number_of_Tanks = 20  
+ 
+Type TankType 'Renamed from TTank to TankType
+    Field X#,Y#
+    Field Dir, Armor = 100
+    Field Speed# = 0.2, Size = 25
+    
+    Global ModelName$ = "Delta 11"
+    Global List:TList 'Keep our tanks inside our TankType
+    
+    Method Draw()
+        DrawRect( X, Y, Size, Size )
+    End Method
+    
+    Method Move()
+        X:+Speed*Cos( Dir )
+        Y:+Speed*Sin( Dir )
+    End Method
+    
+    Function Create()
+        Local NewTank:TankType
+        NewTank   = New TankType
+        NewTank.Armor = Rand( 5 )*10 + 150
+        NewTank.X  = Rand( 5, 800 )
+        NewTank.Y = Rand( 5, 600 )
+        NewTank.Dir  = Rand( 0, 360 ) 
+ 
+        If Not List Then
+            List = CreateList()
+        End If
+        
+        List.AddLast( NewTank )
+    End Function
+End Type 
+ 
+Graphics 800,600,0 
+ 
+For Local N = 1 To Number_of_Tanks
+    TankType.Create()
+Next
+
+While Not KeyDown(Key_Escape)
+    For Local Tank:TankType  = EachIn List ' Global in this type
+        Tank.Draw()
+        DrawText "Number of Tanks : "+List.Count(), 20, 20
+        DrawText "Press ESC to exit", 20, 40 
+        Tank.Move()
+    Next
+    Flip
+    Cls
+Wend
+```
+
+This time the code didn't become smaller but we did it easier to work with in the future.
+Note the For-Eachin-Tank.List-Loop, this will give a error if we haven't already created a list. 
+The List is created as soon as you create your first tank, but sometimes the game starts before you
+have an instance of a certain type. Because of this it is wise to add an if-statement around
+the For Eachin TankList Loop. We can make this code even more object oriented by adding
+a `UpdateAll()` Function. Instead of an if-statement I exit the function if no list have been created.
+
+```blitzmax
+Function UpdateAll()
+    If Not List Return ' Exit function if List = null
+    For Local Tank:TankType  = EachIn List ' Global in this type
+        Tank.Draw()
+        DrawText "Number of Tanks : "+List.Count(), 20, 20
+        DrawText "Press ESC to exit", 20, 40
+        Tank.Move()
+    Next
+End Function
+```
+Call the function from the main-loop (replace the eachin-loop with this):
+```blitzmax
+While Not KeyDown(Key_Escape)
+    TankType.UpdateAll()
+    Flip
+    Cls
+Wend
+```
+
+## Some TList functions and Methods
+
+| `ListAddLast TankList,NewTank` | `ListAddFirst YourList, YourType` |
+| `TankList.AddLast(NewTank)` | `YourList.AddFirst( YourType )` |
+
+These lines do the same thing. The first is a normal function, the second row is a method and is called from
+your List instance. These functions lies in BlitzMax's TList-Type.
+
+You can get the first object in a List by doing this:
+```blitzmax
+My_FirstTank:TankType = Tank( TankType.List.First() )
+```
+Or the last object,
+```blitzmax
+My_LastTank:TankType = Tank( TankType.List.Last() )
+```
+The reason for Tank( … ) is that I have to force the object returned to be a Tank not just any object.
+The following would be the same:
+```blitzmax
+Local someObject:Object = TankType.List.First()
+If someObject Then
+    Print "Object Found in list"
+Else
+    Print "No Object found"
+End If
+
+Local FirstTank:TankType = TankType(someObject )
+If FirstTank Then
+    Print "Tank Found in the list"
+Else
+    Print "No Tank found"
+End If
+```
+And the reason we need to force the object is because First() returns an object and not a tank.
+If someObject is not a Tank then FirstTank would be = null. Read more about this in "casting"*[]:
+
+You will find the code for TList in BlitzMax\Mod\Brl.Mod\LinkedList.mod\linkedlist.bmx.
+All source to BlitzMax comes along for free, open to you! Most of it is written in BlitzMax itself.
+
+## Arrays In Types
+
+These could be useful to know about. To add a field with an array: `Field Missiles[2]`.
+I'll also show you the benefit of this – reduced code. Build the example and then compare it to
+the example after this which does the exact same thing but with reduced and more simple code.
+
+```blitzmax
+Strict
+
+Global TankList:TList = CreateList()
+
+Local Tank:WarTank
+
+Tank = New WarTank
+Tank.Name   = "Thunder Tank"
+Tank.MissileSlot1 = "Infero Missile"
+Tank.AmmoSlot1  = 3 ' 3 missiles
+TankList.AddLast( Tank )
+
+Tank = New WarTank
+Tank.Name   = "Lightning Tank"
+Tank.MissileSlot2 = "Infero Missile"
+Tank.AmmoSlot2  = 1
+Tank.MissileSlot3 = "Normal Missile"
+Tank.AmmoSlot3  = 1
+TankList.AddLast( Tank )
+
+Tank = New WarTank
+Tank.Name   = "Storm Tank"
+Tank.MissileSlot1 = "Normal Missile"
+Tank.AmmoSlot1  = 3
+Tank.MissileSlot2 = "Infero Missile"
+Tank.AmmoSlot2  = 1
+Tank.MissileSlot3 = "Normal Missile"
+Tank.AmmoSlot3  = 2
+TankList.AddLast( Tank )
+
+For Local Tank:WarTank = EachIn TankList
+    Print ""
+    Repeat
+        Select Tank.MissileSlot1
+            Case "Infero Missile"
+                Tank.FireMissile( 1 )
+            Case "Normal Missile"
+                Tank.FireMissile( 1 )
+        End Select
+
+        Select Tank.MissileSlot2
+            Case "Infero Missile"
+                Tank.FireMissile( 2 )
+            Case "Normal Missile"
+                Tank.FireMissile( 2 )
+        End Select
+
+        Select Tank.MissileSlot3
+            Case "Infero Missile"
+                Tank.FireMissile( 3 )
+            Case "Normal Missile"
+                Tank.FireMissile( 3 )
+        End Select
+
+    Until Tank.AmmoSlot1 = 0 And Tank.AmmoSlot2 = 0 Tank.AmmoSlot3 = 0
+Next
+
+Type WarTank
+    Field Name$ = "Default Name"
+    Field MissileSlot1$,MissileSlot2$,MissileSlot3$
+    Field AmmoSlot1%,AmmoSlot2%,AmmoSlot3%
+
+    ' F I R E M I S S I L E
+    '__________________________________________________________________
+    '
+    ' Parameters: MissileSlot - The slot number you want to fire from.
+    ' Use: Fires a missile if you got availible ammo else it don't
+    '
+    '___________________________________________________________________
+
+    Method FireMissile( MissleSlotNR )
+        If MissleSlotNR > 3 Or MissleSlotNR < 1 Then
+            Return
+        End If
+
+        Select MissleSlotNR
+            Case 1
+                If AmmoSlot1 <= 0 Then
+                    Print "Can't fire, No Ammo in Slot 1"
+                    Return
+                End If
+            Case 2
+                If AmmoSlot2 <= 0 Then
+                    Print "Can't fire, No Ammo in Slot 2"
+                    Return
+                End If
+            Case 3
+                If AmmoSlot3 <= 0 Then
+                    Print "Can't fire, No Ammo in Slot 3"
+                    Return
+                End If
+        End Select
+
+        Print "Tank "+Name+" fired a missile from slot "+MissleSlotNR
+
+        Select MissleSlotNR
+            Case 1
+                AmmoSlot1:-1
+                Print "Last Missile Fired was a "+MissileSlot1
+            Case 2
+                AmmoSlot2:-1
+                Print "Last Missile Fired was a "+MissileSlot2
+            Case 3
+                AmmoSlot3:-1
+                Print "Last Missile Fired was a "+MissileSlot3
+        End Select
+    End Method
+
+    '____________________________________________________________________
+End Type
+
+WarTank( TankList.First() ).FireMissile( 1 ) ' Try to fire with first tank
+```
+
+The above is NOT the way to do it, never, because if you use Arrays then you can use loops and auto set them:
+
+```blitzmax
+Strict
+
+Global TankList:TList = CreateList()
+
+Local Tank:WarTank
+
+Tank = New WarTank
+
+Tank.Name   = "Thunder Tank"
+Tank.Missile   = ["Infero Missile"]
+Tank.Ammo    = [   3   ]
+TankList.AddLast( Tank )
+
+Tank = New WarTank
+Tank.Name  = "Lightning Tank"
+Tank.Missile  = ["Infero Missile","Normal Missile"]
+Tank.Ammo  = [   1   ,  1     ]
+
+TankList.AddLast( Tank )
+
+Tank = New WarTank
+Tank.Name   = "Storm Tank"
+Tank.Missile  = ["Normal Missile","Infero Missile","Normal Missile"]
+Tank.Ammo  = [   3   ,  1     ,    2     ]
+TankList.AddLast( Tank )
+
+'Loop Each Tank
+For Local Tank:WarTank = EachIn TankList
+    Print "---------------------------------"  ' Loop Each Missile Slot
+    For Local n = 0 Until Tank.Ammo.length ' Fire missiles until this slot is out-of-ammo
+        Repeat
+            Tank.FireMissile( n )
+        Until Tank.Ammo[n] <= 0
+    Next
+Next
+
+' Try to fire first slot with first tank
+Print "------------------------------------"
+Print "Fire First Missile of the Last Tank"
+WarTank( TankList.Last() ).FireMissile( 0 )
+
+Type WarTank
+
+    Field Name$ = "Default Name"
+    Field Missile$[]
+    Field Ammo[]
+
+    ' F I R E M I S S I L E
+    '__________________________________________________________________
+    '
+    ' Parameters: MissileSlot - The slot number you want to fire from.
+    ' Use: Fires a missile if you got availible ammo else it don't
+    '___________________________________________________________________
+
+    Method FireMissile( MissleSlotNR )
+        If MissleSlotNR > Ammo.length Then
+            Return
+        End If
+
+        If MissleSlotNR > Missile.length Then
+            Return
+        End If
+
+        If MissleSlotNR < 0 Then
+            Return
+        End If
+
+        If Ammo[ MissleSlotNR ] <= 0 Then
+            Print "Can't fire, No Ammo in Slot "+MissleSlotNR
+            Return
+        End If
+
+        Print "Tank "+Name+" fired a "+Missile[ MissleSlotNR ]+" from slot "+MissleSlotNR
+        Ammo[ MissleSlotNR ]:-1
+    End Method
+
+    '____________________________________________________________________
+
+End Type
+```
+
+Always try to never replicate code, use loops and functions as much as possible.
+Also note how easy it would be to increase the number of weapon slots in the last example
+compared to the first. Our code is much more flexible now. Any of our tanks can have any number of weapon slots.   
+ 
+Now let's take it one step further, think if we could have used a type instead of an array
+as our "missileslot". Instead of two arrays we can make it one type. This type will have
+its own methods and functions, like load and fire. Also our missile could be a type. We
+could load our slot with missiles and our tank with slots. Now it's starting to feel OOP.
+It will be a little longer but it will give us an even more flexible code. Here is how that
+could look like: 
+
+```blitzmax
+Strict
+
+Global TankList:TList = CreateList()
+
+Local Tank:WarTank
+Tank = WarTank.Create( "Thunder Tank", 1 )
+'---------------------------
+Tank.GetSlot(1).Load( "Infero Missile", 1 ) 'Add 1 Inferno To Slot 1
+Tank.GetSlot(1).Load( "Normal Missile", 1 ) 'Also Add Normal To Slot 2
+
+Tank = WarTank.Create("Lightning Tank", 2 )
+Tank.GetSlot(1).Load( "WirlWind Missile", 3 ) 'Add 3 WirlWind To Slot 1
+Tank.GetSlot(2).Load( "Infero Missile"  , 1 ) 'Add 1 Missile To Slot 2
+
+Tank = WarTank.Create( "Storm Tank", 3 )
+Tank.GetSlot(1).Load( "Normal Missile", 3 ) 'Add 3 Missiles to Slot 1
+Tank.GetSlot(2).Load( "Infero Missile", 1 ) 'Add 1 Inferno  to Slot 2
+Tank.GetSlot(3).Load( "Normal Missile", 2 ) 'Add 2 Missiles To Slot 3
+
+'Loop Each Tank
+For Tank:WarTank = EachIn TankList
+    Print "---------------------------------"
+    'Loop Each Missile Slot in this Tank
+    Local n
+    For Local ThisSlot:WeaponSlot = EachIn Tank.Slot
+        'Fire missiles until this slot is out-of-ammo
+        n:+1
+        Repeat
+            Local Missile:TMissile = ThisSlot.Fire()
+            If Missile Then
+                Print Tank.Name+" fired a "+Missile.Name+" from slot "+n
+            End If
+        Until ThisSlot.Missile.Count() = 0
+    Next
+Next
+
+'Try to fire first slot with Last tank
+Print "------------------------------------"
+Print "Fire a Missile in the First Slot of the Last Tank"
+WarTank( TankList.Last() ).Fire( 1 )
+
+' W A R T A N K '
+' A Tank which you can create and then fight with. '
+Type WarTank
+    '--------------------------------------
+    Field Name$ = "Default Name"
+    Field Slot:TList = New TList
+
+    Method GetSlot:WeaponSlot( Number )
+        Local n = 0
+        For Local W:WeaponSlot = EachIn Slot
+            n:+1
+            If n = Number Then
+                Return W
+            End If
+        Next
+    End Method
+
+    Method Fire( WhichSlot )
+        If WhichSlot > Slot.Count() Then
+            Return
+        End If
+
+        If WhichSlot < 1 Then
+            Return 'Our slots start from 1!
+        End If
+
+        Local Missile:TMissile = GetSlot( WhichSlot ).Fire()
+    End Method
+
+    Function Create:WarTank( Name$, WeaponSlots=1 )
+        Local Tank:WarTank = New WarTank
+        Tank.Name = Name
+
+        'Create this tanks WeaponSlots -------
+        For Local n = 1 To WeaponSlots
+            Tank.Slot.AddLast( New WeaponSlot )
+        Next
+        '-------------------------------------
+        'Put the tank in the global tanklist
+        TankList.AddLast( Tank )
+        Return Tank
+    End Function
+End Type
+'-------------------------------------------
+
+'W E A P O N   S L O T
+'Contains missiles which can be loaded or fired
+Type WeaponSlot
+
+    Field Missile:TList = New TList ' Contains All Missiles in this Slot
+    Field Number     ' The Slot Number or ID
+
+    ' F I R E
+    '_________________________________________________________________
+    '
+    ' Use: Fires a missile if you got availible ammo else it don't
+    '_________________________________________________________________
+
+    Method Fire:TMissile()
+
+        If Missile.Count() <= 0 Then
+            Print "No Ammo in Slot "+Number
+            Return
+        End IF
+
+        'The above would be the same as the slot's ammo
+
+        Local MissileToFire:TMissile
+        MissileToFire = TMissile( Missile.First() ) 'Get first missile
+        MissileToFire.Launch() 'Fire the missile
+        Missile.Remove( MissileToFire )
+
+        Return MissileToFire
+    End Method
+    '_________________________________________________________________
+    '
+    ' L O A D
+    '_________________________________________________________________
+    '
+    ' Use: Loads one or more missiles
+    '_________________________________________________________________
+    Method Load( MissileName$, Count = 1 )
+        For Local n = 1 To Count
+            Local NewMissile:TMissile
+            NewMissile  = New TMissile
+            NewMissile.Name = MissileName
+            Missile.AddLast( NewMissile )
+        Next
+    End Method
+    '_________________________________________________________________
+
+End Type
+
+' T M I S S I L E
+Type TMissile
+    Field Name$ = "Unkown Missile"
+
+    Method Launch()
+    End Method
+End Type
+```
+
+The above example is pretty advanced so if you don't understand everything above do not worry,
+keep reading and learning, one day you might.
+
+## Extend Types
+
+I assume that you are aware that fields, globals, functions and methods inside Types can have
+the same names as methods, functions in other Types. It is possible to have Car.Create(),
+Tank.Create() and Animal.Create(); three methods which are completely different but have the same name.
+
+I have decided I'm going to use a spaceship approach in this example because it feels
+game related and it is easy to picture and explain the type-structure when it comes to
+spaceships. First I'm going to setup an example where I don't use inheritance. Then I'll use
+inheritance to hopefully simplify the example.
+
+```blitzmax
+'This is a fighter a quick and small ship
+Type Fighter
+    Field X#,Y#
+    Field Xspeed#,Yspeed#
+    Field ID%
+    Field Armor%
+    Field Fleet$,Name$
+    Field WeaponSelected$
+    Global Gfx_Ship 'Graphics
+    Global Gfx_Thrusters
+
+    Global Sfx_Thrust ' Sound
+    Global Sfx_Explode
+    Field SheildRechargeRate#=0.1
+    Field Energy%=500
+    Field WeaponUpgrade%
+    Field PowerUpgrade%
+    Field Fuel%
+    Field Scanner
+
+    Method DockWithCruiser()
+        ...
+    End Method
+
+    Method SelfDestruct()
+        Armor = 0
+        PlaySound Sfx_Explode
+        Explosion( X, Y)
+    End Method
+
+    Method Update()
+        X:+Xspeed
+        Y:+Yspeed
+    End Method
+End Type
+
+'Cruisers are big support ships
+Type Cruiser
+    Field X#,Y#
+    Field Xspeed#,Yspeed#
+    Field ID%
+    Field Armor%
+    Field Fleet$,Name$
+    Field WeaponSelected$
+    Global Gfx_Ship 'Graphics
+    Global Gfx_Thrusters
+    Global Sfx_Thrust ' Sound
+    Global Sfx_Explode
+    Field SheildPower
+    Field Reactor$
+    Field CrewNR%
+    Field TractorBeamUpgrade%
+    Field CloakingDeviceON=False
+    Field MissileSlots[4]
+
+    Method UseTractor(F:Fighter)
+        ...
+    End Method
+
+    Method UseTractor(C:Cruiser)
+        ...
+    End Method
+
+    Method SelfDestruct()
+        Armor = 0
+        PlaySound Sfx_Explode
+        Explosion( X, Y)
+    End Method
+
+    Method Update()
+        X:+Xspeed
+        Y:+Yspeed
+    End Method
+End Type
+```
+
+With OO inheritance I would first create a Type Ship. Then I would extend this Ship into a
+Cruiser and a Fighter. You can also go a step longer and first create a type SpaceObject,
+The Ship can then extend SpaceObject. Comets and missiles can also extend SpaceObject in that case.
+
+```blitzmax
+Type Ship
+    Field X#,Y#
+    Field Xspeed#,Yspeed#
+    Field ID%
+    Field Armor%
+    Field Fleet$,Name$
+    Field WeaponSelected$
+
+    Global Gfx_Ship 'Graphics
+    Global Gfx_Thrusters
+
+    Global Sfx_Thrust' Sound
+    Global Sfx_Explode
+
+    Method SelfDestruct()
+        Armor = 0
+        PlaySound Sfx_Explode
+        Explosion( X, Y)
+    End Method
+
+    Method Update()
+        X:+Xspeed
+        Y:+Yspeed
+    End Method
+End Type
+
+Type Fighter Extends Ship
+    Field SheildRechargeRate#=0.1
+    Field Energy%=500
+    Field WeaponUpgrade%
+    Field PowerUpgrade%
+    Field Fuel%
+    Field Scanner
+
+    Method DockWithCruiser()
+        ...
+    End Method
+End Type
+
+Type Cruiser Extends Ship
+    Field SheildPower
+    Field Reactor$
+    Field CrewNR%
+    Field TractorBeamUpgrade%
+    Field CloakingDeviceON=False
+    Field MissileSlots[4]
+
+    Method UseTractor(S:Ship) 'Accept a cruiser or a Fighter (Any type that extends ship)
+        ...
+    End Method
+End Type
+```
+
+If we look at fighter it will have all fields, methods and functions that ship has plus the new ones
+in the extended Fighter-Type. `F:Fighter = New Fighter`; for the programmer this fighter will look just
+like the Fighter in the first example. An object oriented code will make it easier to sort out stuff
+like this. In this sample I used some dummy methods but when you do even medium size games the size of
+your types and the number of their methods will be extensive. So an OO approach is highly recommended!
+
+I would also suggest that you use OO when doing small games. If you add the Ship-type to a list each time
+a new ship is created, you'll be able to loop thru every Ship but you'll also be able to loop every fighter
+or every cruiser. This is a fast and easy way to access a lot of objects in real-time.
+
+OO also have the plus side that you can easily transport code from one project to another.
+Let's say you are making another space game. Then just move your Ship-Type to that file,
+implement it using your functions and methods and reuse your code in a fast and quite simple way. You'll
+soon discover (if you haven't already) that parts of your games/apps will almost be stand-alone and can
+be used in several other games/apps. Then you can make a module of that part and implement it as a part of
+BlitzMax. There is already a tutorial on how to create your own module in BlitzMax. I recommend you check it out.
+
+## Overide Methods
+
+If you have a type Car which is extended from a Vehicle then you'll inherit all methods in Vehicle too Car.
+You can still make a Method in Car with the same name as this Method in vehicle. If you call that method
+from your car you'll use the car's method. If you call it from vehicle you'll use the vehicle's method.
+When you have two methods of the same name in the same type it is called overriding methods. The Cars
+method overrides the vehicles method (car extends vehicle). This is also known as polymorphism. It can be
+useful because one command can do a lot of different things depending on who is calling it (what object-type).
+See the example below.
+
+## Self
+
+Self can only be used in methods. If you use Self it'll refer to the instance of that type that called the
+method. Like C:Car = New Car; C.Run(). In the Run method Self would refer to the instance of Car known
+as C. So all fields in method can be accessed by Self.FieldName instead of just FieldName this use of
+Self would be quite pointless though. You use Self is if you in a method have a function/method that
+requires an instance of your type to be passed to it. Let's say that you inside your Method Run() in
+your Car-Type, need to call a function which accept Cars, to refer to your current instance of your car,
+use Self, StealTires( Self, Number ). Also you can use self when you function parameters has the same
+name as fields in your type.  Example:
+```blitzmax
+Method SetPosition( X, Y )
+    Self.X = X
+    Self.Y = Y
+End Method
+```
+If you haven't used Self here then your method must call it's parameters X1, Y1 or something.
+
+Here is the real example:
+
+```blitzmax
+Type Vehicle
+    Global Creator$ = " FX-Factory"
+    Field Name$="Vehicle"
+    Field Broken=False
+
+    Method Test()
+        If Not Broken Then
+            Print Name+" works!"
+        Else
+            Print Name+" is broken!"
+        End If
+    End Method
+
+    'Self refers to the Type calling
+
+    'Example:
+    'Bus.Collide( Train )
+    '--> Bus is refered to as Self and Train as V (in the method below)
+
+    'Example2:
+    'Train.Collide( Bus )
+    '--> Train is refered to as Self and Bus as V (in this method Collide)
+
+    Method Collide(V:Vehicle)
+        If Car(Self) And Car(V) Then
+            Print "Car Collide with Car"
+        End If
+
+        If Car(Self) And Bus(V) Then
+            Print "Car Collide with Bus"
+        End If
+
+        If Bus(Self) And Car(V) Then
+            Print "Bus Collide with Car"
+        End If
+
+        If Bus(Self) And Bus(V) Then
+            Print "Bus Collide with Bus"
+        End If
+
+        Broken=True 'Note that Self. is not needed here
+        V.Broken=True
+    End Method
+
+    'If this Method feels strange, checkout "casting" below
+
+End Type
+
+Type Car Extends Vehicle
+
+    Method Test()
+        If Not Broken Then
+            Print "Car works!"
+        Else
+            Print "Car is broken!"
+        End If
+    End Method
+
+End Type
+
+Type Bus Extends Vehicle
+
+    Method Test()
+        If Not Broken Then
+            Print "Bus works!"
+        Else
+            Print "Bus is broken!"
+        End If
+    End Method
+
+    Method SuperTest()
+        Super.Test() 'Calls Vehicle's Test()
+    End Method
+
+End Type
+
+'Just To test it all in an easy way
+Local C:Car = New Car
+Local B:Bus = New Bus
+B.Collide( C )
+
+Local Car2:Car = New Car
+Local Bus2:Bus = New Bus
+Bus2.Collide( B )
+Car2.Collide( Bus2 )
+Car2.Collide( C )
+Car2.Test
+C.Test
+B.Test
+Bus2.Test
+Bus2.SuperTest()
+```
+
+This example shows casting, method overriding, self and super.
+
+## Super
+
+If you have an overridden function or method Somefunction() in an extended type,
+let's take "Car" again. If you somewhere in the car type, its functions or methods,
+and want to call Vehicles Somefunction() (With the same name!) you have to refer to it
+as `Super.Somefunction()`. Read Super as: Use parent's
+
+## Casting
+
+In the above example I use casting. Casting is a way to check if an object is of a certain
+type (if it is a car not a bus). Objects are the instances of your types. If you create a
+new car, C:Car then C is you object, there will be times where you either want to check if
+C is a Car, Bus or perhaps a Vehicle. Well the answer here should be obvious, C is a Car and
+a Vehicle but not a bus. Casting is done like this: TypetoCheck( InstanceObject ). If you
+look in the code example above at the method Collide() you'll see that I use casting to check
+whether the object that calls the method is a Car or a Bus. Like this Car(Self) and Bus(Self).
+Car(Self) will check if Self is a Car-Type. If Self is a Car-Type or any Type extending Car
+this will return a Car-Type which is Self in this case.
+
+Confused?
+
+If Self is not a Car-Type it returns Null or False. If a Car-Type is returned it is not Null,
+therefore it's True. This is why we get True if Self is a Car. Casting can be used on any
+Object-Type, actually BlitzMax casts things for you sometimes, like when you assign an Integer
+to a String. This is specified in the Language Reference.
+
+Still confused?
+
+Then I recommend you take a closer look at the example above and the example below, try to
+change the code. One example of casting could be if a function returns an object. All types
+are of the object type. An array of objects can for example contain any type. The same goes
+with lists which only uses objects. These objects could be strings, types or arrays.
+
+``` blitzmax
+'----------------------------------------------------------------------
+Type Tank
+    Field name$ = "Object Tank"
+EndType
+
+Type Bird
+EndType
+
+Function ReturnsAnObject:Object()
+    T:Tank = New Tank
+    Return T ' But it is actually a Tank
+End Function
+
+TestObject:Object = ReturnsAnObject()
+' Let's say we want to know if this TestObject is a Tank then we need
+' to cast it like this:
+If Tank( TestObject ) Then
+' This will evaluate True only If TestObject is of the Tank-Type.
+' Ok, we know it's of the TankType but how dowe do if we want to change
+' the name of this tank. We cannot do TestObject.Name$, We know it's a
+' tank but BlitzMax don't, so first we need to put the tank into a
+' variable of it's own:
+Local myTank:Tank = Tank( TestObject )
+Print myTank.Name
+' You can also cast And access an Object's field or method in one line:
+Tank( TestObject ).Name$ = "Cool Tank"
+
+' To show it all I made a Function which takes objects And If it is a
+' tank it prints the name.
+
+Function GetTank( TestObject:Object )
+    If Tank( TestObject )
+        myTank:Tank = Tank( TestObject )
+    End If
+
+    If myTank Then
+        Print myTank.Name
+    Else
+        Print "Not a Tank"
+    End If
+End Function
+
+'See what happens when we give the Function some stuff.
+GetTank( TestObject )
+GetTank(New Tank)
+GetTank(New Bird)
+
+'----------------------------------------------------------------------
+```
+
+## Abstract and Final
+If you have an Abstract Type you'll be unable to create a new instance of that type.
+Which means it will be almost useless, or will it? You can still have functions and
+Globals and Fields in it. But you'll never be able to access those fields, except if
+you extend that type. The reason for abstract types is so that the user (which is a programmer
+using your type, including you) won't by mistake create a new instance of it. Vehicle is a good
+example. You cannot create a new Vehicle. Why you say. Because how would I draw a vehicle?
+As a car, a truck or a helicopter? Vehicle is abstract. This does not stop me from creating a
+car or a truck or anything extending Vehicle. The only thing you can't create an instance of
+is the abstract Type itself, Vehicle. But isn't car a Vehicle? Yes it is, but Car is not abstract
+so therefore you can both Draw and Create cars which are vehicles =)
+
+Let's say I want all Vehicles to have a method called create, so that all vehicles
+I use will be creatable (like a common interface for all vehicle objects). In this
+case I can make an abstract method, which will do nothing except giving a compile error
+if someone tries to make an extended vehicle (like Caror Bus) without a method called
+create. Final instead of abstract disallows users to extend a type, let's say I don't want
+people extending my Car, if they try too they'll receive a compile error telling them they
+can't because it's final. You can also set methods as final which will disallow people from overriding them.
+
+## LinkedList - List of Objects
+The default list in B-max is called TList . To make you better understand lists and for you
+to use them well I'll try too explain how they works. When you first create a new list it
+comes empty. Next you may add an object to it. (For this example Ship). The Ship is now the
+first object in the list and the last. If we add another object we have a choice, to either
+add it to the top or bottom of the list. For each object you add to the list you add a link
+to the list. The Link contains three fields. The Object you added to the List A Link to the
+Next Link A Link to the Previous Link In this way it is possible to loop thru the list because
+each link is connected to another link. Like a long chain. The number of links depends on the
+number of objects. You never need to use the Link by yourself, BlitzMax does that for you with
+methods and functions like `AddLast( Object )` or `RemoveLast()`.
+
+Put this code in a new file and test it, I'm going to extend it later
+
+```blitzmax
+Type TShip
+    Field Name$,Score
+EndType
+
+'Create some Ships
+'__________________________
+
+Global Ship:TShip
+
+Ship = New TShip
+Ship.Name =  "My First Ship"
+Ship.Score = 11
+
+Global Ship2:TShip
+Ship2 = New TShip
+Ship2.Name = "My 2nd Ship  "
+Ship2.Score = 3
+
+Global Ship3:TShip
+Ship3 = New TShip
+Ship3.Name = "The 3rd Ship "
+Ship3.Score = 9
+'___________________________
+
+Global MyList:TList   'Define the List
+MyList = CreateList()   'Create a New List
+
+MyList.AddFirst(Ship)   'Add Object to List
+
+'Now you could add to the top of the list
+'MyList.AddFirst()
+'Or add to the bottom
+MyList.AddLast(Ship2)
+MyList.AddLast(Ship3)
+
+For Local S:TShip = EachIn MyList
+    Print "Name: "+S.Name+"     Score:"+S.Score
+Next
+'How many objects in the List?
+Print "Links/Objects in the List: "+MyList.Count()
+```
+
+So far there is nothing new, this was just the basics. We have encountered a problem that
+come from the use of lists. If you in your program have a place where you loop through a
+list that does not exist, you'll receive a runtime error. The solution is simply to put an
+if statement around your For.. Eachin Loop.  You could also make sure you create the list 
+before the loop (no matter what). Make sure you don't skip CreateList() or New Tlist.
+
+If you on the other hand have a list you want to clear. If you want to remove all objects
+from the list use MyList.Clear(). Which clear the list but it does not delete it.
+
+An object exists as long as any variable is pointing to it. In the previous example the
+first-ship had two links. First the Global variable Ship:TShip and second the Link in the List.
+So to delete this ship you first have to erase the global. Ship = null. Second you have to
+delete the first ship in the list. (This is easy because it is at the top of the list).
+Simply go `MyList.RemoveFirst()`. If you do that there will be no way to retrieve the Name$ and
+the Score of this ship, therefore it will get deleted by BMax at the next Flushmem (you should
+have it once in your mainloop).
+
+MyList is of the TList-Type (or a TList-Object). RemoveFirst() and Clear() and most other commands
+are methods in TList. I guess you already knew that, but just to be sure.
+
+A TList can contain any object, just like an array of objects. Arrays and Lists share many characteristics.
+
+Add these lines to the previous example, just below `MyList.AddLast(Ship3)`
+
+```blitzmax
+MyList.AddFirst("A String is also an object")
+MyList.AddLast("This is now the last object")
+```
+
+If you run the program you'll see only the Ships being displayed. But the number of Objects
+in the list is five!
+Add this:
+
+```blitzmax
+For Local Str$ = EachIn MyList
+    Print "String: "+Str
+Next
+```
+
+The Eachin-Loop only loop through the objects of the specified type found in the list.
+First I looped each Ship in MyList, now I Loop Each String in MyList.
+
+The actual List looks something like this now: "A String is also an Object" – Ship – Ship2 – Ship3 – "This is now the last Object"
+Let's say I want to print the Strings and the names of the Ships in the correct order, how to do that?
+
+It's quite simple yet a little more complicated than before. What you do is that you
+loop all Objects in MyList. Like this:
+
+```blitzmax
+For Local TempObject:Object = EachIn MyList
+    Print TempObject
+Next
+```
+
+The above code does not work! It shouldn't. It may be obvious that we can't print a Ship,
+but the String? No neither of them will print straight off (Casting again). You first have
+to tell Bmax you want to convert the tempObject to a string or a ship and then print them in
+turn. Replace both of the each-in loops with this loop.
+
+```blitzmax
+For Local TempObject:Object = EachIn MyList
+    Local TempShip:TShip  = TShip(TempObject)
+    Local TempString$  = String(TempObject)
+
+    If TempShip Then
+        Print "This Object is a Ship it's Name is: "+TempShip.Name
+    End If
+
+    If TempString Then
+        Print "String Object :"+TempString
+    End If
+
+    If Not TempShip And Not TempString Then
+        Print "Unknown Object in List"
+    End If
+Next
+```
+
+If you would have added another object to the loop if would not print. Above I used casting
+to see the objects true type. See casting for more information.
+
+```blitzmax
+Strict
+
+Global MyList:TList
+MyList = CreateList()
+
+MyList.AddLast("Car")
+MyList.AddLast("Bus")
+MyList.AddLast("Airplane")
+MyList.AddLast("Boat")
+MyList.AddLast("Train")
+MyList.AddLast("UFO")
+
+Print "--LIST--"
+
+For Local Vehicle$ = EachIn MyList
+    Print Vehicle$
+Next
+
+'Let's say we want to add a Tank after bus
+MyList.InsertAfterLink("Tank" , MyList.FindLink("Bus") )
+'This would be the same as
+'MyList.InsertBeforeLink("Tank" , MyList.FindLink("Airplane") )
+
+Print "--LIST-- With a Tank After Bus"
+
+For Local Vehicle$ = EachIn MyList
+    Print Vehicle$
+Next
+```
+
+InsertBeforeLink takes an Object and puts it before a Link. `InsertBeforeLink( Object , TLink )`.
+To get a TLink in our list we search the List for an Object "Bus". In this case
+it's a string so it's easy. If there are more string with the same name it will take
+the first it encounters that match. The FinkLink command checks the list for an object.
+So to use it you have to know the object. Like in our example you could use Ship,Ship2,Ship3
+as reference to the object and FindLink would then retrieve that Link which you in turn
+can use with the other commands. You can also use the method Contains MyList.Contains(Ship3)
+to check if that object exist in the list.
+
+## Sorting of Lists
+
+To sort a list of strings or numbers in BMax is trival. To sort your own types such as Ships
+involves nothing more complicated than too add and override a method in your type. Lists can
+also be copied, swapped, reversed and translated into arrays. You can also create a list from
+an array. Here are some methods:    MyList.Swap( MyOtherList ) 'Switch contents; the first List's
+content moves to the second list while the second list's content gets moved to the first.
+```blitzmax
+MyList.Reverse() 'Reverse the order of the list.
+```
+The first is now the last.
+```blitzmax
+newList:Tlist = MyList.Copy() ' Creates a new exact copy of the list.
+Local Array:Object[] = MyList.ToArray()' Converts the List to an Array of Objects.
+```
+Now to the sorting. To sort an array use the method sort(). It's the same as for arrays by
+the way, MyList.Sort. You can sort text like this. If you want to sort numbers then convert
+to an array or make objects out of them. You sort your own types by one or more fields, but
+to be able to sort Ships by name you have to specify you want to sort them by the field called name.
+
+```blitzmax
+Type TShip
+    Field Name$,Score
+    Global SortBy
+
+    Const SortName = 1
+    Const SortScore = 2
+
+    Method Compare(O:Object) 'Override Original
+        'Enter Compare Method Here
+    End Method
+EndType
+
+'__________________________
+
+Global Ship:TShip
+Ship = New TShip
+Ship.Name =  "Sept" Ship.Score = 11
+
+Global Ship2:TShip
+Ship2 = New TShip
+Ship2.Name = "Madwell"
+Ship2.Score = 3
+
+Global Ship3:TShip
+Ship3 = New TShip
+Ship3.Name = "Townus" Ship3.Score = 9
+
+Global Ship4:TShip
+Ship4 = New TShip
+Ship4.Name = "Entus"
+Ship4.Score = 4
+
+'___________________________
+
+Global MyList:TList  'Define the List
+MyList = CreateList()  'Create a New List
+
+MyList.AddLast(Ship)  'Add Ships to List
+MyList.AddLast(Ship2)
+MyList.AddLast(Ship3)
+MyList.AddLast(Ship4)
+
+MyList.Sort(True) 'False for Descending sort
+
+For Local S:TShip = EachIn MyList
+    Print "Name: "+S.Name+"
+    Score :+ S.Score
+Next
+Print "Links/Objects in the List: "+MyList.Count() 'How many objects in the List?
+```
+
+That example won't be sorted. Not yet. First we have to complete the override
+method. That's the important part. Depending on how we do that is depending on
+how the sort will work. First I'll start with a simple sort by score method:
+
+```blitzmax
+Method Compare(Obj:Object)'Override Original
+    If TShip( Obj ).Score > Score Then
+        Return 1
+    Else
+        Return -1
+    End If
+End Method
+```
+
+First we see if the object is a Ship. Next we look to see which field is the highest,
+in this case score of the Ship calling compare (Self) or Score of the Ship we compare
+it too (called S in this example).
+
+```blitzmax
+Method Compare(O:Object) 'Sort by Name
+    If TShip(O).Name < Name Then
+        Return 1
+    Else
+        Return -1
+    End If
+End Method
+```
+
+This does the same but it checks the field Name, which happens to be a String.
+No problems there. What if we want both?
+
+Sort by a primary and a secondary field:
+
+```blitzmax
+Method Compare(O:Object)'Override Original
+    If TShip(O).Score = Score Then
+        If TShip(O).Name < Name Then
+            Return 1
+        Else
+            Return -1
+        End If
+    Else
+        If TShip(O).Score > Score Then
+            Return 1
+        Else
+            Return -1
+        End If
+    End If
+End Method
+```
+
+This sorts by Score, unless the score is a tie, then it will sort by name. You can of
+course continue this. If the names are equal sort by age and if age also is equal sort
+by something else. If you don't care who gets second at a tie just leave it. To be able
+to sort a list in different ways you can specify a variable that holds the way to sort.
+
+```blitzmax
+Method Compare(O:Object)'Override Original
+    If SortBy = SortName Then 'constant
+        If TShip(O).Name < Name Then
+            Return 1
+        Else
+            Return -1
+        End If
+    ElseIf SortBy = SortScore Then 'constant
+        If TShip(O).Score > Score Then
+            Return 1
+        Else
+            Return -1
+        End If
+    Else
+        'Don't sort
+    EndIf
+End Method
+```
+
+Now with one line before sort you can decide weather you wan to sort by name or score:
+```blitzmax
+TShip.Sortby = TShip.SortName
+```
+OR
+```blitzmax
+TShip.Sortby = TShip.SortScore
+```
+
+## Strings
+
+I assume you know the basics of strings. BlitzMax has a quite easy way to deal with strings.
+It's very similar to arrays. Remember that a string is an object.
+
+Strings use slices just as arrays. To get the first three letters of a string:
+```blitzmax
+Test$ = "TestString"
+Print Test[..3]
+Print Test.length 'Like arrays
+```
+
+If you compare two strings you compare the characters of the string. For example
+"Car" and "car" is not the same because `C` and `c` is not equal. Sometimes you want to
+ignore case-sesitivity, one way to do that is to use `ToUpper()` or `ToLower()`.
+
+```blitzmax
+Car$ = "Ferrari"
+If Car.ToLower() = "FerRaRi".ToLower() Then
+    DebugLog("Got match!")
+End If
+```
+
+### How Strings actually work
+
+A string is a piece of text. A string is built up of characters. A character is a letter, number
+or a symbol and is represented with a character code. The most common standard to use to encode
+text to numbers is called ASCII. For example in ASCII "a" has the value 97 while "A" has the
+value 65, "B" has the value 66. Each symbol on your keyboard has a code which is used by the computer.
+There is more letters and signs than those 127 covered in the ASCII standard. These 127 codes
+are not enough to cover all possible symbols and letters from different languages. BlitzMax uses
+2 bytes for each character and can therefore contain almost all common keysymbols in the world ; )
+These 2 byte numbers are called shorts and range from 0-65535.
+
+A string is an array with characters. In other words a string is an array of shorts.
+Remember that to get an element of an array you would do: `MyArray[ ElementNrToGet ]` the
+same goes for a string. To get a character-code of a character in a string you go `MyString[ CharacterToGet ]`.
+Example:
+
+```blitzmax
+Test$ = "TestString"
+Print Test[ 0 ] 'Print the code of the first letter in the String
+Print "T"[0] 'Print the code of the Letter T
+```
+It could also be good to note that the size and length of a string in BlitzMax isn't the same.
+```blitzmax
+Test$ = "ASCII"
+Print Test.length+" chars" ' The number of characters - 5
+Print SizeOf( Test )+" bytes" 'The number of bytes - 10
+```
+
+## Refresh Rate and Delta Time
+
+FPS, Frames per Second is the speed at which your game updates. By default BlitzMax tries
+to update at you monitors refreshrate. In the Graphics command: Graphics Width , Height
+,Depth, Refreshrate. You can specify a refreshrate which BlitzMax will try to follow.
+If you have a simple game like pong and play it on a very fast computer without any
+limitation to the refreshrate, that game would be so fast you wouldn't even see the ball.
+If you try to play a game on a slow system which gives you a refreshrate below the one
+specified your game will run slow, that's your games minimum requirements.
+Put this type into any graphics code:
+
+```blitzmax
+DrawText "Your FPS: "+FPS.Calc(),10,10 'This goes in main-loop
+
+' FPS_Counter    <> Runs and displays the FPS
+' --------------------------------------------
+Type FPS
+    Global Counter, Time, TFPS
+
+    Function Calc%()
+        Counter:+1
+        If Time < MilliSecs()
+            TFPS = Counter ' <- Frames/Sec
+             Time = MilliSecs() + 1000 'Update
+             Counter = 0
+        End If
+        Return TFPS
+    End Function
+End Type
+' --------------------------------------------
+```
+
+You can run at maximum refreshrate (set it free) and with the use of timing control your logic
+so it stays at the speed specified by you. In this way no matter what system that runs the game
+it will run with the same speed; Object A will travel to B in the same time. The object will not
+slow down but with severe lag the object will warp instead. Once you have specified an objects
+speed in pixels/sec it will always follow that speed no matter the FPS. But to counter, why would
+you want lag before slowdown? Multiplayer! In multiplayer each client has to run the game at the
+same speed. After I learnt how delta timing works I would never choose not to use it, unless we're
+talking about a very small game. Is deltatiming complicated? The answer is no, but it does require
+you to add a couple of lines of code to your game. If you add delta time you'll also be able to
+easily change the game speed while keeping the FPS constant which can be good sometimes. Here
+follows the Tank example again, this time with DeltaTime. Try to pretend those squares are tanks.
+
+```blitzmax
+Strict
+
+Global Number_of_Tanks = 50 'How many tanks to create?
+Const RefreshRate = 85 'Hz = FPS
+'Const RefreshRate = NOSYNC 'Try this also
+
+'Try to change the Refreshrate to 5,85,300
+'This simulation should run at the same speed because
+'of delta-timing. At what framerate does it lag at which
+'is it smooth?
+
+Type MoveObject
+    Field X#,Y#
+    Field Dir%
+    Global DeltaTime:Float
+    Global TimeDelay:Int' Millisecs() returns int
+
+    Function UpdateDeltaTime()
+        DeltaTime = ( MilliSecs()- TimeDelay )*0.001 'Delta Timer
+        TimeDelay  = MilliSecs()
+    End Function
+End Type
+
+Type Tank Extends MoveObject
+    'Override the Speed Field in MoveObject
+    Field Speed# = 400/1 ' Pixels / Seconds
+    Field Size%=5
+    Global TankNumber=0 'The current number of tanks
+    Global TankList:TList
+
+    'Draw draws a rect at the tank's X,Y
+    Method Draw()
+        DrawRect X,Y,Size,Size
+    End Method
+
+    'Go update the tank's movement
+    Method Go()
+        X:+Speed*Cos(Dir)*DeltaTime
+        Y:+Speed*Sin(Dir)*DeltaTime
+    End Method
+
+    'Sets the starting values of the Tank
+    Method SetupNew()
+        Dir = Rand(0,360)
+        X = (GraphicsWidth()/2)
+        Y = (GraphicsHeight()/2)
+        Speed:*Rnd(0.1,1)
+    End Method
+
+    'This function Creates a new tank
+    Function Create()'
+        'Create a List if none exists
+        If Not TankList Then
+            TankList = CreateList()
+        End If
+        Local NewTank:Tank = New Tank
+        NewTank.SetupNew()
+        TankList.AddLast( NewTank )
+        TankNumber:+1
+    End Function
+End Type
+
+Graphics 800,600,32,Refreshrate
+
+' Create a bunch of new Tanks
+For Local Nr = 1 To Number_of_Tanks
+    Tank.Create()
+Next
+
+Delay 500
+
+Tank.TimeDelay=MilliSecs()
+
+While Not KeyDown(Key_Escape)
+    DrawText "Your FPS: "+FPS.Calc(),20,40
+    MoveObject.UpdateDeltaTime() 'Update for all MoveObjects
+
+    For Local T:Tank = EachIn Tank.TankList
+        T.Draw
+        DrawText "Number of Tanks : "+Tank.TankNumber,20,20
+        T.Go'update
+    Next
+
+    Flip
+    Cls
+Wend
+
+' FPS_Counter    <> Runs And displays the FPS
+' --------------------------------------------
+Type FPS
+    Global Counter, Time, TFPS
+
+    Function Calc%()
+        Counter:+1
+        If Time < MilliSecs() Then
+            TFPS = Counter' <- Frames/Sec
+            Time = MilliSecs() + 1000'Update
+            Counter = 0
+        End If
+        Return TFPS
+    End Function
+EndType
+' --------------------------------------------
+```
+
+When you want to add DeltaTime you can follow these steps:
+
+1. Add these lines to your main loop.
+
+```blitzmax
+DeltaTime# = ( MilliSecs()- TimeDelay )*0.001 ' Delta Timer
+TimeDelay = MilliSecs()
+```
+Make sure that DeltaTime and TimeDelay are Globals so that you can use them in your
+functions and methods. I did it the OO-way in my Tank Example, but feel free to just
+paste this into your mainloop, does the same. Do you wonder why I multiply DeltaTime
+with 0.001? This is because millisecs() measure the time in milliseconds, 1000ms is
+one second. You probably want to measure your speed in seconds. That is pixels / seconds
+instead of pixels / milliseconds, that's why you divide DeltaTime with 1000 or multiply
+it with 0.001. Also make sure DeltaTime is a Float or Double! And that TimeDelay is an int.
+
+2. To all variables that change over time, that is Speed, Acceleration, Shield generation,
+Energy Recharge. Multiply them with DeltaTime.
+```blitzmax
+X:+Speed*Cos(Dir)*DeltaTime Y:+Speed*Sin(Dir)*DeltaTime
+Sheild:+ SheildRechargeRate*DeltaTime
+```
+Make these variables floats or doubles.
+3. Redefine your speed. When using deltatime your speed is measured in pixels/seconds.
+This means that if you have a resolution of 800x600 and you want to travel the screenwidth in
+3 sec. You speed would be = 800/3, 800pixels in 3sec. That speed will be the same no matter the frame rate.
+
+Here is my Delta-Type. It will help you with delta time. No excuse no to use it now =)
+```blitzmax
+'_____________________________________________________
+'------------------------------------------------------
+Type Delta
+    '   D E L T A  T I M E '-----------------------------------------------------
+    ' This type is Fully global. Which means you'll always
+    ' refere to it as Delta.Start() , Delta.Time(),
+    ' Delta.Update()
+    '
+    ' You shouldn't create instances of this type!
+    ' DeltaTime is same for all your objects!
+    '
+    Global DeltaTime#
+    Global TimeDelay%
+
+    'Do this before your main loop
+    'If you don't there will be a jump in deltatime
+    'where it is very big until it cools down
+    'If anything is moving under that time it would get speeds
+    'well above 100000. So put this line before your main-loop
+    Function Start()
+        TimeDelay = MilliSecs()
+    End Function
+
+    'Everytime where you want to get the deltatime
+    'call this: Delta.Time
+    'You should add this to every place which
+    'adds to you position/speed/acceleration
+    'But not to everything that adds
+    '
+    ' The basic rule is to add deltatime to all
+    ' things which gets added to every frame (over time)
+    ' because this means they will get huge if
+    ' you don't use delta.
+    ' Like Speed:+ 10*Delta.Time
+    Function Time#()
+        Return DeltaTime#
+    End Function
+
+    'Put this once in your main loop
+    'it calculates the current deltatime
+    'depeding on your framerate or more exact
+    'the time between each/the last frame.
+    Function Update()
+        '_____________________________________________________
+        'Purpose: Calculates DeltaTime , put it in mainloop
+        '-----------------------------------------------------
+        DeltaTime = ( MilliSecs()- TimeDelay )*0.001
+        TimeDelay  = MilliSecs()
+    End Function
+End Type
+'_____________________________________________________
+'------------------------------------------------------
+```
+
+## Images
+
+Images are a fast and easy way to draw graphics to the screen. Before you find
+or create an image, make sure you know your imagename and your background color in red, green and blue.
+
+To follow this section I recommend you open you favorite drawing program and make
+an image, like 50x50 pixels. Load and Draw it, set its Alpha and MaskColor. Test your way through.
+
+Maskcolor is the color you want to use as the transparent color. If black are your
+mask color all black pixels in your image will be transparent.
+```blitzmax
+SetMaskColor 0,0,0 'Black is the default anyway
+Global My_Image:Timage=LoadImage( "ImageName.bmp" )
+```
+It is recommended to load images into Timage objects because that way BMax can help you
+clean up the memory when the image are no longer being used.
+
+Loadimage returns an image-object. This is what blitz use to keep track of all your loaded
+images. You use this object which points to the address of this image when you want to draw
+or edit an image. Loadimage have to come after you initiate your graphics. Otherwise your
+images will be plain white or you'll receive a runtime error.
+
+```blitzmax
+MidHandleImage( My_image ) ' Centers the image's coordinates.
+```
+You can also use Automidhandle( true) which centers all images.
+
+These commands alter how an image is drawn, set them before you draw an image to make it
+take effect.
+`Setcolor(red,green,blue)`: Changes the color of your image, white which is 255,255,255 = no color change.
+`SetAlpha( Alpha# )` 'Set the transparency of the image. 1 solid, 0 invisible, 0.5 half-cloaked.
+To display the transparency effect you need to `SetBlend( AlphaBlend )`
+`SetRotation( Direction )` 'rotates the image in real-time! No need to ever pre-rotate images.
+This command consider 0 rotation to be to the right, so if your image is not already rotated
+to the right add `SetRotation(direction + offset)`, where offset is 90 if the original image
+points up, 180 if to left, -90 if down. This does depends on your game. If you use movement
+in 2D with Cos/Sin you need dir=0 to be to the left as that's the nature of Cos/Sin. Otherwise
+it shouldn't matter much.
+`SetScale(Scale#)` 'scale the image in real-time too. 1 = 100%, 2 = 200%, 0,5 = 50% of original size.
+
+Now you can draw your image with Drawimage( My_image ) If you want to alter an image
+fast in real-time then you need to use pixmaps or convert the image you have to a pixmap.
+Like if you want to change the maskcolor after load.
+
+## Real-time Timers
+
+Timers that that does not stop your game. They are used when you need timing in your game. Let's say you want an action to take place after 10seconds. To get the current time you'll use millisecs() which will give you the CPU-Clock in milliseconds. Millisecs() returns an Int and it is increased every millisecond.
+This is a simple way to time an event:
+```blitzmax
+Strict
+Local EndTime,SecTime,Secs
+
+EndTime = MilliSecs() + 8000 'Set "EndTime" to current time + 8 seconds
+
+Repeat
+    If SecTime < MilliSecs() Then
+        Print Secs+" seconds passed"
+        Secs:+1
+        SecTime = MilliSecs() + 1000
+    End If
+    'If the current time is greater than EndTime then End
+    If MilliSecs() > EndTime Then
+        Print "8 seconds...Exit"
+        End
+    End If
+Forever
+```
+
+## Animations
+
+Animations are several images loaded side by side. When you draw your AnimationImage you
+choose which frame your want to draw. In this way you can with ease draw animations in
+your game. This is not tricky at all. When you load an animation you need one image
+containing all your animation frames. It is also required that all these frames have
+the same size. Let's say you have an explosion 50x50 with 25 frames.
+```blitzmax
+LoadAnimImage("Path$,width,height,start,count")
+```
+Frames "start" at 0 for the first image, while "count" have to be at least 1, (at least 1 frame).
+To load this image as an animation you can do as following:
+```blitzmax
+My_Animation = LoadAnimImage("/Gfx/Image.bmp",25,25,0,24)
+DrawImage(My_Animation,X,Y,Frame)
+```
+In DrawImage, "frame" goes from 0 to your frame "count", which is what you set it to in
+LoadAnimImage. If you haven't already go to any paint program you have, throw together a series
+of pictures side by side. Create an image 250width x 50 height. Try to use the grid tool or
+rulers to draw FIVE 50x50 pictures in this image, side by side. Try to make it an animation of
+some sort, perhaps an explosion? 5 frames isn't much but it gives you a good start to work with.
+Now setup a .bmx file in the same directory as your newly saved animation. I recommend .png as a
+good format as it is smaller in file-size than a bmp but it does not distort your image at
+compression as a jpg does. See the example below, you can use to test your animation. First
+let's check out IncBin.
+
+## Save Images in your Exe
+
+BlitzMax has a handy function to pack all your multimedia in your exe when you compile.
+This allows you to supply your game as an exe only. This means that no additional files
+will be required to play it. It also protects your art from others (not hack proof). And
+it function is very easy to use. To include a file put this code somewhere at the start of your file
+```blitzmax
+Incbin "directory/filename.bmp"
+```
+ Then when you load your images write:
+```blitzmax
+LoadImage( "incbin::directory/filename.bmp")
+```
+The path can be in sub directories if you like, just refer to the same path when you
+loaded it with incbin. I have been able to include .png but I'm unsure with .bmp
+Note: When you LoadImage using incbin:: make sure you spell incbin with small letters only!
+It's sensitive! When you IncBin an image, "MyImage.png", the complier will tell you if the image is not found.
+
+Animation Example, including incbin. Make sure you always Loadimages after Graphics!
+```blitzmax
+Strict
+
+Incbin "ExplosionTest.png"
+
+Global Explode = False
+Global  X   = 50, Y   = 50
+Local  Frame = 0, XTimes = 0
+
+Graphics 800,600,0
+SetMaskColor 255,255,255 'White
+Global My_Animation:Timage=LoadAnimImage("ExplosionTest.png",50,50,0,5)
+
+If My_Animation = Null Then
+    DebugLog "Image could Not load - Check path And filename"
+    End
+End If
+
+Repeat
+    If Explode = True Then
+        DrawImage(My_Animation,X,Y,Frame)
+        Frame:+1
+        If Frame = 5 Then
+            Frame = 0
+            XTimes:+1
+        End If
+
+        If XTimes > 25 Then
+            Explode = False
+            XTimes = 0
+        End If
+    End If
+
+    'Explode at Mouse Left Click
+    If KeyHit(1) Then
+        Explode = True
+        X = MouseX()
+        Y = MouseY()
+        Frame = 0
+    End If
+
+    Flip
+    Cls
+Until KeyDown(Key_Escape)
+```
+
+## Sounds
+
+Sounds are loaded the same way as images, `YourSound = LoadSound("boom.wav")`. Then you can
+play the sound with PlaySound(YourSound). You can also use different channels for your
+sounds. You can load .ogg and wav files atm. I hope sounds are pretty self-explanatory
+after you have dealt with images. Read about it in the BMax reference and make your own
+example to try them.
+
+## Short on Collision Detection
+
+Collision, to detect when something overlaps or is about to overlap something else.
+Let's say you want to know when your bullet hits the enemy. One way to do it is to use
+this simple function which I snapped from the forums:
+
+```blitzmax
+Function RectsOverlap(x0, y0, w0, h0, x2, y2, w2, h2)
+    If x0 > (x2 + w2) Or (x0 + w0) < x2 Then
+        Return False
+    End If
+
+    If y0 > (y2 + h2) Or (y0 + h0) < y2 Then
+        Return False
+    End If
+
+    Return True
+End Function
+```
+
+This checks a rectangle at coordinate x0,y0 with a rectangle at x2,y2. w and h
+is the width and height of the rectangles, returns true if they overlap else false.
+This works perfect for enemy vs enemy or mouse-over-button collisions.
+
+Let's say you want to make sure that people don't walk thru walls, how would you do
+that? Consider the following example:
+
+```blitzmax
+Graphics 800,600,0
+
+Global Xvel# = 0.5, X# = 50
+
+Repeat
+
+    LastX = X 'Save X
+    X=X+Xvel 'Update X
+
+    'Draw the wall
+    SetColor 255,255,255 'White
+    DrawRect( 500,0,500,800 )
+    'Draw moving object
+    SetColor 255,0,0'Red
+    DrawRect( X, 50, 300, 55 )
+
+    If X+300 > 500 Then
+        X=LastX 'We collided so reset to last saved X
+    End If
+
+    Flip
+    Cls
+Until KeyDown(Key_Escape)
+```
+
+The above showed how a simple wall check would work. The RectsOverlap function checks all
+sides of the square. There is another quite smart way to check collision and that is by
+distance. In the end checking the distance is the same as checking against circular targets.
+
+```blitzmax
+Strict
+
+Function Distance#( X1, Y1, X2, Y2 )
+    Local DX# = X2 - X1
+    Local DY# = Y2 - Y1
+    Return Sqr( Dx*DX + Dy*Dy )
+End Function
+
+Graphics 800,600,0
+
+Local LastX, LastY, MR = 20'MR Short for MouseRadius
+Local TargetX = 400 , TargetY = 400
+Local TR = 300'TR Short for TargetRadius
+
+Repeat
+
+    'Draw Mouse
+    SetColor 0,155,0 'Green
+    DrawOval MouseX()-MR, MouseY()-MR, MR*2, MR*2
+    'Draw Target
+    SetColor 0,0,255 'Blue
+    DrawOval TargetX-TR, TargetY-TR, TR*2, TR*2
+    If Distance( MouseX(), MouseY(), TargetX, TargetY ) < TR+MR Then
+        MoveMouse( LastX, LastY )'Move it back
+        SetColor 255,0,0
+        DrawText "CIRCULAR COLLISION DETECTED!",20,20
+    End If
+    LastX = MouseX()
+    LastY = MouseY()
+
+    Flip
+    Cls
+Until KeyDown(Key_Escape)
+```
+
+The distance function is very handy. It gets a little more advanced if you want to stop,
+bounce or slide at surfaces. You can loop all your objects in a list and check each one
+against each other. Collision detection is very dependant on which type of game you are
+making. Blitz also has CollideImage functions, which can check your images for pixel
+perfect collisions. They are advanced and slow so I don't recommend any beginners to use
+them before they got a proper documentation with good examples.
+
+## Make your First BlitzMax Game
+
+To get you started I have laid up a simple game-plan:
+1. Start small.. Think up a small and simple game.
+2. Draw and write down your game on paper.
+3. Plan functions, type structures. If this is your first game make it a simple one!
+4. Go to the forums and ask around if you have any questions, ask what others think about your game plan.
+5. Now start coding, set up a small model and test run. Then add more as you go. Comment on every type, function and method that you write!
+6. If a part of your game can be done separate (like explosions, mapcreation). Do a small *.bmx which tests these types/functions. In this way your have a bigger chance of catching evil bugs.
+7. Don't start on your second project until your finish your first.
+
+The plan you make for your "first game project" will most likely come out as "to big" so try
+to cut down on it. Make it a complete but small game.
+
+### Get Debug Help
+
+When you encounter problems try to get help at the www.BlitzMax / Codersworkshop.com forums. Also check
+out the BlitzWiki – www.BlitzWiki.org. For people to be able to help you it's important that you know
+yourself what your problem actually is, so think about it, try to narrow it down. Is it a compile error?
+Is something not showing up as expected? Check your variables, are they what they are supposed to be? Use
+Debugstop() or Waitkey on a line to see if that line is read, if it is your game will stop there. Don't forget
+a most important command – `Debuglog` which allows you to write text to the runtimelog, Ex:
+```blitzmax
+If not Car Then
+    DebugLog "Car type not found!"
+    Return
+End If
+```

+ 60 - 0
docs/tutorials/network_programming.md

@@ -0,0 +1,60 @@
+---
+id: network_programming
+title: Introduction to Network Programming in BlitzMax
+sidebar_label: Network Programming
+---
+
+## Sockets
+
+Sockets are the fundamental "things" behind the network communication performed by your computer. For example, when your
+web browser displays the page for "www.google.com", it opens a socket and connects to google.com in order to fetch everything.
+
+Sockets are the end-point of a two-way communication link, where each socket listens for incoming messages, and replies
+with appropriate responses, thereby establishing bidirectional communication.
+
+There are several different kinds of sockets, but for this guide we are going to focus on the two most common kinds you'll
+come across in BlitzMax, stream (TCP) sockets and datagram (UDP) sockets :
+
+## Creating a Socket
+
+Before we create a socket, we define a `TAddrInfo` object to provide hints for the kind of socket we want to create.
+This is the modern way to handle sockets, and it simplifies a lot of the coding we'll need to do when dealing with them.
+
+```blitzmax
+Local hints:TAddrInfo = New TAddrInfo(AF_INET_, SOCK_STREAM_)
+```
+The first argument `AF_INET_` requests that the socket use the IPv4 protocol. For IPv6 you can use `AF_INET6_`, and if you
+don't care which protocol to use, you can use `AF_UNSPEC_`, which will allow you to use either.
+
+The second argument specifies the kind of socket we want to create. For UDP we could also use `SOCK_DGRAM_`.
+
+To create our stream socket, we use the `TSocket.Create` function, passing in our hints as shown in the example below:
+
+```blitzmax
+' create an AF_INET (IPv4), STREAM socket (TCP)
+Local hints:TAddrInfo = New TAddrInfo(AF_INET_, SOCK_STREAM_)
+
+Local socket:TSocket = TSocket.Create(hints)
+
+Print "Socket Created"
+```
+The `TSocket.Create` function creates a socket and returns a `TSocket` object. You use this object for all of your
+subsequent socket communications.
+
+## Handling Errors
+
+If there was a problem getting a socket, `TSocket.Create` will return `Null`, which you should really handle
+before trying to use your socket object:
+
+```blitzmax
+Local hints:TAddrInfo = New TAddrInfo(AF_INET_, SOCK_STREAM_)
+
+Local socket:TSocket = TSocket.Create(hints)
+
+If Not socket Then
+    Print "Unable to create socket."
+    End
+End If
+
+Print "Socket Created"
+```

+ 1877 - 0
docs/tutorials/oop_tutorial.md

@@ -0,0 +1,1877 @@
+---
+id: oop_tutorial
+title: Object-Oriented Programming in BlitzMax
+sidebar_label: OOP Tutorial
+---
+by John Judnich & Bruce A Henderson
+
+## Introduction
+
+At first, object-oriented programming (OOP) may appear confusing or unnecessary to those accustomed to procedural
+programming methods; however, once you are familiar with OOP techniques and their benefits, you may never want to go
+back to procedural programming again. As the name implies, object-oriented programming basically provides a way to
+associate variables and functions around virtual **objects**. By the end of this tutorial, you should have a good
+understanding of the use and benefits of OOP techniques.
+
+## Custom Types
+
+> If you are already familiar with the use of custom Types with Fields, you can skip this section.
+
+A custom `Type` definition is a handy way to define your own custom variable types. A custom `Type` is
+basically a group of variables all bundled into one. For example:
+
+```blitzmax
+SuperStrict
+
+Type TCar
+    Field image:TImage
+    Field name:String
+    Field speed:Float, rotation:Float
+End Type
+
+Local a:Int, b:Float, car:TCar
+```
+
+Try running the above example. You may be surprised that it actually works. Yes - ''TCar'' is now a valid
+variable type! You can pass it to functions, set its value, etc. just like any other variable. The `Field` lines supply
+variables which TCar variables include internally; these internal variables are technically called "members" of TCar.
+A custom Type is really just a handy way to group variables.
+
+> The **T** prefix is just a way of indicating that it is a `Type`, and is a standard convention used in BlitzMax.
+> You are free to name your Types in any way you like, with or without a **T** prefix. It's entirely up to you!
+
+Accessing a member of a TCar variable is very easy. Simply use the dot (.) operator like this:
+
+```blitzmax
+SuperStrict
+
+Type TCar
+    Field image:TImage
+    Field name:String
+    Field speed:Float, rotation:Float
+End Type
+
+Local a:Int, b:Float, car:TCar
+car = New TCar
+car.name = "70s Chevy"
+Print car.name
+```
+
+As you can see, `car.name` is accessing the **name** member of the TCar variable **car**. As in the example, the
+**name** can be modified and read from, just like any other variable.
+
+You may be wondering what the `car = New TCar` line does. This aspect of custom Types is generally hard
+to understand at first. Think of it this way: a custom type variable (unlike a normal Float, Int, etc. variable) is
+not actually a variable – imagine the TCar variable in this example as a handle which you can stick onto any TCar
+to get a grip on it. Through this handle (the **car** variable), you can access any of the TCar's data (such as
+`car.name`). However, a handle on its own is worthless; it must first be attached to something. To attach this
+handle (the **car** variable) to something, simply assign it to a real object. And, to create a real object, you use the
+**New** keyword. The `car = New TCar` line in the example above creates a new TCar object and assigns it to **car**. Without
+this line, the `car.name` code below will cause a runtime error since it is trying to access nothingness.
+
+
+> When a custom type variable is attached to nothing, its value is called `Null`. If you want to
+> detach a **handle** (custom type variable) from an object, simply set the variable's value to `Null` (such as `car = Null`).
+> You should always detach variables from real objects when you no longer need access to it.
+
+A real object (created with **New**) will always remain in memory until all "handles" have been detached from it. Take a look
+at this example:
+
+```blitzmax
+SuperStrict
+
+Type TCar
+    Field image:TImage
+    Field name:String
+    Field speed:Float, rotation:Float
+End Type
+
+Local a:Int, b:Float, car:TCar, dup:TCar
+
+car = New TCar
+dup = car
+
+car.name = "70s Chevy"
+
+Print dup.name
+```
+First, a new car is created, and assigned to **car**. Then **car** is assigned to **dup** (another TCar "handle").
+When a custom Type variable is assigned to another custom Type variable like this, **dup** is attached to the same
+object that **car** is attached to. So now both **car** and **dup** should be attached to the same TCar.
+As you can see below, `car.name` sets the TCar's name to "70s Chevy". Then, `dup.name` (this is **dup** now,
+not **car**) displays "70s Chevy" on the screen. Since both **car** and **dup** are attached to the same TCar object, this is
+the correct behavior.
+
+You may be wondering what all this is good for. The real advantage to custom type variables being only
+"handles" and not "real objects" is when you begin to represent actual real-world objects in your game. This
+way, you have complete control over the creation/deletion of objects, and you can easily pass an existing object
+into a function. For example:
+
+```blitzmax
+SuperStrict
+
+Type TCar
+    Field image:TImage
+    Field name:String
+    Field speed:Float, rotation:Float
+End Type
+
+Local a:Int, b:Float, car:TCar
+
+car = New TCar ' Create a New Car object and assign it to c
+
+InitCar(car)
+
+' Demonstrate that the InitCar() function has actually modified car's TCar object
+Print car.speed
+Print car.rotation
+car = Null ' Car is no longer needed
+
+Function InitCar(obj:TCar)
+    obj.speed = 0
+    obj.rotation = 90
+End Function
+```
+
+Since TCar variables are only "handles" to the real data, the `InitCar()` function is able to perform
+operations on an existing object. In `InitCar()`, the TCar parameter (`obj:TCar`) gets attached to whatever TCar is
+specified. In this case, it is the car which **car** is attached to. The function then modifies the variables of this car,
+and returns.
+
+Before you move on in this tutorial, you may want to take a while to experiment with custom Types. To
+understand object-oriented techniques, you must first be completely comfortable working with custom Types.
+
+## Object-Orient Programming Basics
+
+First, take a look at the following example, which is an extremely simple demonstration of a traditional
+(procedural) implementation of a "counter" (it simply increments a number every time a function is called):
+
+```blitzmax
+SuperStrict
+
+Type TCounter
+    Field value:Int
+End Type
+
+Function IncrementCounter(counter:TCounter)
+    counter.value :+ 1
+End Function
+
+' Create a test counter
+Local test:TCounter = New TCounter
+
+' Display its value
+Print "Counter value is " + test.value
+
+' Increment it
+IncrementCounter(test)
+
+Print "Counter has been incremented"
+
+' Now display it's value (which should now be 1+ the old value)
+Print "Counter value is " + test.value
+```
+
+The above example simply creates an extremely simple type which contains a single integer field (called **value**). The function called
+`IncrementCounter()` will add 1 to the **value** of any TCounter object. The rest of the code below simply
+demonstrates the operation of the function and type.
+
+Now, to convert this example into a more object-oriented program (OOP), only a few small changes would be
+made. Since OOP allows you to insert procedures within a `Type` definition (just as you are allowed to insert
+variables within them), `IncrementCounter()` can be moved inside the type definition (however, this `Function`
+will now be called a `Method`). For example:
+
+```blitzmax
+SuperStrict
+
+Type TCounter
+    Field value:Int
+
+    Method Increment()
+        Self.value :+ 1
+    End Method
+
+End Type
+```
+Now, the Increment() method can now be called like this:
+
+```blitzmax
+' Create a test counter
+Local test:TCounter = New TCounter
+
+' Set the counter value
+test.value = 5
+
+' Increment it
+test.Increment()
+```
+As you can see, the Increment() method is accessed the same way the Value variable is. The object
+(**test**) is followed by a dot (.), then followed by the name of the member to access. In this case, test's **value** is
+set to 5 (`test.value = 5`). Then, test's `Increment()` method is executed (`test.Increment()`).
+
+You may have noticed that the `Increment()` Method definition has a few differences from the
+`IncrementCounter()` function in the other example; the keyword **Self** is used in place of the `counter:TCounter`
+parameter. Because `Increment()` is a member of TCounter, you can use **Self** to refer to whichever object is
+being manipulated. For example:
+
+```blitzmax
+test.Increment()
+```
+When this is executed, the Increment() method is called:
+
+```blitzmax
+Method Increment()
+    Self.value :+ 1
+End Method
+```
+Now, since `test.Increment()` was just called, **Self** is actually referring to **test**, so `Self.value :+ 1` is effectively
+performing this operation: `test.Value :+ 1`.
+
+> The **Self** keyword is completely optional, and most programmers omit it entirely. For example,
+> the Method `Increment()` could be written like this:
+> `Method Increment()`
+> `    value :+ 1`
+> `End Method`
+> In this case, BlitzMax will automatically assume you are referring to the TCounter's **value** variable. This
+> allows the programmer to more easily focus on the object's perspective, rather than a global perspective. For
+> example, the `Increment()` Method simply supplies the computer with a method to increment a TCounter object;
+> it makes no difference what counter is being manipulated, where `Increment()` is being called from, etc. – just as
+> long as `Increment()` does its job properly, everything will work seamlessly.
+
+Now that you understand the basic concept of Methods, here is a more practical example which demonstrates the usefulness
+of OOP techniques:
+
+```blitzmax
+SuperStrict
+
+Type TRobot
+    Field name:String
+    Field x:Float, y:Float
+    Field health:Int
+
+    Method SetName(newName:String)
+        name = newName
+    End Method
+
+    Method Move(x:Float, y:Float)
+        Self.x :+ x
+        Self.y :+ y
+    End Method
+
+    Method Draw()
+        SetColor 255, 255, 255
+        DrawText name, x - (TextWidth(name)/2), y - 20
+        SetColor 0, 0, 255
+        DrawRect x - 5, y - 5, 10, 10
+        SetColor 255, 0, 0
+        DrawRect x - 4, y - 4, 8, 8
+    End Method
+
+End Type
+```
+This TRobot Type has these members: **name**, **x**, **y**, **health**, `SetName()`, `Move()` and `Draw()`. The Fields (**name**,
+**x**, and **y**) store information about the robot, while the Methods (`SetName()`, `Move()`, and `Draw()`) provide actions
+which can be performed on any TRobot object. For example:
+
+```blitzmax
+Graphics 640, 480
+
+Local robot:TRobot = New TRobot
+robot.SetName("XB-75b")
+
+While Not KeyHit(KEY_ESCAPE)
+    Cls
+    robot.Move(1, 1)
+    robot.Draw()
+    Flip
+Wend
+```
+First, this example creates a New TRobot object (called **robot**). `robot.SetName("XB-75b")` executes the
+TRobot `SetName()` Method (the `SetName()` Method is a little redundant here, since you could just as easily say
+`robot.name = "XB-75b"`; However, it can be useful, and we will look into :ref:`oop_access_modifiers` later which will hopefully explain why).
+
+The main While loop simply calls `robot.Move(1, 1)` and `robot.Draw()` each frame. The `Move()` method
+moves the robot 1 unit to the right, and 1 unit down. The `Draw()` method draws the "robot" to the screen.
+
+> The equivalent of this in traditional/procedural programming methods would be something like:
+> `MoveRobot(robot, 1, 1)` and `DrawRobot(robot)`. The object-oriented style is not only more structured and
+> intuitive, but provides advanced features such as Inheritance and Polymorphism which makes programming
+> complex object relationships extremely easy.
+
+As you can see, using OOP techniques enforces a modular design in your programs, taking your mind
+off the complex inner workings of the system, and rather focusing on the higher level manipulation of objects.
+When writing a `Draw()` Method for an object, for example, the programmer only needs to focus on one thing:
+instructing the computer to draw an object correctly. Once that task is complete, you will never need to worry
+about the internal operations of that Method again; whenever an object needs to be drawn, it's as simple as
+calling `object.Draw()`.
+
+## Inheritance
+
+Inheritance in OOP is really very simple once you understand it. Inheritance is the term for appending
+one Type onto another one. This may seem slightly confusing at first, and is best taught by example.
+If you're making a game with BlitzMax, it's most likely that you'll have many different types of game
+objects (for example, you might have a TPlayer, TRobot, and TBuilding). Here's a short example:
+
+```blitzmax
+SuperStrict
+
+Type TPlayer
+    Field x:Float, y:Float
+    Field health:Int
+End Type
+
+Type TRobot
+    Field x:Float, y:Float
+    Field health:Int
+End Type
+
+Type TBuilding
+    Field x:Float, y:Float
+    Field enterable:Int
+End Type
+
+Local obj:TPlayer = New TPlayer
+obj.x = 1
+obj.y = 2
+```
+As you can see, all three types have a lot in common; they all have **x** and **y** variables, and both
+TPlayer and TRobot have **health**. Inheritance provides a way to make a sort of template Type which others
+can build on. For example:
+
+```blitzmax
+SuperStrict
+
+Type TEntity
+    Field x:Float, y:Float
+End Type
+
+Type TPlayer Extends TEntity
+    Field health:Int
+End Type
+
+Type TRobot Extends TEntity
+    Field health:Int
+End Type
+
+Type TBuilding Extends TEntity
+    Field enterable:Int
+End Type
+
+Local obj:TPlayer = New TPlayer
+obj.x = 1
+obj.y = 2
+```
+In this example, the **Extends** keyword after TPlayer, for example, tells BlitzMax that TPlayer not only
+contains `Field health:Int`, but everything else that TEntity has as well. The result is that any TPlayer objects
+will now automatically have **x** and **y** variables (notice that `obj.x = 1` works just fine, even though the
+TPlayer Type doesn't specifically include **x**).
+
+This may at first seem like only a way to save typing, but it gets amazingly useful when you get into
+polymorphism. However, you should first learn more about Inheritance's benefits which appear when your types
+include Methods.
+
+First, here is the same example with a Method added to TEntity:
+
+```blitzmax
+SuperStrict
+
+Type TEntity
+    Field x:Float, y:Float
+
+    Method Draw()
+        SetColor 255, 255, 255
+        Plot x, y
+    End Method
+End Type
+
+Type TPlayer Extends TEntity
+    Field health:Int
+End Type
+
+Type TRobot Extends TEntity
+    Field health:Int
+End Type
+
+Type TBuilding Extends TEntity
+    Field enterable:Int
+End Type
+
+Graphics 640, 480
+
+Local obj:TPlayer = New TPlayer
+obj.x = 1
+obj.y = 2
+
+obj.Draw()
+
+Flip
+
+WaitKey
+```
+The `Draw()` method of TEntity simply plots a dot at the entity's location. Now, since TPlayer, TRobot,
+and TBuilding all inherit TEntity's properties, this means that they now have a `Draw()` Method (as you can see if
+you run the example).
+
+Now, drawing a dot might be OK if you want to mark the position of an entity, but TBuilding's, TRobot's,
+and TPlayer's should all look unique. This can be done by *overriding* the `Draw()` method. Doing this is really just
+as simple as adding a `Draw()` method to TBuilding, for example, and BlitzMax will use that one instead. For
+example:
+
+```blitzmax
+SuperStrict
+
+Type TEntity
+    Field x:Float, y:Float
+
+    Method Draw()
+        SetColor 255, 255, 255
+        Plot x, y
+    End Method
+End Type
+
+Type TPlayer Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 0, 0, 255
+        DrawOval x, y, 5, 5
+    End Method
+End Type
+
+Type TRobot Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 255, 0, 0
+        DrawOval x, y, 5, 5
+    End Method
+End Type
+
+Type TBuilding Extends TEntity
+    Field enterable:Int
+
+    Method Draw()
+        SetColor 255, 255, 255
+        DrawRect x - 5, y - 5, 10, 10
+    End Method
+End Type
+
+Graphics 640, 480
+
+Local obj:TPlayer = New TPlayer
+obj.x = 5
+obj.y = 7
+
+obj.Draw()
+
+Flip
+
+WaitKey
+```
+When BlitzMax executes `obj.Draw()`, it uses the most appropriate Method. In this case, it is TPlayer's
+`Draw()` Method (not TEntity's, because it is more abstract).
+
+If you do not want TEntity to provide a **default** draw method (as it is now, it just draws a dot if no
+specific `Draw()` Method is provided), you can delete TEntity's `Draw()` Method, and `obj.Draw` will still work,
+since TPlayer contains a `Draw()` Method. However, a better way to do this is to add an **Abstract** `Draw()`
+Method to TEntity. Making a Method **Abstract** is really just a way of saying that this Method is blank, and sub-
+Types (such as TBuilding and TPlayer) must provide one (or else you'll get a compile error). For example:
+
+```blitzmax
+SuperStrict
+
+Type TEntity
+    Field x:Float, y:Float
+
+    Method Draw() Abstract
+End Type
+
+Type TPlayer Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 0, 0, 255
+        DrawOval x, y, 5, 5
+    End Method
+End Type
+
+Type TRobot Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 255, 0, 0
+        DrawOval x, y, 5, 5
+    End Method
+End Type
+
+Type TBuilding Extends TEntity
+    Field enterable:Int
+
+    Method Draw()
+        SetColor 255, 255, 255
+        DrawRect x - 5, y - 5, 10, 10
+    End Method
+End Type
+
+Graphics 640, 480
+
+Local obj:TPlayer = New TPlayer
+obj.x = 5
+obj.y = 7
+
+obj.Draw
+
+Flip
+
+WaitKey
+```
+You may notice that `Method Draw() Abstract` in TEntity has no `End Method` statement. This is
+because an Abstract Method is always blank, and contains no data. This abstract method definition is really just
+saying "all Types which inherit TEntity must have a Draw() Method". Try deleting TPlayer's `Draw()` Method, and
+run the program. A compile error occurs, enforcing the rule that inheritors of TEntity must have a `Draw()`
+Method.
+
+This may at first seem only useful for error checking (to make sure that your entities can be drawn, or
+whatever actions you require), but it comes in handy when using polymorphism.
+
+## Polymorphism
+
+Polymorphism is really just a fancy word for the process of handling your objects in a generalized way.
+Polymorphism might be easier to understand if you think about it like this: in OOP, a TApple Type would Extend
+the TFruit Type (since an apple is a fruit, of course). Now you can do this, for example:
+
+```blitzmax
+Local apple:TApple = New TApple
+Local orange:TOrange = New TOrange
+
+Local fruit:TFruit
+fruit = apple
+fruit = orange
+```
+
+The `fruit:TFruit` variable, has the capability to store apples, oranges, or any other Type which `Extends`
+TFruit. In other words, with a generalized variable (a TFruit variable or TEntity variable, for example), you can
+store any sub-Type object. This means that a TPlayer, TRobot, or TBuilding object can be stored in a TEntity
+variable. This is called polymorphism. For example, you could do this:
+
+```blitzmax
+Graphics 640, 480
+
+Local player:TPlayer = New TPlayer
+player.x = 5
+player.y = 7
+
+Local entity:TEntity
+entity = player
+
+entity.Draw()
+```
+As you can see, the TEntity variable is used to reference a TPlayer Type. The `entity.Draw()` line tells
+the computer to draw the TEntity. In this case, this TEntity is a actually a TPlayer, so TPlayer's `Draw()` Method is
+used (not TEntity's). Whether the entity was a TPlayer, TRobot, TBuilding, etc. makes no difference; the
+appropriate `Draw()` Method will automatically be executed.
+
+However, when accessing a TPlayer, TRobot, etc. through a TEntity variable like this, you will only be
+allowed access to fields and methods included in the TEntity definition; the only members you can be certain the
+object will contain are TEntity members – anything else may vary (depending on whether it's a TPlayer, TRobot,
+TBuilding, etc.)
+
+You might be wondering what it could be useful for. The main advantages of polymorphism become
+apparent when you want to do something to all objects of a general type. For example, what if you wanted to
+execute `Draw()` for every TPlayer, TRobot, and TBuilding? Normally, you would have to keep a list of all players,
+all houses, and all robots separately (which would get very messy, especially if you later decide to add more
+TEntity-inherited Types). The solution is to keep a list of them as TEntity's, since a TEntity variable has the
+polymorphic ability to store TPlayer's, TRobot's, TBuilding's, etc. You can then `Draw()` them whenever you need,
+since `Draw()` is a Method common to all TEntity's. For example:
+
+```blitzmax
+Graphics 640, 480
+
+Local entityList:TList = New TList
+
+Local obj:TPlayer = New TPlayer
+obj.x = 5
+obj.y = 7
+
+entityList.AddLast(obj)
+
+Local obj2:TBuilding = New TBuilding
+obj2.x = 15
+obj2.y = 3
+
+entityList.AddLast(obj2)
+
+' Draw all entities
+
+For Local ent:TEntity = EachIn entityList
+    ent.Draw()
+Next
+
+Flip
+
+WaitKey
+```
+
+> In case you are not familiar with BlitzMax's TList Module, it simply provides an easy way to
+> manage a list of objects, similarly to storing them in an array.
+
+Polymorphism is useful in any case where generalization would benefit. For example, if you have a
+general-purpose function which accepts a TEntity as a parameter, this means that your players, houses, and
+robots will all work seamlessly with that function! For example:
+
+```blitzmax
+Graphics 640, 480
+
+Local player:TPlayer = New TPlayer
+player.x = 5
+player.y = 7
+
+Local house:TBuilding = New TBuilding
+house.x = 15
+house.y = 3
+
+While Not KeyHit(KEY_ESCAPE)
+    Cls
+    DrawAndMove(player)
+    DrawAndMove(house)
+    Flip
+Wend
+
+WaitKey
+
+Function DrawAndMove(entity:TEntity)
+    entity.Draw()
+    entity.x :+ 1
+    entity.y :+ 1
+End Function
+```
+
+## Constructors & Destructors
+
+First, take a look at the following example (specifically, the section where obj and obj2 is added to
+EntityList):
+
+```blitzmax
+SuperStrict
+
+Type TEntity
+    Field x:Float, y:Float
+
+    Method Draw() Abstract
+End Type
+
+Type TPlayer Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 0, 0, 255
+        Draw Oval x, y, 5, 5
+        End Method
+    End Type
+
+Type TRobot Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 255, 0, 0
+        DrawOval x, y, 5, 5
+    End Method
+End Type
+
+Type TBuilding Extends TEntity
+    Field enterable:Int
+
+    Method Draw()
+        SetColor 255, 255, 255
+        DrawRect x - 5, y - 5, 10, 10
+    End Method
+End Type
+
+Graphics 640, 480
+
+Local entityList:TList = New TList
+
+Local obj:TPlayer = New TPlayer
+obj.x = 5
+obj.y = 7
+
+entityList.AddLast(obj)
+
+Local obj2:TBuilding = New TBuilding
+obj2.x = 15
+obj2.y = 3
+
+entityList.AddLast(obj2)
+
+' Draw all entities
+For Local ent:TEntity = EachIn entityList
+    ent.Draw()
+Next
+
+Flip
+
+WaitKey
+```
+There is one thing which might be considered messy or tedious in the above example: the need to call
+`entityList.AddLast()` for each new TEntity-derived object (if it wasn't added to the list, it wouldn't be rendered
+later on). Wouldn't it be a lot easier if could be done automatically? For example:
+
+```blitzmax
+Local obj:TPlayer = New TPlayer
+obj.x = 5
+obj.y = 7
+
+Local obj2:TBuilding = New TBuilding
+obj2.x = 15
+obj2.y = 3
+```
+It would be much easier if these objects could automatically add themselves to a list somewhere.
+Fortunately, this can be done in OOP! Any Type can have a special "constructor" Method which is automatically
+called just as the object is created. The constructor can do anything you like, just as any other Method can (in
+this case, it will be adding the TEntity to a list). To add a constructor to a Type, simply add a Method named
+`New()`. The `New()` Method will be executed whenever an object of that type is created.
+
+In the example above, the best place to put the constructor is in TEntity; this way, TPlayer, TBuilding,
+and all the other sub-Types will inherit the constructor as well. And if necessary, some of the sub-Types can
+override the constructor Method. However, overriding a constructor is not the same as overriding a normal
+Method; rather than the new Method being performed instead of the original Method, the new constructor method is done
+in addition to the original Method. The reason for this should be clear in this example:
+
+```blitzmax
+SuperStrict
+
+Global entityList:TList = New TList
+
+Type TEntity
+    Field x:Float, y:Float
+
+    Method Draw() Abstract
+
+    Method New()
+        entityList.AddLast(Self)
+    End Method
+End Type
+
+Type TPlayer Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 0, 0, 255
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New()
+        health = 100
+    End Method
+End Type
+
+Type TRobot Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 255, 0, 0
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New()
+        health = 100
+    End Method
+End Type
+
+Type TBuilding Extends TEntity
+    Field enterable:Int
+
+    Method Draw()
+        SetColor 255, 255, 255
+        DrawRect x - 5, y - 5, 10, 10
+    End Method
+End Type
+
+Graphics 640, 480
+
+Local obj:TPlayer = New TPlayer
+obj.x = 5
+obj.y = 7
+
+Local obj2:TBuilding = New TBuilding
+obj2.x = 15
+obj2.y = 3
+
+' Draw all entities
+For Local ent:TEntity = EachIn EntityList
+    ent.Draw()
+Next
+
+Flip
+
+WaitKey
+```
+When the TPlayer object is created, first the inherited TEntity constructor is called, which properly adds
+the TPlayer to the EntityList. Then, the TPlayer constructor is called additionally (remember – constructors
+cannot be overridden like normal Methods), which sets the player's health to 100%. Next, the TBuilding is
+created. With the TBuilding, only the inherited TEntity constructor is called, since no specific constructor code is
+provided.
+
+After the TBuilding is added to the EntityList through the TEntity constructor, all the items in the
+EntityList are drawn to demonstrate that both TEntity's have been added to the list correctly.
+
+## Constructor Overloading
+
+We can even go one step further in our example above. Rather than having to set all the Type variables individually each
+time after the creation of our objects, we can specify some parameters on the `New()` method and pass some initial values
+into it. For example:
+
+```blitzmax
+SuperStrict
+
+Global entityList:TList = New TList
+
+Type TEntity
+    Field x:Float, y:Float
+
+    Method Draw() Abstract
+
+    Method New(x:Float, y:Float)
+        Self.x = x
+        Self.y = y
+        entityList.AddLast(Self)
+    End Method
+End Type
+
+Type TPlayer Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 0, 0, 255
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float)
+        Super.New(x, y)
+        health = 100
+    End Method
+End Type
+
+Type TRobot Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 255, 0, 0
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float)
+        Super.New(x, y)
+        health = 100
+    End Method
+End Type
+
+Type TBuilding Extends TEntity
+    Field enterable:Int
+
+    Method Draw()
+        SetColor 255, 255, 255
+        DrawRect x - 5, y - 5, 10, 10
+    End Method
+End Type
+
+Graphics 640, 480
+
+Local obj:TPlayer = New TPlayer(5, 7)
+
+Local obj2:TBuilding = New TBuilding(15, 3)
+
+' Draw all entities
+For Local ent:TEntity = EachIn entityList
+    ent.Draw()
+Next
+
+Flip
+
+WaitKey
+```
+
+As you can see above, the constructor for TEntity now looks like `New(x:Float, y:Float)`. This allows us to remove
+lines like `obj.x = 5` and instead call `New()` by adding those values as arguments to the constructor `New TPlayer(5, 7)`.
+Techniques such as this can greatly reduce the amount of code you end up having to write, and certainly makes your program
+a little tidier.
+
+In the above example, you may have noticed a new line in the TRobot and TPlayer constructors (`Super.New(x, y)`).
+What this does is call the `New()` method of the inherited Type, which in this case is TEntity's `New()` method. You
+could of course have added lines such as `Self.x = x`, but that defeats the elegance of having polymorphism in the
+first place.
+
+Of course, the use of a constructor here is only a small example of what you can do with constructors.
+Basically, any initialization code you want to be performed to new objects can be automated with constructors.
+
+In addition to constructors, there are also destructors. A destructor is done exactly like a constructor,
+except **Delete** is used instead of **New** as the Method's name. Destructors in BlitzMax can be used to perform
+some final steps before an object is deleted.
+
+> Since BlitzMax uses a garbage collection system to delete objects, don't rely on a destructor being called at any
+> specific time; the `Delete()` Method (destructor) will be called whenever the **garbage collector** gets around to it.
+
+## Static Methods & Fields
+
+As you know, a Type is a group of Methods and Fields. The value of Fields, and the operation of
+Methods depends entirely on which object you are working with. For example, `car1.x` may be different than
+`car2.x`. In OOP, you can also include what is called static methods and variables. A static variable is shared by
+all objects of that type. Static variables in Type's are really no different from a standard `Global` variable, but with the
+added benefit of keeping your code more object-oriented. For example, look at the example from the last
+section:
+
+```blitzmax
+SuperStrict
+
+Global entityList:TList = New TList
+
+Type TEntity
+    Field x:Float, y:Float
+
+    Method Draw() Abstract
+
+    Method New(x:Float, y:Float)
+        Self.x = x
+        Self.y = y
+        entityList.AddLast(Self)
+    End Method
+End Type
+
+Type TPlayer Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 0, 0, 255
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float)
+        Super.New(x, y)
+        health = 100
+    End Method
+End Type
+
+Type TRobot Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 255, 0, 0
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float)
+        Super.New(x, y)
+        health = 100
+    End Method
+End Type
+
+Type TBuilding Extends TEntity
+    Field enterable:Int
+
+    Method Draw()
+        SetColor 255, 255, 255
+        DrawRect x - 5, y - 5, 10, 10
+    End Method
+End Type
+
+Graphics 640, 480
+
+Local obj:TPlayer = New TPlayer(5, 7)
+
+Local obj2:TBuilding = New TBuilding(15, 3)
+
+' Draw all entities
+
+For Local ent:TEntity = EachIn entityList
+    ent.Draw()
+Next
+
+Flip
+
+WaitKey
+```
+Now, the “Global entityList:TList = New Tlist” line can be moved inside the TEntity Type:
+
+```blitzmax
+SuperStrict
+
+Type TEntity
+    Field x:Float, y:Float
+    Global entityList:TList = New TList
+
+    Method Draw() Abstract
+
+    Method New(x:Float, y:Float)
+        Self.x = x
+        Self.y = y
+        entityList.AddLast(Self)
+    End Method
+End Type
+
+Type TPlayer Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 0, 0, 255
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float)
+        Super.New(x, y)
+        health = 100
+    End Method
+End Type
+
+Type TRobot Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 255, 0, 0
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float)
+        Super.New(x, y)
+        health = 100
+    End Method
+
+End Type
+
+Type TBuilding Extends TEntity
+    Field enterable:Int
+
+    Method Draw()
+        SetColor 255, 255, 255
+        DrawRect x - 5, y - 5, 10, 10
+    End Method
+End Type
+
+Graphics 640, 480
+
+Local obj:TPlayer = New TPlayer(5, 7)
+
+Local obj2:TBuilding = New TBuilding(15, 3)
+
+' Draw all entities
+For Local ent:TEntity = EachIn TEntity.entityList
+    ent.Draw()
+Next
+
+Flip
+
+WaitKey
+```
+This is how static fields work in BlitzMax; instead of using the **Field** keyword to define the variable,
+**Global** is used. Below, you may notice the use of `TEntity.entityList` below. Since the static field **entityList** is
+shared by all TEntity's, you can even use "TEntity." to access it. This comes in handy especially when you don't
+know if there are any TEntity objects existing (yes - static fields can be accessed, even when there are no
+objects of their type in existence).
+
+Static fields are really just a nice way to categorize your Global variables, keeping everything object oriented.
+BlitzMax also supports static methods. Just as static fields are simply Global variables associated with a
+Type, static methods are simply Functions associated with a Type. Static method can be used for a variety of
+purposes, although the most common is a form of initialization. For example, you could make the functions
+CreatePlayer(), CreateRobot(), and CreateBuilding() to make it easier to initialize certain properties of objects
+when creating them (since the functions would allow you to include parameters, such as x, y, etc.):
+
+```blitzmax
+SuperStrict
+
+Type TEntity
+    Field x:Float, y:Float
+    Global entityList:TList = New TList
+
+    Method Draw() Abstract
+
+    Method New(x:Float, y:Float)
+        Self.x = x
+        Self.y = y
+        entityList.AddLast(Self)
+    End Method
+End Type
+
+Type TPlayer Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 0, 0, 255
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float, health:Int)
+        Super.New(x, y)
+        Self.health = health
+    End Method
+End Type
+
+Type TRobot Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 255, 0, 0
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float, health:Int)
+        Super.New(x, y)
+        Self.health = health
+    End Method
+End Type
+
+Type TBuilding Extends TEntity
+    Field enterable:Int
+
+    Method Draw()
+        SetColor 255, 255, 255
+        DrawRect x - 5, y - 5, 10, 10
+    End Method
+End Type
+
+Function CreatePlayer:TPlayer(x:Float, y:Float, health:Int)
+    Local ent:TPlayer = New TPlayer(x, y, health)
+    Return ent
+End Function
+
+Function CreateRobot:TRobot(x:Float, y:Float, health:Int)
+    Local ent: TRobot = New TRobot(x, y, health)
+    Return ent
+End Function
+
+Function CreateBuilding:TBuilding(x:Float, y:Float, enterable:Int)
+    Local ent:TBuilding = New TBuilding(x, y, enterable)
+    Return ent
+End Function
+
+Graphics 640, 480
+
+Local obj:TPlayer = CreatePlayer(5, 7, 100)
+Local obj2:TBuilding = CreateBuilding(15, 3, False)
+
+' Draw all entities
+
+For Local ent:TEntity = EachIn TEntity.entityList
+    ent.Draw()
+Next
+
+Flip
+
+WaitKey
+```
+As you can see, using Functions to initialize object has advantages, but doing it this way is not very
+object-oriented. Just like the `Global entityList` was moved into the Type definition, functions can be move in
+also. This way, all player-related code is now associated with the TPlayer object, all building-related code is now
+associated with the TBuilding object, etc.:
+
+```blitzmax
+SuperStrict
+
+Type TEntity
+    Field x:Float, y:Float
+    Global entityList:TList = New TList
+
+    Method Draw() Abstract
+
+    Method New()
+        entityList.AddLast(Self)
+    End Method
+End Type
+
+Type TPlayer Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 0, 0, 255
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float, health:Int)
+        Super.New(x, y)
+        Self.health = health
+    End Method
+
+    Function Create:TPlayer(x:Float, y:Float, health:Int)
+        Local ent:TPlayer = New TPlayer(x, y, health)
+        Return ent
+    End Function
+End Type
+
+Type TRobot Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 255, 0, 0
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float, health:Int)
+        Super.New(x, y)
+        Self.health = health
+    End Method
+
+    Function Create:TRobot(x:Float, y:Float, health:Int)
+        Local ent: TRobot = New TRobot(x, y, health)
+        Return ent
+    End Function
+End Type
+
+Type TBuilding Extends TEntity
+    Field enterable:Int
+
+    Method Draw()
+        SetColor 255, 255, 255
+        DrawRect x - 5, y - 5, 10, 10
+    End Method
+
+    Function Create:TBuilding(x:Float, y:Float, Enterable:Int)
+        Local ent:TBuilding = New TBuilding(x, y, enterable)
+        ent.enterable = enterable
+        Return ent
+    End Function
+End Type
+
+Graphics 640, 480
+
+Local obj:TPlayer = TPlayer.Create(5, 7, 100)
+Local obj2:TBuilding = TBuilding.Create(15, 3, False)
+
+' Draw all entities
+For Local ent:TEntity = EachIn TEntity.entityList
+    ent.Draw()
+Next
+
+Flip
+
+WaitKey
+```
+Generally, static methods and fields are useful when you want to perform a Type-related operation
+without regard to any specific object. Static fields provide globally applicable data regarding your custom Type,
+while static methods provide globally applicable code regarding your custom Type. The `Create()` functions in the
+previous example is a good demonstration of the most common use of static functions. However, there are
+many other uses. For example, the code which draws all entities in the example above could be made into a
+static method:
+
+```blitzmax
+SuperStrict
+
+Type TEntity
+    Field x:Float, y:Float
+    Global entityList:TList = New TList
+
+    Method Draw() Abstract
+
+    Method New()
+        entityList.AddLast(Self)
+    End Method
+
+    Function DrawAll()
+        For Local ent:TEntity = EachIn entityList
+            ent.Draw()
+        Next
+    End Function
+End Type
+
+Type TPlayer Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 0, 0, 255
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float, health:Int)
+        Self.New(x, y)
+        health = 100
+    End Method
+
+    Function Create:TPlayer(x:Float, y:Float, health:Int)
+        Local ent:TPlayer = New TPlayer(x, y, health)
+        Return ent
+    End Function
+End Type
+
+Type TRobot Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 255, 0, 0
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float, health:Int)
+        Super.New(x, y)
+        Self.health = health
+    End Method
+
+    Function Create:TRobot(x:Float, y:Float, health:Int)
+        Local ent: TRobot = New TRobot(x, y, health)
+        Return ent
+    End Function
+End Type
+
+Type TBuilding Extends TEntity
+    Field enterable:Int
+
+    Method Draw()
+        SetColor 255, 255, 255
+        DrawRect x - 5, y - 5, 10, 10
+    End Method
+
+    Function Create:TBuilding(x:Float, y:Float, enterable:Int)
+        Local ent:TBuilding = New TBuilding(x, y)
+        ent.enterable = enterable
+        Return ent
+    End Function
+End Type
+
+Graphics 640, 480
+
+Local obj:TPlayer = TPlayer.Create(5, 7, 100)
+Local obj2:TBuilding = TBuilding.Create(15, 3, False)
+
+' Draw all entities
+TEntity.DrawAll()
+
+Flip
+
+WaitKey
+```
+
+## Encapsulation & Access Modifiers
+
+By default, all of a Type's Fields and Methods are visible (or accessible) from everywhere. This is all great, but sometimes
+it would be nice if there were a way to "hide" specific implementation details of your Type, and only allow access to
+them through the Object's own methods. This is called "Encapsulation". By using access modifiers, you can do just that -
+hide functionality so that it is only visible from inside your Type.
+
+Let's take a look at our earlier TCounter example:
+
+```blitzmax
+SuperStrict
+
+Type TCounter
+    Field value:Int
+
+    Method Increment()
+        value :+ 1
+    End Method
+End Type
+```
+As it stands, if you were to use TCounter in your program, you could manipulate **value** in any way you wished:
+
+```blitzmax
+Local counter:TCounter = New TCounter
+
+counter.Increment()
+
+counter.value = 50
+```
+Here, we've overriden the current value of our counter, and set it to 50. To prevent this, we can tell BlitzMax to change
+the level of access to different parts of the Type, by utilising the **Private**, **Protected** and **Public** keywords.
+Let's now lock down our TCounter Type so that we can arbitrarily change its value:
+
+```blitzmax
+SuperStrict
+
+Type TCounter
+
+    Private
+    Field value:Int
+
+    Public
+    Method Increment()
+        value :+ 1
+    End Method
+End Type
+```
+With this minor change to the code, our previous attempt to modify the value (`counter.value = 50`) will no longer compile,
+warning us that **value** is not visible from that part of the program.
+
+All Type members declared after an access modifier inherit that level of privacy, which gives you a fair amount of flexibility
+in designing your Types with the levels of access that you desire. For example, if we neglected to add **Public** before
+`Method Increment()` then BlitzMax would assume that you wanted the `Increment()` method to be Private too. In which case,
+a call to `counter.Increment()` would not compile either for the same reasons as above.
+
+When considering how to apply access modifiers to Types using inheritance, you will find the **Protected** modifier useful.
+**Protected** allows access within a Type hierarchy but not outside of it. This means that a **Protected** member variable is
+only visible to its Type and any sub-Types, and not to your program in general. Let's have a look at an example of the
+different levels of accessibility we can play with:
+
+```blitzmax
+SuperStrict
+
+Type TEntity
+    Field x:Float, y:Float
+
+    Method Draw() Abstract
+
+    Method New(x:Float, y:Float)
+        Self.x = x
+        Self.y = y
+    End Method
+End Type
+
+Type TPlayer Extends TEntity
+    Field health:Int
+
+    Method Draw()
+        SetColor 0, 0, 255
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float, health:Int)
+        Super.New(x, y)
+        Self.health = health
+    End Method
+End Type
+```
+In the code above, all Type members are publicly accessible to all parts of your program. We'll now prevent direct access
+to the member variables:
+
+```blitzmax
+SuperStrict
+
+Type TEntity
+
+    Private
+    Field x:Float, y:Float
+
+    Public
+    Method Draw() Abstract
+
+    Method New(x:Float, y:Float)
+        Self.x = x
+        Self.y = y
+    End Method
+End Type
+
+Type TPlayer Extends TEntity
+
+    Private
+    Field health:Int
+
+    Public
+    Method Draw()
+        SetColor 0, 0, 255
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float, health:Int)
+        Super.New(x, y)
+        Self.health = health
+    End Method
+End Type
+```
+That looks great; access to **x**, **y** and **health** are now Private. But wait. If you attempt to compile this, BlitzMax
+will complain about the line `DrawOval x, y, 5, 5`, because TPlayer no longer has access to the Private members of TEntity.
+We can fix this by changing access to those members to **Protected**:
+
+```blitzmax
+SuperStrict
+
+Type TEntity
+
+    Protected
+    Field x:Float, y:Float
+
+    Public
+    Method Draw() Abstract
+
+    Method New(x:Float, y:Float)
+        Self.x = x
+        Self.y = y
+    End Method
+End Type
+
+Type TPlayer Extends TEntity
+
+    Private
+    Field health:Int
+
+    Public
+    Method Draw()
+        SetColor 0, 0, 255
+        DrawOval x, y, 5, 5
+    End Method
+
+    Method New(x:Float, y:Float, health:Int)
+        Super.New(x, y)
+        Self.health = health
+    End Method
+End Type
+```
+Now, Type members are only directly accessible from within the Types themselves.
+
+By encapsulating your Types, you can protect their integrity by limiting the access your program has to the internal
+data. This, in theory, can help to prevent subtle bugs by guaranteeing that data can only be changed through the "official"
+methods, and not by some old code directly modifying it from a shady part of your program.
+
+## Abstraction & Interfaces
+
+Abstraction and Encapsulation are connected in terms hiding away the implementation details of your custom types.
+BlitzMax supports the idea of abstract types and methods. An abstract method is a method that is declared, but contains
+no implementation or body:
+
+```blitzmax
+Method Sleep(time:Int) Abstract
+```
+An abstract type is one which is either explicitly declared abstract using the **Abstract** keyword, or is a type that
+has an abstract method.
+
+You cannot create an instance of an abstract type, but you can **Extend** it with another custom type and implement any
+abstract methods as required. For example :
+
+```blitzmax
+SuperStrict
+
+Local obj:TGraphicObject = New TGraphicObject
+
+Type TGraphicObject Abstract
+
+    Field x:Float
+    Field y:Float
+
+    Method Draw() Abstract
+
+End Type
+```
+This example will fail to compile with the error "*Cannot create instance of an abstract class.*", because the method
+**Draw** has not been implemented. We need to extend TGraphicObject with a new type that will implement the **Draw** method :
+
+```blitzmax
+SuperStrict
+
+Local obj:TGraphicObject = New TRectangle
+
+obj.Draw()
+
+Type TGraphicObject Abstract
+
+    Field x:Float
+    Field y:Float
+
+    Method Draw() Abstract
+
+End Type
+
+Type TRectangle Extends TGraphicObject
+
+    Field w:Float
+    Field h:Float
+
+    Method Draw()
+
+        Print "Drawing a rectangle"
+
+    End Method
+
+End Type
+```
+Here, a non-abstract **TRectangle** type extends from TGraphicObject and implements the **Draw** method. We can now
+create an instance of **TRectangle**, and when we run the program it outputs "`Drawing a rectangle`".
+
+## Interface
+
+An interface contains definitions for a group of related methods that a type can implement. This is similar in some respect
+to an abstract type, except that an abstract type may implement as for or as many methods as it needs.
+
+By using interfaces, you may include behaviour from multiple sources in your custom type. This is useful, because BlitzMax
+doesn't support multiple inheritance of types (i.e. a type can only **Extend** a single type, but it can **Implement**
+many interfaces).
+
+You define an interface with the **Interface** keyword :
+
+```blitzmax
+Interface ISerializable
+
+    Method Serialize:String()
+
+End Interface
+```
+Any type that implements **ISerializable** must contain a definition for the **Serialize** method that matches the parameters and return
+type. As a result, you guarantee that any type that implements **ISerializable** will contain an **Serialize** method.
+
+Returning to the graphic object example above, let's say that rectangles should also be serializable. We can redefine the
+**TRectangle** type like this :
+
+```blitzmax
+Type TRectangle Extends TGraphicObject Implements ISerializable
+```
+Which states that a **TRectangle** is contracted to implement both the abstract methods declared by TGraphicObject and those
+of ISerializable. This amount of flexibility with our custom types allows us to use a specific type in completely different
+ways. For example, **TGraphicObject** has no concept of serialization, but our subclass of it can be serialized because
+it implements the appropriate interface :
+
+```blitzmax
+SuperStrict
+
+Local obj:TRectangle = New TRectangle
+
+Draw(obj)
+Serialize(obj)
+
+' draw an object
+Function Draw(obj:TGraphicObject)
+    obj.Draw()
+End Function
+
+' serialize an object
+Function Serialize(obj:ISerializable)
+    Print obj.Serialize()
+End Function
+
+Type TGraphicObject Abstract
+
+    Field x:Float
+    Field y:Float
+
+    Method Draw() Abstract
+
+End Type
+
+Type TRectangle Extends TGraphicObject Implements ISerializable
+
+    Field w:Float
+    Field h:Float
+
+    Method Draw()
+
+        Print "Drawing a rectangle"
+
+    End Method
+
+    Method Serialize:String()
+        Return x + ", " + y + ", " + w + ", " + h
+    End Method
+
+End Type
+
+Interface ISerializable
+
+    Method Serialize:String()
+
+End Interface
+```
+The ideas behind abstraction and interfaces may appear complicated at first, but can be very powerful tools when applied
+correctly.
+
+
+## Operator Overloading
+
+It is possible to add to and change the way operators (like `+` and `-`) work for custom types. Normally, for example,
+you cannot add two object together:
+
+```blitzmax
+SuperStrict
+
+Local a:TCalc = New TCalc(10)
+Local b:TCalc = New TCalc(15)
+
+' add two objects together
+Local c:TCalc = a + b
+
+Type TCalc
+
+    Field value:Int
+
+    Method New(value:Int)
+        Self.value = value
+    End Method
+
+End Type
+```
+It will generate a compiler error, "*Operator + cannot be used with Objects.*"
+
+Previously, in order to achieve the addition of two objects, you would need to have implemented your own "Add" method,
+and used in the following way:
+
+```blitzmax
+SuperStrict
+
+Local a:TCalc = New TCalc(10)
+Local b:TCalc = New TCalc(15)
+
+' add two objects together
+Local c:TCalc = a.Add(b)
+
+Print c.value
+
+Type TCalc
+
+    Field value:Int
+
+    Method New(value:Int)
+        Self.value = value
+    End Method
+
+    Method Add:TCalc(other:TCalc)
+        Return New TCalc(value + other.value)
+    End Method
+
+End Type
+```
+Of course, there is nothing wrong with your program filled with code like `a.Add(b)`, but it may not seem as clear or
+easy to read as it does when adding two Ints together, for example `n + j`
+
+With *operator overloading* you now have the ability to write your code as "a + b".
+
+Although you still need to write the equivalent of the "Add" method above, the main advantage is that you can *use* it in
+an arguably cleaner way in your program. Operator overloading is "syntactic sugar", in that it can make your code easier to
+read, perhaps therefore easier maintain and spot bugs.
+
+To overload an operator, we use a specially named method, called **Operator**, followed by the operator symbol we are
+overloading (for example, `+`), and then the rest of the method as normal.
+
+To add an addition overload for our example above, we could write the following method :
+
+```blitzmax
+Method Operator+:TCalc(other:TCalc)
+    Return New TCalc(value + other.value)
+End Method
+```
+As you can see, apart from the method name, `Operator+`, the rest of the method is written in exactly the same way as
+the **Add** method in the previous example. The method declares a return type of TCalc (`:TCalc`) and a parameter of
+the type TCalc (`other:TCalc`).
+
+Now we are free to write `a + b` to add the two TCalc objects together, just as we attempted to do in the first
+example:
+
+```blitzmax
+SuperStrict
+
+Local a:TCalc = New TCalc(10)
+Local b:TCalc = New TCalc(15)
+
+' add two objects together
+Local c:TCalc = a + b
+
+Print c.value
+
+Type TCalc
+
+    Field value:Int
+
+    Method New(value:Int)
+        Self.value = value
+    End Method
+
+    Method Operator+:TCalc(other:TCalc)
+        Return New TCalc(value + other.value)
+    End Method
+
+End Type
+```
+When you run it this time, the result of `c.value` should be output as `25`, which of course is `10 + 15`.
+
+The supported operators for overloading are `*` `/` `+` `-` `&` `|` `~` `:*` `:/` `:+` `:-` `:&` `:|`
+`:~` `<` `>` `<=` `>=` `=` `<>` `mod` `shl` `shr` `:mod` `:shl` `:shr`,
+where `=` is the equality symbol rather than the assignment symbol, eg. `If a = b Then`.
+
+Now, you aren't just limited to object/object expressions, you can basically have operator overloads for object/anything,
+including primitive types like Int and Double. In our above example, we want to add an overload for multiplying by an Int,
+as well as one for determining if our object value is equal to another :
+
+```blitzmax
+Method Operator:*(value:Int)
+    Self.value :* value
+End Method
+```
+Here we implemented the overloaded operator as `:*` which is the symbol for *multiplication assignment*. You'll notice we don't
+declare a return type, because generally `:*` is used as a statement rather than an expression.
+
+For equality, we'll create the following overload :
+
+```blitzmax
+Method Operator=:Int(other:TCalc)
+    Return value = other.value
+End Method
+```
+This time we declare a return type of **Int** (for True or False), and inside the method we perform the actual comparison
+test.
+
+Here's our program with the new methods added:
+
+```blitzmax
+SuperStrict
+
+Local a:TCalc = New TCalc(10)
+Local b:TCalc = New TCalc(15)
+
+' add two objects together
+Local c:TCalc = a + b
+
+' multiply by 3
+c :* 3
+
+Print c.value
+
+' 1 if True, 0 if False
+Print c = b
+
+Type TCalc
+
+    Field value:Int
+
+    Method New(value:Int)
+        Self.value = value
+    End Method
+
+    Method Operator+:TCalc(other:TCalc)
+        Return New TCalc(value + other.value)
+    End Method
+
+    Method Operator:*(value:Int)
+        Self.value :* value
+    End Method
+
+    Method Operator=:Int(other:TCalc)
+        Return value = other.value
+    End Method
+
+End Type
+```
+As you can see, using overloaded operators with your custom types can certainly make the code less wordy, and hopefully
+easier for you to read.
+
+>    Operator overloading allows you to define how the operator works in any way you want, but you need to be careful with
+>    that freedom.
+>
+>    Let's take another look at the addition overload from before :
+>
+>    `Method Operator+:TCalc(other:TCalc)`
+>    `    Return New TCalc(value + other.value)`
+>    `End Method`
+>
+>    It's pretty clear that this `+` overload adds the two object values together.
+>    However, we could change it to use the following code instead, where we replace the addition with a subtraction :
+>
+>    `Method Operator+:TCalc(other:TCalc)`
+>    `    Return New TCalc(value - other.value)`
+>    `End Method`
+>
+>    Although the code is technically correct, the outcome of the result is confusing, rather difficult to understand and probably
+>    hard to debug.
+>
+>    It is your responsibility to use operator overloading properly and in a consistent way, otherwise you are lining yourself
+>    up for no end of problems in the future (when you've completely forgotten that your addition actually subtracts!)
+
+And remember, that operator overloading only works for custom types. It does not work for BlitzMax's built in primitive
+types like Int or Double. That is, you can't change the way `3 + 5` works, but you can change the way `MyObject + 5`
+works.
+
+## Generics
+
+Generics adds improved type-safety to your BlitzMax applications by ensuring that a your code is working on the right
+kind of data, and throwing a compile-time error if it isn't. A compile-time error is a much better time for your program
+to fail than when it's busy running.
+
+<TODO>
+
+
+
+## Summary
+
+Hopefully, by now you will have a good understanding of object-orient programming techniques, and
+how to use them. Object-oriented programming is an extremely useful tool which makes even the most complex
+programs easier to make than ever. The entire purpose of OOP is to allow you take your mind off the inner
+working of your program (the parts you already completed), and lets you focus on more high-level tasks, as you
+continue to create your program.

+ 655 - 0
docs/tutorials/tcp_tutorial.md

@@ -0,0 +1,655 @@
+---
+id: tcp_tutorial
+title: TCP Socket Programming
+sidebar_label: TCP Socket Programming
+---
+
+## Introduction
+
+If you haven't read it yet, see the [Introduction to Network Programming](network_programming.md) tutorial for a brief
+introduction to using Sockets in BlitzMax.
+
+## Connecting to a Server
+
+Connecting to a remote server requires 2 things, an IP address and a port number. This is the server address information.
+If you remember from earlier, we created a `TAddrInfo` object in order to create our socket the way we want.
+
+We can continue to use this "hint" to find out about the remote server we want to connect to, and for our example we'll
+use "www.google.com".
+
+### Obtaining Address Information
+
+BlitzMax has a helpful function `AddrInfo` which will get us an array of all the possible addresses and ports that apply
+to our "hint" :
+
+```blitzmax
+AddrInfo:TAddrInfo[](host:String, service:String, hints:TAddrInfo)
+```
+The array of `TAddrInfo` objects will contain IP addresses, port numbers and other useful bits of information about the
+remote server, all of which will come in handy later.
+
+For our connection to the webserver at "www.google.com", we can try port 80, which is the standard port for HTTP connections.
+As well as accepting port numbers, the `service` argument can also include the names of specific services, like for example
+"http".
+
+When applied to our example client, it looks like this:
+
+```blitzmax
+Local hints:TAddrInfo = New TAddrInfo(AF_INET_, SOCK_STREAM_)
+
+Local socket:TSocket = TSocket.Create(hints)
+
+If Not socket Then
+    Print "Unable to create socket."
+    End
+End If
+
+Print "Socket Created"
+
+Local host:String = "www.google.com"
+Local port:Int = 80
+
+Local infos:TAddrInfo[] = AddrInfo(host, port, hints)
+
+If Not infos Then
+    Print "Hostname could not be resolved."
+    End
+End If
+
+' we'll try the first one
+Local info:TAddrInfo = infos[0]
+
+Print "IP address of " + host + " is " + info.HostIp()
+```
+Note again that we check that `AddrInfo` actually returned something, before we carry on. It's good practice to handle
+errors at every opportunity.
+
+### Making a Connection
+
+Now that we have everything we need, we can now attempt to connect to the remote server with our socket by calling the
+`Connect` method:
+
+```blitzmax
+Connect:Int( addrInfo:TAddrInfo )
+```
+The `Connect` method takes a `TAddrInfo` object as an argument, returning True if the connection succeeded. As we
+already have a valid `TAddrInfo` describing the remote server (including the protocol, socket type, etc to use) we can
+simply pass that in and wait for a successful response:
+
+```blitzmax
+Local hints:TAddrInfo = New TAddrInfo(AF_INET_, SOCK_STREAM_)
+
+Local socket:TSocket = TSocket.Create(hints)
+
+If Not socket Then
+    Print "Unable to create socket."
+    End
+End If
+
+Print "Socket Created"
+
+Local host:String = "www.google.com"
+Local port:Int = 80
+
+Local infos:TAddrInfo[] = AddrInfo(host, port, hints)
+
+If Not infos Then
+    Print "Hostname could not be resolved."
+    End
+End If
+
+' we'll try the first one
+Local info:TAddrInfo = infos[0]
+
+Print "IP address of " + host + " is " + info.HostIp()
+
+If Not socket.Connect(info) Then
+    Print "Error connecting to remote"
+    End
+End If
+
+Print "Socket connected to " + host + " on ip " + socket.RemoteIp()
+```
+If we run the program, we will see something like the following output ::
+
+    Executing:untitled1.exe
+    Socket Created
+    IP address of www.google.com is 172.217.23.36
+    Socket connected to www.google.com on ip 172.217.23.36
+
+
+> The concept of connections apply to SOCK_STREAM/TCP types of sockets, where a connection means a reliable stream
+> of data, such that there can be multiple such streams each having communication of its own. Think of this as a pipe
+> which is not interfered by data from other pipes. Another important property of stream connections is that packets
+> have an "order" or "sequence".
+
+> Other sockets like UDP , ICMP , ARP don't have a concept of "connection". These are non-connection based
+> communication protocols, which means you keep sending or receiving packets from anybody and everybody.
+
+## Sending Data
+
+The method `Send` will send data to the remote server.
+
+```blitzmax
+Send:Size_T( buf:Byte Ptr, count:Size_T, flags:Int = 0 )
+```
+`buf` is a block of data to send over the socket, and `count` is the size in bytes of that data.
+
+We'll now send some text to google.com, in this case "GET / HTTP/1.1~r~n~r~n", which is an HTTP command for fetching the
+root page of a website:
+
+```blitzmax
+Local hints:TAddrInfo = New TAddrInfo(AF_INET_, SOCK_STREAM_)
+
+Local socket:TSocket = TSocket.Create(hints)
+
+If Not socket Then
+    Print "Unable to create socket."
+    End
+End If
+
+Print "Socket Created"
+
+Local host:String = "www.google.com"
+Local port:Int = 80
+
+Local infos:TAddrInfo[] = AddrInfo(host, port, hints)
+
+If Not infos Then
+    Print "Hostname could not be resolved."
+    End
+End If
+
+' we'll try the first one
+Local info:TAddrInfo = infos[0]
+
+Print "IP address of " + host + " is " + info.HostIp()
+
+If Not socket.Connect(info) Then
+    Print "Error connecting to remote"
+    End
+End If
+
+Print "Socket connected to " + host + " on ip " + socket.RemoteIp()
+
+' send some data to the remote server
+Local message:String = "GET / HTTP/1.1~r~n~r~n"
+
+If Not socket.Send(message, Size_T(message.length), 0) Then
+    Print "Send failed."
+    End
+End If
+
+Print "Send successful"
+```
+
+## Receiving Data
+
+Once you've sent some data, you may wish to process any responses from the remote system. To do this, you can call the
+`Recv` method:
+
+```blitzmax
+Recv:Size_T( buf:Byte Ptr, count:Size_T, flags:int = 0 )
+```
+`Recv` has a similar set of parameters as `Send`. However, the buffer that you pass into this method will be filled
+with data received from the remote server:
+
+```blitzmax
+Local hints:TAddrInfo = New TAddrInfo(AF_INET_, SOCK_STREAM_)
+
+Local socket:TSocket = TSocket.Create(hints)
+
+If Not socket Then
+    Print "Unable to create socket."
+    End
+End If
+
+Print "Socket Created"
+
+Local host:String = "www.google.com"
+Local port:Int = 80
+
+Local infos:TAddrInfo[] = AddrInfo(host, port, hints)
+
+If Not infos Then
+    Print "Hostname could not be resolved."
+    End
+End If
+
+' we'll try the first one
+Local info:TAddrInfo = infos[0]
+
+Print "IP address of " + host + " is " + info.HostIp()
+
+If Not socket.Connect(info) Then
+    Print "Error connecting to remote"
+    End
+End If
+
+Print "Socket connected to " + host + " on ip " + socket.RemoteIp()
+
+' send some data to the remote server
+Local message:String = "GET / HTTP/1.1~r~n~r~n"
+
+If Not socket.Send(message, Size_T(message.length), 0) Then
+    Print "Send failed."
+    End
+End If
+
+Print "Send successful"
+
+' now receive some data
+Local buf:Byte Ptr[1024]
+Local dataLen:Size_T = socket.Recv(buf, 1024)
+
+If Not dataLen Then
+    Print "No data"
+    End
+End If
+
+Print String.FromUTF8String(buf)
+```
+
+And here's the result of running the above program ::
+
+    Executing:untitled1.exe
+    Socket Created
+    IP address of www.google.com is 172.217.23.36
+    Socket connected to www.google.com on ip 172.217.23.36
+    Send successful
+    HTTP/1.1 302 Found
+    Cache-Control: private
+    Content-Type: text/html; charset=UTF-8
+    Referrer-Policy: no-referrer
+    Location: http://www.google.co.uk/
+    Content-Length: 261
+    Date: Tue, 18 Jun 2017 19:20:40 GMT
+
+    <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
+    <TITLE>302 Moved</TITLE></HEAD><BODY>
+    <H1>302 Moved</H1>
+    The document has moved
+    <A HREF="http://www.google.co.uk/">here</A>.
+    </BODY></HTML>
+
+As you can see, it doesn't take too much work to connect to and then communicate with a server.
+
+When you are done with the socket, don't forget to close it!
+
+```blitzmax
+socket.Close()
+```
+Otherwise you risk leaving socket connections open for undetermined amounts of time, which is not a resource-friendly
+thing to do.
+
+### Recap
+
+So far we have seen how to
+
+* Create a socket
+* Connect to a remote server
+* Send some data
+* Receive a reply
+
+It's useful to know that your web browser also goes through the same processes when you open "www.google.com". This kind
+of socket activity represents a *client*, that is, a system which connects to a remote system.
+
+The other kind of socket activity is called a *server*, which is a system that uses sockets to receive incoming connections
+and provides them with data.
+
+## Server Programming
+
+Setting up a server socket is a little more involved than for a client, as it requires us to perform some extra steps:
+
+* Open a socket
+* Bind to an address and port
+* Listen for incoming connections
+* Accept connections
+* Read/Send
+
+We'll skip opening a socket, as we've covered this earlier.
+
+### Bind a Socket
+
+The `Bind` method assigns a socket to an address. When a socket is initially created, it is only given socket family,
+but not an assigned address. The socket must be bound to an address before the socket will accept connections to other
+hosts.
+
+```blitzmax
+Bind:Int( info:TAddrInfo )
+```
+The `info` argument, like from our client implementation, is acquired from the call to `AddrInfo`. This object contains
+all the information we require (address, port, protocol, etc) to bind the socket:
+
+```blitzmax
+Local hints:TAddrInfo = New TAddrInfo(AF_INET_, SOCK_STREAM_)
+
+Local socket:TSocket = TSocket.Create(hints)
+
+If Not socket Then
+    Print "Unable to create socket."
+    End
+End If
+
+Print "Socket Created"
+
+Local host:String = Null ' symbolic name meaning all available interfaces
+Local port:Int = 4444 ' An arbitrary non-privilaged port
+
+Local infos:TAddrInfo[] = AddrInfo(host, port, hints)
+
+If Not infos Then
+    Print "Hostname could not be resolved."
+    End
+End If
+
+' we'll try the first one
+Local info:TAddrInfo = infos[0]
+Print "Host address is " + info.HostIp()
+
+If Not socket.Bind(info) Then
+    Print "Bind failed."
+    End
+End If
+
+Print "Socket bind complete"
+```
+Now that the socket id bound to an address, it's time to make the socket listen to incoming connections. By binding to
+a specific IP address and port number we ensure that all incoming data which is directed towards this port number is
+received by this application.
+
+### Listen for Incoming Connections
+
+
+To react to connections, the socket needs to be put into listening mode. This is accomplished by calling `Listen`:
+
+```blitzmax
+Listen:Int( backlog:Int )
+```
+The `backlog` parameter represents the number of pending connections that can be queued up at any one time. Any further
+connections over this value will be rejected.
+
+### Accept Connection
+
+The next step is to accept a connection:
+
+```blitzmax
+Accept:TSocket( timeout:Int = -1, storage:TSockaddrStorage = Null )
+```
+The `Accept` method creates a new socket for each connection and removes the connection from the listen queue. When the
+argument `timeout` is set to the default, -1, the call to `Accept` will block until there is a connection from a client
+socket.
+Any other value for `timeout` will result in a non-blocking mode where the method will wait up to the desired
+amount of time before either timing out and returning Null, or by accepting a valid client socket.
+
+If a `TSockaddrStorage` object is passed in as the second argument, it is filled in with the address of the connecting
+socket.
+
+```blitzmax
+Local hints:TAddrInfo = New TAddrInfo(AF_INET_, SOCK_STREAM_)
+
+Local socket:TSocket = TSocket.Create(hints)
+
+If Not socket Then
+    Print "Unable to create socket."
+    End
+End If
+
+Print "Socket Created"
+
+Local host:String = Null ' symbolic name meaning all available interfaces
+Local port:Int = 4444 ' An arbitrary non-privilaged port
+
+Local infos:TAddrInfo[] = AddrInfo(host, port, hints)
+
+If Not infos Then
+    Print "Hostname could not be resolved."
+    End
+End If
+
+' we'll try the first one
+Local info:TAddrInfo = infos[0]
+Print "Host address is " + info.HostIp()
+
+If Not socket.Bind(info) Then
+    Print "Bind failed."
+    End
+End If
+
+Print "Socket bind complete"
+
+socket.Listen(10)
+Print "Socket now listening"
+
+' wait to accept a connection - blocking call
+Local client:TSocket = socket.Accept()
+
+Print "Connected with " + client.RemoteIp() + ":" + client.RemotePort()
+```
+On running the server program you should see something like ::
+
+    Executing:untitled1.exe
+    Socket Created
+    Host address is 127.0.0.1
+    Socket bind complete
+    Socket now listening
+
+At this point the server is waiting for incoming connections on port 4444. We can test the connection by attempting to
+use a telnet client on it in a different window ::
+
+    telnet 127.0.0.1 4444
+
+This should result in the server output displaying some new information at the end ::
+
+    Connected with 127.0.0.1:23488
+
+As we can see, the client connected successfully to the server!
+
+We accepted the incoming connection but closed it immediately. To be a little more productive we can provide a little
+interaction by replying to anything that the client sends over our connection.
+
+To enable this, we first wait to receive some data, before sending it back to the client like an echo:
+
+```blitzmax
+Local hints:TAddrInfo = New TAddrInfo(AF_INET_, SOCK_STREAM_)
+
+Local socket:TSocket = TSocket.Create(hints)
+
+If Not socket Then
+    Print "Unable to create socket."
+    End
+End If
+
+Print "Socket Created"
+
+Local host:String = Null ' symbolic name meaning all available interfaces
+Local port:Int = 4444 ' An arbitrary non-privilaged port
+
+Local infos:TAddrInfo[] = AddrInfo(host, port, hints)
+
+If Not infos Then
+    Print "Hostname could not be resolved."
+    End
+End If
+
+' we'll try the first one
+Local info:TAddrInfo = infos[0]
+Print "Host address is " + info.HostIp()
+
+If Not socket.Bind(info) Then
+    Print "Bind failed."
+    End
+End If
+
+Print "Socket bind complete"
+
+socket.Listen(10)
+Print "Socket now listening"
+
+' wait to accept a connection - blocking call
+Local client:TSocket = socket.Accept()
+
+Print "Connected with " + client.RemoteIp() + ":" + client.RemotePort()
+
+' have a chat with the client
+Local data:Byte[1024]
+Local size:Size_T = client.Recv(data, Size_T(data.length))
+
+client.Send(data, size)
+
+client.Close()
+socket.Close()
+```
+The result of this can be seen on the client side output ::
+
+    $ telnet 127.0.0.1 4444
+    Trying 127.0.0.1...
+    Connected to 127.0.0.1.
+    Escape character is '^]'.
+    Hello
+    Hello
+    Connection closed by foreign host.
+
+> This example doesn't work so well with the standard Windows telnet client. On Linux/OSX systems it tends to work
+> as in the example output above.
+
+Although our test was successful, normal servers don't shutdown after the first connection, and continue to run, serving
+multiple client requests over a period of time. So we need to keep our server running.
+The simplest way to achieve this is to put the call to `Accept` in a loop so that it can keep receiving connections
+indefinitely.
+
+### Live Server
+
+So, a live server will always be running, waiting for new connection. But how to manage these multiple connections?
+
+One way to achieve this is to process each client connection separately in a new thread, which is what we'll do now.
+To keep things simple, we will use a thread pool to take care of the thread stuff.
+
+When a client connects to the server, a "task" will be created, executed by the thread pool, and will be responsible for
+handling messages to and from the client. When the client types "enter" twice in a row, the server will close the
+connection, freeing up the socket and the thread for future connections.
+
+Once the connection is handed over to the thread task, the server returns to accepting more connections.
+
+```blitzmax
+Local hints:TAddrInfo = New TAddrInfo(AF_INET_, SOCK_STREAM_)
+
+Local socket:TSocket = TSocket.Create(hints)
+
+If Not socket Then
+    Print "Unable to create socket."
+    End
+End If
+
+Print "Socket Created"
+
+Local host:String = Null ' symbolic name meaning all available interfaces
+Local port:Int = 4444 ' An arbitrary non-privilaged port
+
+Local infos:TAddrInfo[] = AddrInfo(host, port, hints)
+
+If Not infos Then
+    Print "Hostname could not be resolved."
+    End
+End If
+
+' we'll try the first one
+Local info:TAddrInfo = infos[0]
+Print "Host address is " + info.HostIp()
+
+If Not socket.Bind(info) Then
+    Print "Bind failed."
+    End
+End If
+
+Print "Socket bind complete"
+
+socket.Listen(10)
+Print "Socket now listening"
+
+' set up server thread pool
+Local pool:TThreadPoolExecutor = TThreadPoolExecutor.newFixedThreadPool(4)
+
+While True
+
+    ' wait to accept a connection - blocking call
+    Local client:TSocket = socket.Accept()
+
+    Print "Connected with " + client.RemoteIp() + ":" + client.RemotePort()
+
+    pool.execute(New TServerTask(client))
+
+Wend
+
+pool.shutdown()
+socket.Close()
+
+
+' helper task for processing client connections
+Type TServerTask Extends TRunnable
+
+    Field client:TSocket
+
+    Method New(client:TSocket)
+        Self.client = client
+    End Method
+
+    Method run()
+
+        Local s:String = "Welcome to the server. Type something and hit enter (Double enter to quit)~n~n"
+        client.Send(s, Size_T(s.length))
+
+        Local last:String
+
+        ' loop forever, or until the user types enter twice.
+        While True
+
+            Local data:Byte[1024]
+            Local size:Size_T = client.Recv(data, Size_T(data.length)) ' blocking call
+
+            ' no more data from client!
+            If Not size Then
+                Exit
+            End If
+
+            Local msg:String = String.FromCString(data)
+
+            ' close the connection if the client hits enter twice in a row
+            If (last = "~n" Or last = "~r~n") And (msg = "~n" Or msg = "~r~n")  Then
+                Exit
+            End If
+
+            last = msg
+
+            Local reply:String = "OK..." + msg
+            client.Send(reply, Size_T(reply.length))
+
+        Wend
+
+        Print "Closing connection with " + client.RemoteIp() + ":" + client.RemotePort()
+
+        client.Close()
+    End Method
+
+End Type
+```
+The following server output shows a typical session of clients connecting and disconnecting ::
+
+    Executing:untitled1.exe
+    Socket Created
+    Host address is 127.0.0.1
+    Socket bind complete
+    Socket now listening
+    Connected with 192.168.1.65:34024
+    Connected with 127.0.0.1:38632
+    Closing connection with 192.168.1.65:34024
+    Closing connection with 127.0.0.1:38632
+    Connected with 127.0.0.1:44264
+    Connected with 127.0.0.1:45800
+    Closing connection with 127.0.0.1:44264
+    Closing connection with 127.0.0.1:45800
+
+## Conclusion
+
+And that wraps up our introduction to TCP sockets. Hopefully you'll be able to use some of what you've learned here in
+your own projects now!

+ 193 - 0
website/README.md

@@ -0,0 +1,193 @@
+This website was created with [Docusaurus](https://docusaurus.io/).
+
+# What's In This Document
+
+* [Get Started in 5 Minutes](#get-started-in-5-minutes)
+* [Directory Structure](#directory-structure)
+* [Editing Content](#editing-content)
+* [Adding Content](#adding-content)
+* [Full Documentation](#full-documentation)
+
+# Get Started in 5 Minutes
+
+1. Make sure all the dependencies for the website are installed:
+
+```sh
+# Install dependencies
+$ yarn
+```
+2. Run your dev server:
+
+```sh
+# Start the site
+$ yarn start
+```
+
+## Directory Structure
+
+Your project file structure should look something like this
+
+```
+my-docusaurus/
+  docs/
+    doc-1.md
+    doc-2.md
+    doc-3.md
+  website/
+    blog/
+      2016-3-11-oldest-post.md
+      2017-10-24-newest-post.md
+    core/
+    node_modules/
+    pages/
+    static/
+      css/
+      img/
+    package.json
+    sidebar.json
+    siteConfig.js
+```
+
+# Editing Content
+
+## Editing an existing docs page
+
+Edit docs by navigating to `docs/` and editing the corresponding document:
+
+`docs/doc-to-be-edited.md`
+
+```markdown
+---
+id: page-needs-edit
+title: This Doc Needs To Be Edited
+---
+
+Edit me...
+```
+
+For more information about docs, click [here](https://docusaurus.io/docs/en/navigation)
+
+## Editing an existing blog post
+
+Edit blog posts by navigating to `website/blog` and editing the corresponding post:
+
+`website/blog/post-to-be-edited.md`
+```markdown
+---
+id: post-needs-edit
+title: This Blog Post Needs To Be Edited
+---
+
+Edit me...
+```
+
+For more information about blog posts, click [here](https://docusaurus.io/docs/en/adding-blog)
+
+# Adding Content
+
+## Adding a new docs page to an existing sidebar
+
+1. Create the doc as a new markdown file in `/docs`, example `docs/newly-created-doc.md`:
+
+```md
+---
+id: newly-created-doc
+title: This Doc Needs To Be Edited
+---
+
+My new content here..
+```
+
+1. Refer to that doc's ID in an existing sidebar in `website/sidebar.json`:
+
+```javascript
+// Add newly-created-doc to the Getting Started category of docs
+{
+  "docs": {
+    "Getting Started": [
+      "quick-start",
+      "newly-created-doc" // new doc here
+    ],
+    ...
+  },
+  ...
+}
+```
+
+For more information about adding new docs, click [here](https://docusaurus.io/docs/en/navigation)
+
+## Adding a new blog post
+
+1. Make sure there is a header link to your blog in `website/siteConfig.js`:
+
+`website/siteConfig.js`
+```javascript
+headerLinks: [
+    ...
+    { blog: true, label: 'Blog' },
+    ...
+]
+```
+
+2. Create the blog post with the format `YYYY-MM-DD-My-Blog-Post-Title.md` in `website/blog`:
+
+`website/blog/2018-05-21-New-Blog-Post.md`
+
+```markdown
+---
+author: Frank Li
+authorURL: https://twitter.com/foobarbaz
+authorFBID: 503283835
+title: New Blog Post
+---
+
+Lorem Ipsum...
+```
+
+For more information about blog posts, click [here](https://docusaurus.io/docs/en/adding-blog)
+
+## Adding items to your site's top navigation bar
+
+1. Add links to docs, custom pages or external links by editing the headerLinks field of `website/siteConfig.js`:
+
+`website/siteConfig.js`
+```javascript
+{
+  headerLinks: [
+    ...
+    /* you can add docs */
+    { doc: 'my-examples', label: 'Examples' },
+    /* you can add custom pages */
+    { page: 'help', label: 'Help' },
+    /* you can add external links */
+    { href: 'https://github.com/facebook/Docusaurus', label: 'GitHub' },
+    ...
+  ],
+  ...
+}
+```
+
+For more information about the navigation bar, click [here](https://docusaurus.io/docs/en/navigation)
+
+## Adding custom pages
+
+1. Docusaurus uses React components to build pages. The components are saved as .js files in `website/pages/en`:
+1. If you want your page to show up in your navigation header, you will need to update `website/siteConfig.js` to add to the `headerLinks` element:
+
+`website/siteConfig.js`
+```javascript
+{
+  headerLinks: [
+    ...
+    { page: 'my-new-custom-page', label: 'My New Custom Page' },
+    ...
+  ],
+  ...
+}
+```
+
+For more information about custom pages, click [here](https://docusaurus.io/docs/en/custom-pages).
+
+# Full Documentation
+
+Full documentation can be found on the [website](https://docusaurus.io/).

+ 82 - 0
website/core/Footer.js

@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2017-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+const React = require('react');
+
+class Footer extends React.Component {
+  docUrl(doc, language) {
+    const baseUrl = this.props.config.baseUrl;
+    return `${baseUrl}docs/${language ? `${language}/` : ''}${doc}`;
+  }
+
+  pageUrl(doc, language) {
+    const baseUrl = this.props.config.baseUrl;
+    return baseUrl + (language ? `${language}/` : '') + doc;
+  }
+
+  render() {
+    return (
+      <footer className="nav-footer" id="footer">
+        <section className="sitemap">
+          <a href={this.props.config.baseUrl} className="nav-home">
+            {this.props.config.footerIcon && (
+              <img
+                src={this.props.config.baseUrl + this.props.config.footerIcon}
+                alt={this.props.config.title}
+                width="66"
+                height="58"
+              />
+            )}
+          </a>
+          <div>
+            <h5>Docs</h5>
+            <a href={this.docUrl('setup/get_started', this.props.language)}>
+              Getting Started
+            </a>
+            <a href={this.pageUrl('downloads', this.props.language)}>
+              Downloads
+            </a>
+              <a href={this.docUrl('site/about', this.props.language)}>
+                  About
+              </a>
+          </div>
+          <div>
+            <h5>Community</h5>
+            <a href={this.docUrl('community/resources', this.props.language)}>
+              Resources
+            </a>
+            <a
+              href="https://www.syntaxbomb.com/index.php/board,19.0.html"
+              target="_blank"
+              rel="noreferrer noopener">
+              SyntaxBomb Forums
+            </a>
+          </div>
+          <div>
+            <h5>More</h5>
+            <a href={`${this.props.config.baseUrl}blog`}>News</a>
+            <a href="https://github.com/bmx-ng">GitHub</a>
+            <a
+              className="github-button"
+              href={this.props.config.repoUrl}
+              data-icon="octicon-star"
+              data-count-href="/bmx-ng/bmx-ng/stargazers"
+              data-show-count="true"
+              data-count-aria-label="# stargazers on GitHub"
+              aria-label="Star this project on GitHub">
+              Star
+            </a>
+          </div>
+        </section>
+
+        <section className="copyright">{this.props.config.copyright}</section>
+      </footer>
+    );
+  }
+}
+
+module.exports = Footer;

+ 9226 - 0
website/package-lock.json

@@ -0,0 +1,9226 @@
+{
+  "requires": true,
+  "lockfileVersion": 1,
+  "dependencies": {
+    "@types/cheerio": {
+      "version": "0.22.9",
+      "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.9.tgz",
+      "integrity": "sha512-q6LuBI0t5u04f0Q4/R+cGBqIbZMtJkVvCSF+nTfFBBdQqQvJR/mNHeWjRkszyLl7oyf2rDoKUYMEjTw5AV0hiw==",
+      "dev": true
+    },
+    "accepts": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
+      "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+      "dev": true,
+      "requires": {
+        "mime-types": "2.1.20",
+        "negotiator": "0.6.1"
+      }
+    },
+    "address": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz",
+      "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==",
+      "dev": true
+    },
+    "ajv": {
+      "version": "5.5.2",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+      "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+      "dev": true,
+      "requires": {
+        "co": "4.6.0",
+        "fast-deep-equal": "1.1.0",
+        "fast-json-stable-stringify": "2.0.0",
+        "json-schema-traverse": "0.3.1"
+      }
+    },
+    "alphanum-sort": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
+      "dev": true
+    },
+    "ansi-escapes": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
+      "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
+      "dev": true
+    },
+    "ansi-gray": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+      "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+      "dev": true,
+      "requires": {
+        "ansi-wrap": "0.1.0"
+      }
+    },
+    "ansi-red": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+      "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+      "dev": true,
+      "requires": {
+        "ansi-wrap": "0.1.0"
+      }
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "requires": {
+        "color-convert": "1.9.3"
+      }
+    },
+    "ansi-wrap": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+      "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+      "dev": true
+    },
+    "archive-type": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz",
+      "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=",
+      "dev": true,
+      "requires": {
+        "file-type": "3.9.0"
+      },
+      "dependencies": {
+        "file-type": {
+          "version": "3.9.0",
+          "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
+          "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=",
+          "dev": true
+        }
+      }
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "1.0.3"
+      }
+    },
+    "arr-diff": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+      "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "1.1.0"
+      }
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "dev": true
+    },
+    "array-differ": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
+      "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
+      "dev": true
+    },
+    "array-filter": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
+      "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
+      "dev": true
+    },
+    "array-find-index": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+      "dev": true
+    },
+    "array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+      "dev": true
+    },
+    "array-map": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
+      "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
+      "dev": true
+    },
+    "array-reduce": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
+      "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
+      "dev": true
+    },
+    "array-union": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "dev": true,
+      "requires": {
+        "array-uniq": "1.0.3"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true
+    },
+    "array-unique": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+      "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+      "dev": true
+    },
+    "asn1": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": "2.1.2"
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+      "dev": true
+    },
+    "async-each-series": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz",
+      "integrity": "sha1-9C/YFV048hpbjqB8KOBj7RcAsTg=",
+      "dev": true
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+      "dev": true
+    },
+    "autolinker": {
+      "version": "0.15.3",
+      "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz",
+      "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=",
+      "dev": true
+    },
+    "autoprefixer": {
+      "version": "9.1.5",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.1.5.tgz",
+      "integrity": "sha512-kk4Zb6RUc58ld7gdosERHMF3DzIYJc2fp5sX46qEsGXQQy5bXsu8qyLjoxuY1NuQ/cJuCYnx99BfjwnRggrYIw==",
+      "dev": true,
+      "requires": {
+        "browserslist": "4.1.1",
+        "caniuse-lite": "1.0.30000885",
+        "normalize-range": "0.1.2",
+        "num2fraction": "1.2.2",
+        "postcss": "7.0.2",
+        "postcss-value-parser": "3.3.0"
+      }
+    },
+    "aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+      "dev": true
+    },
+    "aws4": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+      "dev": true
+    },
+    "babel-code-frame": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "esutils": "2.0.2",
+        "js-tokens": "3.0.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "babel-core": {
+      "version": "6.26.3",
+      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
+      "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "6.26.0",
+        "babel-generator": "6.26.1",
+        "babel-helpers": "6.24.1",
+        "babel-messages": "6.23.0",
+        "babel-register": "6.26.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0",
+        "babylon": "6.18.0",
+        "convert-source-map": "1.6.0",
+        "debug": "2.6.9",
+        "json5": "0.5.1",
+        "lodash": "4.17.11",
+        "minimatch": "3.0.4",
+        "path-is-absolute": "1.0.1",
+        "private": "0.1.8",
+        "slash": "1.0.0",
+        "source-map": "0.5.7"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "babel-generator": {
+      "version": "6.26.1",
+      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+      "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+      "dev": true,
+      "requires": {
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "detect-indent": "4.0.0",
+        "jsesc": "1.3.0",
+        "lodash": "4.17.11",
+        "source-map": "0.5.7",
+        "trim-right": "1.0.1"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+          "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "babel-helper-builder-binary-assignment-operator-visitor": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+      "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+      "dev": true,
+      "requires": {
+        "babel-helper-explode-assignable-expression": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-builder-react-jsx": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz",
+      "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "esutils": "2.0.2"
+      }
+    },
+    "babel-helper-call-delegate": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+      "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+      "dev": true,
+      "requires": {
+        "babel-helper-hoist-variables": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-define-map": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+      "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "lodash": "4.17.11"
+      }
+    },
+    "babel-helper-explode-assignable-expression": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+      "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-function-name": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+      "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+      "dev": true,
+      "requires": {
+        "babel-helper-get-function-arity": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-get-function-arity": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+      "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-hoist-variables": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+      "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-optimise-call-expression": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+      "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-regex": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+      "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "lodash": "4.17.11"
+      }
+    },
+    "babel-helper-remap-async-to-generator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+      "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-replace-supers": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+      "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+      "dev": true,
+      "requires": {
+        "babel-helper-optimise-call-expression": "6.24.1",
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helpers": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-messages": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-check-es2015-constants": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+      "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-syntax-async-functions": {
+      "version": "6.13.0",
+      "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+      "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+      "dev": true
+    },
+    "babel-plugin-syntax-class-properties": {
+      "version": "6.13.0",
+      "resolved": "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
+      "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=",
+      "dev": true
+    },
+    "babel-plugin-syntax-exponentiation-operator": {
+      "version": "6.13.0",
+      "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+      "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+      "dev": true
+    },
+    "babel-plugin-syntax-flow": {
+      "version": "6.18.0",
+      "resolved": "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz",
+      "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=",
+      "dev": true
+    },
+    "babel-plugin-syntax-jsx": {
+      "version": "6.18.0",
+      "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
+      "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=",
+      "dev": true
+    },
+    "babel-plugin-syntax-object-rest-spread": {
+      "version": "6.13.0",
+      "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
+      "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
+      "dev": true
+    },
+    "babel-plugin-syntax-trailing-function-commas": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+      "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+      "dev": true
+    },
+    "babel-plugin-transform-async-to-generator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+      "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+      "dev": true,
+      "requires": {
+        "babel-helper-remap-async-to-generator": "6.24.1",
+        "babel-plugin-syntax-async-functions": "6.13.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-class-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
+      "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-plugin-syntax-class-properties": "6.13.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-arrow-functions": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+      "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-block-scoped-functions": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+      "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-block-scoping": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+      "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0",
+        "lodash": "4.17.11"
+      }
+    },
+    "babel-plugin-transform-es2015-classes": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+      "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+      "dev": true,
+      "requires": {
+        "babel-helper-define-map": "6.26.0",
+        "babel-helper-function-name": "6.24.1",
+        "babel-helper-optimise-call-expression": "6.24.1",
+        "babel-helper-replace-supers": "6.24.1",
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-computed-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+      "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-destructuring": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+      "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-duplicate-keys": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+      "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-for-of": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+      "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-function-name": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+      "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-literals": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+      "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-amd": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+      "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-es2015-modules-commonjs": "6.26.2",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-commonjs": {
+      "version": "6.26.2",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+      "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-strict-mode": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-systemjs": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+      "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+      "dev": true,
+      "requires": {
+        "babel-helper-hoist-variables": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-umd": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+      "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-object-super": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+      "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+      "dev": true,
+      "requires": {
+        "babel-helper-replace-supers": "6.24.1",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-parameters": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+      "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+      "dev": true,
+      "requires": {
+        "babel-helper-call-delegate": "6.24.1",
+        "babel-helper-get-function-arity": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-shorthand-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+      "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-spread": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+      "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-sticky-regex": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+      "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+      "dev": true,
+      "requires": {
+        "babel-helper-regex": "6.26.0",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-template-literals": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+      "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-typeof-symbol": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+      "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-unicode-regex": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+      "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+      "dev": true,
+      "requires": {
+        "babel-helper-regex": "6.26.0",
+        "babel-runtime": "6.26.0",
+        "regexpu-core": "2.0.0"
+      }
+    },
+    "babel-plugin-transform-exponentiation-operator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+      "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+      "dev": true,
+      "requires": {
+        "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1",
+        "babel-plugin-syntax-exponentiation-operator": "6.13.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-flow-strip-types": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz",
+      "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-flow": "6.18.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-object-rest-spread": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
+      "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-object-rest-spread": "6.13.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-react-display-name": {
+      "version": "6.25.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz",
+      "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-react-jsx": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz",
+      "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=",
+      "dev": true,
+      "requires": {
+        "babel-helper-builder-react-jsx": "6.26.0",
+        "babel-plugin-syntax-jsx": "6.18.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-react-jsx-self": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz",
+      "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-jsx": "6.18.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-react-jsx-source": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz",
+      "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-jsx": "6.18.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-regenerator": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+      "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+      "dev": true,
+      "requires": {
+        "regenerator-transform": "0.10.1"
+      }
+    },
+    "babel-plugin-transform-strict-mode": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+      "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-polyfill": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+      "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "core-js": "2.5.7",
+        "regenerator-runtime": "0.10.5"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.10.5",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+          "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
+          "dev": true
+        }
+      }
+    },
+    "babel-preset-env": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
+      "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
+      "dev": true,
+      "requires": {
+        "babel-plugin-check-es2015-constants": "6.22.0",
+        "babel-plugin-syntax-trailing-function-commas": "6.22.0",
+        "babel-plugin-transform-async-to-generator": "6.24.1",
+        "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
+        "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
+        "babel-plugin-transform-es2015-block-scoping": "6.26.0",
+        "babel-plugin-transform-es2015-classes": "6.24.1",
+        "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+        "babel-plugin-transform-es2015-destructuring": "6.23.0",
+        "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+        "babel-plugin-transform-es2015-for-of": "6.23.0",
+        "babel-plugin-transform-es2015-function-name": "6.24.1",
+        "babel-plugin-transform-es2015-literals": "6.22.0",
+        "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+        "babel-plugin-transform-es2015-modules-commonjs": "6.26.2",
+        "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
+        "babel-plugin-transform-es2015-modules-umd": "6.24.1",
+        "babel-plugin-transform-es2015-object-super": "6.24.1",
+        "babel-plugin-transform-es2015-parameters": "6.24.1",
+        "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+        "babel-plugin-transform-es2015-spread": "6.22.0",
+        "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+        "babel-plugin-transform-es2015-template-literals": "6.22.0",
+        "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
+        "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+        "babel-plugin-transform-exponentiation-operator": "6.24.1",
+        "babel-plugin-transform-regenerator": "6.26.0",
+        "browserslist": "3.2.8",
+        "invariant": "2.2.4",
+        "semver": "5.5.1"
+      },
+      "dependencies": {
+        "browserslist": {
+          "version": "3.2.8",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
+          "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
+          "dev": true,
+          "requires": {
+            "caniuse-lite": "1.0.30000885",
+            "electron-to-chromium": "1.3.67"
+          }
+        }
+      }
+    },
+    "babel-preset-flow": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz",
+      "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-flow-strip-types": "6.22.0"
+      }
+    },
+    "babel-preset-react": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz",
+      "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-jsx": "6.18.0",
+        "babel-plugin-transform-react-display-name": "6.25.0",
+        "babel-plugin-transform-react-jsx": "6.24.1",
+        "babel-plugin-transform-react-jsx-self": "6.22.0",
+        "babel-plugin-transform-react-jsx-source": "6.22.0",
+        "babel-preset-flow": "6.23.0"
+      }
+    },
+    "babel-register": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+      "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+      "dev": true,
+      "requires": {
+        "babel-core": "6.26.3",
+        "babel-runtime": "6.26.0",
+        "core-js": "2.5.7",
+        "home-or-tmp": "2.0.0",
+        "lodash": "4.17.11",
+        "mkdirp": "0.5.1",
+        "source-map-support": "0.4.18"
+      }
+    },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+      "dev": true,
+      "requires": {
+        "core-js": "2.5.7",
+        "regenerator-runtime": "0.11.1"
+      }
+    },
+    "babel-template": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0",
+        "babylon": "6.18.0",
+        "lodash": "4.17.11"
+      }
+    },
+    "babel-traverse": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "6.26.0",
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "babylon": "6.18.0",
+        "debug": "2.6.9",
+        "globals": "9.18.0",
+        "invariant": "2.2.4",
+        "lodash": "4.17.11"
+      }
+    },
+    "babel-types": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "esutils": "2.0.2",
+        "lodash": "4.17.11",
+        "to-fast-properties": "1.0.3"
+      }
+    },
+    "babylon": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+      "dev": true
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "dev": true
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "tweetnacl": "0.14.5"
+      }
+    },
+    "beeper": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
+      "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
+      "dev": true
+    },
+    "bin-build": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz",
+      "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=",
+      "dev": true,
+      "requires": {
+        "archive-type": "3.2.0",
+        "decompress": "3.0.0",
+        "download": "4.4.3",
+        "exec-series": "1.0.3",
+        "rimraf": "2.6.2",
+        "tempfile": "1.1.1",
+        "url-regex": "3.2.0"
+      },
+      "dependencies": {
+        "tempfile": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz",
+          "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=",
+          "dev": true,
+          "requires": {
+            "os-tmpdir": "1.0.2",
+            "uuid": "2.0.3"
+          }
+        },
+        "uuid": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+          "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
+          "dev": true
+        }
+      }
+    },
+    "bin-check": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz",
+      "integrity": "sha1-hvjm9CU4k99g3DFpV/WvAqywWTA=",
+      "dev": true,
+      "requires": {
+        "executable": "1.1.0"
+      }
+    },
+    "bin-version": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz",
+      "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=",
+      "dev": true,
+      "requires": {
+        "find-versions": "1.2.1"
+      }
+    },
+    "bin-version-check": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz",
+      "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=",
+      "dev": true,
+      "requires": {
+        "bin-version": "1.0.4",
+        "minimist": "1.2.0",
+        "semver": "4.3.6",
+        "semver-truncate": "1.1.2"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "semver": {
+          "version": "4.3.6",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
+          "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
+          "dev": true
+        }
+      }
+    },
+    "bin-wrapper": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz",
+      "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=",
+      "dev": true,
+      "requires": {
+        "bin-check": "2.0.0",
+        "bin-version-check": "2.1.0",
+        "download": "4.4.3",
+        "each-async": "1.1.1",
+        "lazy-req": "1.1.0",
+        "os-filter-obj": "1.0.3"
+      }
+    },
+    "bl": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
+      "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
+      "dev": true,
+      "requires": {
+        "readable-stream": "2.3.6",
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "body": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz",
+      "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=",
+      "dev": true,
+      "requires": {
+        "continuable-cache": "0.3.1",
+        "error": "7.0.2",
+        "raw-body": "1.1.7",
+        "safe-json-parse": "1.0.1"
+      },
+      "dependencies": {
+        "bytes": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
+          "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=",
+          "dev": true
+        },
+        "raw-body": {
+          "version": "1.1.7",
+          "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz",
+          "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=",
+          "dev": true,
+          "requires": {
+            "bytes": "1.0.0",
+            "string_decoder": "0.10.31"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true
+        }
+      }
+    },
+    "body-parser": {
+      "version": "1.18.2",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
+      "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+      "dev": true,
+      "requires": {
+        "bytes": "3.0.0",
+        "content-type": "1.0.4",
+        "debug": "2.6.9",
+        "depd": "1.1.2",
+        "http-errors": "1.6.3",
+        "iconv-lite": "0.4.19",
+        "on-finished": "2.3.0",
+        "qs": "6.5.1",
+        "raw-body": "2.3.2",
+        "type-is": "1.6.16"
+      },
+      "dependencies": {
+        "qs": {
+          "version": "6.5.1",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+          "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+          "dev": true
+        }
+      }
+    },
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+      "dev": true
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+      "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+      "dev": true,
+      "requires": {
+        "expand-range": "1.8.2",
+        "preserve": "0.2.0",
+        "repeat-element": "1.1.3"
+      }
+    },
+    "browserslist": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.1.1.tgz",
+      "integrity": "sha512-VBorw+tgpOtZ1BYhrVSVTzTt/3+vSE3eFUh0N2GCFK1HffceOaf32YS/bs6WiFhjDAblAFrx85jMy3BG9fBK2Q==",
+      "dev": true,
+      "requires": {
+        "caniuse-lite": "1.0.30000885",
+        "electron-to-chromium": "1.3.67",
+        "node-releases": "1.0.0-alpha.11"
+      }
+    },
+    "buffer-alloc": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+      "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+      "dev": true,
+      "requires": {
+        "buffer-alloc-unsafe": "1.1.0",
+        "buffer-fill": "1.0.0"
+      }
+    },
+    "buffer-alloc-unsafe": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
+      "dev": true
+    },
+    "buffer-crc32": {
+      "version": "0.2.13",
+      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+      "dev": true
+    },
+    "buffer-fill": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
+      "dev": true
+    },
+    "buffer-from": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+      "dev": true
+    },
+    "buffer-to-vinyl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz",
+      "integrity": "sha1-APFfruOreh3aLN5tkSG//dB7ImI=",
+      "dev": true,
+      "requires": {
+        "file-type": "3.9.0",
+        "readable-stream": "2.3.6",
+        "uuid": "2.0.3",
+        "vinyl": "1.2.0"
+      },
+      "dependencies": {
+        "file-type": {
+          "version": "3.9.0",
+          "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
+          "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=",
+          "dev": true
+        },
+        "uuid": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+          "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
+          "dev": true
+        }
+      }
+    },
+    "builtin-modules": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+      "dev": true
+    },
+    "bytes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+      "dev": true
+    },
+    "camelcase": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+      "dev": true
+    },
+    "camelcase-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "dev": true,
+      "requires": {
+        "camelcase": "2.1.1",
+        "map-obj": "1.0.1"
+      }
+    },
+    "caniuse-api": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz",
+      "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=",
+      "dev": true,
+      "requires": {
+        "browserslist": "1.7.7",
+        "caniuse-db": "1.0.30000885",
+        "lodash.memoize": "4.1.2",
+        "lodash.uniq": "4.5.0"
+      },
+      "dependencies": {
+        "browserslist": {
+          "version": "1.7.7",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
+          "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+          "dev": true,
+          "requires": {
+            "caniuse-db": "1.0.30000885",
+            "electron-to-chromium": "1.3.67"
+          }
+        }
+      }
+    },
+    "caniuse-db": {
+      "version": "1.0.30000885",
+      "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000885.tgz",
+      "integrity": "sha512-Hy1a+UIXooG+tRlt3WnT9avMf+l999bR9J1MqlQdYKgbsYjKxV4a4rgcmiyMmdCLPBFsiRoDxdl9tnNyaq2RXw==",
+      "dev": true
+    },
+    "caniuse-lite": {
+      "version": "1.0.30000885",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000885.tgz",
+      "integrity": "sha512-cXKbYwpxBLd7qHyej16JazPoUacqoVuDhvR61U7Fr5vSxMUiodzcYa1rQYRYfZ5GexV03vGZHd722vNPLjPJGQ==",
+      "dev": true
+    },
+    "capture-stack-trace": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
+      "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==",
+      "dev": true
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+      "dev": true
+    },
+    "caw": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz",
+      "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=",
+      "dev": true,
+      "requires": {
+        "get-proxy": "1.1.0",
+        "is-obj": "1.0.1",
+        "object-assign": "3.0.0",
+        "tunnel-agent": "0.4.3"
+      },
+      "dependencies": {
+        "object-assign": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+          "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+          "dev": true
+        },
+        "tunnel-agent": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+          "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+          "dev": true
+        }
+      }
+    },
+    "chalk": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+      "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "3.2.1",
+        "escape-string-regexp": "1.0.5",
+        "supports-color": "5.5.0"
+      }
+    },
+    "chardet": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+      "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+      "dev": true
+    },
+    "cheerio": {
+      "version": "0.22.0",
+      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz",
+      "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=",
+      "dev": true,
+      "requires": {
+        "css-select": "1.2.0",
+        "dom-serializer": "0.1.0",
+        "entities": "1.1.1",
+        "htmlparser2": "3.9.2",
+        "lodash.assignin": "4.2.0",
+        "lodash.bind": "4.2.1",
+        "lodash.defaults": "4.2.0",
+        "lodash.filter": "4.6.0",
+        "lodash.flatten": "4.4.0",
+        "lodash.foreach": "4.5.0",
+        "lodash.map": "4.6.0",
+        "lodash.merge": "4.6.1",
+        "lodash.pick": "4.4.0",
+        "lodash.reduce": "4.6.0",
+        "lodash.reject": "4.6.0",
+        "lodash.some": "4.6.0"
+      },
+      "dependencies": {
+        "css-select": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+          "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+          "dev": true,
+          "requires": {
+            "boolbase": "1.0.0",
+            "css-what": "2.1.0",
+            "domutils": "1.5.1",
+            "nth-check": "1.0.1"
+          }
+        }
+      }
+    },
+    "clap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz",
+      "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "classnames": {
+      "version": "2.2.6",
+      "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
+      "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==",
+      "dev": true
+    },
+    "cli-cursor": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "2.0.0"
+      }
+    },
+    "cli-width": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+      "dev": true
+    },
+    "clipboard": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.1.tgz",
+      "integrity": "sha512-7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "good-listener": "1.2.2",
+        "select": "1.1.2",
+        "tiny-emitter": "2.0.2"
+      }
+    },
+    "clone": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+      "dev": true
+    },
+    "clone-stats": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+      "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+      "dev": true
+    },
+    "co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+      "dev": true
+    },
+    "coa": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz",
+      "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=",
+      "dev": true,
+      "requires": {
+        "q": "1.5.1"
+      }
+    },
+    "coffee-script": {
+      "version": "1.12.7",
+      "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz",
+      "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==",
+      "dev": true
+    },
+    "color": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color/-/color-2.0.1.tgz",
+      "integrity": "sha512-ubUCVVKfT7r2w2D3qtHakj8mbmKms+tThR8gI8zEYCbUBl8/voqFGt3kgBqGwXAopgXybnkuOq+qMYCRrp4cXw==",
+      "dev": true,
+      "requires": {
+        "color-convert": "1.9.3",
+        "color-string": "1.5.3"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "dev": true
+    },
+    "color-string": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
+      "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3",
+        "simple-swizzle": "0.2.2"
+      }
+    },
+    "color-support": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+      "dev": true
+    },
+    "colormin": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz",
+      "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=",
+      "dev": true,
+      "requires": {
+        "color": "0.11.4",
+        "css-color-names": "0.0.4",
+        "has": "1.0.3"
+      },
+      "dependencies": {
+        "color": {
+          "version": "0.11.4",
+          "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz",
+          "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=",
+          "dev": true,
+          "requires": {
+            "clone": "1.0.4",
+            "color-convert": "1.9.3",
+            "color-string": "0.3.0"
+          }
+        },
+        "color-string": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz",
+          "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=",
+          "dev": true,
+          "requires": {
+            "color-name": "1.1.3"
+          }
+        }
+      }
+    },
+    "colors": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+      "dev": true
+    },
+    "combined-stream": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+      "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+      "dev": true,
+      "requires": {
+        "delayed-stream": "1.0.0"
+      }
+    },
+    "commander": {
+      "version": "2.18.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz",
+      "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==",
+      "dev": true
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "1.1.1",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6",
+        "typedarray": "0.0.6"
+      }
+    },
+    "console-stream": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz",
+      "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=",
+      "dev": true
+    },
+    "content-disposition": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+      "dev": true
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+      "dev": true
+    },
+    "continuable-cache": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz",
+      "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
+      "dev": true
+    },
+    "convert-source-map": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
+      "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "cookie": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+      "dev": true
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+      "dev": true
+    },
+    "core-js": {
+      "version": "2.5.7",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
+      "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==",
+      "dev": true
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "dev": true
+    },
+    "create-error-class": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+      "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+      "dev": true,
+      "requires": {
+        "capture-stack-trace": "1.0.1"
+      }
+    },
+    "cross-spawn": {
+      "version": "6.0.5",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+      "dev": true,
+      "requires": {
+        "nice-try": "1.0.5",
+        "path-key": "2.0.1",
+        "semver": "5.5.1",
+        "shebang-command": "1.2.0",
+        "which": "1.3.1"
+      }
+    },
+    "crowdin-cli": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/crowdin-cli/-/crowdin-cli-0.3.0.tgz",
+      "integrity": "sha1-6smYmm/n/qrzMJA5evwYfGe0YZE=",
+      "dev": true,
+      "requires": {
+        "request": "2.88.0",
+        "yamljs": "0.2.10",
+        "yargs": "2.3.0"
+      }
+    },
+    "css-color-names": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
+      "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
+      "dev": true
+    },
+    "css-select": {
+      "version": "1.3.0-rc0",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.3.0-rc0.tgz",
+      "integrity": "sha1-b5MZaqrnN2ZuoQNqjLFKj8t6kjE=",
+      "dev": true,
+      "requires": {
+        "boolbase": "1.0.0",
+        "css-what": "2.1.0",
+        "domutils": "1.5.1",
+        "nth-check": "1.0.1"
+      }
+    },
+    "css-select-base-adapter": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz",
+      "integrity": "sha1-AQKz0UYw34bD65+p9UVicBBs+ZA=",
+      "dev": true
+    },
+    "css-tree": {
+      "version": "1.0.0-alpha25",
+      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha25.tgz",
+      "integrity": "sha512-XC6xLW/JqIGirnZuUWHXCHRaAjje2b3OIB0Vj5RIJo6mIi/AdJo30quQl5LxUl0gkXDIrTrFGbMlcZjyFplz1A==",
+      "dev": true,
+      "requires": {
+        "mdn-data": "1.2.0",
+        "source-map": "0.5.7"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "css-url-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz",
+      "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=",
+      "dev": true
+    },
+    "css-what": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
+      "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
+      "dev": true
+    },
+    "cssnano": {
+      "version": "3.10.0",
+      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz",
+      "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=",
+      "dev": true,
+      "requires": {
+        "autoprefixer": "6.7.7",
+        "decamelize": "1.2.0",
+        "defined": "1.0.0",
+        "has": "1.0.3",
+        "object-assign": "4.1.1",
+        "postcss": "5.2.18",
+        "postcss-calc": "5.3.1",
+        "postcss-colormin": "2.2.2",
+        "postcss-convert-values": "2.6.1",
+        "postcss-discard-comments": "2.0.4",
+        "postcss-discard-duplicates": "2.1.0",
+        "postcss-discard-empty": "2.1.0",
+        "postcss-discard-overridden": "0.1.1",
+        "postcss-discard-unused": "2.2.3",
+        "postcss-filter-plugins": "2.0.3",
+        "postcss-merge-idents": "2.1.7",
+        "postcss-merge-longhand": "2.0.2",
+        "postcss-merge-rules": "2.1.2",
+        "postcss-minify-font-values": "1.0.5",
+        "postcss-minify-gradients": "1.0.5",
+        "postcss-minify-params": "1.2.2",
+        "postcss-minify-selectors": "2.1.1",
+        "postcss-normalize-charset": "1.1.1",
+        "postcss-normalize-url": "3.0.8",
+        "postcss-ordered-values": "2.2.3",
+        "postcss-reduce-idents": "2.4.0",
+        "postcss-reduce-initial": "1.0.1",
+        "postcss-reduce-transforms": "1.0.4",
+        "postcss-svgo": "2.1.6",
+        "postcss-unique-selectors": "2.0.2",
+        "postcss-value-parser": "3.3.0",
+        "postcss-zindex": "2.2.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "autoprefixer": {
+          "version": "6.7.7",
+          "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz",
+          "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=",
+          "dev": true,
+          "requires": {
+            "browserslist": "1.7.7",
+            "caniuse-db": "1.0.30000885",
+            "normalize-range": "0.1.2",
+            "num2fraction": "1.2.2",
+            "postcss": "5.2.18",
+            "postcss-value-parser": "3.3.0"
+          }
+        },
+        "browserslist": {
+          "version": "1.7.7",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
+          "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+          "dev": true,
+          "requires": {
+            "caniuse-db": "1.0.30000885",
+            "electron-to-chromium": "1.3.67"
+          }
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "csso": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz",
+      "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=",
+      "dev": true,
+      "requires": {
+        "clap": "1.2.3",
+        "source-map": "0.5.7"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+      "dev": true,
+      "requires": {
+        "array-find-index": "1.0.2"
+      }
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0"
+      }
+    },
+    "dateformat": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
+      "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
+      "dev": true
+    },
+    "debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true
+    },
+    "decompress": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz",
+      "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=",
+      "dev": true,
+      "requires": {
+        "buffer-to-vinyl": "1.1.0",
+        "concat-stream": "1.6.2",
+        "decompress-tar": "3.1.0",
+        "decompress-tarbz2": "3.1.0",
+        "decompress-targz": "3.1.0",
+        "decompress-unzip": "3.4.0",
+        "stream-combiner2": "1.1.1",
+        "vinyl-assign": "1.2.1",
+        "vinyl-fs": "2.4.4"
+      }
+    },
+    "decompress-tar": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz",
+      "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=",
+      "dev": true,
+      "requires": {
+        "is-tar": "1.0.0",
+        "object-assign": "2.1.1",
+        "strip-dirs": "1.1.1",
+        "tar-stream": "1.6.1",
+        "through2": "0.6.5",
+        "vinyl": "0.4.6"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "0.2.0",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+          "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+          "dev": true
+        },
+        "object-assign": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz",
+          "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=",
+          "dev": true
+        },
+        "vinyl": {
+          "version": "0.4.6",
+          "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+          "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+          "dev": true,
+          "requires": {
+            "clone": "0.2.0",
+            "clone-stats": "0.0.1"
+          }
+        }
+      }
+    },
+    "decompress-tarbz2": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz",
+      "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=",
+      "dev": true,
+      "requires": {
+        "is-bzip2": "1.0.0",
+        "object-assign": "2.1.1",
+        "seek-bzip": "1.0.5",
+        "strip-dirs": "1.1.1",
+        "tar-stream": "1.6.1",
+        "through2": "0.6.5",
+        "vinyl": "0.4.6"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "0.2.0",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+          "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+          "dev": true
+        },
+        "object-assign": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz",
+          "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=",
+          "dev": true
+        },
+        "vinyl": {
+          "version": "0.4.6",
+          "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+          "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+          "dev": true,
+          "requires": {
+            "clone": "0.2.0",
+            "clone-stats": "0.0.1"
+          }
+        }
+      }
+    },
+    "decompress-targz": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz",
+      "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=",
+      "dev": true,
+      "requires": {
+        "is-gzip": "1.0.0",
+        "object-assign": "2.1.1",
+        "strip-dirs": "1.1.1",
+        "tar-stream": "1.6.1",
+        "through2": "0.6.5",
+        "vinyl": "0.4.6"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "0.2.0",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+          "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+          "dev": true
+        },
+        "object-assign": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz",
+          "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=",
+          "dev": true
+        },
+        "vinyl": {
+          "version": "0.4.6",
+          "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+          "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+          "dev": true,
+          "requires": {
+            "clone": "0.2.0",
+            "clone-stats": "0.0.1"
+          }
+        }
+      }
+    },
+    "decompress-unzip": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz",
+      "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=",
+      "dev": true,
+      "requires": {
+        "is-zip": "1.0.0",
+        "read-all-stream": "3.1.0",
+        "stat-mode": "0.2.2",
+        "strip-dirs": "1.1.1",
+        "through2": "2.0.3",
+        "vinyl": "1.2.0",
+        "yauzl": "2.10.0"
+      },
+      "dependencies": {
+        "through2": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+          "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+          "dev": true,
+          "requires": {
+            "readable-stream": "2.3.6",
+            "xtend": "4.0.1"
+          }
+        }
+      }
+    },
+    "deep-extend": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+      "dev": true
+    },
+    "deep-is": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.2.tgz",
+      "integrity": "sha1-nO1l6gvAsJ9CptecGxkD+dkTzBg=",
+      "dev": true
+    },
+    "deepmerge": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.1.1.tgz",
+      "integrity": "sha512-urQxA1smbLZ2cBbXbaYObM1dJ82aJ2H57A1C/Kklfh/ZN1bgH4G/n5KWhdNfOK11W98gqZfyYj7W4frJJRwA2w==",
+      "dev": true
+    },
+    "define-properties": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+      "dev": true,
+      "requires": {
+        "object-keys": "1.0.12"
+      }
+    },
+    "defined": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
+      "dev": true
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+      "dev": true
+    },
+    "delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
+      "dev": true,
+      "optional": true
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+      "dev": true
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+      "dev": true
+    },
+    "detect-indent": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+      "dev": true,
+      "requires": {
+        "repeating": "2.0.1"
+      }
+    },
+    "detect-port-alt": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
+      "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
+      "dev": true,
+      "requires": {
+        "address": "1.0.3",
+        "debug": "2.6.9"
+      }
+    },
+    "diacritics-map": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz",
+      "integrity": "sha1-bfwP+dAQAKLt8oZTccrDFulJd68=",
+      "dev": true
+    },
+    "docusaurus": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/docusaurus/-/docusaurus-1.4.0.tgz",
+      "integrity": "sha512-o/ZhgnKApGUHKjK4b3XAcdSoqRjECKc41R74rLq+bYn0sD0hQw997mJ9PPxhs4JhzooOXpFFaE6BcD8FxYOp9g==",
+      "dev": true,
+      "requires": {
+        "autoprefixer": "9.1.5",
+        "babel-plugin-transform-class-properties": "6.24.1",
+        "babel-plugin-transform-object-rest-spread": "6.26.0",
+        "babel-polyfill": "6.26.0",
+        "babel-preset-env": "1.7.0",
+        "babel-preset-react": "6.24.1",
+        "babel-register": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babylon": "6.18.0",
+        "chalk": "2.4.1",
+        "classnames": "2.2.6",
+        "color": "2.0.1",
+        "commander": "2.18.0",
+        "cross-spawn": "6.0.5",
+        "crowdin-cli": "0.3.0",
+        "cssnano": "3.10.0",
+        "deepmerge": "2.1.1",
+        "escape-string-regexp": "1.0.5",
+        "express": "4.16.3",
+        "feed": "1.1.1",
+        "fs-extra": "5.0.0",
+        "gaze": "1.1.3",
+        "glob": "7.1.3",
+        "highlight.js": "9.12.0",
+        "imagemin": "5.3.1",
+        "imagemin-gifsicle": "5.2.0",
+        "imagemin-jpegtran": "5.0.2",
+        "imagemin-optipng": "5.2.1",
+        "imagemin-svgo": "6.0.0",
+        "markdown-toc": "1.2.0",
+        "mkdirp": "0.5.1",
+        "opencollective": "1.0.3",
+        "postcss": "7.0.2",
+        "prismjs": "1.15.0",
+        "react": "16.5.1",
+        "react-dev-utils": "5.0.2",
+        "react-dom": "16.5.1",
+        "remarkable": "1.7.1",
+        "request": "2.88.0",
+        "shelljs": "0.7.8",
+        "sitemap": "1.13.0",
+        "tcp-port-used": "0.1.2",
+        "tiny-lr": "1.1.1",
+        "tree-node-cli": "1.2.5",
+        "truncate-html": "1.0.1"
+      }
+    },
+    "dom-serializer": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
+      "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1.1.3",
+        "entities": "1.1.1"
+      },
+      "dependencies": {
+        "domelementtype": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+          "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
+          "dev": true
+        }
+      }
+    },
+    "domelementtype": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
+      "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
+      "dev": true
+    },
+    "domhandler": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+      "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1.3.0"
+      }
+    },
+    "domutils": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "0.1.0",
+        "domelementtype": "1.3.0"
+      }
+    },
+    "download": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/download/-/download-4.4.3.tgz",
+      "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=",
+      "dev": true,
+      "requires": {
+        "caw": "1.2.0",
+        "concat-stream": "1.6.2",
+        "each-async": "1.1.1",
+        "filenamify": "1.2.1",
+        "got": "5.7.1",
+        "gulp-decompress": "1.2.0",
+        "gulp-rename": "1.4.0",
+        "is-url": "1.2.4",
+        "object-assign": "4.1.1",
+        "read-all-stream": "3.1.0",
+        "readable-stream": "2.3.6",
+        "stream-combiner2": "1.1.1",
+        "vinyl": "1.2.0",
+        "vinyl-fs": "2.4.4",
+        "ware": "1.3.0"
+      }
+    },
+    "duplexer": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+      "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+      "dev": true
+    },
+    "duplexer2": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+      "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "2.3.6"
+      }
+    },
+    "duplexify": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz",
+      "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "1.4.1",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6",
+        "stream-shift": "1.0.0"
+      }
+    },
+    "each-async": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz",
+      "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=",
+      "dev": true,
+      "requires": {
+        "onetime": "1.1.0",
+        "set-immediate-shim": "1.0.1"
+      }
+    },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "jsbn": "0.1.1",
+        "safer-buffer": "2.1.2"
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "dev": true
+    },
+    "electron-to-chromium": {
+      "version": "1.3.67",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.67.tgz",
+      "integrity": "sha512-h3zEBLdHvsKfaXv1SHAtykJyNtwYFEKkrWGSFyW1BzGgPQ4ykAzD5Hd8C5MZGTAEhkCKmtyIwYUrapsI0xfKww==",
+      "dev": true
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+      "dev": true
+    },
+    "encoding": {
+      "version": "0.1.12",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
+      "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+      "dev": true,
+      "requires": {
+        "iconv-lite": "0.4.19"
+      }
+    },
+    "end-of-stream": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+      "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+      "dev": true,
+      "requires": {
+        "once": "1.4.0"
+      }
+    },
+    "entities": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
+      "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
+      "dev": true
+    },
+    "error": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz",
+      "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=",
+      "dev": true,
+      "requires": {
+        "string-template": "0.2.1",
+        "xtend": "4.0.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "0.2.1"
+      },
+      "dependencies": {
+        "is-arrayish": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+          "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+          "dev": true
+        }
+      }
+    },
+    "es-abstract": {
+      "version": "1.12.0",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
+      "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
+      "dev": true,
+      "requires": {
+        "es-to-primitive": "1.1.1",
+        "function-bind": "1.1.1",
+        "has": "1.0.3",
+        "is-callable": "1.1.4",
+        "is-regex": "1.0.4"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
+      "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
+      "dev": true,
+      "requires": {
+        "is-callable": "1.1.4",
+        "is-date-object": "1.0.1",
+        "is-symbol": "1.0.1"
+      }
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "dev": true
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "esprima": {
+      "version": "2.7.3",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+      "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+      "dev": true
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+      "dev": true
+    },
+    "eventsource": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz",
+      "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
+      "dev": true,
+      "requires": {
+        "original": "1.0.2"
+      }
+    },
+    "exec-buffer": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz",
+      "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==",
+      "dev": true,
+      "requires": {
+        "execa": "0.7.0",
+        "p-finally": "1.0.0",
+        "pify": "3.0.0",
+        "rimraf": "2.6.2",
+        "tempfile": "2.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        }
+      }
+    },
+    "exec-series": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/exec-series/-/exec-series-1.0.3.tgz",
+      "integrity": "sha1-bSV6m+rEgqhyx3g7yGFYOfx3FDo=",
+      "dev": true,
+      "requires": {
+        "async-each-series": "1.1.0",
+        "object-assign": "4.1.1"
+      }
+    },
+    "execa": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "5.1.0",
+        "get-stream": "3.0.0",
+        "is-stream": "1.1.0",
+        "npm-run-path": "2.0.2",
+        "p-finally": "1.0.0",
+        "signal-exit": "3.0.2",
+        "strip-eof": "1.0.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "4.1.3",
+            "shebang-command": "1.2.0",
+            "which": "1.3.1"
+          }
+        }
+      }
+    },
+    "executable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz",
+      "integrity": "sha1-h3mA6REvM5EGbaNyZd562ENKtNk=",
+      "dev": true,
+      "requires": {
+        "meow": "3.7.0"
+      }
+    },
+    "expand-brackets": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+      "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+      "dev": true,
+      "requires": {
+        "is-posix-bracket": "0.1.1"
+      }
+    },
+    "expand-range": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+      "dev": true,
+      "requires": {
+        "fill-range": "2.2.4"
+      }
+    },
+    "expand-tilde": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+      "dev": true,
+      "requires": {
+        "homedir-polyfill": "1.0.1"
+      }
+    },
+    "express": {
+      "version": "4.16.3",
+      "resolved": "http://registry.npmjs.org/express/-/express-4.16.3.tgz",
+      "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
+      "dev": true,
+      "requires": {
+        "accepts": "1.3.5",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.18.2",
+        "content-disposition": "0.5.2",
+        "content-type": "1.0.4",
+        "cookie": "0.3.1",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "1.1.2",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "etag": "1.8.1",
+        "finalhandler": "1.1.1",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "1.1.2",
+        "on-finished": "2.3.0",
+        "parseurl": "1.3.2",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "2.0.4",
+        "qs": "6.5.1",
+        "range-parser": "1.2.0",
+        "safe-buffer": "5.1.1",
+        "send": "0.16.2",
+        "serve-static": "1.13.2",
+        "setprototypeof": "1.1.0",
+        "statuses": "1.4.0",
+        "type-is": "1.6.16",
+        "utils-merge": "1.0.1",
+        "vary": "1.1.2"
+      },
+      "dependencies": {
+        "qs": {
+          "version": "6.5.1",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+          "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+          "dev": true
+        },
+        "safe-buffer": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+          "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+          "dev": true
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true
+    },
+    "extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+      "dev": true,
+      "requires": {
+        "is-extendable": "0.1.1"
+      }
+    },
+    "external-editor": {
+      "version": "2.2.0",
+      "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+      "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+      "dev": true,
+      "requires": {
+        "chardet": "0.4.2",
+        "iconv-lite": "0.4.19",
+        "tmp": "0.0.33"
+      }
+    },
+    "extglob": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+      "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+      "dev": true,
+      "requires": {
+        "is-extglob": "1.0.0"
+      },
+      "dependencies": {
+        "is-extglob": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+          "dev": true
+        }
+      }
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+      "dev": true
+    },
+    "fancy-log": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+      "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
+      "dev": true,
+      "requires": {
+        "ansi-gray": "0.1.1",
+        "color-support": "1.1.3",
+        "time-stamp": "1.1.0"
+      }
+    },
+    "fast-deep-equal": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+      "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+      "dev": true
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+      "dev": true
+    },
+    "faye-websocket": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
+      "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
+      "dev": true,
+      "requires": {
+        "websocket-driver": "0.7.0"
+      }
+    },
+    "fd-slicer": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+      "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+      "dev": true,
+      "requires": {
+        "pend": "1.2.0"
+      }
+    },
+    "feed": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/feed/-/feed-1.1.1.tgz",
+      "integrity": "sha1-kUiXUX6U+jJ8xvc7tYWkfEqe0yE=",
+      "dev": true,
+      "requires": {
+        "xml": "1.0.1"
+      }
+    },
+    "figures": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+      "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "1.0.5",
+        "object-assign": "4.1.1"
+      }
+    },
+    "file-type": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz",
+      "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=",
+      "dev": true
+    },
+    "filename-regex": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+      "dev": true
+    },
+    "filename-reserved-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz",
+      "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=",
+      "dev": true
+    },
+    "filenamify": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz",
+      "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=",
+      "dev": true,
+      "requires": {
+        "filename-reserved-regex": "1.0.0",
+        "strip-outer": "1.0.1",
+        "trim-repeated": "1.0.0"
+      }
+    },
+    "filesize": {
+      "version": "3.5.11",
+      "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz",
+      "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==",
+      "dev": true
+    },
+    "fill-range": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+      "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+      "dev": true,
+      "requires": {
+        "is-number": "2.1.0",
+        "isobject": "2.1.0",
+        "randomatic": "3.1.0",
+        "repeat-element": "1.1.3",
+        "repeat-string": "1.6.1"
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+      "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "on-finished": "2.3.0",
+        "parseurl": "1.3.2",
+        "statuses": "1.4.0",
+        "unpipe": "1.0.0"
+      }
+    },
+    "find-up": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+      "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+      "dev": true,
+      "requires": {
+        "path-exists": "2.1.0",
+        "pinkie-promise": "2.0.1"
+      }
+    },
+    "find-versions": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz",
+      "integrity": "sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I=",
+      "dev": true,
+      "requires": {
+        "array-uniq": "1.0.3",
+        "get-stdin": "4.0.1",
+        "meow": "3.7.0",
+        "semver-regex": "1.0.0"
+      }
+    },
+    "first-chunk-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
+      "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
+      "dev": true
+    },
+    "flatten": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz",
+      "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=",
+      "dev": true
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true
+    },
+    "for-own": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+      "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+      "dev": true,
+      "requires": {
+        "for-in": "1.0.2"
+      }
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+      "dev": true
+    },
+    "form-data": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
+      "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
+      "dev": true,
+      "requires": {
+        "asynckit": "0.4.0",
+        "combined-stream": "1.0.6",
+        "mime-types": "2.1.20"
+      }
+    },
+    "forwarded": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+      "dev": true
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+      "dev": true
+    },
+    "fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+      "dev": true
+    },
+    "fs-extra": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+      "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "jsonfile": "4.0.0",
+        "universalify": "0.1.2"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "gaze": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
+      "dev": true,
+      "requires": {
+        "globule": "1.2.1"
+      }
+    },
+    "get-proxy": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz",
+      "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=",
+      "dev": true,
+      "requires": {
+        "rc": "1.2.8"
+      }
+    },
+    "get-stdin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+      "dev": true
+    },
+    "get-stream": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+      "dev": true
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0"
+      }
+    },
+    "gifsicle": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-3.0.4.tgz",
+      "integrity": "sha1-9Fy17RAWW2ZdySng6TKLbIId+js=",
+      "dev": true,
+      "requires": {
+        "bin-build": "2.2.0",
+        "bin-wrapper": "3.0.2",
+        "logalot": "2.1.0"
+      }
+    },
+    "glob": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+      "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+      "dev": true,
+      "requires": {
+        "fs.realpath": "1.0.0",
+        "inflight": "1.0.6",
+        "inherits": "2.0.3",
+        "minimatch": "3.0.4",
+        "once": "1.4.0",
+        "path-is-absolute": "1.0.1"
+      }
+    },
+    "glob-base": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+      "dev": true,
+      "requires": {
+        "glob-parent": "2.0.0",
+        "is-glob": "2.0.1"
+      },
+      "dependencies": {
+        "glob-parent": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+          "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+          "dev": true,
+          "requires": {
+            "is-glob": "2.0.1"
+          }
+        },
+        "is-extglob": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "1.0.0"
+          }
+        }
+      }
+    },
+    "glob-parent": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+      "dev": true,
+      "requires": {
+        "is-glob": "3.1.0",
+        "path-dirname": "1.0.2"
+      }
+    },
+    "glob-stream": {
+      "version": "5.3.5",
+      "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz",
+      "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=",
+      "dev": true,
+      "requires": {
+        "extend": "3.0.2",
+        "glob": "5.0.15",
+        "glob-parent": "3.1.0",
+        "micromatch": "2.3.11",
+        "ordered-read-streams": "0.3.0",
+        "through2": "0.6.5",
+        "to-absolute-glob": "0.1.1",
+        "unique-stream": "2.2.1"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "5.0.15",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+          "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+          "dev": true,
+          "requires": {
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4",
+            "once": "1.4.0",
+            "path-is-absolute": "1.0.1"
+          }
+        }
+      }
+    },
+    "global-modules": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+      "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+      "dev": true,
+      "requires": {
+        "global-prefix": "1.0.2",
+        "is-windows": "1.0.2",
+        "resolve-dir": "1.0.1"
+      }
+    },
+    "global-prefix": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+      "dev": true,
+      "requires": {
+        "expand-tilde": "2.0.2",
+        "homedir-polyfill": "1.0.1",
+        "ini": "1.3.5",
+        "is-windows": "1.0.2",
+        "which": "1.3.1"
+      }
+    },
+    "globals": {
+      "version": "9.18.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+      "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+      "dev": true
+    },
+    "globby": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+      "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+      "dev": true,
+      "requires": {
+        "array-union": "1.0.2",
+        "glob": "7.1.3",
+        "object-assign": "4.1.1",
+        "pify": "2.3.0",
+        "pinkie-promise": "2.0.1"
+      }
+    },
+    "globule": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
+      "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
+      "dev": true,
+      "requires": {
+        "glob": "7.1.3",
+        "lodash": "4.17.11",
+        "minimatch": "3.0.4"
+      }
+    },
+    "glogg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
+      "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
+      "dev": true,
+      "requires": {
+        "sparkles": "1.0.1"
+      }
+    },
+    "good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "delegate": "3.2.0"
+      }
+    },
+    "got": {
+      "version": "5.7.1",
+      "resolved": "http://registry.npmjs.org/got/-/got-5.7.1.tgz",
+      "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=",
+      "dev": true,
+      "requires": {
+        "create-error-class": "3.0.2",
+        "duplexer2": "0.1.4",
+        "is-redirect": "1.0.0",
+        "is-retry-allowed": "1.1.0",
+        "is-stream": "1.1.0",
+        "lowercase-keys": "1.0.1",
+        "node-status-codes": "1.0.0",
+        "object-assign": "4.1.1",
+        "parse-json": "2.2.0",
+        "pinkie-promise": "2.0.1",
+        "read-all-stream": "3.1.0",
+        "readable-stream": "2.3.6",
+        "timed-out": "3.1.3",
+        "unzip-response": "1.0.2",
+        "url-parse-lax": "1.0.0"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+      "dev": true
+    },
+    "graceful-readlink": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+      "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+      "dev": true
+    },
+    "gray-matter": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz",
+      "integrity": "sha1-MELZrewqHe1qdwep7SOA+KF6Qw4=",
+      "dev": true,
+      "requires": {
+        "ansi-red": "0.1.1",
+        "coffee-script": "1.12.7",
+        "extend-shallow": "2.0.1",
+        "js-yaml": "3.12.0",
+        "toml": "2.3.3"
+      },
+      "dependencies": {
+        "esprima": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+          "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+          "dev": true
+        },
+        "js-yaml": {
+          "version": "3.12.0",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
+          "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+          "dev": true,
+          "requires": {
+            "argparse": "1.0.10",
+            "esprima": "4.0.1"
+          }
+        }
+      }
+    },
+    "gulp-decompress": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-1.2.0.tgz",
+      "integrity": "sha1-jutlpeAV+O2FMsr+KEVJYGJvDcc=",
+      "dev": true,
+      "requires": {
+        "archive-type": "3.2.0",
+        "decompress": "3.0.0",
+        "gulp-util": "3.0.8",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "gulp-rename": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz",
+      "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==",
+      "dev": true
+    },
+    "gulp-sourcemaps": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz",
+      "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=",
+      "dev": true,
+      "requires": {
+        "convert-source-map": "1.6.0",
+        "graceful-fs": "4.1.11",
+        "strip-bom": "2.0.0",
+        "through2": "2.0.3",
+        "vinyl": "1.2.0"
+      },
+      "dependencies": {
+        "through2": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+          "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+          "dev": true,
+          "requires": {
+            "readable-stream": "2.3.6",
+            "xtend": "4.0.1"
+          }
+        }
+      }
+    },
+    "gulp-util": {
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
+      "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
+      "dev": true,
+      "requires": {
+        "array-differ": "1.0.0",
+        "array-uniq": "1.0.3",
+        "beeper": "1.1.1",
+        "chalk": "1.1.3",
+        "dateformat": "2.2.0",
+        "fancy-log": "1.3.2",
+        "gulplog": "1.0.0",
+        "has-gulplog": "0.1.0",
+        "lodash._reescape": "3.0.0",
+        "lodash._reevaluate": "3.0.0",
+        "lodash._reinterpolate": "3.0.0",
+        "lodash.template": "3.6.2",
+        "minimist": "1.2.0",
+        "multipipe": "0.1.2",
+        "object-assign": "3.0.0",
+        "replace-ext": "0.0.1",
+        "through2": "2.0.3",
+        "vinyl": "0.5.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "object-assign": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+          "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+          "dev": true
+        },
+        "replace-ext": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+          "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        },
+        "through2": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+          "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+          "dev": true,
+          "requires": {
+            "readable-stream": "2.3.6",
+            "xtend": "4.0.1"
+          }
+        },
+        "vinyl": {
+          "version": "0.5.3",
+          "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
+          "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+          "dev": true,
+          "requires": {
+            "clone": "1.0.4",
+            "clone-stats": "0.0.1",
+            "replace-ext": "0.0.1"
+          }
+        }
+      }
+    },
+    "gulplog": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+      "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+      "dev": true,
+      "requires": {
+        "glogg": "1.0.1"
+      }
+    },
+    "gzip-size": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz",
+      "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=",
+      "dev": true,
+      "requires": {
+        "duplexer": "0.1.1"
+      }
+    },
+    "har-schema": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+      "dev": true
+    },
+    "har-validator": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
+      "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
+      "dev": true,
+      "requires": {
+        "ajv": "5.5.2",
+        "har-schema": "2.0.0"
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "1.1.1"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "2.1.1"
+      }
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true
+    },
+    "has-gulplog": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
+      "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
+      "dev": true,
+      "requires": {
+        "sparkles": "1.0.1"
+      }
+    },
+    "highlight.js": {
+      "version": "9.12.0",
+      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz",
+      "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=",
+      "dev": true
+    },
+    "home-or-tmp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+      "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+      "dev": true,
+      "requires": {
+        "os-homedir": "1.0.2",
+        "os-tmpdir": "1.0.2"
+      }
+    },
+    "homedir-polyfill": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+      "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+      "dev": true,
+      "requires": {
+        "parse-passwd": "1.0.0"
+      }
+    },
+    "hosted-git-info": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
+      "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
+      "dev": true
+    },
+    "html-comment-regex": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz",
+      "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=",
+      "dev": true
+    },
+    "htmlparser2": {
+      "version": "3.9.2",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
+      "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1.3.0",
+        "domhandler": "2.4.2",
+        "domutils": "1.5.1",
+        "entities": "1.1.1",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "http-errors": {
+      "version": "1.6.3",
+      "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+      "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+      "dev": true,
+      "requires": {
+        "depd": "1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.0",
+        "statuses": "1.4.0"
+      }
+    },
+    "http-parser-js": {
+      "version": "0.4.13",
+      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz",
+      "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=",
+      "dev": true
+    },
+    "http-signature": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "jsprim": "1.4.1",
+        "sshpk": "1.14.2"
+      }
+    },
+    "iconv-lite": {
+      "version": "0.4.19",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+      "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+      "dev": true
+    },
+    "imagemin": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-5.3.1.tgz",
+      "integrity": "sha1-8Zwu7h5xumxlWMUV+fyWaAGJptQ=",
+      "dev": true,
+      "requires": {
+        "file-type": "4.4.0",
+        "globby": "6.1.0",
+        "make-dir": "1.3.0",
+        "p-pipe": "1.2.0",
+        "pify": "2.3.0",
+        "replace-ext": "1.0.0"
+      }
+    },
+    "imagemin-gifsicle": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz",
+      "integrity": "sha512-K01m5QuPK+0en8oVhiOOAicF7KjrHlCZxS++mfLI2mV/Ksfq/Y9nCXCWDz6jRv13wwlqe5T7hXT+ji2DnLc2yQ==",
+      "dev": true,
+      "requires": {
+        "exec-buffer": "3.2.0",
+        "gifsicle": "3.0.4",
+        "is-gif": "1.0.0"
+      }
+    },
+    "imagemin-jpegtran": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-5.0.2.tgz",
+      "integrity": "sha1-5ogiY7j3kW/duABkDPddLpcNKtY=",
+      "dev": true,
+      "requires": {
+        "exec-buffer": "3.2.0",
+        "is-jpg": "1.0.1",
+        "jpegtran-bin": "3.2.0"
+      }
+    },
+    "imagemin-optipng": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz",
+      "integrity": "sha1-0i2kEsCfX/AKQzmWC5ioix2+hpU=",
+      "dev": true,
+      "requires": {
+        "exec-buffer": "3.2.0",
+        "is-png": "1.1.0",
+        "optipng-bin": "3.1.4"
+      }
+    },
+    "imagemin-svgo": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-6.0.0.tgz",
+      "integrity": "sha512-xwjBZQKpbkklHtJYnCOwRJjTRJA/nR0hQzKMh+CUZRvm/L0QwKKPJQ9tkPWQHrg+cydPu2i1vLgHuy2E0hKEkg==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "0.1.2",
+        "is-svg": "2.1.0",
+        "svgo": "1.0.5"
+      },
+      "dependencies": {
+        "buffer-from": {
+          "version": "0.1.2",
+          "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz",
+          "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==",
+          "dev": true
+        },
+        "coa": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.1.tgz",
+          "integrity": "sha512-5wfTTO8E2/ja4jFSxePXlG5nRu5bBtL/r1HCIpJW/lzT6yDtKl0u0Z4o/Vpz32IpKmBn7HerheEZQgA9N2DarQ==",
+          "dev": true,
+          "requires": {
+            "q": "1.5.1"
+          }
+        },
+        "csso": {
+          "version": "3.5.1",
+          "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz",
+          "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==",
+          "dev": true,
+          "requires": {
+            "css-tree": "1.0.0-alpha.29"
+          },
+          "dependencies": {
+            "css-tree": {
+              "version": "1.0.0-alpha.29",
+              "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz",
+              "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==",
+              "dev": true,
+              "requires": {
+                "mdn-data": "1.1.4",
+                "source-map": "0.5.7"
+              }
+            }
+          }
+        },
+        "esprima": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+          "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+          "dev": true
+        },
+        "js-yaml": {
+          "version": "3.10.0",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
+          "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==",
+          "dev": true,
+          "requires": {
+            "argparse": "1.0.10",
+            "esprima": "4.0.1"
+          }
+        },
+        "mdn-data": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz",
+          "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "svgo": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.0.5.tgz",
+          "integrity": "sha512-nYrifviB77aNKDNKKyuay3M9aYiK6Hv5gJVDdjj2ZXTQmI8WZc8+UPLR5IpVlktJfSu3co/4XcWgrgI6seGBPg==",
+          "dev": true,
+          "requires": {
+            "coa": "2.0.1",
+            "colors": "1.1.2",
+            "css-select": "1.3.0-rc0",
+            "css-select-base-adapter": "0.1.0",
+            "css-tree": "1.0.0-alpha25",
+            "css-url-regex": "1.1.0",
+            "csso": "3.5.1",
+            "js-yaml": "3.10.0",
+            "mkdirp": "0.5.1",
+            "object.values": "1.0.4",
+            "sax": "1.2.4",
+            "stable": "0.1.8",
+            "unquote": "1.1.1",
+            "util.promisify": "1.0.0"
+          }
+        }
+      }
+    },
+    "indent-string": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+      "dev": true,
+      "requires": {
+        "repeating": "2.0.1"
+      }
+    },
+    "indexes-of": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "requires": {
+        "once": "1.4.0",
+        "wrappy": "1.0.2"
+      }
+    },
+    "inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "dev": true
+    },
+    "ini": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+      "dev": true
+    },
+    "inquirer": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz",
+      "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "1.4.0",
+        "chalk": "1.1.3",
+        "cli-cursor": "2.1.0",
+        "cli-width": "2.2.0",
+        "external-editor": "2.2.0",
+        "figures": "2.0.0",
+        "lodash": "4.17.11",
+        "mute-stream": "0.0.7",
+        "run-async": "2.3.0",
+        "rx": "4.1.0",
+        "string-width": "2.1.1",
+        "strip-ansi": "3.0.1",
+        "through": "2.3.8"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "figures": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+          "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "1.0.5"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "interpret": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+      "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+      "dev": true
+    },
+    "invariant": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+      "dev": true,
+      "requires": {
+        "loose-envify": "1.4.0"
+      }
+    },
+    "ip-regex": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz",
+      "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=",
+      "dev": true
+    },
+    "ipaddr.js": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
+      "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
+      "dev": true
+    },
+    "is-absolute": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz",
+      "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=",
+      "dev": true,
+      "requires": {
+        "is-relative": "0.1.3"
+      }
+    },
+    "is-absolute-url": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
+      "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
+      "dev": true
+    },
+    "is-arrayish": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+      "dev": true
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "dev": true
+    },
+    "is-builtin-module": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+      "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+      "dev": true,
+      "requires": {
+        "builtin-modules": "1.1.1"
+      }
+    },
+    "is-bzip2": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz",
+      "integrity": "sha1-XuWOqlounIDiFAe+3yOuWsCRs/w=",
+      "dev": true
+    },
+    "is-callable": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+      "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+      "dev": true
+    },
+    "is-date-object": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
+      "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+      "dev": true
+    },
+    "is-dotfile": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+      "dev": true
+    },
+    "is-equal-shallow": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+      "dev": true,
+      "requires": {
+        "is-primitive": "2.0.0"
+      }
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "dev": true
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true
+    },
+    "is-finite": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "1.0.1"
+      }
+    },
+    "is-fullwidth-code-point": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+      "dev": true
+    },
+    "is-gif": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz",
+      "integrity": "sha1-ptKumIkwB7/6l6HYwB1jIFgyCX4=",
+      "dev": true
+    },
+    "is-glob": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+      "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+      "dev": true,
+      "requires": {
+        "is-extglob": "2.1.1"
+      }
+    },
+    "is-gzip": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz",
+      "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=",
+      "dev": true
+    },
+    "is-jpg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-1.0.1.tgz",
+      "integrity": "sha1-KW1X/dmc4BBDSnKD40armhA16XU=",
+      "dev": true
+    },
+    "is-natural-number": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz",
+      "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=",
+      "dev": true
+    },
+    "is-number": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+      "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "is-obj": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+      "dev": true
+    },
+    "is-plain-obj": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+      "dev": true
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dev": true,
+      "requires": {
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
+      }
+    },
+    "is-png": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz",
+      "integrity": "sha1-1XSxK/J1wDUEVVcLDltXqwYgd84=",
+      "dev": true
+    },
+    "is-posix-bracket": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+      "dev": true
+    },
+    "is-primitive": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+      "dev": true
+    },
+    "is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+      "dev": true
+    },
+    "is-redirect": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+      "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+      "dev": true
+    },
+    "is-regex": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+      "dev": true,
+      "requires": {
+        "has": "1.0.3"
+      }
+    },
+    "is-relative": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz",
+      "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=",
+      "dev": true
+    },
+    "is-retry-allowed": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+      "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
+      "dev": true
+    },
+    "is-root": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz",
+      "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=",
+      "dev": true
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true
+    },
+    "is-svg": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz",
+      "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=",
+      "dev": true,
+      "requires": {
+        "html-comment-regex": "1.1.1"
+      }
+    },
+    "is-symbol": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
+      "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=",
+      "dev": true
+    },
+    "is-tar": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz",
+      "integrity": "sha1-L2suF5LB9bs2UZrKqdZcDSb+hT0=",
+      "dev": true
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+      "dev": true
+    },
+    "is-url": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
+      "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==",
+      "dev": true
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "is-valid-glob": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
+      "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=",
+      "dev": true
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "dev": true
+    },
+    "is-zip": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz",
+      "integrity": "sha1-R7Co/004p2QxzP2ZqOFaTIa6IyU=",
+      "dev": true
+    },
+    "is2": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/is2/-/is2-0.0.9.tgz",
+      "integrity": "sha1-EZVW0dFlGkG6EFr4AyZ8gLKZ9ik=",
+      "dev": true,
+      "requires": {
+        "deep-is": "0.1.2"
+      }
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "isobject": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+      "dev": true,
+      "requires": {
+        "isarray": "1.0.0"
+      }
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+      "dev": true
+    },
+    "jpegtran-bin": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz",
+      "integrity": "sha1-9g7PSumZwL2tLp+83ytvCYHnops=",
+      "dev": true,
+      "requires": {
+        "bin-build": "2.2.0",
+        "bin-wrapper": "3.0.2",
+        "logalot": "2.1.0"
+      }
+    },
+    "js-base64": {
+      "version": "2.4.9",
+      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz",
+      "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==",
+      "dev": true
+    },
+    "js-tokens": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+      "dev": true
+    },
+    "js-yaml": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz",
+      "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=",
+      "dev": true,
+      "requires": {
+        "argparse": "1.0.10",
+        "esprima": "2.7.3"
+      }
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+      "dev": true,
+      "optional": true
+    },
+    "jsesc": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+      "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+      "dev": true
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+      "dev": true
+    },
+    "json-schema-traverse": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+      "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+      "dev": true
+    },
+    "json-stable-stringify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+      "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+      "dev": true,
+      "requires": {
+        "jsonify": "0.0.0"
+      }
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+      "dev": true
+    },
+    "json3": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+      "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+      "dev": true
+    },
+    "json5": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+      "dev": true
+    },
+    "jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11"
+      }
+    },
+    "jsonify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+      "dev": true
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      }
+    },
+    "kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "dev": true,
+      "requires": {
+        "is-buffer": "1.1.6"
+      }
+    },
+    "lazy-cache": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
+      "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
+      "dev": true,
+      "requires": {
+        "set-getter": "0.1.0"
+      }
+    },
+    "lazy-req": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz",
+      "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=",
+      "dev": true
+    },
+    "lazystream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+      "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "2.3.6"
+      }
+    },
+    "list-item": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz",
+      "integrity": "sha1-DGXQDih8tmPMs8s4Sad+iewmilY=",
+      "dev": true,
+      "requires": {
+        "expand-range": "1.8.2",
+        "extend-shallow": "2.0.1",
+        "is-number": "2.1.0",
+        "repeat-string": "1.6.1"
+      }
+    },
+    "livereload-js": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz",
+      "integrity": "sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg==",
+      "dev": true
+    },
+    "load-json-file": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "parse-json": "2.2.0",
+        "pify": "2.3.0",
+        "pinkie-promise": "2.0.1",
+        "strip-bom": "2.0.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.11",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+      "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+      "dev": true
+    },
+    "lodash._basecopy": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
+      "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+      "dev": true
+    },
+    "lodash._basetostring": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
+      "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=",
+      "dev": true
+    },
+    "lodash._basevalues": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
+      "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=",
+      "dev": true
+    },
+    "lodash._getnative": {
+      "version": "3.9.1",
+      "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
+      "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
+      "dev": true
+    },
+    "lodash._isiterateecall": {
+      "version": "3.0.9",
+      "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
+      "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+      "dev": true
+    },
+    "lodash._reescape": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
+      "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=",
+      "dev": true
+    },
+    "lodash._reevaluate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
+      "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=",
+      "dev": true
+    },
+    "lodash._reinterpolate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+      "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+      "dev": true
+    },
+    "lodash._root": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
+      "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
+      "dev": true
+    },
+    "lodash.assignin": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz",
+      "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=",
+      "dev": true
+    },
+    "lodash.bind": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz",
+      "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=",
+      "dev": true
+    },
+    "lodash.defaults": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+      "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+      "dev": true
+    },
+    "lodash.escape": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
+      "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+      "dev": true,
+      "requires": {
+        "lodash._root": "3.0.1"
+      }
+    },
+    "lodash.filter": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz",
+      "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=",
+      "dev": true
+    },
+    "lodash.flatten": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+      "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
+      "dev": true
+    },
+    "lodash.foreach": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
+      "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=",
+      "dev": true
+    },
+    "lodash.isarguments": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+      "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+      "dev": true
+    },
+    "lodash.isarray": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
+      "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
+      "dev": true
+    },
+    "lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
+      "dev": true
+    },
+    "lodash.keys": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
+      "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+      "dev": true,
+      "requires": {
+        "lodash._getnative": "3.9.1",
+        "lodash.isarguments": "3.1.0",
+        "lodash.isarray": "3.0.4"
+      }
+    },
+    "lodash.map": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz",
+      "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=",
+      "dev": true
+    },
+    "lodash.memoize": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+      "dev": true
+    },
+    "lodash.merge": {
+      "version": "4.6.1",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz",
+      "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==",
+      "dev": true
+    },
+    "lodash.pick": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
+      "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=",
+      "dev": true
+    },
+    "lodash.reduce": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz",
+      "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=",
+      "dev": true
+    },
+    "lodash.reject": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz",
+      "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=",
+      "dev": true
+    },
+    "lodash.restparam": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
+      "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
+      "dev": true
+    },
+    "lodash.some": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
+      "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
+      "dev": true
+    },
+    "lodash.template": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
+      "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
+      "dev": true,
+      "requires": {
+        "lodash._basecopy": "3.0.1",
+        "lodash._basetostring": "3.0.1",
+        "lodash._basevalues": "3.0.0",
+        "lodash._isiterateecall": "3.0.9",
+        "lodash._reinterpolate": "3.0.0",
+        "lodash.escape": "3.2.0",
+        "lodash.keys": "3.1.2",
+        "lodash.restparam": "3.6.1",
+        "lodash.templatesettings": "3.1.1"
+      }
+    },
+    "lodash.templatesettings": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
+      "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+      "dev": true,
+      "requires": {
+        "lodash._reinterpolate": "3.0.0",
+        "lodash.escape": "3.2.0"
+      }
+    },
+    "lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
+      "dev": true
+    },
+    "logalot": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz",
+      "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=",
+      "dev": true,
+      "requires": {
+        "figures": "1.7.0",
+        "squeak": "1.3.0"
+      }
+    },
+    "longest": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+      "dev": true
+    },
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "dev": true,
+      "requires": {
+        "js-tokens": "3.0.2"
+      }
+    },
+    "loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+      "dev": true,
+      "requires": {
+        "currently-unhandled": "0.4.1",
+        "signal-exit": "3.0.2"
+      }
+    },
+    "lowercase-keys": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+      "dev": true
+    },
+    "lpad-align": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz",
+      "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=",
+      "dev": true,
+      "requires": {
+        "get-stdin": "4.0.1",
+        "indent-string": "2.1.0",
+        "longest": "1.0.1",
+        "meow": "3.7.0"
+      }
+    },
+    "lru-cache": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
+      "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
+      "dev": true,
+      "requires": {
+        "pseudomap": "1.0.2",
+        "yallist": "2.1.2"
+      }
+    },
+    "make-dir": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+      "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+      "dev": true,
+      "requires": {
+        "pify": "3.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        }
+      }
+    },
+    "map-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+      "dev": true
+    },
+    "markdown-link": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz",
+      "integrity": "sha1-MsXGUZmmRXMWMi0eQinRNAfIx88=",
+      "dev": true
+    },
+    "markdown-toc": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz",
+      "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==",
+      "dev": true,
+      "requires": {
+        "concat-stream": "1.6.2",
+        "diacritics-map": "0.1.0",
+        "gray-matter": "2.1.1",
+        "lazy-cache": "2.0.2",
+        "list-item": "1.1.1",
+        "markdown-link": "0.1.1",
+        "minimist": "1.2.0",
+        "mixin-deep": "1.3.1",
+        "object.pick": "1.3.0",
+        "remarkable": "1.7.1",
+        "repeat-string": "1.6.1",
+        "strip-color": "0.1.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "math-expression-evaluator": {
+      "version": "1.2.17",
+      "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz",
+      "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=",
+      "dev": true
+    },
+    "math-random": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
+      "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
+      "dev": true
+    },
+    "mdn-data": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.2.0.tgz",
+      "integrity": "sha512-esDqNvsJB2q5V28+u7NdtdMg6Rmg4khQmAVSjUiX7BY/7haIv0K2yWM43hYp0or+3nvG7+UaTF1JHz31hgU1TA==",
+      "dev": true
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+      "dev": true
+    },
+    "meow": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+      "dev": true,
+      "requires": {
+        "camelcase-keys": "2.1.0",
+        "decamelize": "1.2.0",
+        "loud-rejection": "1.6.0",
+        "map-obj": "1.0.1",
+        "minimist": "1.2.0",
+        "normalize-package-data": "2.4.0",
+        "object-assign": "4.1.1",
+        "read-pkg-up": "1.0.1",
+        "redent": "1.0.0",
+        "trim-newlines": "1.0.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+      "dev": true
+    },
+    "merge-stream": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
+      "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "2.3.6"
+      }
+    },
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "2.3.11",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+      "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+      "dev": true,
+      "requires": {
+        "arr-diff": "2.0.0",
+        "array-unique": "0.2.1",
+        "braces": "1.8.5",
+        "expand-brackets": "0.1.5",
+        "extglob": "0.3.2",
+        "filename-regex": "2.0.1",
+        "is-extglob": "1.0.0",
+        "is-glob": "2.0.1",
+        "kind-of": "3.2.2",
+        "normalize-path": "2.1.1",
+        "object.omit": "2.0.1",
+        "parse-glob": "3.0.4",
+        "regex-cache": "0.4.4"
+      },
+      "dependencies": {
+        "is-extglob": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "1.0.0"
+          }
+        }
+      }
+    },
+    "mime": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+      "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+      "dev": true
+    },
+    "mime-db": {
+      "version": "1.36.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
+      "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==",
+      "dev": true
+    },
+    "mime-types": {
+      "version": "2.1.20",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
+      "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
+      "dev": true,
+      "requires": {
+        "mime-db": "1.36.0"
+      }
+    },
+    "mimic-fn": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "1.1.11"
+      }
+    },
+    "minimist": {
+      "version": "0.0.8",
+      "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+      "dev": true
+    },
+    "mixin-deep": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+      "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+      "dev": true,
+      "requires": {
+        "for-in": "1.0.2",
+        "is-extendable": "1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "2.0.4"
+          }
+        }
+      }
+    },
+    "mkdirp": {
+      "version": "0.5.1",
+      "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "dev": true,
+      "requires": {
+        "minimist": "0.0.8"
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
+    },
+    "multipipe": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
+      "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
+      "dev": true,
+      "requires": {
+        "duplexer2": "0.0.2"
+      },
+      "dependencies": {
+        "duplexer2": {
+          "version": "0.0.2",
+          "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+          "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+          "dev": true,
+          "requires": {
+            "readable-stream": "1.1.14"
+          }
+        },
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "1.1.14",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "0.0.1",
+            "string_decoder": "0.10.31"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true
+        }
+      }
+    },
+    "mute-stream": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+      "dev": true
+    },
+    "negotiator": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+      "dev": true
+    },
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "dev": true
+    },
+    "node-fetch": {
+      "version": "1.6.3",
+      "resolved": "http://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz",
+      "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=",
+      "dev": true,
+      "requires": {
+        "encoding": "0.1.12",
+        "is-stream": "1.1.0"
+      }
+    },
+    "node-releases": {
+      "version": "1.0.0-alpha.11",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.0-alpha.11.tgz",
+      "integrity": "sha512-CaViu+2FqTNYOYNihXa5uPS/zry92I3vPU4nCB6JB3OeZ2UGtOpF5gRwuN4+m3hbEcL47bOXyun1jX2iC+3uEQ==",
+      "dev": true,
+      "requires": {
+        "semver": "5.5.1"
+      }
+    },
+    "node-status-codes": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz",
+      "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=",
+      "dev": true
+    },
+    "normalize-package-data": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+      "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "2.7.1",
+        "is-builtin-module": "1.0.0",
+        "semver": "5.5.1",
+        "validate-npm-package-license": "3.0.4"
+      }
+    },
+    "normalize-path": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+      "dev": true,
+      "requires": {
+        "remove-trailing-separator": "1.1.0"
+      }
+    },
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+      "dev": true
+    },
+    "normalize-url": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
+      "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+      "dev": true,
+      "requires": {
+        "object-assign": "4.1.1",
+        "prepend-http": "1.0.4",
+        "query-string": "4.3.4",
+        "sort-keys": "1.1.2"
+      }
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "dev": true,
+      "requires": {
+        "path-key": "2.0.1"
+      }
+    },
+    "nth-check": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
+      "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
+      "dev": true,
+      "requires": {
+        "boolbase": "1.0.0"
+      }
+    },
+    "num2fraction": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+      "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
+      "dev": true
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+      "dev": true
+    },
+    "oauth-sign": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+      "dev": true
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "dev": true
+    },
+    "object-keys": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
+      "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
+      "dev": true
+    },
+    "object.getownpropertydescriptors": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
+      "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
+      "dev": true,
+      "requires": {
+        "define-properties": "1.1.3",
+        "es-abstract": "1.12.0"
+      }
+    },
+    "object.omit": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+      "dev": true,
+      "requires": {
+        "for-own": "0.1.5",
+        "is-extendable": "0.1.1"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "requires": {
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
+      }
+    },
+    "object.values": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz",
+      "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=",
+      "dev": true,
+      "requires": {
+        "define-properties": "1.1.3",
+        "es-abstract": "1.12.0",
+        "function-bind": "1.1.1",
+        "has": "1.0.3"
+      }
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "dev": true,
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
+      "requires": {
+        "wrappy": "1.0.2"
+      }
+    },
+    "onetime": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+      "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
+      "dev": true
+    },
+    "opencollective": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz",
+      "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=",
+      "dev": true,
+      "requires": {
+        "babel-polyfill": "6.23.0",
+        "chalk": "1.1.3",
+        "inquirer": "3.0.6",
+        "minimist": "1.2.0",
+        "node-fetch": "1.6.3",
+        "opn": "4.0.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "babel-polyfill": {
+          "version": "6.23.0",
+          "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz",
+          "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=",
+          "dev": true,
+          "requires": {
+            "babel-runtime": "6.26.0",
+            "core-js": "2.5.7",
+            "regenerator-runtime": "0.10.5"
+          }
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "regenerator-runtime": {
+          "version": "0.10.5",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+          "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "opn": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz",
+      "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=",
+      "dev": true,
+      "requires": {
+        "object-assign": "4.1.1",
+        "pinkie-promise": "2.0.1"
+      }
+    },
+    "optipng-bin": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-3.1.4.tgz",
+      "integrity": "sha1-ldNPLEiHBPb9cGBr/qDGWfHZXYQ=",
+      "dev": true,
+      "requires": {
+        "bin-build": "2.2.0",
+        "bin-wrapper": "3.0.2",
+        "logalot": "2.1.0"
+      }
+    },
+    "ordered-read-streams": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz",
+      "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=",
+      "dev": true,
+      "requires": {
+        "is-stream": "1.1.0",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "original": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
+      "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
+      "dev": true,
+      "requires": {
+        "url-parse": "1.4.3"
+      }
+    },
+    "os-filter-obj": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz",
+      "integrity": "sha1-WRUzDZDs7VV9LZOKMcbdIU2cY60=",
+      "dev": true
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+      "dev": true
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+      "dev": true
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-pipe": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz",
+      "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=",
+      "dev": true
+    },
+    "parse-glob": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+      "dev": true,
+      "requires": {
+        "glob-base": "0.3.0",
+        "is-dotfile": "1.0.3",
+        "is-extglob": "1.0.0",
+        "is-glob": "2.0.1"
+      },
+      "dependencies": {
+        "is-extglob": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "1.0.0"
+          }
+        }
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "requires": {
+        "error-ex": "1.3.2"
+      }
+    },
+    "parse-passwd": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+      "dev": true
+    },
+    "parseurl": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+      "dev": true
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "dev": true
+    },
+    "path-exists": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+      "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+      "dev": true,
+      "requires": {
+        "pinkie-promise": "2.0.1"
+      }
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+      "dev": true
+    },
+    "path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+      "dev": true
+    },
+    "path-type": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "pify": "2.3.0",
+        "pinkie-promise": "2.0.1"
+      }
+    },
+    "pend": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+      "dev": true
+    },
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+      "dev": true
+    },
+    "pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "dev": true
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "dev": true,
+      "requires": {
+        "pinkie": "2.0.4"
+      }
+    },
+    "postcss": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.2.tgz",
+      "integrity": "sha512-fmaUY5370keLUTx+CnwRxtGiuFTcNBLQBqr1oE3WZ/euIYmGAo0OAgOhVJ3ByDnVmOR3PK+0V9VebzfjRIUcqw==",
+      "dev": true,
+      "requires": {
+        "chalk": "2.4.1",
+        "source-map": "0.6.1",
+        "supports-color": "5.5.0"
+      }
+    },
+    "postcss-calc": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz",
+      "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-message-helpers": "2.0.0",
+        "reduce-css-calc": "1.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-colormin": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz",
+      "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=",
+      "dev": true,
+      "requires": {
+        "colormin": "1.1.2",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-convert-values": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz",
+      "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-comments": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz",
+      "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-duplicates": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz",
+      "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-empty": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz",
+      "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-overridden": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz",
+      "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-unused": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz",
+      "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18",
+        "uniqs": "2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-filter-plugins": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz",
+      "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-merge-idents": {
+      "version": "2.1.7",
+      "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz",
+      "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=",
+      "dev": true,
+      "requires": {
+        "has": "1.0.3",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-merge-longhand": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz",
+      "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-merge-rules": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz",
+      "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=",
+      "dev": true,
+      "requires": {
+        "browserslist": "1.7.7",
+        "caniuse-api": "1.6.1",
+        "postcss": "5.2.18",
+        "postcss-selector-parser": "2.2.3",
+        "vendors": "1.0.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "browserslist": {
+          "version": "1.7.7",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
+          "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+          "dev": true,
+          "requires": {
+            "caniuse-db": "1.0.30000885",
+            "electron-to-chromium": "1.3.67"
+          }
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-message-helpers": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz",
+      "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=",
+      "dev": true
+    },
+    "postcss-minify-font-values": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz",
+      "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=",
+      "dev": true,
+      "requires": {
+        "object-assign": "4.1.1",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-minify-gradients": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz",
+      "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-minify-params": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz",
+      "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "1.0.2",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0",
+        "uniqs": "2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-minify-selectors": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz",
+      "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "1.0.2",
+        "has": "1.0.3",
+        "postcss": "5.2.18",
+        "postcss-selector-parser": "2.2.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-normalize-charset": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz",
+      "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-normalize-url": {
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz",
+      "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=",
+      "dev": true,
+      "requires": {
+        "is-absolute-url": "2.1.0",
+        "normalize-url": "1.9.1",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-ordered-values": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz",
+      "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-reduce-idents": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz",
+      "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-reduce-initial": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz",
+      "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-reduce-transforms": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz",
+      "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=",
+      "dev": true,
+      "requires": {
+        "has": "1.0.3",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-selector-parser": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz",
+      "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=",
+      "dev": true,
+      "requires": {
+        "flatten": "1.0.2",
+        "indexes-of": "1.0.1",
+        "uniq": "1.0.1"
+      }
+    },
+    "postcss-svgo": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz",
+      "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=",
+      "dev": true,
+      "requires": {
+        "is-svg": "2.1.0",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0",
+        "svgo": "0.7.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-unique-selectors": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz",
+      "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "1.0.2",
+        "postcss": "5.2.18",
+        "uniqs": "2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-value-parser": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz",
+      "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=",
+      "dev": true
+    },
+    "postcss-zindex": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz",
+      "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=",
+      "dev": true,
+      "requires": {
+        "has": "1.0.3",
+        "postcss": "5.2.18",
+        "uniqs": "2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.9",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "prepend-http": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+      "dev": true
+    },
+    "preserve": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+      "dev": true
+    },
+    "prismjs": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.15.0.tgz",
+      "integrity": "sha512-Lf2JrFYx8FanHrjoV5oL8YHCclLQgbJcVZR+gikGGMqz6ub5QVWDTM6YIwm3BuPxM/LOV+rKns3LssXNLIf+DA==",
+      "dev": true,
+      "requires": {
+        "clipboard": "2.0.1"
+      }
+    },
+    "private": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+      "dev": true
+    },
+    "process-nextick-args": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+      "dev": true
+    },
+    "prop-types": {
+      "version": "15.6.2",
+      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz",
+      "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==",
+      "dev": true,
+      "requires": {
+        "loose-envify": "1.4.0",
+        "object-assign": "4.1.1"
+      }
+    },
+    "proxy-addr": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
+      "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
+      "dev": true,
+      "requires": {
+        "forwarded": "0.1.2",
+        "ipaddr.js": "1.8.0"
+      }
+    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+      "dev": true
+    },
+    "psl": {
+      "version": "1.1.29",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
+      "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==",
+      "dev": true
+    },
+    "punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+      "dev": true
+    },
+    "q": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+      "dev": true
+    },
+    "qs": {
+      "version": "6.5.2",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+      "dev": true
+    },
+    "query-string": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
+      "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+      "dev": true,
+      "requires": {
+        "object-assign": "4.1.1",
+        "strict-uri-encode": "1.1.0"
+      }
+    },
+    "querystringify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz",
+      "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==",
+      "dev": true
+    },
+    "randomatic": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz",
+      "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==",
+      "dev": true,
+      "requires": {
+        "is-number": "4.0.0",
+        "kind-of": "6.0.2",
+        "math-random": "1.0.1"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "range-parser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+      "dev": true
+    },
+    "raw-body": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
+      "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+      "dev": true,
+      "requires": {
+        "bytes": "3.0.0",
+        "http-errors": "1.6.2",
+        "iconv-lite": "0.4.19",
+        "unpipe": "1.0.0"
+      },
+      "dependencies": {
+        "depd": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
+          "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
+          "dev": true
+        },
+        "http-errors": {
+          "version": "1.6.2",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
+          "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+          "dev": true,
+          "requires": {
+            "depd": "1.1.1",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.0.3",
+            "statuses": "1.4.0"
+          }
+        },
+        "setprototypeof": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
+          "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+          "dev": true
+        }
+      }
+    },
+    "rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "dev": true,
+      "requires": {
+        "deep-extend": "0.6.0",
+        "ini": "1.3.5",
+        "minimist": "1.2.0",
+        "strip-json-comments": "2.0.1"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "react": {
+      "version": "16.5.1",
+      "resolved": "https://registry.npmjs.org/react/-/react-16.5.1.tgz",
+      "integrity": "sha512-E+23+rbpPsJgSX812LQkwupUCFnbVE84+L8uxlkqN5MU0DcraWMlVf9cRvKCKtGu0XvScyRnW7Z+9d7ymkjy3A==",
+      "dev": true,
+      "requires": {
+        "loose-envify": "1.4.0",
+        "object-assign": "4.1.1",
+        "prop-types": "15.6.2",
+        "schedule": "0.4.0"
+      }
+    },
+    "react-dev-utils": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-5.0.2.tgz",
+      "integrity": "sha512-d2FbKvYe4XAQx5gjHBoWG+ADqC3fGZzjb7i9vxd/Y5xfLkBGtQyX7aOb8lBRQPYUhjngiD3d49LevjY1stUR0Q==",
+      "dev": true,
+      "requires": {
+        "address": "1.0.3",
+        "babel-code-frame": "6.26.0",
+        "chalk": "1.1.3",
+        "cross-spawn": "5.1.0",
+        "detect-port-alt": "1.1.6",
+        "escape-string-regexp": "1.0.5",
+        "filesize": "3.5.11",
+        "global-modules": "1.0.0",
+        "gzip-size": "3.0.0",
+        "inquirer": "3.3.0",
+        "is-root": "1.0.0",
+        "opn": "5.2.0",
+        "react-error-overlay": "4.0.1",
+        "recursive-readdir": "2.2.1",
+        "shell-quote": "1.6.1",
+        "sockjs-client": "1.1.5",
+        "strip-ansi": "3.0.1",
+        "text-table": "0.2.0"
+      },
+      "dependencies": {
+        "ansi-escapes": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+          "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
+          "dev": true
+        },
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "4.1.3",
+            "shebang-command": "1.2.0",
+            "which": "1.3.1"
+          }
+        },
+        "figures": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+          "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "1.0.5"
+          }
+        },
+        "inquirer": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+          "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+          "dev": true,
+          "requires": {
+            "ansi-escapes": "3.1.0",
+            "chalk": "2.4.1",
+            "cli-cursor": "2.1.0",
+            "cli-width": "2.2.0",
+            "external-editor": "2.2.0",
+            "figures": "2.0.0",
+            "lodash": "4.17.11",
+            "mute-stream": "0.0.7",
+            "run-async": "2.3.0",
+            "rx-lite": "4.0.8",
+            "rx-lite-aggregates": "4.0.8",
+            "string-width": "2.1.1",
+            "strip-ansi": "4.0.0",
+            "through": "2.3.8"
+          },
+          "dependencies": {
+            "ansi-styles": {
+              "version": "3.2.1",
+              "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+              "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+              "dev": true,
+              "requires": {
+                "color-convert": "1.9.3"
+              }
+            },
+            "chalk": {
+              "version": "2.4.1",
+              "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+              "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+              "dev": true,
+              "requires": {
+                "ansi-styles": "3.2.1",
+                "escape-string-regexp": "1.0.5",
+                "supports-color": "5.5.0"
+              }
+            },
+            "strip-ansi": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "3.0.0"
+              }
+            },
+            "supports-color": {
+              "version": "5.5.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "3.0.0"
+              }
+            }
+          }
+        },
+        "opn": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz",
+          "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==",
+          "dev": true,
+          "requires": {
+            "is-wsl": "1.1.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "react-dom": {
+      "version": "16.5.1",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.5.1.tgz",
+      "integrity": "sha512-l4L9GtX7ezgnDIIr6AaNvGBM4BiK0fSs4/V8bdsu9X6xqrtHr+jp6auT0hbHpN7bH9WRvDBZceWQ9WJ3lGCIvQ==",
+      "dev": true,
+      "requires": {
+        "loose-envify": "1.4.0",
+        "object-assign": "4.1.1",
+        "prop-types": "15.6.2",
+        "schedule": "0.4.0"
+      }
+    },
+    "react-error-overlay": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-4.0.1.tgz",
+      "integrity": "sha512-xXUbDAZkU08aAkjtUvldqbvI04ogv+a1XdHxvYuHPYKIVk/42BIOD0zSKTHAWV4+gDy3yGm283z2072rA2gdtw==",
+      "dev": true
+    },
+    "read-all-stream": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz",
+      "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=",
+      "dev": true,
+      "requires": {
+        "pinkie-promise": "2.0.1",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "read-pkg": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+      "dev": true,
+      "requires": {
+        "load-json-file": "1.1.0",
+        "normalize-package-data": "2.4.0",
+        "path-type": "1.1.0"
+      }
+    },
+    "read-pkg-up": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+      "dev": true,
+      "requires": {
+        "find-up": "1.1.2",
+        "read-pkg": "1.1.0"
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.6",
+      "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+      "dev": true,
+      "requires": {
+        "core-util-is": "1.0.2",
+        "inherits": "2.0.3",
+        "isarray": "1.0.0",
+        "process-nextick-args": "2.0.0",
+        "safe-buffer": "5.1.2",
+        "string_decoder": "1.1.1",
+        "util-deprecate": "1.0.2"
+      }
+    },
+    "rechoir": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+      "dev": true,
+      "requires": {
+        "resolve": "1.8.1"
+      }
+    },
+    "recursive-readdir": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz",
+      "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=",
+      "dev": true,
+      "requires": {
+        "minimatch": "3.0.3"
+      },
+      "dependencies": {
+        "minimatch": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
+          "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "1.1.11"
+          }
+        }
+      }
+    },
+    "redent": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+      "dev": true,
+      "requires": {
+        "indent-string": "2.1.0",
+        "strip-indent": "1.0.1"
+      }
+    },
+    "reduce-css-calc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz",
+      "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=",
+      "dev": true,
+      "requires": {
+        "balanced-match": "0.4.2",
+        "math-expression-evaluator": "1.2.17",
+        "reduce-function-call": "1.0.2"
+      },
+      "dependencies": {
+        "balanced-match": {
+          "version": "0.4.2",
+          "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+          "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
+          "dev": true
+        }
+      }
+    },
+    "reduce-function-call": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz",
+      "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=",
+      "dev": true,
+      "requires": {
+        "balanced-match": "0.4.2"
+      },
+      "dependencies": {
+        "balanced-match": {
+          "version": "0.4.2",
+          "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+          "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
+          "dev": true
+        }
+      }
+    },
+    "regenerate": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+      "dev": true
+    },
+    "regenerator-runtime": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+      "dev": true
+    },
+    "regenerator-transform": {
+      "version": "0.10.1",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+      "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "private": "0.1.8"
+      }
+    },
+    "regex-cache": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+      "dev": true,
+      "requires": {
+        "is-equal-shallow": "0.1.3"
+      }
+    },
+    "regexpu-core": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+      "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+      "dev": true,
+      "requires": {
+        "regenerate": "1.4.0",
+        "regjsgen": "0.2.0",
+        "regjsparser": "0.1.5"
+      }
+    },
+    "regjsgen": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+      "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+      "dev": true
+    },
+    "regjsparser": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+      "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+      "dev": true,
+      "requires": {
+        "jsesc": "0.5.0"
+      }
+    },
+    "remarkable": {
+      "version": "1.7.1",
+      "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.1.tgz",
+      "integrity": "sha1-qspJchALZqZCpjoQIcpLrBvjv/Y=",
+      "dev": true,
+      "requires": {
+        "argparse": "0.1.16",
+        "autolinker": "0.15.3"
+      },
+      "dependencies": {
+        "argparse": {
+          "version": "0.1.16",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz",
+          "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=",
+          "dev": true,
+          "requires": {
+            "underscore": "1.7.0",
+            "underscore.string": "2.4.0"
+          }
+        }
+      }
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+      "dev": true
+    },
+    "repeat-element": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+      "dev": true
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "dev": true
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "dev": true,
+      "requires": {
+        "is-finite": "1.0.2"
+      }
+    },
+    "replace-ext": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+      "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+      "dev": true
+    },
+    "request": {
+      "version": "2.88.0",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+      "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+      "dev": true,
+      "requires": {
+        "aws-sign2": "0.7.0",
+        "aws4": "1.8.0",
+        "caseless": "0.12.0",
+        "combined-stream": "1.0.6",
+        "extend": "3.0.2",
+        "forever-agent": "0.6.1",
+        "form-data": "2.3.2",
+        "har-validator": "5.1.0",
+        "http-signature": "1.2.0",
+        "is-typedarray": "1.0.0",
+        "isstream": "0.1.2",
+        "json-stringify-safe": "5.0.1",
+        "mime-types": "2.1.20",
+        "oauth-sign": "0.9.0",
+        "performance-now": "2.1.0",
+        "qs": "6.5.2",
+        "safe-buffer": "5.1.2",
+        "tough-cookie": "2.4.3",
+        "tunnel-agent": "0.6.0",
+        "uuid": "3.3.2"
+      }
+    },
+    "requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
+      "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
+      "dev": true,
+      "requires": {
+        "path-parse": "1.0.6"
+      }
+    },
+    "resolve-dir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+      "dev": true,
+      "requires": {
+        "expand-tilde": "2.0.2",
+        "global-modules": "1.0.0"
+      }
+    },
+    "restore-cursor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+      "dev": true,
+      "requires": {
+        "onetime": "2.0.1",
+        "signal-exit": "3.0.2"
+      },
+      "dependencies": {
+        "onetime": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+          "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "1.2.0"
+          }
+        }
+      }
+    },
+    "rimraf": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+      "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+      "dev": true,
+      "requires": {
+        "glob": "7.1.3"
+      }
+    },
+    "run-async": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+      "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+      "dev": true,
+      "requires": {
+        "is-promise": "2.1.0"
+      }
+    },
+    "rx": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
+      "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=",
+      "dev": true
+    },
+    "rx-lite": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+      "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
+      "dev": true
+    },
+    "rx-lite-aggregates": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+      "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+      "dev": true,
+      "requires": {
+        "rx-lite": "4.0.8"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
+    },
+    "safe-json-parse": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz",
+      "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=",
+      "dev": true
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
+    },
+    "sax": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+      "dev": true
+    },
+    "schedule": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/schedule/-/schedule-0.4.0.tgz",
+      "integrity": "sha512-hYjmoaEMojiMkWCxKr6ue+LYcZ29u29+AamWYmzwT2VOO9ws5UJp/wNhsVUPiUeNh+EdRfZm7nDeB40ffTfMhA==",
+      "dev": true,
+      "requires": {
+        "object-assign": "4.1.1"
+      }
+    },
+    "seek-bzip": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz",
+      "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=",
+      "dev": true,
+      "requires": {
+        "commander": "2.8.1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.8.1",
+          "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
+          "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
+          "dev": true,
+          "requires": {
+            "graceful-readlink": "1.0.1"
+          }
+        }
+      }
+    },
+    "select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
+      "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=",
+      "dev": true,
+      "optional": true
+    },
+    "semver": {
+      "version": "5.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
+      "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
+      "dev": true
+    },
+    "semver-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz",
+      "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=",
+      "dev": true
+    },
+    "semver-truncate": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz",
+      "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=",
+      "dev": true,
+      "requires": {
+        "semver": "5.5.1"
+      }
+    },
+    "send": {
+      "version": "0.16.2",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+      "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "1.1.2",
+        "destroy": "1.0.4",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "etag": "1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "1.6.3",
+        "mime": "1.4.1",
+        "ms": "2.0.0",
+        "on-finished": "2.3.0",
+        "range-parser": "1.2.0",
+        "statuses": "1.4.0"
+      }
+    },
+    "serve-static": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
+      "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+      "dev": true,
+      "requires": {
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "parseurl": "1.3.2",
+        "send": "0.16.2"
+      }
+    },
+    "set-getter": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
+      "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
+      "dev": true,
+      "requires": {
+        "to-object-path": "0.3.0"
+      }
+    },
+    "set-immediate-shim": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+      "dev": true
+    },
+    "setprototypeof": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+      "dev": true
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "dev": true
+    },
+    "shell-quote": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
+      "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
+      "dev": true,
+      "requires": {
+        "array-filter": "0.0.1",
+        "array-map": "0.0.0",
+        "array-reduce": "0.0.0",
+        "jsonify": "0.0.0"
+      }
+    },
+    "shelljs": {
+      "version": "0.7.8",
+      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz",
+      "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=",
+      "dev": true,
+      "requires": {
+        "glob": "7.1.3",
+        "interpret": "1.1.0",
+        "rechoir": "0.6.2"
+      }
+    },
+    "signal-exit": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+      "dev": true
+    },
+    "simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "0.3.2"
+      }
+    },
+    "sitemap": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-1.13.0.tgz",
+      "integrity": "sha1-Vpy+IYAgKSamKiZs094Jyc60P4M=",
+      "dev": true,
+      "requires": {
+        "underscore": "1.7.0",
+        "url-join": "1.1.0"
+      }
+    },
+    "slash": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+      "dev": true
+    },
+    "sockjs-client": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz",
+      "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "eventsource": "0.1.6",
+        "faye-websocket": "0.11.1",
+        "inherits": "2.0.3",
+        "json3": "3.3.2",
+        "url-parse": "1.4.3"
+      }
+    },
+    "sort-keys": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+      "dev": true,
+      "requires": {
+        "is-plain-obj": "1.1.0"
+      }
+    },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "dev": true
+    },
+    "source-map-support": {
+      "version": "0.4.18",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+      "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+      "dev": true,
+      "requires": {
+        "source-map": "0.5.7"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "sparkles": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz",
+      "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==",
+      "dev": true
+    },
+    "spdx-correct": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
+      "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "3.0.0",
+        "spdx-license-ids": "3.0.1"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
+      "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "2.1.0",
+        "spdx-license-ids": "3.0.1"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz",
+      "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==",
+      "dev": true
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "dev": true
+    },
+    "squeak": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz",
+      "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "console-stream": "0.1.1",
+        "lpad-align": "1.1.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "sshpk": {
+      "version": "1.14.2",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
+      "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
+      "dev": true,
+      "requires": {
+        "asn1": "0.2.4",
+        "assert-plus": "1.0.0",
+        "bcrypt-pbkdf": "1.0.2",
+        "dashdash": "1.14.1",
+        "ecc-jsbn": "0.1.2",
+        "getpass": "0.1.7",
+        "jsbn": "0.1.1",
+        "safer-buffer": "2.1.2",
+        "tweetnacl": "0.14.5"
+      }
+    },
+    "stable": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+      "dev": true
+    },
+    "stat-mode": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz",
+      "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=",
+      "dev": true
+    },
+    "statuses": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+      "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+      "dev": true
+    },
+    "stream-combiner2": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+      "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
+      "dev": true,
+      "requires": {
+        "duplexer2": "0.1.4",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "stream-shift": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+      "dev": true
+    },
+    "strict-uri-encode": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
+      "dev": true
+    },
+    "string-template": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
+      "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=",
+      "dev": true
+    },
+    "string-width": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+      "dev": true,
+      "requires": {
+        "is-fullwidth-code-point": "2.0.0",
+        "strip-ansi": "4.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "3.0.0"
+          }
+        }
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "2.1.1"
+      }
+    },
+    "strip-bom": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+      "dev": true,
+      "requires": {
+        "is-utf8": "0.2.1"
+      }
+    },
+    "strip-bom-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz",
+      "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=",
+      "dev": true,
+      "requires": {
+        "first-chunk-stream": "1.0.0",
+        "strip-bom": "2.0.0"
+      }
+    },
+    "strip-color": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz",
+      "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s=",
+      "dev": true
+    },
+    "strip-dirs": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz",
+      "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "get-stdin": "4.0.1",
+        "is-absolute": "0.1.7",
+        "is-natural-number": "2.1.1",
+        "minimist": "1.2.0",
+        "sum-up": "1.0.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+      "dev": true,
+      "requires": {
+        "get-stdin": "4.0.1"
+      }
+    },
+    "strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+      "dev": true
+    },
+    "strip-outer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
+      "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "1.0.5"
+      }
+    },
+    "sum-up": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz",
+      "integrity": "sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "requires": {
+        "has-flag": "3.0.0"
+      }
+    },
+    "svgo": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz",
+      "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=",
+      "dev": true,
+      "requires": {
+        "coa": "1.0.4",
+        "colors": "1.1.2",
+        "csso": "2.3.2",
+        "js-yaml": "3.7.0",
+        "mkdirp": "0.5.1",
+        "sax": "1.2.4",
+        "whet.extend": "0.9.9"
+      }
+    },
+    "tar-stream": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz",
+      "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==",
+      "dev": true,
+      "requires": {
+        "bl": "1.2.2",
+        "buffer-alloc": "1.2.0",
+        "end-of-stream": "1.4.1",
+        "fs-constants": "1.0.0",
+        "readable-stream": "2.3.6",
+        "to-buffer": "1.1.1",
+        "xtend": "4.0.1"
+      }
+    },
+    "tcp-port-used": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-0.1.2.tgz",
+      "integrity": "sha1-lFDodoyDtBb9TRpqlEnuzL9JbCk=",
+      "dev": true,
+      "requires": {
+        "debug": "0.7.4",
+        "is2": "0.0.9",
+        "q": "0.9.7"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "0.7.4",
+          "resolved": "http://registry.npmjs.org/debug/-/debug-0.7.4.tgz",
+          "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=",
+          "dev": true
+        },
+        "q": {
+          "version": "0.9.7",
+          "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz",
+          "integrity": "sha1-TeLmyzspCIyeTLwDv51C+5bOL3U=",
+          "dev": true
+        }
+      }
+    },
+    "temp-dir": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz",
+      "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=",
+      "dev": true
+    },
+    "tempfile": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz",
+      "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=",
+      "dev": true,
+      "requires": {
+        "temp-dir": "1.0.0",
+        "uuid": "3.3.2"
+      }
+    },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+      "dev": true
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+      "dev": true
+    },
+    "through2": {
+      "version": "0.6.5",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+      "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "1.0.34",
+        "xtend": "4.0.1"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "1.0.34",
+          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "0.0.1",
+            "string_decoder": "0.10.31"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true
+        }
+      }
+    },
+    "through2-filter": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
+      "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
+      "dev": true,
+      "requires": {
+        "through2": "2.0.3",
+        "xtend": "4.0.1"
+      },
+      "dependencies": {
+        "through2": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+          "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+          "dev": true,
+          "requires": {
+            "readable-stream": "2.3.6",
+            "xtend": "4.0.1"
+          }
+        }
+      }
+    },
+    "time-stamp": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+      "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+      "dev": true
+    },
+    "timed-out": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz",
+      "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=",
+      "dev": true
+    },
+    "tiny-emitter": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz",
+      "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==",
+      "dev": true,
+      "optional": true
+    },
+    "tiny-lr": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz",
+      "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==",
+      "dev": true,
+      "requires": {
+        "body": "5.1.0",
+        "debug": "3.2.5",
+        "faye-websocket": "0.10.0",
+        "livereload-js": "2.3.0",
+        "object-assign": "4.1.1",
+        "qs": "6.5.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.5",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz",
+          "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==",
+          "dev": true,
+          "requires": {
+            "ms": "2.1.1"
+          }
+        },
+        "faye-websocket": {
+          "version": "0.10.0",
+          "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
+          "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+          "dev": true,
+          "requires": {
+            "websocket-driver": "0.7.0"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true
+        }
+      }
+    },
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "dev": true,
+      "requires": {
+        "os-tmpdir": "1.0.2"
+      }
+    },
+    "to-absolute-glob": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz",
+      "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "2.0.1"
+      }
+    },
+    "to-buffer": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
+      "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
+      "dev": true
+    },
+    "to-fast-properties": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+      "dev": true
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "toml": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.3.tgz",
+      "integrity": "sha512-O7L5hhSQHxuufWUdcTRPfuTh3phKfAZ/dqfxZFoxPCj2RYmpaSGLEIs016FCXItQwNr08yefUB5TSjzRYnajTA==",
+      "dev": true
+    },
+    "tough-cookie": {
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+      "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+      "dev": true,
+      "requires": {
+        "psl": "1.1.29",
+        "punycode": "1.4.1"
+      }
+    },
+    "tree-node-cli": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/tree-node-cli/-/tree-node-cli-1.2.5.tgz",
+      "integrity": "sha512-Yhv4bfLa3WYdJLS4FkCj0h72duPGMUjC6Ld8eBlT9BA3CfjeQyHNBfgtzQvDrw1OkQva2JSpUyslZHuweCRtGQ==",
+      "dev": true,
+      "requires": {
+        "commander": "2.18.0"
+      }
+    },
+    "trim-newlines": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+      "dev": true
+    },
+    "trim-repeated": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
+      "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "1.0.5"
+      }
+    },
+    "trim-right": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+      "dev": true
+    },
+    "truncate-html": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/truncate-html/-/truncate-html-1.0.1.tgz",
+      "integrity": "sha512-4Yw02HZAhGTGZsW2aNB7GtoF/SG4yPVlS4V42tehY1ZorZhIIZpdUuocdGB7W30J8WHzgOYmyhBzMTx/362Cew==",
+      "dev": true,
+      "requires": {
+        "@types/cheerio": "0.22.9",
+        "cheerio": "0.22.0"
+      }
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+      "dev": true,
+      "optional": true
+    },
+    "type-is": {
+      "version": "1.6.16",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
+      "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+      "dev": true,
+      "requires": {
+        "media-typer": "0.3.0",
+        "mime-types": "2.1.20"
+      }
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+      "dev": true
+    },
+    "underscore": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
+      "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
+      "dev": true
+    },
+    "underscore.string": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz",
+      "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=",
+      "dev": true
+    },
+    "uniq": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+      "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+      "dev": true
+    },
+    "uniqs": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
+      "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
+      "dev": true
+    },
+    "unique-stream": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
+      "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
+      "dev": true,
+      "requires": {
+        "json-stable-stringify": "1.0.1",
+        "through2-filter": "2.0.0"
+      }
+    },
+    "universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+      "dev": true
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+      "dev": true
+    },
+    "unquote": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+      "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
+      "dev": true
+    },
+    "unzip-response": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz",
+      "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=",
+      "dev": true
+    },
+    "url-join": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz",
+      "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=",
+      "dev": true
+    },
+    "url-parse": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz",
+      "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==",
+      "dev": true,
+      "requires": {
+        "querystringify": "2.0.0",
+        "requires-port": "1.0.0"
+      }
+    },
+    "url-parse-lax": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+      "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+      "dev": true,
+      "requires": {
+        "prepend-http": "1.0.4"
+      }
+    },
+    "url-regex": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz",
+      "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=",
+      "dev": true,
+      "requires": {
+        "ip-regex": "1.0.3"
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "util.promisify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
+      "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "1.1.3",
+        "object.getownpropertydescriptors": "2.0.3"
+      }
+    },
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+      "dev": true
+    },
+    "uuid": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+      "dev": true
+    },
+    "vali-date": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
+      "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=",
+      "dev": true
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "3.0.0",
+        "spdx-expression-parse": "3.0.0"
+      }
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+      "dev": true
+    },
+    "vendors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz",
+      "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==",
+      "dev": true
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "1.3.0"
+      }
+    },
+    "vinyl": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+      "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+      "dev": true,
+      "requires": {
+        "clone": "1.0.4",
+        "clone-stats": "0.0.1",
+        "replace-ext": "0.0.1"
+      },
+      "dependencies": {
+        "replace-ext": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+          "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+          "dev": true
+        }
+      }
+    },
+    "vinyl-assign": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz",
+      "integrity": "sha1-TRmIkbVRWRHXcajNnFSApGoHSkU=",
+      "dev": true,
+      "requires": {
+        "object-assign": "4.1.1",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "vinyl-fs": {
+      "version": "2.4.4",
+      "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz",
+      "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
+      "dev": true,
+      "requires": {
+        "duplexify": "3.6.0",
+        "glob-stream": "5.3.5",
+        "graceful-fs": "4.1.11",
+        "gulp-sourcemaps": "1.6.0",
+        "is-valid-glob": "0.3.0",
+        "lazystream": "1.0.0",
+        "lodash.isequal": "4.5.0",
+        "merge-stream": "1.0.1",
+        "mkdirp": "0.5.1",
+        "object-assign": "4.1.1",
+        "readable-stream": "2.3.6",
+        "strip-bom": "2.0.0",
+        "strip-bom-stream": "1.0.0",
+        "through2": "2.0.3",
+        "through2-filter": "2.0.0",
+        "vali-date": "1.0.0",
+        "vinyl": "1.2.0"
+      },
+      "dependencies": {
+        "through2": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+          "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+          "dev": true,
+          "requires": {
+            "readable-stream": "2.3.6",
+            "xtend": "4.0.1"
+          }
+        }
+      }
+    },
+    "ware": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz",
+      "integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=",
+      "dev": true,
+      "requires": {
+        "wrap-fn": "0.1.5"
+      }
+    },
+    "websocket-driver": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
+      "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
+      "dev": true,
+      "requires": {
+        "http-parser-js": "0.4.13",
+        "websocket-extensions": "0.1.3"
+      }
+    },
+    "websocket-extensions": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+      "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
+      "dev": true
+    },
+    "whet.extend": {
+      "version": "0.9.9",
+      "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz",
+      "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=",
+      "dev": true
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "dev": true,
+      "requires": {
+        "isexe": "2.0.0"
+      }
+    },
+    "wordwrap": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+      "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+      "dev": true
+    },
+    "wrap-fn": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz",
+      "integrity": "sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU=",
+      "dev": true,
+      "requires": {
+        "co": "3.1.0"
+      },
+      "dependencies": {
+        "co": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz",
+          "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=",
+          "dev": true
+        }
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
+    },
+    "xml": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
+      "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=",
+      "dev": true
+    },
+    "xtend": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+      "dev": true
+    },
+    "yallist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+      "dev": true
+    },
+    "yamljs": {
+      "version": "0.2.10",
+      "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.2.10.tgz",
+      "integrity": "sha1-SBzHwlynOvWfWR8MluPOVsdXpA8=",
+      "dev": true,
+      "requires": {
+        "argparse": "1.0.10",
+        "glob": "7.1.3"
+      }
+    },
+    "yargs": {
+      "version": "2.3.0",
+      "resolved": "http://registry.npmjs.org/yargs/-/yargs-2.3.0.tgz",
+      "integrity": "sha1-6QDIclDsXNCA22AJ/j3WMVbx1/s=",
+      "dev": true,
+      "requires": {
+        "wordwrap": "0.0.2"
+      }
+    },
+    "yauzl": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+      "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
+      "dev": true,
+      "requires": {
+        "buffer-crc32": "0.2.13",
+        "fd-slicer": "1.1.0"
+      }
+    }
+  }
+}

+ 14 - 0
website/package.json

@@ -0,0 +1,14 @@
+{
+  "scripts": {
+    "examples": "docusaurus-examples",
+    "start": "docusaurus-start",
+    "build": "docusaurus-build",
+    "publish-gh-pages": "docusaurus-publish",
+    "write-translations": "docusaurus-write-translations",
+    "version": "docusaurus-version",
+    "rename-version": "docusaurus-rename-version"
+  },
+  "devDependencies": {
+    "docusaurus": "^1.4.0"
+  }
+}

+ 157 - 0
website/pages/en/downloads.js

@@ -0,0 +1,157 @@
+/**
+ * Copyright (c) 2017-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+const React = require('react');
+
+const CompLibrary = require('../../core/CompLibrary.js');
+const MarkdownBlock = CompLibrary.MarkdownBlock; /* Used to read markdown */
+const Container = CompLibrary.Container;
+const GridBlock = CompLibrary.GridBlock;
+
+const siteConfig = require(process.cwd() + '/siteConfig.js');
+
+class Button extends React.Component {
+    render() {
+        return (
+            <div className="pluginWrapper buttonWrapper">
+                <a className="button" href={this.props.href} target={this.props.target}>
+                    {this.props.children}
+                </a>
+            </div>
+        );
+    }
+}
+
+Button.defaultProps = {
+    target: '_self',
+};
+
+class Downloads extends React.Component {
+    render() {
+        let language = this.props.language || 'en';
+
+        return (
+            <div>
+                <div className="mainContainer">
+
+                    <Container padding={["bottom", "top"]}>
+                        <GridBlock
+                            align="center"
+                            contents={[
+                                {
+                                    content:
+                                        `<strong>
+                                            <a href="https://github.com/bmx-ng/bmx-ng/releases/download/v0.98.3.27.win32/BlitzMax_win32_0.98.3.27.7z">BlitzMax_win32_0.98.3.27.7z</a>
+                                         </strong>
+                                        <br/><br/>
+                                        Windows edition, with both x86 and x64 MinGW-w64 8.1.0-rev0 distributions.
+                                        Includes SDL backend, and mojo2.
+                                        `,
+                                    image: `${siteConfig.baseUrl}img/platform/windows.svg`,
+                                    imageAlign: "top",
+                                    imageLink: `https://github.com/bmx-ng/bmx-ng/releases/download/v0.98.3.27.win32/BlitzMax_win32_0.98.3.27.7z`,
+                                    title: "Win32 x86/x64"
+                                },
+                                {
+                                    content:
+                                        `<strong>
+                                            <a href="https://github.com/bmx-ng/bmx-ng/releases/download/v0.98.3.27.win32.x64/BlitzMax_win32_x64_0.98.3.27.7z">BlitzMax_win32_x64_0.98.3.27.7z</a>
+                                         </strong>
+                                        <br/><br/>
+                                        Windows edition, aimed at x64 development, with x64 MinGW-w64 8.1.0-rev0.
+                                        Includes SDL backend, and mojo2.
+                                        `,
+                                    image: `${siteConfig.baseUrl}img/platform/windows.svg`,
+                                    imageAlign: "top",
+                                    imageLink: `https://github.com/bmx-ng/bmx-ng/releases/download/v0.98.3.27.win32.x64/BlitzMax_win32_x64_0.98.3.27.7z`,
+                                    title: "Win32 x64"
+                                },
+                                {
+                                    content:
+                                        `<strong>
+                                            <a href="https://github.com/bmx-ng/bmx-ng/releases/download/v0.98.3.27.win32.x86/BlitzMax_win32_x86_0.98.3.27.7z">BlitzMax_win32_x86_0.98.3.27.7z</a>
+                                         </strong>
+                                        <br/><br/>
+                                        Windows edition, aimed at x86 development, with x86 MinGW-w64 8.1.0-rev0.
+                                        Includes SDL backend, and mojo2.
+                                        `,
+                                    image: `${siteConfig.baseUrl}img/platform/windows.svg`,
+                                    imageAlign: "top",
+                                    imageLink: `https://github.com/bmx-ng/bmx-ng/releases/download/v0.98.3.27.win32.x86/BlitzMax_win32_x86_0.98.3.27.7z`,
+                                    title: "win32 x86"
+                                },
+                            ]}
+                            layout="threeColumn"
+                        />
+
+                        <GridBlock
+                            align="center"
+                            contents={[
+                                {},
+                                {
+                                    content:
+                                        `<strong>
+                                            <a href="https://github.com/bmx-ng/bmx-ng/releases/download/v0.98.3.27.linux.x64/BlitzMax_linux_x64_0.98.3.27.tar.xz">BlitzMax_linux_x64_0.98.3.27.tar.xz</a>
+                                         </strong>
+                                        <br/><br/>
+                                        BlitzMax, Linux edition, aimed at x64 development, with x64 MaxIDE.
+                                        Includes SDL backend, mojo2, and Gtk3 MaxGUI.
+                                        `,
+                                    image: `${siteConfig.baseUrl}img/platform/linux.svg`,
+                                    imageAlign: "top",
+                                    imageLink: `https://github.com/bmx-ng/bmx-ng/releases/download/v0.98.3.27.linux.x64/BlitzMax_linux_x64_0.98.3.27.tar.xz`,
+                                    title: "Linux x64"
+                                },
+                                {},
+                            ]}
+                            layout="threeColumn"
+                        />
+
+                        <GridBlock
+                            align="center"
+                            contents={[
+                                {},
+                                {
+                                    content:
+                                        `Coming soon...
+                                        `,
+                                    image: `${siteConfig.baseUrl}img/platform/apple.svg`,
+                                    imageAlign: "top",
+                                    //imageLink: `${siteConfig.baseUrl}docs/setup/${this.props.language}/platforms.html`,
+                                    title: "macOS"
+                                },
+                                {},
+                            ]}
+                            layout="threeColumn"
+                        />
+
+                        <GridBlock
+                            align="center"
+                            contents={[
+                                {},
+                                {
+                                    content:
+                                        `Coming soon...
+                                        `,
+                                    image: `${siteConfig.baseUrl}img/platform/rpi.svg`,
+                                    imageAlign: "top",
+                                    //imageLink: `${siteConfig.baseUrl}docs/setup/${this.props.language}/platforms.html`,
+                                    title: "Raspberry Pi"
+                                },
+                                {},
+                            ]}
+                            layout="threeColumn"
+                        />
+                    </Container>
+
+                </div>
+            </div>
+        );
+    }
+}
+
+module.exports = Downloads;

+ 149 - 0
website/pages/en/index.js

@@ -0,0 +1,149 @@
+/**
+ * Copyright (c) 2017-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+const React = require('react');
+
+const CompLibrary = require('../../core/CompLibrary.js');
+const MarkdownBlock = CompLibrary.MarkdownBlock; /* Used to read markdown */
+const Container = CompLibrary.Container;
+const GridBlock = CompLibrary.GridBlock;
+
+const siteConfig = require(process.cwd() + '/siteConfig.js');
+
+class Button extends React.Component {
+    render() {
+        return (
+            <div className="pluginWrapper buttonWrapper">
+                <a className="button" href={this.props.href} target={this.props.target}>
+                    {this.props.children}
+                </a>
+            </div>
+        );
+    }
+}
+
+Button.defaultProps = {
+    target: '_self',
+};
+
+class HomeSplash extends React.Component {
+    render() {
+        return (
+            <div className="homeContainer">
+                <div className="homeSplashFade">
+                    <div className="wrapper homeWrapper">
+                        <div className="projectLogo">
+                        </div>
+                        <div className="inner">
+                            <h2 className="projectTitle">
+                                <img src={siteConfig.baseUrl + 'img/max_logo.png'}/>
+                                <small>{siteConfig.tagline}</small>
+                            </h2>
+                            <div className="section promoSection">
+                                <div className="promoRow">
+                                    <div className="pluginRowBlock">
+                                        <Button
+                                            href={
+                                                siteConfig.baseUrl +
+                                                'docs/' +
+                                                this.props.language +
+                                                '/setup/get_started'
+                                            }>
+                                            Get Started
+                                        </Button>
+                                        <Button
+                                            href={
+                                                siteConfig.baseUrl +
+                                                'downloads'
+                                            }>
+                                            Downloads
+                                        </Button>
+                                    </div>
+                                </div>
+                            </div>
+                            <div
+                                className="productShowcaseSection paddingBottom"
+                                style={{textAlign: 'center'}}>
+                                <p>
+                                    BlitzMax is a fast cross-platform, open-source, programming language.
+                                </p>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        );
+    }
+}
+
+class Index extends React.Component {
+    render() {
+        let language = this.props.language || 'en';
+        const showcase = siteConfig.users
+            .filter(user => {
+                return user.pinned;
+            })
+            .map(user => {
+                return (
+                    <a href={user.infoLink}>
+                        <img src={user.image} title={user.caption} />
+                    </a>
+                );
+            });
+
+        return (
+            <div>
+                <HomeSplash language={language} />
+                <div className="mainContainer">
+
+                    <Container padding={["bottom", "top"]}>
+                        <GridBlock
+                            align="center"
+                            contents={[
+                                {
+                                    content:
+                                        `Build, deploy and run your apps on many popular platforms.
+                                        <br/><br/>
+                                        <img src=${siteConfig.baseUrl}img/platform/windows.svg title="Windows" width="50px" height="50px"/>
+                                        <img src=${siteConfig.baseUrl}img/platform/linux.svg title="Linux" width="50px" height="50px"/>
+                                        <img src=${siteConfig.baseUrl}img/platform/apple.svg title="macOS and iOS" width="50px" height="50px"/>
+                                        <img src=${siteConfig.baseUrl}img/platform/android.svg title="Android" width="50px" height="50px"/>
+                                        <img src=${siteConfig.baseUrl}img/platform/rpi.svg title="Raspberry Pi" width="50px" height="50px"/>
+                                        <img src=${siteConfig.baseUrl}img/platform/switch.svg title="Switch Homebrew" width="50px" height="50px"/>
+`,
+                                    image: `${siteConfig.baseUrl}img/devices.svg`,
+                                    imageAlign: "top",
+                                    imageLink: `${siteConfig.baseUrl}docs/setup/${this.props.language}/platforms.html`,
+                                    title: "Cross-platform"
+                                },
+                                {
+                                    content:
+                                        `The BlitzMax community have developed scores of great cross-platform drop-in modules, from game-coding frameworks to database connectivity.`,
+                                    image: `${siteConfig.baseUrl}img/network.svg`,
+                                    imageAlign: "top",
+                                    title: "Modular"
+                                },
+                                {
+                                    content:
+                                        `BlitzMax users are friendly, creative, helpful and welcoming to all.<br/>`,
+                                    image: `${siteConfig.baseUrl}img/group.svg`,
+                                    imageAlign: "top",
+                                    imageLink: `${siteConfig.baseUrl}docs/${this.props.language}/architecture-remote-local.html`,
+                                    title: "Community"
+                                },
+                            ]}
+                            layout="threeColumn"
+                        />
+                    </Container>
+
+                </div>
+            </div>
+        );
+    }
+}
+
+module.exports = Index;

+ 74 - 0
website/sidebars.json

@@ -0,0 +1,74 @@
+{
+  "docs": {
+    "Setup": [
+      "setup/get_started",
+      "setup/win32",
+      "setup/linux",
+      "setup/macos",
+      "setup/android",
+      "setup/ios",
+      "setup/rpi",
+      "setup/nx",
+      "setup/custom_settings"
+    ],
+    "Tutorials": [
+      "tutorials/beginners_guide",
+      "tutorials/oop_tutorial",
+      "tutorials/network_programming",
+      "tutorials/tcp_tutorial"
+    ],
+    "Language": [
+      "language/arrays",
+      "language/basic_compatibility",
+      "language/collections",
+      "language/comments",
+      "language/conditional_compiling",
+      "language/constants",
+      "language/data_types",
+      "language/debugging",
+      "language/exceptions",
+      "language/expressions",
+      "language/functions",
+      "language/identifiers",
+      "language/keywords",
+      "language/literals",
+      "language/variables"
+    ],
+    "Tools": [
+      "tools/maxide",
+      "tools/bmk",
+      "tools/bcc"
+    ]
+  },
+  "community": {
+    "Community": [
+      "community/resources",
+      "community/collections",
+      "community/2d_frameworks",
+      "community/2d_drivers",
+      "community/3d_engines",
+      "community/3d_libraries",
+      "community/3d_physics",
+      "community/2d_audio",
+      "community/3d_audio",
+      "community/applications",
+      "community/controllers",
+      "community/database",
+      "community/file_formats",
+      "community/gui",
+      "community/gui_builders",
+      "community/gui_drivers",
+      "community/gui_gadgets",
+      "community/ides",
+      "community/networking",
+      "community/open_source_games",
+      "community/particles"
+    ]
+  },
+  "about": {
+    "About": [
+      "site/about",
+      "site/credits"
+    ]
+  }
+}

+ 94 - 0
website/siteConfig.js

@@ -0,0 +1,94 @@
+/**
+ * Copyright (c) 2017-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// See https://docusaurus.io/docs/site-config for all the possible
+// site configuration options.
+
+// List of projects/orgs using your project for the users page.
+const users = [];
+
+const siteConfig = {
+    title: 'BlitzMax', // Title for your website.
+    tagline: 'Code. Build. Play.',
+    url: 'https://localhost', // Your website URL
+    baseUrl: '/', // Base URL for your project */
+    // For github.io type URLs, you would set the url and baseUrl like:
+    //   url: 'https://facebook.github.io',
+    //   baseUrl: '/test-site/',
+
+    // Used for publishing and more
+    projectName: 'blitzmax',
+    organizationName: 'bmx-ng',
+    // For top-level user or org sites, the organization is still the same.
+    // e.g., for the https://JoelMarcey.github.io site, it would be set like...
+    //   organizationName: 'JoelMarcey'
+
+    // For no header links in the top nav bar -> headerLinks: [],
+    headerLinks: [
+        {doc: 'setup/get_started', label: 'Docs'},
+        {page: 'downloads', label: 'Downloads'},
+        {doc: 'community/resources', label: 'Community'},
+        {doc: 'site/about', label: 'About'},
+    ],
+
+    // If you have users set above, you add it here:
+    users,
+
+    /* path to images for header/footer */
+    headerIcon: 'img/max_logo.png',
+    footerIcon: 'img/max_logo.png',
+    favicon: 'img/favicon.png',
+
+    /* Colors for website */
+    colors: {
+        primaryColor: '#000000',
+        secondaryColor: '#4f62be',
+    },
+
+    /* Custom fonts for website */
+    /*
+    fonts: {
+      myFont: [
+        "Times New Roman",
+        "Serif"
+      ],
+      myOtherFont: [
+        "-apple-system",
+        "system-ui"
+      ]
+    },
+    */
+    // This copyright info is used in /core/Footer.js and blog RSS/Atom feeds.
+    copyright: `Copyright © ${new Date().getFullYear()} Bruce A Henderson`,
+
+    highlight: {
+        // Highlight.js theme to use for syntax highlighting in code blocks.
+        theme: 'default',
+    },
+
+    // Add custom scripts here that would be placed in <script> tags.
+    scripts: [
+        'https://buttons.github.io/buttons.js'
+    ],
+
+
+    // On page navigation for the current documentation page.
+    onPageNav: 'separate',
+    // No .html extensions for paths.
+    cleanUrl: true,
+
+    scrollToTop: true,
+    // You may provide arbitrary config keys to be used as needed by your
+    // template. For example, if you need your repo's URL...
+    repoUrl: 'https://github.com/bmx-ng/bmx-ng',
+
+    editUrl: 'https://github.com/bmx-ng/bmx-site/docs/',
+
+    useEnglishUrl: true,
+};
+
+module.exports = siteConfig;

+ 21 - 0
website/static/css/custom.css

@@ -0,0 +1,21 @@
+/* your custom css */
+
+@media only screen and (min-device-width: 360px) and (max-device-width: 736px) {
+}
+
+@media only screen and (min-width: 1024px) {
+}
+
+@media only screen and (max-width: 1023px) {
+}
+
+@media only screen and (min-width: 1400px) {
+}
+
+@media only screen and (min-width: 1500px) {
+}
+
+a, a:hover {
+    color: #4f62be;
+    text-decoration: none;
+}

+ 52 - 0
website/static/img/devices.svg

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<g>
+	<g>
+		<path d="M485.547,251.733h-58.88v-153.6C426.638,74.581,407.552,55.495,384,55.467H128c-23.552,0.028-42.638,19.114-42.667,42.667
+			v51.2H38.519C17.255,149.357,0.023,166.589,0,187.853v230.161c0.023,21.264,17.255,38.496,38.519,38.519h136.294
+			c16.24-0.049,30.7-10.294,36.13-25.6H358.4c4.713,0,8.533-3.82,8.533-8.533v-17.067c0-14.138-11.462-25.6-25.6-25.6h-25.6V345.6
+			H384v84.48c0,14.61,11.844,26.453,26.453,26.453h75.093c14.61,0,26.453-11.844,26.453-26.453V278.187
+			C512,263.577,500.156,251.733,485.547,251.733z M196.267,418.014c-0.009,11.844-9.609,21.443-21.453,21.453H38.519
+			c-11.844-0.009-21.443-9.609-21.453-21.453v-4.147h179.2V418.014z M196.267,396.8h-179.2V209.067h179.2V396.8z M196.267,192
+			h-179.2v-4.147c0.009-11.844,9.609-21.443,21.453-21.453h136.294c11.844,0.009,21.443,9.609,21.453,21.453V192z M341.333,396.8
+			c4.713,0,8.533,3.821,8.533,8.533v8.533H213.333V396.8H341.333z M213.333,379.733V345.6h85.333v34.133H213.333z M384,328.533
+			h-76.8h-93.867v-25.6H384V328.533z M384,278.187v7.68H213.333v-98.014c-0.024-21.264-17.256-38.496-38.519-38.519H102.4v-51.2
+			c0-14.138,11.461-25.6,25.6-25.6h256c14.138,0,25.6,11.461,25.6,25.6v153.685C395.358,252.278,384.039,263.937,384,278.187z
+			 M494.933,430.08c0,5.184-4.203,9.387-9.387,9.387h-75.093c-5.184,0-9.387-4.203-9.387-9.387v-7.68h93.867V430.08z
+			 M494.933,405.333h-93.867v-102.4h93.867V405.333z M494.933,285.867h-93.867v-7.68c0-5.184,4.203-9.387,9.387-9.387h75.093
+			c5.184,0,9.387,4.203,9.387,9.387V285.867z"/>
+	</g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 60 - 0
website/static/img/group.svg

@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="536.071px" height="536.07px" viewBox="0 0 536.071 536.07" style="enable-background:new 0 0 536.071 536.07;"
+	 xml:space="preserve">
+<g>
+	<path d="M147.128,91.076c0-37.95,30.766-68.716,68.721-68.716c37.95,0,68.719,30.766,68.719,68.716s-30.769,68.715-68.719,68.715
+		C177.894,159.792,147.128,129.026,147.128,91.076z M248.873,206.607c0.689-14.963,5.84-28.812,14.127-40.261
+		c-5.816-1.218-11.827-1.865-17.995-1.865h-58.304c-6.15,0-12.153,0.642-17.939,1.845c8.819,12.232,14.094,27.171,14.18,43.343
+		c10.72-5.896,23.02-9.253,36.085-9.253C229.625,200.416,239.714,202.624,248.873,206.607z M260.505,212.775
+		c19.96,12.517,33.957,33.688,36.517,58.274c8.133,3.801,17.171,5.994,26.746,5.994c34.968,0,63.311-28.346,63.311-63.313
+		c0-34.971-28.343-63.311-63.311-63.311C289.12,150.42,261.031,178.257,260.505,212.775z M219.026,342.411
+		c34.962,0,63.307-28.354,63.307-63.311c0-34.962-28.345-63.311-63.307-63.311c-34.965,0-63.322,28.348-63.322,63.311
+		C155.705,314.057,184.061,342.411,219.026,342.411z M245.882,346.72h-53.717c-44.697,0-81.069,36.369-81.069,81.072v65.703
+		l0.171,1.029l4.522,1.406c42.658,13.323,79.718,17.779,110.224,17.779c59.571,0,94.114-16.987,96.242-18.074l4.231-2.141h0.449
+		v-65.703C326.936,383.089,290.585,346.72,245.882,346.72z M350.638,281.364h-53.314c-0.579,21.332-9.683,40.542-24.081,54.35
+		c39.732,11.815,68.802,48.657,68.802,92.178v20.245c52.629-1.938,82.963-16.846,84.961-17.851l4.232-2.152h0.449v-65.715
+		C431.693,317.728,395.324,281.364,350.638,281.364z M364.889,149.069c19.961,12.519,33.957,33.691,36.511,58.277
+		c8.134,3.801,17.171,5.99,26.746,5.99c34.975,0,63.316-28.342,63.316-63.304c0-34.972-28.342-63.311-63.316-63.311
+		C393.503,86.717,365.416,114.56,364.889,149.069z M455.01,217.658h-53.303c-0.579,21.332-9.682,40.542-24.08,54.349
+		c39.731,11.811,68.801,48.658,68.801,92.179v20.245c52.624-1.934,82.964-16.84,84.962-17.852l4.226-2.145h0.455v-65.723
+		C536.077,254.024,499.708,217.658,455.01,217.658z M107.937,277.044c12.386,0,23.903-3.618,33.67-9.777
+		c3.106-20.241,13.958-37.932,29.454-49.975c0.065-1.188,0.174-2.361,0.174-3.561c0-34.971-28.351-63.311-63.298-63.311
+		c-34.977,0-63.316,28.339-63.316,63.311C44.621,248.704,72.959,277.044,107.937,277.044z M164.795,335.714
+		c-14.331-13.742-23.404-32.847-24.072-54.055c-1.971-0.147-3.928-0.295-5.943-0.295H81.069C36.366,281.364,0,317.728,0,362.425
+		v65.709l0.166,1.023l4.528,1.412c34.214,10.699,64.761,15.616,91.292,17.153v-19.837
+		C95.991,384.371,125.054,347.523,164.795,335.714z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

BIN
website/static/img/max_logo.png


+ 57 - 0
website/static/img/network.svg

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="47px" height="47px" viewBox="0 0 47 47" style="enable-background:new 0 0 47 47;" xml:space="preserve">
+<g>
+	<g id="Layer_1_110_">
+		<g>
+			<path d="M17.567,15.938l-2.859-2.702c0.333-0.605,0.539-1.29,0.539-2.029c0-2.342-1.897-4.239-4.24-4.239
+				c-2.343,0-4.243,1.896-4.243,4.239c0,2.343,1.9,4.241,4.243,4.241c0.826,0,1.59-0.246,2.242-0.654l2.855,2.699
+				C16.536,16.922,17.023,16.399,17.567,15.938z"/>
+			<path d="M29.66,15.6l3.799-6.393c0.374,0.107,0.762,0.184,1.169,0.184c2.347,0,4.244-1.898,4.244-4.241
+				c0-2.342-1.897-4.239-4.244-4.239c-2.343,0-4.239,1.896-4.239,4.239c0,1.163,0.469,2.214,1.227,2.981l-3.787,6.375
+				C28.48,14.801,29.094,15.169,29.66,15.6z"/>
+			<path d="M42.762,20.952c-1.824,0-3.369,1.159-3.968,2.775l-5.278-0.521c0,0.04,0.006,0.078,0.006,0.117
+				c0,0.688-0.076,1.36-0.213,2.009l5.276,0.521c0.319,2.024,2.062,3.576,4.177,3.576c2.342,0,4.238-1.896,4.238-4.238
+				C47,22.85,45.104,20.952,42.762,20.952z"/>
+			<path d="M28.197,37.624l-1.18-5.156c-0.666,0.232-1.359,0.398-2.082,0.481l1.182,5.157c-1.355,0.709-2.29,2.11-2.29,3.746
+				c0,2.342,1.896,4.237,4.243,4.237c2.342,0,4.238-1.896,4.238-4.237C32.311,39.553,30.479,37.692,28.197,37.624z"/>
+			<path d="M14.357,25.37l-6.57,2.201c-0.758-1.158-2.063-1.926-3.548-1.926C1.896,25.645,0,27.542,0,29.884
+				c0,2.345,1.896,4.242,4.239,4.242c2.341,0,4.242-1.897,4.242-4.242c0-0.098-0.021-0.188-0.029-0.284l6.591-2.207
+				C14.746,26.752,14.51,26.077,14.357,25.37z"/>
+			<circle cx="23.83" cy="23.323" r="7.271"/>
+		</g>
+	</g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 89 - 0
website/static/img/platform/android.svg

@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 505.145 505.145" style="enable-background:new 0 0 505.145 505.145;" xml:space="preserve">
+<g>
+	<g>
+		<g>
+			<path style="fill:#010002;" d="M68.541,164.715h-1.294c-16.588,0-30.113,13.568-30.113,30.113v131.107
+				c0,16.61,13.525,30.134,30.113,30.134h1.316c16.588,0,30.113-13.568,30.113-30.134V194.827
+				C98.654,178.283,85.108,164.715,68.541,164.715z"/>
+			<path style="fill:#010002;" d="M113.085,376.54c0,15.229,12.446,27.632,27.675,27.632h29.574v70.817
+				c0,16.631,13.568,30.156,30.113,30.156h1.294c16.61,0,30.156-13.546,30.156-30.156v-70.817h41.33v70.817
+				c0,16.631,13.611,30.156,30.156,30.156h1.273c16.609,0,30.134-13.546,30.134-30.156v-70.817h29.595
+				c15.207,0,27.654-12.403,27.654-27.632V169.525H113.085V376.54z"/>
+			<path style="fill:#010002;" d="M322.041,43.983l23.491-36.26c1.51-2.287,0.841-5.414-1.467-6.903
+				c-2.286-1.51-5.414-0.884-6.903,1.467l-24.353,37.512c-18.27-7.485-38.676-11.691-60.226-11.691
+				c-21.571,0-41.934,4.206-60.247,11.691l-24.31-37.512c-1.488-2.351-4.638-2.977-6.946-1.467
+				c-2.308,1.488-2.977,4.616-1.467,6.903l23.512,36.26c-42.387,20.773-70.968,59.924-70.968,104.834
+				c0,2.761,0.173,5.479,0.41,8.175h280.053c0.237-2.696,0.388-5.414,0.388-8.175C393.009,103.907,364.406,64.756,322.041,43.983z
+				 M187.655,108.911c-7.442,0-13.482-5.997-13.482-13.46c0-7.463,6.04-13.439,13.482-13.439c7.485,0,13.482,5.975,13.482,13.439
+				S195.097,108.911,187.655,108.911z M317.49,108.911c-7.442,0-13.482-5.997-13.482-13.46c0-7.463,6.04-13.439,13.482-13.439
+				c7.463,0,13.46,5.975,13.46,13.439C330.95,102.914,324.953,108.911,317.49,108.911z"/>
+			<path style="fill:#010002;" d="M437.876,164.715h-1.251c-16.588,0-30.156,13.568-30.156,30.113v131.107
+				c0,16.61,13.59,30.134,30.156,30.134h1.273c16.609,0,30.113-13.568,30.113-30.134V194.827
+				C468.011,178.283,454.464,164.715,437.876,164.715z"/>
+		</g>
+	</g>
+	<g>
+	</g>
+	<g>
+	</g>
+	<g>
+	</g>
+	<g>
+	</g>
+	<g>
+	</g>
+	<g>
+	</g>
+	<g>
+	</g>
+	<g>
+	</g>
+	<g>
+	</g>
+	<g>
+	</g>
+	<g>
+	</g>
+	<g>
+	</g>
+	<g>
+	</g>
+	<g>
+	</g>
+	<g>
+	</g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 45 - 0
website/static/img/platform/apple.svg

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<g>
+	<path d="M395.748,272.046c-0.646-64.841,52.88-95.938,55.271-97.483c-30.075-44.01-76.925-50.039-93.62-50.736
+		c-39.871-4.037-77.798,23.474-98.033,23.474c-20.184,0-51.409-22.877-84.476-22.276c-43.458,0.646-83.529,25.269-105.906,64.19
+		c-45.152,78.35-11.563,194.42,32.445,257.963c21.504,31.104,47.146,66.038,80.813,64.79c32.421-1.294,44.681-20.979,83.878-20.979
+		c39.196,0,50.215,20.979,84.524,20.335c34.888-0.648,56.991-31.699,78.347-62.898c24.694-36.084,34.862-71.019,35.462-72.812
+		C463.678,375.26,396.422,349.495,395.748,272.046z M331.28,81.761C349.149,60.082,361.21,30.005,357.92,0
+		c-25.739,1.048-56.938,17.145-75.405,38.775c-16.57,19.188-31.075,49.813-27.188,79.218
+		C284.061,120.235,313.392,103.391,331.28,81.761z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 79 - 0
website/static/img/platform/linux.svg

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 304.998 304.998" style="enable-background:new 0 0 304.998 304.998;" xml:space="preserve">
+<g id="XMLID_91_">
+	<path id="XMLID_92_" d="M274.659,244.888c-8.944-3.663-12.77-8.524-12.4-15.777c0.381-8.466-4.422-14.667-6.703-17.117
+		c1.378-5.264,5.405-23.474,0.004-39.291c-5.804-16.93-23.524-42.787-41.808-68.204c-7.485-10.438-7.839-21.784-8.248-34.922
+		c-0.392-12.531-0.834-26.735-7.822-42.525C190.084,9.859,174.838,0,155.851,0c-11.295,0-22.889,3.53-31.811,9.684
+		c-18.27,12.609-15.855,40.1-14.257,58.291c0.219,2.491,0.425,4.844,0.545,6.853c1.064,17.816,0.096,27.206-1.17,30.06
+		c-0.819,1.865-4.851,7.173-9.118,12.793c-4.413,5.812-9.416,12.4-13.517,18.539c-4.893,7.387-8.843,18.678-12.663,29.597
+		c-2.795,7.99-5.435,15.537-8.005,20.047c-4.871,8.676-3.659,16.766-2.647,20.505c-1.844,1.281-4.508,3.803-6.757,8.557
+		c-2.718,5.8-8.233,8.917-19.701,11.122c-5.27,1.078-8.904,3.294-10.804,6.586c-2.765,4.791-1.259,10.811,0.115,14.925
+		c2.03,6.048,0.765,9.876-1.535,16.826c-0.53,1.604-1.131,3.42-1.74,5.423c-0.959,3.161-0.613,6.035,1.026,8.542
+		c4.331,6.621,16.969,8.956,29.979,10.492c7.768,0.922,16.27,4.029,24.493,7.035c8.057,2.944,16.388,5.989,23.961,6.913
+		c1.151,0.145,2.291,0.218,3.39,0.218c11.434,0,16.6-7.587,18.238-10.704c4.107-0.838,18.272-3.522,32.871-3.882
+		c14.576-0.416,28.679,2.462,32.674,3.357c1.256,2.404,4.567,7.895,9.845,10.724c2.901,1.586,6.938,2.495,11.073,2.495
+		c0.001,0,0,0,0.001,0c4.416,0,12.817-1.044,19.466-8.039c6.632-7.028,23.202-16,35.302-22.551c2.7-1.462,5.226-2.83,7.441-4.065
+		c6.797-3.768,10.506-9.152,10.175-14.771C282.445,250.905,279.356,246.811,274.659,244.888z M124.189,243.535
+		c-0.846-5.96-8.513-11.871-17.392-18.715c-7.26-5.597-15.489-11.94-17.756-17.312c-4.685-11.082-0.992-30.568,5.447-40.602
+		c3.182-5.024,5.781-12.643,8.295-20.011c2.714-7.956,5.521-16.182,8.66-19.783c4.971-5.622,9.565-16.561,10.379-25.182
+		c4.655,4.444,11.876,10.083,18.547,10.083c1.027,0,2.024-0.134,2.977-0.403c4.564-1.318,11.277-5.197,17.769-8.947
+		c5.597-3.234,12.499-7.222,15.096-7.585c4.453,6.394,30.328,63.655,32.972,82.044c2.092,14.55-0.118,26.578-1.229,31.289
+		c-0.894-0.122-1.96-0.221-3.08-0.221c-7.207,0-9.115,3.934-9.612,6.283c-1.278,6.103-1.413,25.618-1.427,30.003
+		c-2.606,3.311-15.785,18.903-34.706,21.706c-7.707,1.12-14.904,1.688-21.39,1.688c-5.544,0-9.082-0.428-10.551-0.651l-9.508-10.879
+		C121.429,254.489,125.177,250.583,124.189,243.535z M136.254,64.149c-0.297,0.128-0.589,0.265-0.876,0.411
+		c-0.029-0.644-0.096-1.297-0.199-1.952c-1.038-5.975-5-10.312-9.419-10.312c-0.327,0-0.656,0.025-1.017,0.08
+		c-2.629,0.438-4.691,2.413-5.821,5.213c0.991-6.144,4.472-10.693,8.602-10.693c4.85,0,8.947,6.536,8.947,14.272
+		C136.471,62.143,136.4,63.113,136.254,64.149z M173.94,68.756c0.444-1.414,0.684-2.944,0.684-4.532
+		c0-7.014-4.45-12.509-10.131-12.509c-5.552,0-10.069,5.611-10.069,12.509c0,0.47,0.023,0.941,0.067,1.411
+		c-0.294-0.113-0.581-0.223-0.861-0.329c-0.639-1.935-0.962-3.954-0.962-6.015c0-8.387,5.36-15.211,11.95-15.211
+		c6.589,0,11.95,6.824,11.95,15.211C176.568,62.78,175.605,66.11,173.94,68.756z M169.081,85.08
+		c-0.095,0.424-0.297,0.612-2.531,1.774c-1.128,0.587-2.532,1.318-4.289,2.388l-1.174,0.711c-4.718,2.86-15.765,9.559-18.764,9.952
+		c-2.037,0.274-3.297-0.516-6.13-2.441c-0.639-0.435-1.319-0.897-2.044-1.362c-5.107-3.351-8.392-7.042-8.763-8.485
+		c1.665-1.287,5.792-4.508,7.905-6.415c4.289-3.988,8.605-6.668,10.741-6.668c0.113,0,0.215,0.008,0.321,0.028
+		c2.51,0.443,8.701,2.914,13.223,4.718c2.09,0.834,3.895,1.554,5.165,2.01C166.742,82.664,168.828,84.422,169.081,85.08z
+		 M205.028,271.45c2.257-10.181,4.857-24.031,4.436-32.196c-0.097-1.855-0.261-3.874-0.42-5.826
+		c-0.297-3.65-0.738-9.075-0.283-10.684c0.09-0.042,0.19-0.078,0.301-0.109c0.019,4.668,1.033,13.979,8.479,17.226
+		c2.219,0.968,4.755,1.458,7.537,1.458c7.459,0,15.735-3.659,19.125-7.049c1.996-1.996,3.675-4.438,4.851-6.372
+		c0.257,0.753,0.415,1.737,0.332,3.005c-0.443,6.885,2.903,16.019,9.271,19.385l0.927,0.487c2.268,1.19,8.292,4.353,8.389,5.853
+		c-0.001,0.001-0.051,0.177-0.387,0.489c-1.509,1.379-6.82,4.091-11.956,6.714c-9.111,4.652-19.438,9.925-24.076,14.803
+		c-6.53,6.872-13.916,11.488-18.376,11.488c-0.537,0-1.026-0.068-1.461-0.206C206.873,288.406,202.886,281.417,205.028,271.45z
+		 M39.917,245.477c-0.494-2.312-0.884-4.137-0.465-5.905c0.304-1.31,6.771-2.714,9.533-3.313c3.883-0.843,7.899-1.714,10.525-3.308
+		c3.551-2.151,5.474-6.118,7.17-9.618c1.228-2.531,2.496-5.148,4.005-6.007c0.085-0.05,0.215-0.108,0.463-0.108
+		c2.827,0,8.759,5.943,12.177,11.262c0.867,1.341,2.473,4.028,4.331,7.139c5.557,9.298,13.166,22.033,17.14,26.301
+		c3.581,3.837,9.378,11.214,7.952,17.541c-1.044,4.909-6.602,8.901-7.913,9.784c-0.476,0.108-1.065,0.163-1.758,0.163
+		c-7.606,0-22.662-6.328-30.751-9.728l-1.197-0.503c-4.517-1.894-11.891-3.087-19.022-4.241c-5.674-0.919-13.444-2.176-14.732-3.312
+		c-1.044-1.171,0.167-4.978,1.235-8.337c0.769-2.414,1.563-4.91,1.998-7.523C41.225,251.596,40.499,248.203,39.917,245.477z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 86 - 0
website/static/img/platform/rpi.svg

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<path style="fill:#222123;" d="M468.741,319.969c0,20.135-4.618,37.794-13.479,51.994c-3.062,22.904-10.459,44.523-21.389,64.125
+	c-0.616,1.996-1.337,4.023-2.184,6.092C385.839,485.47,324.023,512,256,512c-68.033,0-129.849-26.53-175.7-69.82
+	c-0.836-2.069-1.567-4.096-2.184-6.092c-10.93-19.602-18.328-41.221-21.379-64.125c-8.861-14.2-13.49-31.859-13.49-51.994
+	c0-30.208,21.347-49.089,33.865-58.149c2.476-4.556,5.151-9.007,8.004-13.343c-0.063-0.502-0.094-1.003-0.115-1.515
+	c-0.878-24.398,8.673-47.877,26.885-66.09c5.12-5.11,10.668-9.206,16.823-12.403c-4.963-0.94-8.61-1.829-9.425-2.038
+	c-5.183-1.296-9.226-5.224-10.731-10.219c-7.492-3.887-12.466-8.359-13.385-9.206c-2.487-2.32-4.075-5.381-4.587-8.631
+	c-6.907-4.117-10.522-7.68-11.515-8.725c-3.135-3.312-4.566-7.826-3.992-12.257c-3.615-3.26-5.831-5.893-6.343-6.52
+	c-3.072-3.772-4.096-8.756-2.853-13.385c-2.811-3.657-4.336-6.468-4.671-7.105c-0.052-0.104-0.104-0.209-0.157-0.313
+	c-2.111-4.305-2.038-9.362,0.188-13.594c-2.581-3.814-3.929-6.771-4.232-7.492c-2.017-4.639-1.557-9.989,1.223-14.211
+	c0.387-0.596,0.815-1.149,1.264-1.672c-3.626-4.995-3.95-11.891-0.272-17.324c2.863-4.221,7.816-6.552,12.915-6.552h6.468
+	l0.021-0.042c2.581-5.078,7.784-8.307,13.479-8.307c3.856,0,7.983,0.23,11.985,0.575c2.8-3.218,6.907-5.162,11.327-5.162
+	c1.63,0,3.375,0.125,5.172,0.324c2.863-3.657,7.44-5.757,12.184-5.757c0.909,0,1.829,0.073,2.738,0.23
+	c4.827,0.846,9.028,1.87,12.675,2.988c0.606-0.522,1.264-1.003,1.954-1.421c2.403-1.463,5.11-2.205,7.826-2.205
+	c2.351,0,4.712,0.554,6.865,1.661c1.797,0.92,3.469,1.839,5.026,2.748c0.387,0.219,0.763,0.449,1.139,0.669
+	c1.933-0.867,4.033-1.327,6.165-1.327c1.766,0,3.553,0.313,5.266,0.961c2.957,1.108,6.092,2.988,9.112,5.151
+	c1.808-0.731,3.72-1.097,5.642-1.097c1.975,0,3.96,0.387,5.82,1.17c3.615,1.526,7.252,4.065,10.616,6.928
+	c0.773-0.115,1.546-0.178,2.33-0.178c3.375,0,6.729,1.139,9.456,3.354c1.066,0.867,23.845,19.613,30.595,47.156
+	c6.74-27.544,29.518-46.289,30.584-47.156c2.727-2.215,6.081-3.354,9.456-3.354c0.784,0,1.567,0.063,2.341,0.178
+	c3.354-2.863,6.99-5.402,10.606-6.928c1.87-0.784,3.845-1.17,5.831-1.17c1.912,0,3.824,0.366,5.632,1.097
+	c3.02-2.163,6.154-4.044,9.112-5.151c1.724-0.648,3.511-0.961,5.277-0.961c2.121,0,4.221,0.46,6.154,1.327
+	c0.376-0.23,0.752-0.449,1.149-0.669c1.557-0.909,3.229-1.829,5.015-2.748c2.163-1.108,4.514-1.661,6.865-1.661
+	c2.717,0,5.434,0.742,7.826,2.205c0.7,0.418,1.348,0.899,1.964,1.421c3.636-1.118,7.837-2.142,12.664-2.988
+	c0.919-0.157,1.829-0.23,2.738-0.23c4.744,0,9.32,2.1,12.184,5.757c1.797-0.199,3.542-0.324,5.172-0.324
+	c4.43,0,8.526,1.944,11.337,5.162c4.012-0.345,8.161-0.575,12.027-0.575c5.705,0,10.919,3.229,13.448,8.349c0.01,0,0.01,0,0.01,0
+	h6.541c5.099,0,10.041,2.351,12.884,6.593c3.647,5.444,3.312,12.319-0.324,17.283c0.46,0.522,0.888,1.076,1.275,1.672
+	c2.769,4.221,3.229,9.571,1.223,14.211c-0.313,0.721-1.661,3.678-4.232,7.492c2.215,4.232,2.299,9.279,0.178,13.584
+	c-0.052,0.115-0.105,0.219-0.157,0.324c-0.334,0.637-1.849,3.448-4.66,7.105c1.243,4.629,0.209,9.613-2.863,13.385
+	c-0.502,0.627-2.717,3.26-6.343,6.52c0.575,4.43-0.857,8.944-3.992,12.257c-0.982,1.045-4.608,4.608-11.504,8.725
+	c-0.522,3.25-2.111,6.311-4.598,8.631c-0.919,0.846-5.883,5.319-13.375,9.206c-1.515,4.995-5.548,8.923-10.742,10.219
+	c-0.815,0.209-4.462,1.097-9.425,2.038c6.154,3.197,11.713,7.293,16.823,12.403c18.213,18.213,27.763,41.691,26.896,66.09
+	c-0.021,0.512-0.063,1.014-0.115,1.515c2.842,4.336,5.517,8.788,7.993,13.343C447.394,270.879,468.741,289.761,468.741,319.969z"/>
+<path style="fill:#FFFFFF;" d="M120.008,64.679c0,0,61.914,18.788,103.797,56.993c7.48-4.035,20.649-13.958,18.844-33.215
+	c-2.503-26.697-26.697-46.304-26.697-46.304v9.594c0,0-10.846-14.183-18.772-17.52l-2.086,9.177c0,0-11.263-11.68-17.938-14.183
+	c0,0,2.086,4.588,0,10.429c0,0-4.588-6.675-19.189-14.183v10.011c0,0-5.84-6.257-25.028-9.594c0,0,4.588,3.754,7.092,10.846
+	c0,0-15.851-5.423-24.612-5.423l7.718,7.718c0,0-17.729-3.128-31.077-3.128l6.257,8.342H71.619c0,0,11.263,11.263,11.263,18.772
+	H70.785c0,0,5.423,12.515,17.938,18.355c0,0-4.171,2.086-14.183,2.086c0,0,5.423,10.429,16.686,16.686l-10.846,1.252
+	c0,0,9.177,11.263,22.526,15.434l-12.932,2.503c0,0,7.509,7.926,25.445,13.765l-10.011,2.92c0,0,12.097,11.263,26.28,11.263
+	l-8.76,4.588c0,0,16.686,4.171,28.783,4.171l-7.509,7.509c0,0,58.173,8.047,68.983-34.449
+	C203.874,118.139,179.522,95.452,120.008,64.679z"/>
+<g>
+	<path style="fill:#FFFFFF;" d="M255.997,230.703c27.949,0,52.977-14.183,55.898-27.532c2.921-13.349-15.434-37.96-55.898-37.96
+		s-58.817,24.612-55.898,37.96C203.019,216.521,228.048,230.703,255.997,230.703z"/>
+	<path style="fill:#FFFFFF;" d="M315.183,505.125C296.187,509.618,276.365,512,256,512c-20.376,0-40.187-2.382-59.183-6.875
+		c-0.293-1.881-0.251-3.657,0.125-5.277c3.082-13.343,29.529-19.968,59.058-19.968s55.965,6.625,59.058,19.968
+		C315.434,501.457,315.476,503.244,315.183,505.125z"/>
+	<path style="fill:#FFFFFF;" d="M162.297,409.506c-19.489-22.183-43.204-36.546-57.858-27.779
+		c-14.655,8.769-25.12,43.776,3.096,75.892s64.28,26.243,74.862,12.84C192.978,457.055,181.786,431.689,162.297,409.506z"/>
+</g>
+<path style="fill:#FFFFFF;" d="M182.007,175.247c4.35,0.292,6.66,5.297,4.062,8.797c-7.323,9.862-17.874,22.296-31.855,34.562
+	c-17.252,15.131-34.376,25.974-45.98,32.528c-3.636,2.054-8.075-0.539-8.225-4.712c-0.827-23.059,9.416-41.843,22.502-54.929
+	C136.335,177.667,153.949,173.369,182.007,175.247z"/>
+<g>
+	<path style="fill:#FFFFFF;" d="M91.225,270.332c-17.52,11.68-32.954,27.114-32.954,49.64s6.466,41.506,19.605,54.646
+		c13.14,13.14,25.318-39.64,25.863-52.144C104.554,303.805,109.787,261.78,91.225,270.332z"/>
+	<ellipse style="fill:#FFFFFF;" cx="256" cy="404.793" rx="63.812" ry="56.728"/>
+	
+		<ellipse transform="matrix(-0.7071 -0.7071 0.7071 -0.7071 105.1524 636.8993)" style="fill:#FFFFFF;" cx="184.482" cy="296.672" rx="55.964" ry="64.919"/>
+</g>
+<path style="fill:#FFFFFF;" d="M391.986,64.679c0,0-61.914,18.788-103.797,56.993c-7.48-4.035-20.649-13.958-18.844-33.215
+	c2.503-26.697,26.697-46.304,26.697-46.304v9.594c0,0,10.846-14.183,18.772-17.52l2.086,9.177c0,0,11.263-11.68,17.938-14.183
+	c0,0-2.086,4.588,0,10.429c0,0,4.588-6.675,19.189-14.183v10.011c0,0,5.84-6.257,25.028-9.594c0,0-4.588,3.754-7.092,10.846
+	c0,0,15.851-5.423,24.612-5.423l-7.718,7.718c0,0,17.729-3.128,31.077-3.128l-6.257,8.342h26.697c0,0-11.263,11.263-11.263,18.772
+	h12.097c0,0-5.423,12.515-17.938,18.355c0,0,4.171,2.086,14.183,2.086c0,0-5.423,10.429-16.686,16.686l10.846,1.252
+	c0,0-9.177,11.263-22.526,15.434l12.932,2.503c0,0-7.509,7.926-25.446,13.765l10.011,2.92c0,0-12.097,11.263-26.28,11.263
+	l8.76,4.588c0,0-16.686,4.171-28.783,4.171l7.509,7.509c0,0-58.173,8.047-68.983-34.449
+	C308.12,118.139,332.472,95.452,391.986,64.679z"/>
+<g>
+	<path style="fill:#FFFFFF;" d="M255.997,230.703c-27.949,0-52.977-14.183-55.898-27.532c-2.92-13.349,15.434-37.96,55.898-37.96
+		s58.817,24.612,55.898,37.96C308.974,216.521,283.946,230.703,255.997,230.703z"/>
+	<path style="fill:#FFFFFF;" d="M349.697,409.506c19.489-22.183,43.204-36.546,57.858-27.779
+		c14.655,8.769,25.12,43.776-3.096,75.892s-64.28,26.243-74.862,12.84C319.016,457.055,330.208,431.689,349.697,409.506z"/>
+</g>
+<path style="fill:#FFFFFF;" d="M329.987,175.247c-4.35,0.292-6.66,5.297-4.061,8.797c7.323,9.862,17.874,22.296,31.855,34.562
+	c17.252,15.131,34.376,25.974,45.98,32.528c3.636,2.054,8.075-0.539,8.225-4.712c0.827-23.059-9.417-41.843-22.502-54.929
+	C375.659,177.667,358.045,173.369,329.987,175.247z"/>
+<g>
+	<path style="fill:#FFFFFF;" d="M420.769,270.332c17.52,11.68,32.954,27.114,32.954,49.64s-6.466,41.506-19.605,54.646
+		c-13.14,13.14-25.318-39.64-25.863-52.144C407.44,303.805,402.206,261.78,420.769,270.332z"/>
+	
+		<ellipse transform="matrix(-0.7071 0.7071 -0.7071 -0.7071 768.8735 274.8859)" style="fill:#FFFFFF;" cx="327.506" cy="296.682" rx="55.964" ry="64.919"/>
+</g>
+</svg>

+ 67 - 0
website/static/img/platform/switch.svg

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<g>
+	<g>
+		<g>
+			<path d="M437.333,64H352c-5.896,0-10.667,4.771-10.667,10.667v7.548c-7.564-4.48-11.762-12.253-11.792-12.319
+				C327.729,66.281,324.042,64,320,64H192c-4.042,0-7.729,2.281-9.542,5.896c-3.194,6.384-7.656,10.034-11.792,12.23v-7.46
+				C170.667,68.771,165.896,64,160,64H74.667C33.5,64,0,97.5,0,138.667v234.667C0,414.5,33.5,448,74.667,448H160h192h85.333
+				C478.5,448,512,414.5,512,373.333V138.667C512,97.5,478.5,64,437.333,64z M149.333,426.667H74.667
+				c-29.417,0-53.333-23.927-53.333-53.333V138.667c0-29.406,23.917-53.333,53.333-53.333h74.667V426.667z M341.333,426.667H170.667
+				V104.923c8.137-2.221,19.237-7.341,27.458-19.59h116c4.59,6.451,13.628,16.211,27.208,19.829V426.667z M490.667,373.333
+				c0,29.406-23.917,53.333-53.333,53.333h-74.667V85.333h74.667c29.417,0,53.333,23.927,53.333,53.333V373.333z"/>
+			<path d="M42.667,213.333c0,23.531,19.146,42.667,42.667,42.667C108.854,256,128,236.865,128,213.333
+				s-19.146-42.667-42.667-42.667C61.813,170.667,42.667,189.802,42.667,213.333z M85.333,192c11.771,0,21.333,9.573,21.333,21.333
+				c0,11.76-9.563,21.333-21.333,21.333c-11.771,0-21.333-9.573-21.333-21.333C64,201.573,73.563,192,85.333,192z"/>
+			<circle cx="85.333" cy="288" r="10.667"/>
+			<circle cx="85.333" cy="330.667" r="10.667"/>
+			<circle cx="106.667" cy="309.333" r="10.667"/>
+			<circle cx="64" cy="309.333" r="10.667"/>
+			<path d="M426.667,256C403.146,256,384,275.135,384,298.667s19.146,42.667,42.667,42.667s42.667-19.135,42.667-42.667
+				S450.188,256,426.667,256z M426.667,320c-11.771,0-21.333-9.573-21.333-21.333c0-11.76,9.563-21.333,21.333-21.333
+				S448,286.906,448,298.667C448,310.427,438.438,320,426.667,320z"/>
+			<circle cx="426.667" cy="224" r="10.667"/>
+			<circle cx="426.667" cy="181.333" r="10.667"/>
+			<circle cx="405.333" cy="202.667" r="10.667"/>
+			<circle cx="448" cy="202.667" r="10.667"/>
+			<path d="M96,128h21.333c5.896,0,10.667-4.771,10.667-10.667c0-5.896-4.771-10.667-10.667-10.667H96
+				c-5.896,0-10.667,4.771-10.667,10.667C85.333,123.229,90.104,128,96,128z"/>
+			<path d="M394.667,128c0,5.896,4.771,10.667,10.667,10.667c5.896,0,10.667-4.771,10.667-10.667
+				c5.896,0,10.667-4.771,10.667-10.667c0-5.896-4.771-10.667-10.667-10.667C416,100.771,411.229,96,405.333,96
+				c-5.896,0-10.667,4.771-10.667,10.667c-5.896,0-10.667,4.771-10.667,10.667C384,123.229,388.771,128,394.667,128z"/>
+		</g>
+	</g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 45 - 0
website/static/img/platform/windows.svg

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="475.082px" height="475.082px" viewBox="0 0 475.082 475.082" style="enable-background:new 0 0 475.082 475.082;"
+	 xml:space="preserve">
+<g>
+	<g>
+		<polygon points="0,409.705 194.716,436.541 194.716,250.677 0,250.677 		"/>
+		<polygon points="0,226.692 194.716,226.692 194.716,38.544 0,65.38 		"/>
+		<polygon points="216.129,439.398 475.082,475.082 475.082,250.677 475.082,250.674 216.129,250.674 		"/>
+		<polygon points="216.132,35.688 216.132,226.692 475.082,226.692 475.082,0 		"/>
+	</g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 58 - 0
website/static/img/rocket.svg

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448)  -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="Ebene_1"
+   width="73.302002"
+   height="73.113998"
+   viewBox="0 0 73.302003 73.113999"
+   overflow="visible"
+   enable-background="new 0 0 161.116 96.724"
+   xml:space="preserve"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="blitzmaxng_logo.svg"
+   style="overflow:visible"><metadata
+     id="metadata3548"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+     id="defs3546" /><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="2560"
+     inkscape:window-height="1395"
+     id="namedview3544"
+     showgrid="false"
+     inkscape:zoom="2.5147203"
+     inkscape:cx="-14.570245"
+     inkscape:cy="-51.417152"
+     inkscape:window-x="0"
+     inkscape:window-y="1"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="Ebene_1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" /><g
+     id="g3536"
+     transform="translate(-1.124439,-0.942463)" /><g
+     id="g3540"
+     transform="translate(-87.814,-23.609)"
+     style="fill:#000000"><path
+       d="m 95.056,89.67 c 0,0 -1.213,-5.351 4.93,-11.365 0,0 -12.268,3.104 -9.652,16.088 12.984,2.615 16.088,-9.652 16.088,-9.652 -6.016,6.142 -11.366,4.929 -11.366,4.929 z m 66.06,-66.061 c 0,0 -36.136,1.761 -44.287,26.496 0,0 -9.418,-1.747 -16.844,5.678 -7.424,7.425 -12.171,20.003 -12.171,20.003 0,0 10.729,-9.749 15.389,-7.134 4.534,2.545 0,9.652 0,9.652 l 3.218,3.218 c 0,0 6.464,-4.108 9.652,0 3.178,4.097 -7.321,15.201 -7.321,15.201 0,0 12.766,-4.56 20.19,-11.983 7.425,-7.426 5.659,-16.864 5.659,-16.864 23.297,-7.392 26.515,-44.267 26.515,-44.267 z m -31.041,36.542 -8.181,3.165 2.639,2.085 -6.855,2.079 1.46,1.004 -5.014,0.009 1.826,-2.779 1.248,1.313 4.585,-1.917 -3.254,-2.334 8.087,-2.832 -4.48,-2.693 9.249,-5.368 3.215,3.032 -8.278,2.652 3.753,2.584 z m 8.28,-19.661 c 0,-3.249 2.647,-5.883 5.913,-5.883 3.266,0 5.914,2.634 5.914,5.883 0,3.25 -2.648,5.884 -5.914,5.884 -3.266,0 -5.913,-2.634 -5.913,-5.884 z M 98.539,86.123 c 5.736,1.155 7.107,-4.265 7.107,-4.265 -2.657,2.715 -4.628,1.792 -4.628,1.792 0,0 -0.93,-1.978 1.785,-4.635 0.001,0.001 -5.419,1.372 -4.264,7.108 z"
+       id="path3542"
+       inkscape:connector-curvature="0"
+       style="clip-rule:evenodd;fill-rule:evenodd;fill:#000000" /></g></svg>